diff --git a/AAP Definitions.md b/AAP Definitions.md
index 9f1b2d7..bf617a9 100644
--- a/AAP Definitions.md
+++ b/AAP Definitions.md
@@ -348,27 +348,34 @@ The packets sent (based on the previous states) are as follows:
> *i do hate apple for not hardcoding these, like there are literally only 4^2 - ${\binom{4}{1}}$ - $\binom{4}{2}$*
-# Miscellaneous/Unknown
+# Head Tracking
-## Request something (Probably Head Positions)
+## Start Tracking
+
+This packet initiates head tracking. When sent, the AirPods begin streaming head tracking data (e.g. orientation and acceleration) for live plotting and analysis.
```plaintext
-
-OR
04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00
```
-Example packet
+## Stop Tracking
-```plaintext
-04 00 04 00 17 00 00 00 10 00 43 00 08 ec 07 10 01 1a 3c 0e 00 01 90 95 5d af 86 19 00 00 03 04 43 94 04 9e 6b 01 00 00 00 d5 a2 06 13 eb 13 03 00 f0 ff 01 00 67 83 67 83 67 83 fe ff fd ff 07 00 b3 01 9c 03 65 00 48 74 2c 37 fd 1e 00 00
-```
-
-## Stop whatever was requested
+This packet stops the head tracking data stream.
```plaintext
04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00
```
+## Received Head Tracking Sensor Data
+
+Once tracking is active, the AirPods stream sensor packets with the following common structure:
+
+| Field | Offset | Length (bytes) |
+|--------------------------|--------|----------------|
+| orientation 1 | 43 | 2 |
+| orientation 2 | 45 | 2 |
+| orientation 3 | 47 | 2 |
+| Horizontal Acceleration | 51 | 2 |
+| Vertical Acceleration | 53 | 2 |
# LICENSE
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index 7841e36..8218683 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -64,4 +64,4 @@ dependencies {
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
-}
\ No newline at end of file
+}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index b8a480b..848427d 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -24,6 +24,8 @@
tools:ignore="UnusedAttribute" />
+
+
(null) }
@@ -250,6 +254,9 @@ fun Main() {
composable("app_settings") {
AppSettingsScreen(navController)
}
+ composable("head_tracking") {
+ HeadTrackingScreen(navController)
+ }
}
}
serviceConnection = remember {
diff --git a/android/app/src/main/java/me/kavishdevar/aln/composables/IndependentToggle.kt b/android/app/src/main/java/me/kavishdevar/aln/composables/IndependentToggle.kt
index b3a7f7f..47bb8fa 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/composables/IndependentToggle.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/composables/IndependentToggle.kt
@@ -1,17 +1,17 @@
/*
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
- *
+ *
* Copyright (C) 2024 Kavish Devar
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
@@ -48,7 +48,7 @@ import androidx.compose.ui.unit.sp
import me.kavishdevar.aln.services.AirPodsService
@Composable
-fun IndependentToggle(name: String, service: AirPodsService, functionName: String, sharedPreferences: SharedPreferences, default: Boolean = false) {
+fun IndependentToggle(name: String, service: AirPodsService? = null, functionName: String? = null, sharedPreferences: SharedPreferences, default: Boolean = false) {
val isDarkTheme = isSystemInDarkTheme()
val textColor = if (isDarkTheme) Color.White else Color.Black
@@ -77,9 +77,10 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
.edit()
.putBoolean(snakeCasedName, checked)
.apply()
-
- val method = service::class.java.getMethod(functionName, Boolean::class.java)
- method.invoke(service, checked)
+ if (functionName != null && service != null) {
+ val method = service::class.java.getMethod(functionName, Boolean::class.java)
+ method.invoke(service, checked)
+ }
}
)
},
@@ -98,8 +99,11 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
onCheckedChange = {
checked = it
sharedPreferences.edit().putBoolean(snakeCasedName, it).apply()
- val method = service::class.java.getMethod(functionName, Boolean::class.java)
- method.invoke(service, it)
+ if (functionName != null && service != null) {
+ val method =
+ service::class.java.getMethod(functionName, Boolean::class.java)
+ method.invoke(service, it)
+ }
},
)
}
@@ -110,4 +114,4 @@ fun IndependentToggle(name: String, service: AirPodsService, functionName: Strin
@Composable
fun IndependentTogglePreview() {
IndependentToggle("Test", AirPodsService(), "test", LocalContext.current.getSharedPreferences("preview", 0), true)
-}
\ No newline at end of file
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/composables/PressAndHoldSettings.kt b/android/app/src/main/java/me/kavishdevar/aln/composables/PressAndHoldSettings.kt
index ba368ce..6a0f20e 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/composables/PressAndHoldSettings.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/composables/PressAndHoldSettings.kt
@@ -1,17 +1,17 @@
/*
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
- *
+ *
* Copyright (C) 2024 Kavish Devar
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
@@ -81,6 +81,8 @@ fun PressAndHoldSettings(navController: NavController) {
modifier = Modifier.padding(8.dp, bottom = 2.dp)
)
+ Spacer(modifier = Modifier.height(1.dp))
+
Column(
modifier = Modifier
.fillMaxWidth()
diff --git a/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt b/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt
index 68f0695..427acfa 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt
@@ -305,6 +305,21 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService,
Spacer(modifier = Modifier.height(32.dp))
NoiseControlSettings(service = service)
+ Spacer(modifier = Modifier.height(16.dp))
+ Text(
+ text = stringResource(R.string.head_gestures).uppercase(),
+ style = TextStyle(
+ fontSize = 14.sp,
+ fontWeight = FontWeight.Light,
+ color = (if (isSystemInDarkTheme()) Color.White else Color.Black).copy(alpha = 0.6f),
+ fontFamily = FontFamily(Font(R.font.sf_pro))
+ ),
+ modifier = Modifier.padding(8.dp, bottom = 2.dp)
+ )
+
+ Spacer(modifier = Modifier.height(2.dp))
+ NavigationButton(to = "head_tracking", "Head Tracking", navController)
+
Spacer(modifier = Modifier.height(16.dp))
PressAndHoldSettings(navController = navController)
diff --git a/android/app/src/main/java/me/kavishdevar/aln/screens/DebugScreen.kt b/android/app/src/main/java/me/kavishdevar/aln/screens/DebugScreen.kt
index cbb6e7a..581bf6f 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/screens/DebugScreen.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/screens/DebugScreen.kt
@@ -1,17 +1,17 @@
/*
* AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
- *
+ *
* Copyright (C) 2024 Kavish Devar
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
- *
+ *
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
@@ -22,6 +22,8 @@ package me.kavishdevar.aln.screens
import android.annotation.SuppressLint
import android.content.Context
+import android.os.Build
+import androidx.annotation.RequiresApi
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.isSystemInDarkTheme
@@ -32,7 +34,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -86,6 +87,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import me.kavishdevar.aln.R
import me.kavishdevar.aln.services.ServiceManager
+@RequiresApi(Build.VERSION_CODES.Q)
@OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter", "UnspecifiedRegisterReceiverFlag")
@Composable
@@ -154,7 +156,7 @@ fun DebugScreen(navController: NavController) {
Column(
modifier = Modifier
.fillMaxSize()
- .imePadding()
+// .imePadding()
.haze(hazeState)
.padding(top = paddingValues.calculateTopPadding())
) {
@@ -198,7 +200,7 @@ fun DebugScreen(navController: NavController) {
Column {
Text(
text =
- if (isSent) message.substring(5).take(60) + (if (message.substring(5).length > 60) "..." else "")
+ if (isSent) message.substring(5).take(60) + (if (message.substring(5).length > 60) "..." else "")
else message.substring(9).take(60) + (if (message.substring(9).length > 60) "..." else ""),
style = MaterialTheme.typography.bodySmall,
)
@@ -261,4 +263,4 @@ fun DebugScreen(navController: NavController) {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/screens/HeadTrackingScreen.kt b/android/app/src/main/java/me/kavishdevar/aln/screens/HeadTrackingScreen.kt
new file mode 100644
index 0000000..aedf267
--- /dev/null
+++ b/android/app/src/main/java/me/kavishdevar/aln/screens/HeadTrackingScreen.kt
@@ -0,0 +1,808 @@
+/*
+ * AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
+ *
+ * Copyright (C) 2024 Kavish Devar
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package me.kavishdevar.aln.screens
+
+import android.content.Context
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.ExperimentalAnimationApi
+import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.slideInVertically
+import androidx.compose.animation.togetherWith
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.aspectRatio
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
+import androidx.compose.material.icons.filled.PlayArrow
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Card
+import androidx.compose.material3.CardDefaults
+import androidx.compose.material3.CenterAlignedTopAppBar
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextButton
+import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableFloatStateOf
+import androidx.compose.runtime.mutableLongStateOf
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.scale
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Path
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.StrokeCap
+import androidx.compose.ui.graphics.asAndroidPath
+import androidx.compose.ui.graphics.drawscope.Stroke
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.graphics.vector.path
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.drawText
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.rememberTextMeasurer
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavController
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import me.kavishdevar.aln.R
+import me.kavishdevar.aln.composables.IndependentToggle
+import me.kavishdevar.aln.services.ServiceManager
+import me.kavishdevar.aln.utils.HeadTracking
+import kotlin.math.abs
+import kotlin.math.cos
+import kotlin.math.sin
+import kotlin.random.Random
+
+@RequiresApi(Build.VERSION_CODES.Q)
+@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class)
+@Composable
+fun HeadTrackingScreen(navController: NavController) {
+ DisposableEffect(Unit) {
+ ServiceManager.getService()?.startHeadTracking()
+ onDispose {
+ ServiceManager.getService()?.stopHeadTracking()
+ }
+ }
+ val sharedPreferences = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
+ val isDarkTheme = isSystemInDarkTheme()
+ val backgroundColor = if (isDarkTheme) Color(0xFF1C1C1E) else Color(0xFFFFFFFF)
+ val textColor = if (isDarkTheme) Color.White else Color.Black
+ Scaffold(
+ topBar = {
+ CenterAlignedTopAppBar(
+ title = {
+ Text(
+ stringResource(R.string.head_tracking),
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ )
+ },
+ navigationIcon = {
+ TextButton(
+ onClick = {
+ navController.popBackStack()
+ if (ServiceManager.getService()?.isHeadTrackingActive == true) ServiceManager.getService()?.stopHeadTracking()
+ },
+ shape = RoundedCornerShape(8.dp),
+ ) {
+ Icon(
+ Icons.AutoMirrored.Filled.KeyboardArrowLeft,
+ contentDescription = "Back",
+ tint = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
+ modifier = Modifier.scale(1.5f)
+ )
+ Text(
+ sharedPreferences.getString("name", "AirPods")!!,
+ style = TextStyle(
+ fontSize = 18.sp,
+ fontWeight = FontWeight.Medium,
+ color = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
+ fontFamily = FontFamily(Font(R.font.sf_pro))
+ ),
+ )
+ }
+ },
+ colors = TopAppBarDefaults.topAppBarColors(
+ containerColor = Color.Transparent
+ ),
+ actions = {
+ var isActive by remember { mutableStateOf(ServiceManager.getService()?.isHeadTrackingActive == true) }
+ IconButton(
+ onClick = {
+ if (ServiceManager.getService()?.isHeadTrackingActive == false) {
+ ServiceManager.getService()?.startHeadTracking()
+ Log.d("HeadTrackingScreen", "Head tracking started")
+ isActive = true
+ } else {
+ ServiceManager.getService()?.stopHeadTracking()
+ Log.d("HeadTrackingScreen", "Head tracking stopped")
+ isActive = false
+ }
+ },
+ ) {
+ Icon(
+ if (isActive) {
+ ImageVector.Builder(
+ name = "Pause",
+ defaultWidth = 24.dp,
+ defaultHeight = 24.dp,
+ viewportWidth = 24f,
+ viewportHeight = 24f
+ ).apply {
+ path(
+ fill = SolidColor(Color.Black),
+ pathBuilder = {
+ moveTo(6f, 5f)
+ lineTo(10f, 5f)
+ lineTo(10f, 19f)
+ lineTo(6f, 19f)
+ lineTo(6f, 5f)
+ moveTo(14f, 5f)
+ lineTo(18f, 5f)
+ lineTo(18f, 19f)
+ lineTo(14f, 19f)
+ lineTo(14f, 5f)
+ }
+ )
+ }.build()
+ } else Icons.Filled.PlayArrow,
+ contentDescription = "Start",
+ tint = if (isDarkTheme) Color(0xFF007AFF) else Color(0xFF3C6DF5),
+ modifier = Modifier.scale(1.5f)
+ )
+ }
+ }
+ )
+ },
+ containerColor = if (isSystemInDarkTheme()) Color(0xFF000000)
+ else Color(0xFFF2F2F7),
+ ) { paddingValues ->
+ Column (
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(paddingValues = paddingValues)
+ .padding(horizontal = 16.dp)
+ .padding(top = 8.dp)
+ ) {
+ val sharedPreferences =
+ LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
+
+ var gestureText by remember { mutableStateOf("") }
+ val coroutineScope = rememberCoroutineScope()
+
+ IndependentToggle(name = "Head Gestures", sharedPreferences = sharedPreferences)
+ Spacer(modifier = Modifier.height(2.dp))
+ Text(
+ stringResource(R.string.head_gestures_details),
+ style = TextStyle(
+ fontSize = 14.sp,
+ fontWeight = FontWeight.Normal,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor.copy(0.6f)
+ ),
+ modifier = Modifier.padding(start = 4.dp)
+ )
+
+ Spacer(modifier = Modifier.height(16.dp))
+ Text(
+ "Head Orientation",
+ style = TextStyle(
+ fontSize = 18.sp,
+ fontWeight = FontWeight.Medium,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor
+ ),
+ modifier = Modifier.padding(start = 4.dp, bottom = 8.dp, top = 8.dp)
+ )
+ HeadVisualization()
+
+ Spacer(modifier = Modifier.height(16.dp))
+ Text(
+ "Acceleration",
+ style = TextStyle(
+ fontSize = 18.sp,
+ fontWeight = FontWeight.Medium,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor
+ ),
+ modifier = Modifier.padding(start = 4.dp, bottom = 8.dp, top = 8.dp)
+ )
+ AccelerationPlot()
+
+ Spacer(modifier = Modifier.height(16.dp))
+ Button (
+ onClick = {
+ gestureText = "Shake your head or nod!"
+ coroutineScope.launch {
+ val accepted = ServiceManager.getService()?.testHeadGestures() ?: false
+ gestureText = if (accepted) "\"Yes\" gesture detected." else "\"No\" gesture detected."
+ }
+ },
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(55.dp),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = backgroundColor
+ ),
+ shape = RoundedCornerShape(8.dp)
+ ) {
+ Text(
+ "Test Head Gestures",
+ style = TextStyle(
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Medium,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor
+ ),
+ )
+ }
+ var lastClickTime by remember { mutableLongStateOf(0L) }
+ var shouldExplode by remember { mutableStateOf(false) }
+
+ LaunchedEffect(gestureText) {
+ if (gestureText.isNotEmpty()) {
+ lastClickTime = System.currentTimeMillis()
+ delay(3000)
+ if (System.currentTimeMillis() - lastClickTime >= 3000) {
+ shouldExplode = true
+ }
+ }
+ }
+
+ Box(
+ contentAlignment = Alignment.Center,
+ modifier = Modifier.padding(top = 12.dp)
+ ) {
+ AnimatedContent(
+ targetState = gestureText,
+ transitionSpec = {
+ (fadeIn(
+ animationSpec = tween(300)
+ ) + slideInVertically(
+ initialOffsetY = { 40 },
+ animationSpec = tween(300)
+ )).togetherWith(fadeOut(animationSpec = tween(150)))
+ }
+ ) { text ->
+ if (shouldExplode) {
+ LaunchedEffect(Unit) {
+ CoroutineScope(coroutineScope.coroutineContext).launch {
+ delay(750)
+ gestureText = ""
+ }
+ }
+ ParticleText(
+ text = text,
+ style = TextStyle(
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Medium,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor,
+ textAlign = TextAlign.Center
+ ),
+ onAnimationComplete = {
+ shouldExplode = false
+ },
+ )
+ } else {
+ Text(
+ text = text,
+ style = TextStyle(
+ fontSize = 20.sp,
+ fontWeight = FontWeight.Medium,
+ fontFamily = FontFamily(Font(R.font.sf_pro)),
+ color = textColor,
+ textAlign = TextAlign.Center
+ ),
+ modifier = Modifier
+ .fillMaxWidth()
+ )
+ }
+ }
+ }
+ }
+ }
+}
+private data class Particle(
+ val initialPosition: Offset,
+ val velocity: Offset,
+ var alpha: Float = 1f
+)
+
+@Composable
+private fun ParticleText(
+ text: String,
+ style: TextStyle,
+ onAnimationComplete: () -> Unit,
+) {
+ val particles = remember { mutableStateListOf() }
+ val textMeasurer = rememberTextMeasurer()
+ var isAnimating by remember { mutableStateOf(true) }
+ var textVisible by remember { mutableStateOf(true) }
+
+ Canvas(modifier = Modifier.fillMaxWidth()) {
+ val textLayoutResult = textMeasurer.measure(text, style)
+ val textBounds = textLayoutResult.size
+ val centerX = (size.width - textBounds.width) / 2
+ val centerY = size.height / 2
+
+ if (textVisible && particles.isEmpty()) {
+ drawText(
+ textMeasurer = textMeasurer,
+ text = text,
+ style = style,
+ topLeft = Offset(centerX, centerY - textBounds.height / 2)
+ )
+ }
+
+ if (particles.isEmpty()) {
+ val random = Random(System.currentTimeMillis())
+ for (i in 0..100) {
+ val x = centerX + random.nextFloat() * textBounds.width
+ val y = centerY - textBounds.height / 2 + random.nextFloat() * textBounds.height
+ val vx = (random.nextFloat() - 0.5f) * 20
+ val vy = (random.nextFloat() - 0.5f) * 20
+ particles.add(Particle(Offset(x, y), Offset(vx, vy)))
+ }
+ textVisible = false
+ }
+
+ particles.forEach { particle ->
+ drawCircle(
+ color = style.color.copy(alpha = particle.alpha),
+ radius = 0.5.dp.toPx(),
+ center = particle.initialPosition
+ )
+ }
+ }
+
+ LaunchedEffect(text) {
+ while (isAnimating) {
+ delay(16)
+ particles.forEachIndexed { index, particle ->
+ particles[index] = particle.copy(
+ initialPosition = particle.initialPosition + particle.velocity,
+ alpha = (particle.alpha - 0.02f).coerceAtLeast(0f)
+ )
+ }
+
+ if (particles.all { it.alpha <= 0f }) {
+ isAnimating = false
+ onAnimationComplete()
+ }
+ }
+ }
+}
+
+@Composable
+private fun HeadVisualization() {
+ val orientation by HeadTracking.orientation.collectAsState()
+ val darkTheme = isSystemInDarkTheme()
+ val backgroundColor = if (darkTheme) Color(0xFF1C1C1E) else Color.White
+ val strokeColor = if (darkTheme) Color.White else Color.Black
+
+ Card(
+ modifier = Modifier
+ .fillMaxWidth()
+ .aspectRatio(2f),
+ colors = CardDefaults.cardColors(
+ containerColor = backgroundColor
+ )
+ ) {
+ Box(
+ modifier = Modifier.fillMaxSize(),
+ contentAlignment = Alignment.Center
+ ) {
+ Canvas(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(16.dp)
+ ) {
+ val width = size.width
+ val height = size.height
+ val center = Offset(width / 2, height / 2)
+ val faceRadius = height * 0.35f
+
+ val pitch = Math.toRadians(orientation.pitch.toDouble())
+ val yaw = Math.toRadians(orientation.yaw.toDouble())
+
+ val cosY = cos(yaw).toFloat()
+ val sinY = sin(yaw).toFloat()
+ val cosP = cos(pitch).toFloat()
+ val sinP = sin(pitch).toFloat()
+
+ fun rotate3D(point: Triple): Triple {
+ val (x, y, z) = point
+ val x1 = x * cosY - z * sinY
+ val y1 = y
+ val z1 = x * sinY + z * cosY
+
+ val x2 = x1
+ val y2 = y1 * cosP - z1 * sinP
+ val z2 = y1 * sinP + z1 * cosP
+
+ return Triple(x2, y2, z2)
+ }
+
+ fun project(point: Triple): Pair {
+ val (x, y, z) = point
+ val scale = 1f + (z / width)
+ return Pair(center.x + x * scale, center.y + y * scale)
+ }
+
+ val earWidth = height * 0.08f
+ val earHeight = height * 0.2f
+ val earOffsetX = height * 0.4f
+ val earOffsetY = 0f
+ val earZ = 0f
+
+ for (xSign in listOf(-1f, 1f)) {
+ val rotated = rotate3D(Triple(earOffsetX * xSign, earOffsetY, earZ))
+ val (earX, earY) = project(rotated)
+ drawRoundRect(
+ color = strokeColor,
+ topLeft = Offset(earX - earWidth/2, earY - earHeight/2),
+ size = Size(earWidth, earHeight),
+ cornerRadius = CornerRadius(earWidth/2),
+ style = Stroke(width = 4.dp.toPx())
+ )
+ }
+
+ val spherePath = Path()
+ val firstPoint = project(rotate3D(Triple(faceRadius, 0f, 0f)))
+ spherePath.moveTo(firstPoint.first, firstPoint.second)
+
+ for (i in 1..32) {
+ val angle = (i * 2 * Math.PI / 32).toFloat()
+ val point = project(rotate3D(Triple(
+ cos(angle) * faceRadius,
+ sin(angle) * faceRadius,
+ 0f
+ )))
+ spherePath.lineTo(point.first, point.second)
+ }
+ spherePath.close()
+
+ drawContext.canvas.nativeCanvas.apply {
+ val paint = android.graphics.Paint().apply {
+ style = android.graphics.Paint.Style.FILL
+ shader = android.graphics.RadialGradient(
+ center.x + sinY * faceRadius * 0.3f,
+ center.y - sinP * faceRadius * 0.3f,
+ faceRadius * 1.4f,
+ intArrayOf(
+ backgroundColor.copy(alpha = 1f).toArgb(),
+ backgroundColor.copy(alpha = 0.95f).toArgb(),
+ backgroundColor.copy(alpha = 0.9f).toArgb(),
+ backgroundColor.copy(alpha = 0.8f).toArgb(),
+ backgroundColor.copy(alpha = 0.7f).toArgb()
+ ),
+ floatArrayOf(0.3f, 0.5f, 0.7f, 0.8f, 1f),
+ android.graphics.Shader.TileMode.CLAMP
+ )
+ }
+ drawPath(spherePath.asAndroidPath(), paint)
+
+ val highlightPaint = android.graphics.Paint().apply {
+ style = android.graphics.Paint.Style.FILL
+ shader = android.graphics.RadialGradient(
+ center.x - faceRadius * 0.4f - sinY * faceRadius * 0.5f,
+ center.y - faceRadius * 0.4f - sinP * faceRadius * 0.5f,
+ faceRadius * 0.9f,
+ intArrayOf(
+ android.graphics.Color.WHITE,
+ android.graphics.Color.argb(100, 255, 255, 255),
+ android.graphics.Color.TRANSPARENT
+ ),
+ floatArrayOf(0f, 0.3f, 1f),
+ android.graphics.Shader.TileMode.CLAMP
+ )
+ alpha = if (darkTheme) 30 else 60
+ }
+ drawPath(spherePath.asAndroidPath(), highlightPaint)
+
+ val secondaryHighlightPaint = android.graphics.Paint().apply {
+ style = android.graphics.Paint.Style.FILL
+ shader = android.graphics.RadialGradient(
+ center.x + faceRadius * 0.3f + sinY * faceRadius * 0.3f,
+ center.y + faceRadius * 0.3f - sinP * faceRadius * 0.3f,
+ faceRadius * 0.7f,
+ intArrayOf(
+ android.graphics.Color.WHITE,
+ android.graphics.Color.TRANSPARENT
+ ),
+ floatArrayOf(0f, 1f),
+ android.graphics.Shader.TileMode.CLAMP
+ )
+ alpha = if (darkTheme) 15 else 30
+ }
+ drawPath(spherePath.asAndroidPath(), secondaryHighlightPaint)
+
+ val shadowPaint = android.graphics.Paint().apply {
+ style = android.graphics.Paint.Style.FILL
+ shader = android.graphics.RadialGradient(
+ center.x + sinY * faceRadius * 0.5f,
+ center.y - sinP * faceRadius * 0.5f,
+ faceRadius * 1.1f,
+ intArrayOf(
+ android.graphics.Color.TRANSPARENT,
+ android.graphics.Color.BLACK
+ ),
+ floatArrayOf(0.7f, 1f),
+ android.graphics.Shader.TileMode.CLAMP
+ )
+ alpha = if (darkTheme) 40 else 20
+ }
+ drawPath(spherePath.asAndroidPath(), shadowPaint)
+ }
+
+ drawPath(
+ path = spherePath,
+ color = strokeColor,
+ style = Stroke(width = 4.dp.toPx())
+ )
+
+ val smileRadius = faceRadius * 0.5f
+ val smileStartAngle = -340f
+ val smileSweepAngle = 140f
+ val smileOffsetY = faceRadius * 0.1f
+
+ val smilePath = Path()
+ for (i in 0..32) {
+ val angle = Math.toRadians(smileStartAngle + (smileSweepAngle * i / 32.0))
+ val x = cos(angle.toFloat()) * smileRadius
+ val y = sin(angle.toFloat()) * smileRadius + smileOffsetY
+
+ val rotated = rotate3D(Triple(x, y, 0f))
+ val projected = project(rotated)
+
+ if (i == 0) {
+ smilePath.moveTo(projected.first, projected.second)
+ } else {
+ smilePath.lineTo(projected.first, projected.second)
+ }
+ }
+
+ drawPath(
+ path = smilePath,
+ color = strokeColor,
+ style = Stroke(
+ width = 4.dp.toPx(),
+ cap = StrokeCap.Round
+ )
+ )
+
+ val eyeOffsetX = height * 0.15f
+ val eyeOffsetY = height * 0.1f
+ val eyeLength = height * 0.08f
+
+ for (xSign in listOf(-1f, 1f)) {
+ val rotated = rotate3D(Triple(eyeOffsetX * xSign, -eyeOffsetY, 0f))
+ val (eyeX, eyeY) = project(rotated)
+ drawLine(
+ color = strokeColor,
+ start = Offset(eyeX, eyeY - eyeLength/2),
+ end = Offset(eyeX, eyeY + eyeLength/2),
+ strokeWidth = 4.dp.toPx(),
+ cap = StrokeCap.Round
+ )
+ }
+
+ drawContext.canvas.nativeCanvas.apply {
+ val paint = android.graphics.Paint().apply {
+ color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
+ textSize = 12.sp.toPx()
+ textAlign = android.graphics.Paint.Align.RIGHT
+ typeface = android.graphics.Typeface.create(
+ "SF Pro",
+ android.graphics.Typeface.NORMAL
+ )
+ }
+
+ val pitch = orientation.pitch.toInt()
+ val yaw = orientation.yaw.toInt()
+ val text = "Pitch: ${pitch}° Yaw: ${yaw}°"
+
+ drawText(
+ text,
+ width - 8.dp.toPx(),
+ height - 8.dp.toPx(),
+ paint
+ )
+ }
+ }
+ }
+ }
+}
+
+@Composable
+private fun AccelerationPlot() {
+ val acceleration by HeadTracking.acceleration.collectAsState()
+ val maxPoints = 100
+ val points = remember { mutableStateListOf>() }
+ val darkTheme = isSystemInDarkTheme()
+
+ var maxAbs by remember { mutableFloatStateOf(1000f) }
+
+ LaunchedEffect(acceleration) {
+ points.add(Pair(acceleration.horizontal, acceleration.vertical))
+ if (points.size > maxPoints) {
+ points.removeAt(0)
+ }
+
+ val currentMax = points.maxOf { maxOf(abs(it.first), abs(it.second)) }
+ maxAbs = maxOf(currentMax * 1.2f, 1000f)
+ }
+
+ Card(
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(300.dp),
+ colors = CardDefaults.cardColors(
+ containerColor = if (darkTheme) Color(0xFF1C1C1E) else Color.White
+ )
+ ) {
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(16.dp)
+ ) {
+ Canvas(
+ modifier = Modifier.fillMaxSize()
+ ) {
+ val width = size.width
+ val height = size.height
+ val xScale = width / maxPoints
+ val yScale = (height - 40.dp.toPx()) / (maxAbs * 2)
+ val zeroY = height / 2
+
+ val gridColor = if (darkTheme) Color.White.copy(alpha = 0.1f) else Color.Black.copy(alpha = 0.1f)
+
+ for (i in 0..maxPoints step 10) {
+ val x = i * xScale
+ drawLine(
+ color = gridColor,
+ start = Offset(x, 0f),
+ end = Offset(x, height),
+ strokeWidth = 1.dp.toPx()
+ )
+ }
+
+ val gridStep = maxAbs / 4
+ for (value in (-maxAbs.toInt()..maxAbs.toInt()) step gridStep.toInt()) {
+ val y = zeroY - value * yScale
+ drawLine(
+ color = gridColor,
+ start = Offset(0f, y),
+ end = Offset(width, y),
+ strokeWidth = 1.dp.toPx()
+ )
+ }
+
+ drawLine(
+ color = if (darkTheme) Color.White.copy(alpha = 0.3f) else Color.Black.copy(alpha = 0.3f),
+ start = Offset(0f, zeroY),
+ end = Offset(width, zeroY),
+ strokeWidth = 1.5f.dp.toPx()
+ )
+
+ if (points.size > 1) {
+ for (i in 0 until points.size - 1) {
+ val x1 = i * xScale
+ val x2 = (i + 1) * xScale
+
+ drawLine(
+ color = Color(0xFF007AFF),
+ start = Offset(x1, zeroY - points[i].first * yScale),
+ end = Offset(x2, zeroY - points[i + 1].first * yScale),
+ strokeWidth = 2.dp.toPx()
+ )
+
+ drawLine(
+ color = Color(0xFFFF3B30),
+ start = Offset(x1, zeroY - points[i].second * yScale),
+ end = Offset(x2, zeroY - points[i + 1].second * yScale),
+ strokeWidth = 2.dp.toPx()
+ )
+ }
+ }
+
+ drawContext.canvas.nativeCanvas.apply {
+ val paint = android.graphics.Paint().apply {
+ color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
+ textSize = 12.sp.toPx()
+ textAlign = android.graphics.Paint.Align.RIGHT
+ }
+
+ drawText("${maxAbs.toInt()}", 30.dp.toPx(), 20.dp.toPx(), paint)
+ drawText("0", 30.dp.toPx(), height/2, paint)
+ drawText("-${maxAbs.toInt()}", 30.dp.toPx(), height - 10.dp.toPx(), paint)
+ }
+
+ val legendY = 15.dp.toPx()
+ val textOffsetY = legendY + 5.dp.toPx() / 2
+
+ drawCircle(Color(0xFF007AFF), 5.dp.toPx(), Offset(width - 150.dp.toPx(), legendY))
+ drawContext.canvas.nativeCanvas.apply {
+ val paint = android.graphics.Paint().apply {
+ color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
+ textSize = 12.sp.toPx()
+ textAlign = android.graphics.Paint.Align.LEFT
+ }
+ drawText("Horizontal", width - 140.dp.toPx(), textOffsetY, paint)
+ }
+
+ drawCircle(Color(0xFFFF3B30), 5.dp.toPx(), Offset(width - 70.dp.toPx(), legendY))
+ drawContext.canvas.nativeCanvas.apply {
+ val paint = android.graphics.Paint().apply {
+ color = if (darkTheme) android.graphics.Color.WHITE else android.graphics.Color.BLACK
+ textSize = 12.sp.toPx()
+ textAlign = android.graphics.Paint.Align.LEFT
+ }
+ drawText("Vertical", width - 60.dp.toPx(), textOffsetY, paint)
+ }
+ }
+ }
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.Q)
+@Preview
+@Composable
+fun HeadTrackingScreenPreview() {
+ HeadTrackingScreen(navController = NavController(LocalContext.current))
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/screens/PressAndHoldSettingsScreen.kt b/android/app/src/main/java/me/kavishdevar/aln/screens/PressAndHoldSettingsScreen.kt
index f37fcc9..1f52113 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/screens/PressAndHoldSettingsScreen.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/screens/PressAndHoldSettingsScreen.kt
@@ -216,7 +216,7 @@ fun LongPressElement(name: String, checked: MutableState, id: String, e
sharedPreferences.getBoolean("long_press_adaptive", false)
)
ServiceManager.getService()
- ?.updateLongPress(originalLongPressArray, newLongPressArray)
+ ?.updateLongPress(originalLongPressArray, newLongPressArray, offListeningMode)
}
val shape = when {
isFirst -> RoundedCornerShape(topStart = 14.dp, topEnd = 14.dp)
diff --git a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt
index 5a0b1d2..2259c44 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt
@@ -36,6 +36,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
+import android.content.pm.PackageManager
import android.content.res.Resources
import android.media.AudioManager
import android.os.BatteryManager
@@ -45,22 +46,27 @@ import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.os.ParcelUuid
+import android.telecom.TelecomManager
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import android.util.Log
import android.util.TypedValue
import android.view.View
import android.widget.RemoteViews
+import android.widget.Toast
+import androidx.annotation.RequiresApi
import androidx.annotation.RequiresPermission
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.core.app.NotificationCompat
import androidx.core.content.edit
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
+import kotlinx.coroutines.suspendCancellableCoroutine
import me.kavishdevar.aln.MainActivity
import me.kavishdevar.aln.R
import me.kavishdevar.aln.utils.AirPodsNotifications
@@ -70,15 +76,19 @@ import me.kavishdevar.aln.utils.BatteryStatus
import me.kavishdevar.aln.utils.CrossDevice
import me.kavishdevar.aln.utils.CrossDevicePackets
import me.kavishdevar.aln.utils.Enums
+import me.kavishdevar.aln.utils.GestureDetector
+import me.kavishdevar.aln.utils.HeadTracking
import me.kavishdevar.aln.utils.IslandType
import me.kavishdevar.aln.utils.IslandWindow
-import me.kavishdevar.aln.utils.LongPressMode
+import me.kavishdevar.aln.utils.LongPressPackets
import me.kavishdevar.aln.utils.MediaController
import me.kavishdevar.aln.utils.PopupWindow
-import me.kavishdevar.aln.utils.determinePacket
+import me.kavishdevar.aln.utils.isHeadTrackingData
import me.kavishdevar.aln.widgets.BatteryWidget
import me.kavishdevar.aln.widgets.NoiseControlWidget
import org.lsposed.hiddenapibypass.HiddenApiBypass
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
object ServiceManager {
private var service: AirPodsService? = null
@@ -152,7 +162,7 @@ class AirPodsService : Service() {
}
fun clearLogs() {
- clearPacketLogs() // Expose a method to clear logs
+ clearPacketLogs()
_packetLogsFlow.value = emptySet()
}
@@ -160,6 +170,18 @@ class AirPodsService : Service() {
return LocalBinder()
}
+ private var gestureDetector: GestureDetector? = null
+ private var isInCall = false
+ private var callNumber: String? = null
+
+ @RequiresApi(Build.VERSION_CODES.Q)
+ private fun initGestureDetector() {
+ if (gestureDetector == null) {
+ gestureDetector = GestureDetector(this)
+ }
+ }
+
+
var popupShown = false
fun showPopup(service: Service, name: String) {
@@ -525,6 +547,98 @@ class AirPodsService : Service() {
notificationManager.notify(1, updatedNotification)
}
+ @RequiresApi(Build.VERSION_CODES.Q)
+ fun handleIncomingCall() {
+ if (isInCall) return
+
+ initGestureDetector()
+
+ gestureDetector?.startDetection { accepted ->
+ if (accepted) {
+ answerCall()
+ } else {
+ rejectCall()
+ }
+ }
+ }
+ @OptIn(ExperimentalCoroutinesApi::class)
+ @RequiresApi(Build.VERSION_CODES.Q)
+
+ suspend fun testHeadGestures(): Boolean {
+ return suspendCancellableCoroutine { continuation ->
+ gestureDetector?.startDetection(doNotStop = true) { accepted ->
+ if (continuation.isActive) {
+ continuation.resume(accepted) {
+ gestureDetector?.stopDetection()
+ }
+ }
+ }
+ }
+ }
+ private fun answerCall() {
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ val telecomManager = getSystemService(TELECOM_SERVICE) as TelecomManager
+ if (checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {
+ telecomManager.acceptRingingCall()
+ }
+ } else {
+ val telephonyService = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
+ val telephonyClass = Class.forName(telephonyService.javaClass.name)
+ val method = telephonyClass.getDeclaredMethod("getITelephony")
+ method.isAccessible = true
+ val telephonyInterface = method.invoke(telephonyService)
+ val answerCallMethod = telephonyInterface.javaClass.getDeclaredMethod("answerRingingCall")
+ answerCallMethod.invoke(telephonyInterface)
+ }
+
+ sendToast("Call answered via head gesture")
+ } catch (e: Exception) {
+ e.printStackTrace()
+ sendToast("Failed to answer call: ${e.message}")
+ } finally {
+ islandWindow?.close()
+ }
+ }
+ private fun rejectCall() {
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager
+ if (checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {
+ telecomManager.endCall()
+ }
+ } else {
+ val telephonyService = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
+ val telephonyClass = Class.forName(telephonyService.javaClass.name)
+ val method = telephonyClass.getDeclaredMethod("getITelephony")
+ method.isAccessible = true
+ val telephonyInterface = method.invoke(telephonyService)
+ val endCallMethod = telephonyInterface.javaClass.getDeclaredMethod("endCall")
+ endCallMethod.invoke(telephonyInterface)
+ }
+
+ sendToast("Call rejected via head gesture")
+ } catch (e: Exception) {
+ e.printStackTrace()
+ sendToast("Failed to reject call: ${e.message}")
+ } finally {
+ islandWindow?.close()
+ }
+ }
+
+ fun sendToast(message: String) {
+ Handler(Looper.getMainLooper()).post {
+ Toast.makeText(applicationContext, message, Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ @RequiresApi(Build.VERSION_CODES.R)
+ fun processHeadTrackingData(data: ByteArray) {
+ val horizontal = ByteBuffer.wrap(data, 51, 2).order(ByteOrder.LITTLE_ENDIAN).short.toInt()
+ val vertical = ByteBuffer.wrap(data, 53, 2).order(ByteOrder.LITTLE_ENDIAN).short.toInt()
+ gestureDetector?.processHeadOrientation(horizontal, vertical)
+ }
+
private lateinit var connectionReceiver: BroadcastReceiver
private lateinit var disconnectionReceiver: BroadcastReceiver
@@ -533,6 +647,7 @@ class AirPodsService : Service() {
Log.d("AirPodsService", "Service started")
ServiceManager.setService(this)
startForegroundNotification()
+ initGestureDetector()
val audioManager =
this@AirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager
MediaController.initialize(
@@ -559,9 +674,19 @@ class AirPodsService : Service() {
when (state) {
TelephonyManager.CALL_STATE_RINGING -> {
if (CrossDevice.isAvailable && !isConnectedLocally && earDetectionNotification.status.contains(0x00)) takeOver()
+ if (sharedPreferences.getBoolean("head_gestures", false)) {
+ callNumber = phoneNumber
+ handleIncomingCall()
+ }
}
TelephonyManager.CALL_STATE_OFFHOOK -> {
if (CrossDevice.isAvailable && !isConnectedLocally && earDetectionNotification.status.contains(0x00)) takeOver()
+ isInCall = true
+ }
+ TelephonyManager.CALL_STATE_IDLE -> {
+ isInCall = false
+ callNumber = null
+ gestureDetector?.stopDetection()
}
}
}
@@ -711,7 +836,7 @@ class AirPodsService : Service() {
}
if (!isConnectedLocally && !CrossDevice.isAvailable) {
- clearPacketLogs() // Clear logs when device is not available
+ clearPacketLogs()
}
return START_STICKY
@@ -729,6 +854,7 @@ class AirPodsService : Service() {
}
}
+ @RequiresApi(Build.VERSION_CODES.R)
@SuppressLint("MissingPermission")
fun takeOver() {
Log.d("AirPodsService", "Taking over audio")
@@ -750,6 +876,7 @@ class AirPodsService : Service() {
CrossDevice.isAvailable = false
}
+ @RequiresApi(Build.VERSION_CODES.R)
@SuppressLint("MissingPermission", "UnspecifiedRegisterReceiverFlag")
fun connectToSocket(device: BluetoothDevice) {
HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;")
@@ -824,7 +951,6 @@ class AirPodsService : Service() {
var data: ByteArray = byteArrayOf()
if (bytesRead > 0) {
data = buffer.copyOfRange(0, bytesRead)
- logPacket(data, "AirPods")
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DATA).apply {
putExtra("data", buffer.copyOfRange(0, bytesRead))
})
@@ -836,7 +962,10 @@ class AirPodsService : Service() {
sharedPreferences.getString("name", device.name),
batteryNotification.getBattery()
)
- Log.d("AirPods Data", "Data received: $formattedHex")
+ if (!isHeadTrackingData(data)) {
+ Log.d("AirPods Data", "Data received: $formattedHex")
+ logPacket(data, "AirPods")
+ }
} else if (bytesRead == -1) {
Log.d("AirPods Service", "Socket closed (bytesRead = -1)")
sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DISCONNECTED))
@@ -844,6 +973,7 @@ class AirPodsService : Service() {
}
var inEar = false
var inEarData = listOf()
+ processData(data)
if (earDetectionNotification.isEarDetectionData(data)) {
earDetectionNotification.setStatus(data)
sendBroadcast(Intent(AirPodsNotifications.Companion.EAR_DETECTION_DATA).apply {
@@ -1042,7 +1172,9 @@ class AirPodsService : Service() {
"AirPods Parser",
"Conversation Awareness: ${conversationAwarenessNotification.status}"
)
- } else {
+ }
+ else if (isHeadTrackingData(data)) {
+ processHeadTrackingData(data)
}
}
}
@@ -1391,27 +1523,136 @@ class AirPodsService : Service() {
fun updateLongPress(
oldLongPressArray: BooleanArray,
newLongPressArray: BooleanArray,
+ offListeningMode: Boolean
) {
if (oldLongPressArray.contentEquals(newLongPressArray)) {
return
}
- val oldModes = mutableSetOf()
- val newModes = mutableSetOf()
+ val oldOffEnabled = oldLongPressArray[0]
+ val oldAncEnabled = oldLongPressArray[1]
+ val oldTransparencyEnabled = oldLongPressArray[2]
+ val oldAdaptiveEnabled = oldLongPressArray[3]
- if (oldLongPressArray[0]) oldModes.add(LongPressMode.OFF)
- if (oldLongPressArray[1]) oldModes.add(LongPressMode.ANC)
- if (oldLongPressArray[2]) oldModes.add(LongPressMode.TRANSPARENCY)
- if (oldLongPressArray[3]) oldModes.add(LongPressMode.ADAPTIVE)
-
- if (newLongPressArray[0]) newModes.add(LongPressMode.OFF)
- if (newLongPressArray[1]) newModes.add(LongPressMode.ANC)
- if (newLongPressArray[2]) newModes.add(LongPressMode.TRANSPARENCY)
- if (newLongPressArray[3]) newModes.add(LongPressMode.ADAPTIVE)
+ val newOffEnabled = newLongPressArray[0]
+ val newAncEnabled = newLongPressArray[1]
+ val newTransparencyEnabled = newLongPressArray[2]
+ val newAdaptiveEnabled = newLongPressArray[3]
val changedIndex = findChangedIndex(oldLongPressArray, newLongPressArray)
- val newEnabled = newLongPressArray[changedIndex]
+ Log.d("AirPodsService", "changedIndex: $changedIndex")
+ var packet: ByteArray? = null
+ if (offListeningMode) {
+ packet = when (changedIndex) {
+ 0 -> {
+ if (newOffEnabled) {
+ when {
+ oldAncEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
+ oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ANC.value
+ oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_ADAPTIVE_AND_ANC.value
+ oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
+ else -> null
+ }
+ } else {
+ when {
+ oldAncEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_EVERYTHING.value
+ oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ANC.value
+ oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_ADAPTIVE_AND_ANC.value
+ oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
+ else -> null
+ }
+ }
+ }
- val packet = determinePacket(changedIndex, newEnabled, oldModes, newModes)
+ 1 -> {
+ if (newAncEnabled) {
+ when {
+ oldOffEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
+ oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ANC_FROM_OFF_AND_TRANSPARENCY.value
+ oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_ANC_FROM_OFF_AND_ADAPTIVE.value
+ oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
+ else -> null
+ }
+ } else {
+ when {
+ oldOffEnabled && oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_ANC_FROM_EVERYTHING.value
+ oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ANC_FROM_OFF_AND_TRANSPARENCY.value
+ oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_ANC_FROM_OFF_AND_ADAPTIVE.value
+ oldTransparencyEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE.value
+ else -> null
+ }
+ }
+ }
+
+ 2 -> {
+ if (newTransparencyEnabled) {
+ when {
+ oldOffEnabled && oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
+ oldOffEnabled && oldAncEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_OFF_AND_ANC.value
+ oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE.value
+ oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.ENABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC.value
+ else -> null
+ }
+ } else {
+ when {
+ oldOffEnabled && oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_EVERYTHING.value
+ oldOffEnabled && oldAncEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_OFF_AND_ANC.value
+ oldOffEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE.value
+ oldAncEnabled && oldAdaptiveEnabled -> LongPressPackets.DISABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC.value
+ else -> null
+ }
+ }
+ }
+
+ 3 -> {
+ if (newAdaptiveEnabled) {
+ when {
+ oldOffEnabled && oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_EVERYTHING.value
+ oldOffEnabled && oldAncEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_OFF_AND_ANC.value
+ oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY.value
+ oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.ENABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC.value
+ else -> null
+ }
+ } else {
+ when {
+ oldOffEnabled && oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_EVERYTHING.value
+ oldOffEnabled && oldAncEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_OFF_AND_ANC.value
+ oldOffEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY.value
+ oldAncEnabled && oldTransparencyEnabled -> LongPressPackets.DISABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC.value
+ else -> null
+ }
+ }
+ }
+
+ else -> null
+ }
+ } else {
+ when (changedIndex) {
+ 1 -> {
+ packet = if (newLongPressArray[1]) {
+ LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
+ } else {
+ LongPressPackets.DISABLE_ANC_OFF_DISABLED.value
+ }
+ }
+
+ 2 -> {
+ packet = if (newLongPressArray[2]) {
+ LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
+ } else {
+ LongPressPackets.DISABLE_TRANSPARENCY_OFF_DISABLED.value
+ }
+ }
+
+ 3 -> {
+ packet = if (newLongPressArray[3]) {
+ LongPressPackets.ENABLE_EVERYTHING_OFF_DISABLED.value
+ } else {
+ LongPressPackets.DISABLE_ADAPTIVE_OFF_DISABLED.value
+ }
+ }
+ }
+
+ }
packet?.let {
Log.d("AirPodsService", "Sending packet: ${it.joinToString(" ") { "%02X".format(it) }}")
sendPacket(it)
@@ -1442,11 +1683,29 @@ class AirPodsService : Service() {
e.printStackTrace()
}
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
- // Reset state variables
isConnectedLocally = false
CrossDevice.isAvailable = true
super.onDestroy()
}
+
+ var isHeadTrackingActive = false
+
+ fun startHeadTracking() {
+ isHeadTrackingActive = true
+ socket.outputStream.write(Enums.START_HEAD_TRACKING.value)
+ HeadTracking.reset()
+ }
+
+ fun stopHeadTracking() {
+ socket.outputStream.write(Enums.STOP_HEAD_TRACKING.value)
+ isHeadTrackingActive = false
+ }
+
+ fun processData(data: ByteArray) {
+ if (isHeadTrackingActive && isHeadTrackingData(data)) {
+ HeadTracking.processPacket(data)
+ }
+ }
}
private fun Int.dpToPx(): Int {
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt
index bae4100..499029c 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt
@@ -143,9 +143,7 @@ object CrossDevice {
}
fun sendReceivedPacket(packet: ByteArray) {
- Log.d("CrossDevice", "Sending packet to remote device")
if (clientSocket == null || clientSocket!!.outputStream != null) {
- Log.d("CrossDevice", "Client socket is null")
return
}
clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DATA_HEADER.packet + packet)
@@ -257,7 +255,6 @@ object CrossDevice {
fun sendRemotePacket(byteArray: ByteArray) {
if (clientSocket == null || clientSocket!!.outputStream == null) {
- Log.d("CrossDevice", "Client socket is null")
return
}
clientSocket?.outputStream?.write(byteArray)
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/GestureDetector.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/GestureDetector.kt
new file mode 100644
index 0000000..f00e60c
--- /dev/null
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/GestureDetector.kt
@@ -0,0 +1,441 @@
+package me.kavishdevar.aln.utils
+
+import android.os.Build
+import android.util.Log
+import androidx.annotation.RequiresApi
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import me.kavishdevar.aln.services.AirPodsService
+import me.kavishdevar.aln.services.ServiceManager
+import java.util.Collections
+import java.util.concurrent.CopyOnWriteArrayList
+import kotlin.math.abs
+import kotlin.math.max
+import kotlin.math.min
+import kotlin.math.pow
+
+@RequiresApi(Build.VERSION_CODES.Q)
+class GestureDetector(
+ private val airPodsService: AirPodsService,
+) {
+ companion object {
+ private const val TAG = "GestureDetector"
+
+ private const val START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
+ private const val STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
+
+ private const val IMMEDIATE_FEEDBACK_THRESHOLD = 600
+ private const val DIRECTION_CHANGE_SENSITIVITY = 150
+
+ private const val FAST_MOVEMENT_THRESHOLD = 300.0
+ private const val MIN_REQUIRED_EXTREMES = 3
+ private const val MAX_REQUIRED_EXTREMES = 4
+ }
+
+ val audio = GestureFeedback(ServiceManager.getService()?.baseContext!!)
+
+ private val horizontalBuffer = Collections.synchronizedList(ArrayList())
+ private val verticalBuffer = Collections.synchronizedList(ArrayList())
+
+ private val horizontalAvgBuffer = Collections.synchronizedList(ArrayList())
+ private val verticalAvgBuffer = Collections.synchronizedList(ArrayList())
+
+ private var prevHorizontal: Double = 0.0
+ private var prevVertical: Double = 0.0
+
+ private val horizontalPeaks = CopyOnWriteArrayList>()
+ private val horizontalTroughs = CopyOnWriteArrayList>()
+ private val verticalPeaks = CopyOnWriteArrayList>()
+ private val verticalTroughs = CopyOnWriteArrayList>()
+
+ private var lastPeakTime: Long = 0
+ private val peakIntervals = Collections.synchronizedList(ArrayList())
+
+ private val movementSpeedIntervals = Collections.synchronizedList(ArrayList())
+
+ private val peakThreshold = 400
+ private val directionChangeThreshold = DIRECTION_CHANGE_SENSITIVITY
+ private val rhythmConsistencyThreshold = 0.5
+
+ private var horizontalIncreasing: Boolean? = null
+ private var verticalIncreasing: Boolean? = null
+
+ private var detectionTimeout = 15000L
+ private val minConfidenceThreshold = 0.7
+
+ private var isRunning = false
+ private var detectionJob: Job? = null
+ private var gestureDetectedCallback: ((Boolean) -> Unit)? = null
+
+ private var significantMotion = false
+ private var lastSignificantMotionTime = 0L
+
+ init {
+ while (horizontalAvgBuffer.size < 3) horizontalAvgBuffer.add(0.0)
+ while (verticalAvgBuffer.size < 3) verticalAvgBuffer.add(0.0)
+ }
+
+ /**
+ * Start head gesture detection
+ */
+ fun startDetection(doNotStop: Boolean = false, onGestureDetected: (Boolean) -> Unit) {
+ if (isRunning) return
+
+ Log.d(TAG, "Starting gesture detection...")
+ isRunning = true
+ gestureDetectedCallback = onGestureDetected
+
+ clearData()
+
+ prevHorizontal = 0.0
+ prevVertical = 0.0
+
+ airPodsService.sendPacket(START_CMD)
+
+ detectionJob = CoroutineScope(Dispatchers.Default).launch {
+ val startTime = System.currentTimeMillis()
+
+ while (isRunning && (System.currentTimeMillis() - startTime < detectionTimeout)) {
+ delay(50)
+
+ val gesture = detectGestures()
+ if (gesture != null) {
+ withContext(Dispatchers.Main) {
+ audio.playConfirmation(gesture)
+
+ gestureDetectedCallback?.invoke(gesture)
+ stopDetection(doNotStop)
+ }
+ break
+ }
+ }
+
+ if (isRunning) {
+ Log.d(TAG, "Gesture detection timed out")
+ withContext(Dispatchers.Main) {
+ stopDetection(doNotStop)
+ }
+ }
+ }
+ }
+
+ /**
+ * Stop head gesture detection
+ */
+ fun stopDetection(doNotStop: Boolean = false) {
+ if (!isRunning) return
+
+ Log.d(TAG, "Stopping gesture detection")
+ isRunning = false
+
+ if (!doNotStop) airPodsService.sendPacket(STOP_CMD)
+
+ detectionJob?.cancel()
+ detectionJob = null
+ gestureDetectedCallback = null
+ }
+
+ /**
+ * Process head orientation data received from AirPods
+ */
+ @RequiresApi(Build.VERSION_CODES.R)
+ fun processHeadOrientation(horizontal: Int, vertical: Int) {
+ if (!isRunning) return
+
+ val horizontalDelta = horizontal - prevHorizontal
+ val verticalDelta = vertical - prevVertical
+
+ val significantHorizontal = abs(horizontalDelta) > IMMEDIATE_FEEDBACK_THRESHOLD
+ val significantVertical = abs(verticalDelta) > IMMEDIATE_FEEDBACK_THRESHOLD
+
+ if (significantHorizontal && (!significantVertical || abs(horizontalDelta) > abs(verticalDelta))) {
+ CoroutineScope(Dispatchers.Main).launch {
+ audio.playDirectional(isVertical = false, value = horizontalDelta)
+ }
+ significantMotion = true
+ lastSignificantMotionTime = System.currentTimeMillis()
+ Log.d(TAG, "Significant HORIZONTAL movement: $horizontalDelta")
+ }
+ else if (significantVertical) {
+ CoroutineScope(Dispatchers.Main).launch {
+ audio.playDirectional(isVertical = true, value = verticalDelta)
+ }
+ significantMotion = true
+ lastSignificantMotionTime = System.currentTimeMillis()
+ Log.d(TAG, "Significant VERTICAL movement: $verticalDelta")
+ }
+ else if (significantMotion &&
+ (System.currentTimeMillis() - lastSignificantMotionTime) > 300) {
+ significantMotion = false
+ }
+
+ prevHorizontal = horizontal.toDouble()
+ prevVertical = vertical.toDouble()
+
+ val smoothHorizontal = applySmoothing(horizontal.toDouble(), horizontalAvgBuffer)
+ val smoothVertical = applySmoothing(vertical.toDouble(), verticalAvgBuffer)
+
+ synchronized(horizontalBuffer) {
+ horizontalBuffer.add(smoothHorizontal)
+ if (horizontalBuffer.size > 100) horizontalBuffer.removeAt(0)
+ }
+
+ synchronized(verticalBuffer) {
+ verticalBuffer.add(smoothVertical)
+ if (verticalBuffer.size > 100) verticalBuffer.removeAt(0)
+ }
+
+ detectPeaksAndTroughs()
+ }
+
+ /**
+ * Apply moving average smoothing
+ */
+ private fun applySmoothing(newValue: Double, buffer: MutableList): Double {
+ synchronized(buffer) {
+ buffer.add(newValue)
+ if (buffer.size > 3) buffer.removeAt(0)
+ return buffer.average()
+ }
+ }
+
+ /**
+ * Detect motion direction changes
+ */
+ private fun detectPeaksAndTroughs() {
+ if (horizontalBuffer.size < 4 || verticalBuffer.size < 4) return
+
+ val hValues = horizontalBuffer.takeLast(4)
+ val vValues = verticalBuffer.takeLast(4)
+ val hVariance = calculateVariance(hValues)
+ val vVariance = calculateVariance(vValues)
+
+ processDirectionChanges(
+ horizontalBuffer,
+ horizontalIncreasing,
+ hVariance,
+ horizontalPeaks,
+ horizontalTroughs
+ )?.let { horizontalIncreasing = it }
+
+ processDirectionChanges(
+ verticalBuffer,
+ verticalIncreasing,
+ vVariance,
+ verticalPeaks,
+ verticalTroughs
+ )?.let { verticalIncreasing = it }
+ }
+
+ /**
+ * Process direction changes and detect peaks/troughs
+ */
+ private fun processDirectionChanges(
+ buffer: List,
+ isIncreasing: Boolean?,
+ variance: Double,
+ peaks: MutableList>,
+ troughs: MutableList>
+ ): Boolean? {
+ if (buffer.size < 2) return isIncreasing
+
+ val current = buffer.last()
+ val prev = buffer[buffer.size - 2]
+ var increasing = isIncreasing ?: (current > prev)
+
+ val dynamicThreshold = max(50.0, min(directionChangeThreshold.toDouble(), variance / 3))
+
+ val now = System.currentTimeMillis()
+
+ if (increasing && current < prev - dynamicThreshold) {
+ if (abs(prev) > peakThreshold) {
+ peaks.add(Triple(buffer.size - 1, prev, now))
+ if (lastPeakTime > 0) {
+ val interval = (now - lastPeakTime) / 1000.0
+ val timeDiff = now - lastPeakTime
+
+ synchronized(peakIntervals) {
+ peakIntervals.add(interval)
+ if (peakIntervals.size > 5) peakIntervals.removeAt(0)
+ }
+
+ synchronized(movementSpeedIntervals) {
+ movementSpeedIntervals.add(timeDiff)
+ if (movementSpeedIntervals.size > 5) movementSpeedIntervals.removeAt(0)
+ }
+ }
+ lastPeakTime = now
+ }
+ increasing = false
+ } else if (!increasing && current > prev + dynamicThreshold) {
+ if (abs(prev) > peakThreshold) {
+ troughs.add(Triple(buffer.size - 1, prev, now))
+
+ if (lastPeakTime > 0) {
+ val interval = (now - lastPeakTime) / 1000.0
+ val timeDiff = now - lastPeakTime
+
+ synchronized(peakIntervals) {
+ peakIntervals.add(interval)
+ if (peakIntervals.size > 5) peakIntervals.removeAt(0)
+ }
+
+ synchronized(movementSpeedIntervals) {
+ movementSpeedIntervals.add(timeDiff)
+ if (movementSpeedIntervals.size > 5) movementSpeedIntervals.removeAt(0)
+ }
+ }
+ lastPeakTime = now
+ }
+ increasing = true
+ }
+
+ return increasing
+ }
+
+ /**
+ * Calculate variance of a list of values
+ */
+ private fun calculateVariance(values: List): Double {
+ if (values.size <= 1) return 0.0
+
+ val mean = values.average()
+ val squaredDiffs = values.map { (it - mean) * (it - mean) }
+ return squaredDiffs.average()
+ }
+
+ /**
+ * Calculate how consistent the timing between peaks is
+ */
+ private fun calculateRhythmConsistency(): Double {
+ if (peakIntervals.size < 2) return 0.0
+
+ val meanInterval = peakIntervals.average()
+ if (meanInterval == 0.0) return 0.0
+
+ val variances = peakIntervals.map { (it / meanInterval - 1.0).pow(2) }
+ val consistency = 1.0 - min(1.0, variances.average() / rhythmConsistencyThreshold)
+ return max(0.0, consistency)
+ }
+
+ /**
+ * Calculate confidence score for gesture detection
+ */
+ private fun calculateConfidenceScore(extremes: List>, isVertical: Boolean): Double {
+ if (extremes.size < getRequiredExtremes()) return 0.0
+
+ val sortedExtremes = extremes.sortedBy { it.first }
+
+ val recent = sortedExtremes.takeLast(getRequiredExtremes())
+
+ val avgAmplitude = recent.map { abs(it.second) }.average()
+ val amplitudeFactor = min(1.0, avgAmplitude / 600)
+
+ val rhythmFactor = calculateRhythmConsistency()
+
+ val signs = recent.map { if (it.second > 0) 1 else -1 }
+ val alternating = (1 until signs.size).all { signs[it] != signs[it - 1] }
+ val alternationFactor = if (alternating) 1.0 else 0.5
+
+ val isolationFactor = if (isVertical) {
+ val vertAmplitude = recent.map { abs(it.second) }.average()
+ val horizVals = horizontalBuffer.takeLast(recent.size * 2)
+ val horizAmplitude = horizVals.map { abs(it) }.average()
+ min(1.0, vertAmplitude / (horizAmplitude + 0.1) * 1.2)
+ } else {
+ val horizAmplitude = recent.map { abs(it.second) }.average()
+ val vertVals = verticalBuffer.takeLast(recent.size * 2)
+ val vertAmplitude = vertVals.map { abs(it) }.average()
+ min(1.0, horizAmplitude / (vertAmplitude + 0.1) * 1.2)
+ }
+
+ return (
+ amplitudeFactor * 0.4 +
+ rhythmFactor * 0.2 +
+ alternationFactor * 0.2 +
+ isolationFactor * 0.2
+ )
+ }
+
+ /**
+ * Calculate the required number of extremes based on movement speed
+ * - Fast movements (short intervals) require more evidence (5 extremes)
+ * - Slow, deliberate movements need fewer evidence points (3 extremes)
+ */
+ private fun getRequiredExtremes(): Int {
+ if (movementSpeedIntervals.isEmpty()) return MIN_REQUIRED_EXTREMES
+
+ val avgInterval = movementSpeedIntervals.average()
+ Log.d(TAG, "Average movement interval: $avgInterval ms")
+
+ return if (avgInterval < FAST_MOVEMENT_THRESHOLD) {
+ MAX_REQUIRED_EXTREMES
+ } else {
+ MIN_REQUIRED_EXTREMES
+ }
+ }
+
+ /**
+ * Detect gestures based on collected motion data
+ */
+ private fun detectGestures(): Boolean? {
+ val requiredExtremes = getRequiredExtremes()
+ Log.d(TAG, "Current required extremes: $requiredExtremes")
+
+ if (verticalPeaks.size + verticalTroughs.size >= requiredExtremes) {
+ val allExtremes = (verticalPeaks + verticalTroughs).sortedBy { it.first }
+
+ val confidence = calculateConfidenceScore(allExtremes, isVertical = true)
+
+ Log.d(TAG, "Vertical motion confidence: $confidence (need $minConfidenceThreshold)")
+
+ if (confidence >= minConfidenceThreshold) {
+ Log.d(TAG, "\"Yes\" Gesture Detected (confidence: $confidence, extremes: ${allExtremes.size}/$requiredExtremes)")
+ return true
+ }
+ }
+
+ if (horizontalPeaks.size + horizontalTroughs.size >= requiredExtremes) {
+ val allExtremes = (horizontalPeaks + horizontalTroughs).sortedBy { it.first }
+
+ val confidence = calculateConfidenceScore(allExtremes, isVertical = false)
+
+ Log.d(TAG, "Horizontal motion confidence: $confidence (need $minConfidenceThreshold)")
+
+ if (confidence >= minConfidenceThreshold) {
+ Log.d(TAG, "\"No\" Gesture Detected (confidence: $confidence, extremes: ${allExtremes.size}/$requiredExtremes)")
+ return false
+ }
+ }
+
+ return null
+ }
+
+ /**
+ * Clear all buffers and tracking data
+ */
+ private fun clearData() {
+ horizontalBuffer.clear()
+ verticalBuffer.clear()
+ horizontalPeaks.clear()
+ horizontalTroughs.clear()
+ verticalPeaks.clear()
+ verticalTroughs.clear()
+ peakIntervals.clear()
+ movementSpeedIntervals.clear()
+ horizontalIncreasing = null
+ verticalIncreasing = null
+ lastPeakTime = 0
+ significantMotion = false
+ lastSignificantMotionTime = 0L
+ }
+
+ /**
+ * Extension function for power calculation
+ */
+ private fun Double.pow(exponent: Int): Double = this.pow(exponent.toDouble())
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/GestureFeedback.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/GestureFeedback.kt
new file mode 100644
index 0000000..0726686
--- /dev/null
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/GestureFeedback.kt
@@ -0,0 +1,228 @@
+@file:Suppress("PrivatePropertyName")
+
+package me.kavishdevar.aln.utils
+
+import android.content.Context
+import android.media.AudioAttributes
+import android.media.AudioDeviceInfo
+import android.media.AudioFocusRequest
+import android.media.AudioManager
+import android.media.SoundPool
+import android.os.Build
+import android.os.SystemClock
+import android.util.Log
+import androidx.annotation.RequiresApi
+import me.kavishdevar.aln.R
+import java.util.concurrent.atomic.AtomicBoolean
+
+/**
+ * Audio feedback for head gestures using efficient SoundPool API
+ * - Simple audio cues for direction
+ * - Strict channel separation for clarity
+ * - Optimized for low latency
+ */
+@RequiresApi(Build.VERSION_CODES.Q)
+class GestureFeedback(private val context: Context) {
+
+ private val TAG = "GestureFeedback"
+
+ private val soundsLoaded = AtomicBoolean(false)
+
+ private fun forceBluetoothRouting(audioManager: AudioManager) {
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
+ val bluetoothDevice = devices.find {
+ it.type == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP ||
+ it.type == AudioDeviceInfo.TYPE_BLUETOOTH_SCO
+ }
+
+ bluetoothDevice?.let { device ->
+ val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
+ .setAudioAttributes(AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .build())
+ .build()
+
+ audioManager.requestAudioFocus(focusRequest)
+
+ if (!audioManager.isBluetoothScoOn) {
+ audioManager.isBluetoothScoOn = true
+ audioManager.startBluetoothSco()
+ }
+
+ Log.d(TAG, "Forced audio routing to Bluetooth device")
+ }
+ } else {
+ if (!audioManager.isBluetoothScoOn) {
+ audioManager.isBluetoothScoOn = true
+ audioManager.startBluetoothSco()
+ Log.d(TAG, "Started Bluetooth SCO")
+ }
+ }
+ } catch (e: Exception) {
+ Log.e(TAG, "Failed to force Bluetooth routing", e)
+ }
+ }
+
+ private val soundPool = SoundPool.Builder()
+ .setMaxStreams(3)
+ .setAudioAttributes(
+ AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setFlags(AudioAttributes.FLAG_LOW_LATENCY or
+ AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
+ .build()
+ )
+ .build()
+
+
+ private var soundId = 0
+ private var confirmYesId = 0
+ private var confirmNoId = 0
+
+ private var lastHorizontalTime = 0L
+ private var lastLeftTime = 0L
+ private var lastRightTime = 0L
+
+ private var lastVerticalTime = 0L
+ private var lastUpTime = 0L
+ private var lastDownTime = 0L
+
+ private val MIN_TIME_BETWEEN_SOUNDS = 150L
+ private val MIN_TIME_BETWEEN_DIRECTION = 200L
+
+ private var currentHorizontalStreamId = 0
+ private var currentVerticalStreamId = 0
+
+
+ private val LEFT_VOLUME = Pair(1.0f, 0.0f)
+ private val RIGHT_VOLUME = Pair(0.0f, 1.0f)
+ private val VERTICAL_VOLUME = Pair(1.0f, 1.0f)
+
+ init {
+ soundId = soundPool.load(context, R.raw.blip_no, 1)
+ confirmYesId = soundPool.load(context, R.raw.confirm_yes, 1)
+ confirmNoId = soundPool.load(context, R.raw.confirm_no, 1)
+
+ soundPool.setOnLoadCompleteListener { _, _, _ ->
+ Log.d(TAG, "Sounds loaded")
+ soundsLoaded.set(true)
+
+ soundPool.play(soundId, 0.0f, 0.0f, 1, 0, 1.0f)
+ }
+ }
+
+ /**
+ * Play directional feedback sound with appropriate channel separation
+ * Optimized for minimal latency
+ */
+ @RequiresApi(Build.VERSION_CODES.R)
+ fun playDirectional(isVertical: Boolean, value: Double) {
+ if (!soundsLoaded.get()) {
+ Log.d(TAG, "Sounds not yet loaded, skipping playback")
+ return
+ }
+
+ val now = SystemClock.uptimeMillis()
+
+ if (isVertical) {
+ val isUp = value > 0
+
+ if (now - lastVerticalTime < MIN_TIME_BETWEEN_SOUNDS) {
+ Log.d(TAG, "Skipping vertical sound due to general vertical debounce")
+ return
+ }
+
+ if (isUp && now - lastUpTime < MIN_TIME_BETWEEN_DIRECTION) {
+ Log.d(TAG, "Skipping UP sound due to direction debounce")
+ return
+ }
+
+ if (!isUp && now - lastDownTime < MIN_TIME_BETWEEN_DIRECTION) {
+ Log.d(TAG, "Skipping DOWN sound due to direction debounce")
+ return
+ }
+
+ if (currentVerticalStreamId > 0) {
+ soundPool.stop(currentVerticalStreamId)
+ }
+
+ val (leftVol, rightVol) = VERTICAL_VOLUME
+
+ currentVerticalStreamId = soundPool.play(soundId, leftVol, rightVol, 1, 0, 1.0f)
+ Log.d(TAG, "Playing VERTICAL sound: ${if (isUp) "UP" else "DOWN"} - streamID=$currentVerticalStreamId")
+
+ lastVerticalTime = now
+ if (isUp) {
+ lastUpTime = now
+ } else {
+ lastDownTime = now
+ }
+ } else {
+ if (now - lastHorizontalTime < MIN_TIME_BETWEEN_SOUNDS) {
+ Log.d(TAG, "Skipping horizontal sound due to general horizontal debounce")
+ return
+ }
+
+ val isRight = value > 0
+
+ if (isRight && now - lastRightTime < MIN_TIME_BETWEEN_DIRECTION) {
+ Log.d(TAG, "Skipping RIGHT sound due to direction debounce")
+ return
+ }
+
+ if (!isRight && now - lastLeftTime < MIN_TIME_BETWEEN_DIRECTION) {
+ Log.d(TAG, "Skipping LEFT sound due to direction debounce")
+ return
+ }
+
+ if (currentHorizontalStreamId > 0) {
+ soundPool.stop(currentHorizontalStreamId)
+ }
+
+ val (leftVol, rightVol) = if (isRight) RIGHT_VOLUME else LEFT_VOLUME
+
+ currentHorizontalStreamId = soundPool.play(soundId, leftVol, rightVol, 1, 0, 1.0f)
+ Log.d(TAG, "Playing HORIZONTAL sound: ${if (isRight) "RIGHT" else "LEFT"} - streamID=$currentHorizontalStreamId")
+
+ lastHorizontalTime = now
+ if (isRight) {
+ lastRightTime = now
+ } else {
+ lastLeftTime = now
+ }
+ }
+ }
+
+ /**
+ * Play confirmation sound for completed gesture
+ */
+ fun playConfirmation(isYes: Boolean) {
+ if (currentHorizontalStreamId > 0) {
+ soundPool.stop(currentHorizontalStreamId)
+ }
+ if (currentVerticalStreamId > 0) {
+ soundPool.stop(currentVerticalStreamId)
+ }
+
+ val soundId = if (isYes) confirmYesId else confirmNoId
+ if (soundId != 0 && soundsLoaded.get()) {
+ val streamId = soundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f)
+ Log.d(TAG, "Playing ${if (isYes) "YES" else "NO"} confirmation - streamID=$streamId")
+ }
+ }
+
+ /**
+ * Clean up resources
+ */
+ fun release() {
+ try {
+ soundPool.release()
+ } catch (e: Exception) {
+ Log.e(TAG, "Error releasing resources", e)
+ }
+ }
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/HeadOrientation.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/HeadOrientation.kt
new file mode 100644
index 0000000..b266777
--- /dev/null
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/HeadOrientation.kt
@@ -0,0 +1,84 @@
+package me.kavishdevar.aln.utils
+
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlin.math.roundToInt
+
+data class Orientation(val pitch: Float = 0f, val yaw: Float = 0f)
+data class Acceleration(val vertical: Float = 0f, val horizontal: Float = 0f)
+
+object HeadTracking {
+ private val _orientation = MutableStateFlow(Orientation())
+ val orientation = _orientation.asStateFlow()
+
+ private val _acceleration = MutableStateFlow(Acceleration())
+ val acceleration = _acceleration.asStateFlow()
+
+ private val calibrationSamples = mutableListOf>()
+ private var isCalibrated = false
+ private var o1Neutral = 19000
+ private var o2Neutral = 0
+ private var o3Neutral = 0
+
+ private const val CALIBRATION_SAMPLE_COUNT = 10
+ private const val ORIENTATION_OFFSET = 5500
+
+ fun processPacket(packet: ByteArray) {
+ val o1 = bytesToInt(packet[43], packet[44])
+ val o2 = bytesToInt(packet[45], packet[46])
+ val o3 = bytesToInt(packet[47], packet[48])
+
+ val horizontalAccel = bytesToInt(packet[51], packet[52]).toFloat()
+ val verticalAccel = bytesToInt(packet[53], packet[54]).toFloat()
+
+ if (!isCalibrated) {
+ calibrationSamples.add(Triple(o1, o2, o3))
+ if (calibrationSamples.size >= CALIBRATION_SAMPLE_COUNT) {
+ calibrate()
+ }
+ return
+ }
+
+ val orientation = calculateOrientation(o1, o2, o3)
+ _orientation.value = orientation
+
+ _acceleration.value = Acceleration(verticalAccel, horizontalAccel)
+ }
+
+ private fun calibrate() {
+ if (calibrationSamples.size < 3) return
+
+ // Add offset during calibration
+ o1Neutral = calibrationSamples.map { it.first + ORIENTATION_OFFSET }.average().roundToInt()
+ o2Neutral = calibrationSamples.map { it.second + ORIENTATION_OFFSET }.average().roundToInt()
+ o3Neutral = calibrationSamples.map { it.third + ORIENTATION_OFFSET }.average().roundToInt()
+
+ isCalibrated = true
+ }
+
+ @Suppress("UnusedVariable")
+ private fun calculateOrientation(o1: Int, o2: Int, o3: Int): Orientation {
+ if (!isCalibrated) return Orientation()
+
+ // Add offset before normalizationval
+ val o1Norm = (o1 + ORIENTATION_OFFSET) - o1Neutral
+ val o2Norm = (o2 + ORIENTATION_OFFSET) - o2Neutral
+ val o3Norm = (o3 + ORIENTATION_OFFSET) - o3Neutral
+
+ val pitch = (o2Norm + o3Norm) / 2f / 32000f * 180f
+ val yaw = (o2Norm - o3Norm) / 2f / 32000f * 180f
+
+ return Orientation(pitch, yaw)
+ }
+
+ private fun bytesToInt(b1: Byte, b2: Byte): Int {
+ return (b2.toInt() shl 8) or (b1.toInt() and 0xFF)
+ }
+
+ fun reset() {
+ calibrationSamples.clear()
+ isCalibrated = false
+ _orientation.value = Orientation()
+ _acceleration.value = Acceleration()
+ }
+}
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/IslandWindow.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/IslandWindow.kt
index 3406f0a..e696277 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/utils/IslandWindow.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/IslandWindow.kt
@@ -45,7 +45,8 @@ import me.kavishdevar.aln.services.ServiceManager
enum class IslandType {
CONNECTED,
TAKING_OVER,
- MOVED_TO_REMOTE
+ MOVED_TO_REMOTE,
+// CALL_GESTURE
}
class IslandWindow(context: Context) {
@@ -84,14 +85,20 @@ class IslandWindow(context: Context) {
close()
}
- if (type == IslandType.TAKING_OVER) {
- islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_taking_over_text)
- } else if (type == IslandType.MOVED_TO_REMOTE) {
- islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_moved_to_remote_text)
- } else if (CrossDevice.isAvailable) {
- islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_connected_remote_text)
- } else if (type == IslandType.CONNECTED) {
- islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_connected_text)
+ when (type) {
+ IslandType.CONNECTED -> {
+ islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_connected_text)
+ }
+ IslandType.TAKING_OVER -> {
+ islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_taking_over_text)
+ }
+ IslandType.MOVED_TO_REMOTE -> {
+ islandView.findViewById(R.id.island_connected_text).text = getString(context, R.string.island_moved_to_remote_text)
+ }
+// IslandType.CALL_GESTURE -> {
+// islandView.findViewById(R.id.island_connected_text).text = "Incoming Call from $name"
+// islandView.findViewById(R.id.island_device_name).text = "Use Head Gestures to answer."
+// }
}
val batteryProgressBar = islandView.findViewById(R.id.island_battery_progress)
diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/Packets.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/Packets.kt
index 61891d9..7b34daa 100644
--- a/android/app/src/main/java/me/kavishdevar/aln/utils/Packets.kt
+++ b/android/app/src/main/java/me/kavishdevar/aln/utils/Packets.kt
@@ -45,7 +45,9 @@ enum class Enums(val value: ByteArray) {
NOISE_CANCELLATION_ADAPTIVE(NOISE_CANCELLATION_PREFIX.value + Capabilities.NoiseCancellation.ADAPTIVE.value + SUFFIX.value),
SET_CONVERSATION_AWARENESS_OFF(PREFIX.value + SETTINGS.value + CONVERSATION_AWARENESS.value + Capabilities.ConversationAwareness.OFF.value + SUFFIX.value),
SET_CONVERSATION_AWARENESS_ON(PREFIX.value + SETTINGS.value + CONVERSATION_AWARENESS.value + Capabilities.ConversationAwareness.ON.value + SUFFIX.value),
- CONVERSATION_AWARENESS_RECEIVE_PREFIX(PREFIX.value + byteArrayOf(0x4b, 0x00, 0x02, 0x00));
+ CONVERSATION_AWARENESS_RECEIVE_PREFIX(PREFIX.value + byteArrayOf(0x4b, 0x00, 0x02, 0x00)),
+ START_HEAD_TRACKING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0xA1.toByte(), 0x02, 0x42, 0x0B, 0x08, 0x0E, 0x10, 0x02, 0x1A, 0x05, 0x01, 0x40, 0x9C.toByte(), 0x00, 0x00)),
+ STOP_HEAD_TRACKING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x08, 0x7E.toByte(), 0x10, 0x02, 0x42, 0x0B, 0x08, 0x4E.toByte(), 0x10, 0x02, 0x1A, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00));
}
object BatteryComponent {
@@ -241,36 +243,105 @@ class Capabilities {
}
}
-enum class LongPressMode {
- OFF, TRANSPARENCY, ADAPTIVE, ANC
+enum class LongPressPackets(val value: ByteArray) {
+ ENABLE_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0F, 0x00, 0x00, 0x00)),
+
+ DISABLE_OFF_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
+ DISABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0c, 0x00, 0x00, 0x00)),
+ DISABLE_OFF_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
+ DISABLE_OFF_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0a, 0x00, 0x00, 0x00)),
+
+ ENABLE_OFF_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
+ ENABLE_OFF_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
+ ENABLE_OFF_FROM_TRANSPARENCY_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
+
+ DISABLE_TRANSPARENCY_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
+ DISABLE_TRANSPARENCY_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x03, 0x00, 0x00, 0x00)),
+ DISABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0a, 0x00, 0x00, 0x00)),
+ DISABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x09, 0x00, 0x00, 0x00)),
+
+ ENABLE_TRANSPARENCY_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
+ ENABLE_TRANSPARENCY_FROM_ADAPTIVE_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
+ ENABLE_TRANSPARENCY_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
+
+ DISABLE_ANC_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0D, 0x00, 0x00, 0x00)),
+ DISABLE_ANC_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x05, 0x00, 0x00, 0x00)),
+ DISABLE_ANC_FROM_ADAPTIVE_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0c, 0x00, 0x00, 0x00)),
+ DISABLE_ANC_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x09, 0x00, 0x00, 0x00)),
+
+ ENABLE_ANC_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
+ ENABLE_ANC_FROM_ADAPTIVE_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
+ ENABLE_ANC_FROM_OFF_AND_ADAPTIVE(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
+
+ DISABLE_ADAPTIVE_FROM_EVERYTHING(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x07, 0x00, 0x00, 0x00)),
+ DISABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x05, 0x00, 0x00, 0x00)),
+ DISABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
+ DISABLE_ADAPTIVE_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x03, 0x00, 0x00, 0x00)),
+
+ ENABLE_ADAPTIVE_FROM_OFF_AND_TRANSPARENCY(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0d, 0x00, 0x00, 0x00)),
+ ENABLE_ADAPTIVE_FROM_TRANSPARENCY_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0e, 0x00, 0x00, 0x00)),
+ ENABLE_ADAPTIVE_FROM_OFF_AND_ANC(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0b, 0x00, 0x00, 0x00)),
+
+ ENABLE_EVERYTHING_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0E, 0x00, 0x00, 0x00)),
+ DISABLE_TRANSPARENCY_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0A, 0x00, 0x00, 0x00)),
+ DISABLE_ADAPTIVE_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x06, 0x00, 0x00, 0x00)),
+ DISABLE_ANC_OFF_DISABLED(byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A, 0x0C, 0x00, 0x00, 0x00)),
}
-data class LongPressPacket(val modes: Set) {
- val value: ByteArray
- get() {
- val baseArray = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A)
- val modeByte = calculateModeByte()
- return baseArray + byteArrayOf(modeByte, 0x00, 0x00, 0x00)
- }
+//enum class LongPressMode {
+// OFF, TRANSPARENCY, ADAPTIVE, ANC
+//}
+//
+//data class LongPressPacket(val modes: Set) {
+// val value: ByteArray
+// get() {
+// val baseArray = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1A)
+// val modeByte = calculateModeByte()
+// return baseArray + byteArrayOf(modeByte, 0x00, 0x00, 0x00)
+// }
+//
+// private fun calculateModeByte(): Byte {
+// var modeByte: Byte = 0x00
+// modes.forEach { mode ->
+// modeByte = when (mode) {
+// LongPressMode.OFF -> (modeByte + 0x01).toByte()
+// LongPressMode.TRANSPARENCY -> (modeByte + 0x02).toByte()
+// LongPressMode.ADAPTIVE -> (modeByte + 0x04).toByte()
+// LongPressMode.ANC -> (modeByte + 0x08).toByte()
+// }
+// }
+// return modeByte
+// }
+//}
+//
+//fun determinePacket(changedIndex: Int, newEnabled: Boolean, oldModes: Set, newModes: Set): ByteArray? {
+// return if (newEnabled) {
+// LongPressPacket(oldModes + newModes.elementAt(changedIndex)).value
+// } else {
+// LongPressPacket(oldModes - newModes.elementAt(changedIndex)).value
+// }
+//}
- private fun calculateModeByte(): Byte {
- var modeByte: Byte = 0x00
- modes.forEach { mode ->
- modeByte = when (mode) {
- LongPressMode.OFF -> (modeByte + 0x01).toByte()
- LongPressMode.TRANSPARENCY -> (modeByte + 0x02).toByte()
- LongPressMode.ADAPTIVE -> (modeByte + 0x04).toByte()
- LongPressMode.ANC -> (modeByte + 0x08).toByte()
- }
- }
- return modeByte
+fun isHeadTrackingData(data: ByteArray): Boolean {
+ // Check minimum size requirement first for efficiency
+ if (data.size <= 60) return false
+
+ // Check if the first 10 bytes match
+ val prefixPattern = byteArrayOf(
+ 0x04, 0x00, 0x04, 0x00, 0x17, 0x00, 0x00, 0x00,
+ 0x10, 0x00
+ )
+
+ // Check prefix (first 10 bytes)
+ for (i in prefixPattern.indices) {
+ if (data[i] != prefixPattern[i].toByte()) return false
}
-}
-fun determinePacket(changedIndex: Int, newEnabled: Boolean, oldModes: Set, newModes: Set): ByteArray? {
- return if (newEnabled) {
- LongPressPacket(oldModes + newModes.elementAt(changedIndex)).value
- } else {
- LongPressPacket(oldModes - newModes.elementAt(changedIndex)).value
- }
+ // Check if byte 11 is either 0x44 or 0x45
+ if (data[10] != 0x44.toByte() && data[10] != 0x45.toByte()) return false
+
+ // Check byte 12
+ if (data[11] != 0x00.toByte()) return false
+
+ return true
}
diff --git a/android/app/src/main/res/raw/blip_no.wav b/android/app/src/main/res/raw/blip_no.wav
new file mode 100644
index 0000000..d691f33
Binary files /dev/null and b/android/app/src/main/res/raw/blip_no.wav differ
diff --git a/android/app/src/main/res/raw/blip_yes.wav b/android/app/src/main/res/raw/blip_yes.wav
new file mode 100644
index 0000000..b796b59
Binary files /dev/null and b/android/app/src/main/res/raw/blip_yes.wav differ
diff --git a/android/app/src/main/res/raw/confirm_no.wav b/android/app/src/main/res/raw/confirm_no.wav
new file mode 100644
index 0000000..441b518
Binary files /dev/null and b/android/app/src/main/res/raw/confirm_no.wav differ
diff --git a/android/app/src/main/res/raw/confirm_yes.wav b/android/app/src/main/res/raw/confirm_yes.wav
new file mode 100644
index 0000000..0cfb139
Binary files /dev/null and b/android/app/src/main/res/raw/confirm_yes.wav differ
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 3661485..8969cae 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -17,6 +17,7 @@
Adaptive
Noise Cancellation
Press and Hold AirPods
+ Head Gestures
Left
Right
Adjusts the volume of media in response to your environment
@@ -46,4 +47,6 @@
Connected to Linux
Moved to phone
Moved to Linux
+ Head Tracking
+ Nod to answer calls, and shake your head to decline.
diff --git a/android/gradle/libs.versions.toml b/android/gradle/libs.versions.toml
index 9c76639..6d051a7 100644
--- a/android/gradle/libs.versions.toml
+++ b/android/gradle/libs.versions.toml
@@ -1,6 +1,6 @@
[versions]
accompanistPermissions = "0.36.0"
-agp = "8.8.0"
+agp = "8.8.2"
hiddenapibypass = "4.3"
kotlin = "2.0.0"
coreKtx = "1.15.0"
diff --git a/head-tracking/.gitignore b/head-tracking/.gitignore
deleted file mode 100644
index 51549fa..0000000
--- a/head-tracking/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-imgs
diff --git a/head-tracking/Extracted Data/1 - 1 to 4.png b/head-tracking/Extracted Data/1 - 1 to 4.png
deleted file mode 100644
index a0360ee..0000000
Binary files a/head-tracking/Extracted Data/1 - 1 to 4.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 13 to 16.png b/head-tracking/Extracted Data/1 - 13 to 16.png
deleted file mode 100644
index 60d52c1..0000000
Binary files a/head-tracking/Extracted Data/1 - 13 to 16.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 17 to 20.png b/head-tracking/Extracted Data/1 - 17 to 20.png
deleted file mode 100644
index 7b02990..0000000
Binary files a/head-tracking/Extracted Data/1 - 17 to 20.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 21 to 24.png b/head-tracking/Extracted Data/1 - 21 to 24.png
deleted file mode 100644
index 848eaac..0000000
Binary files a/head-tracking/Extracted Data/1 - 21 to 24.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 25 to 28.png b/head-tracking/Extracted Data/1 - 25 to 28.png
deleted file mode 100644
index cd10b1e..0000000
Binary files a/head-tracking/Extracted Data/1 - 25 to 28.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 29 to 32.png b/head-tracking/Extracted Data/1 - 29 to 32.png
deleted file mode 100644
index 8b46344..0000000
Binary files a/head-tracking/Extracted Data/1 - 29 to 32.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 33 to 36.png b/head-tracking/Extracted Data/1 - 33 to 36.png
deleted file mode 100644
index bcf8db2..0000000
Binary files a/head-tracking/Extracted Data/1 - 33 to 36.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 37 to 40.png b/head-tracking/Extracted Data/1 - 37 to 40.png
deleted file mode 100644
index e61d443..0000000
Binary files a/head-tracking/Extracted Data/1 - 37 to 40.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 41 to 44.png b/head-tracking/Extracted Data/1 - 41 to 44.png
deleted file mode 100644
index b7667fd..0000000
Binary files a/head-tracking/Extracted Data/1 - 41 to 44.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 5 to 8.png b/head-tracking/Extracted Data/1 - 5 to 8.png
deleted file mode 100644
index 1576902..0000000
Binary files a/head-tracking/Extracted Data/1 - 5 to 8.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1 - 9 to 12.png b/head-tracking/Extracted Data/1 - 9 to 12.png
deleted file mode 100644
index af4b3de..0000000
Binary files a/head-tracking/Extracted Data/1 - 9 to 12.png and /dev/null differ
diff --git a/head-tracking/Extracted Data/1.txt b/head-tracking/Extracted Data/1.txt
deleted file mode 100644
index 7dbbec8..0000000
--- a/head-tracking/Extracted Data/1.txt
+++ /dev/null
@@ -1,237 +0,0 @@
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 01 10 07 1A 3A 0E 00 01 C0 92 F4 B0 7A 14 00 00 06 04 83 A7 F2 99 76 00 00 00 00 DD 9B 6A E8 A7 DD FC FF F2 FF 05 00 23 83 00 0E 27 08 02 00 FD FF 00 00 84 FD E7 02 22 01 91 E3 1A 38 27 06 00 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 01 10 07 1A 3A 0E 00 01 F0 5B 58 B3 7A 14 00 00 06 04 83 45 8F 9A 76 00 00 00 00 D9 9B 67 E8 B0 DD F5 FF F3 FF 00 00 23 83 00 0E 27 08 00 00 F9 FF 01 00 84 FD E7 02 22 01 31 B4 1B 38 2F 06 3C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 01 10 07 1A 3A 0E 00 01 20 25 BC B5 7A 14 00 00 06 04 83 E3 2B 9B 76 00 00 00 00 D4 9B 5F E8 AD DD F8 FF F9 FF FA FF 23 83 00 0E 27 08 FE FF 01 00 03 00 85 FD E8 02 23 01 A0 6E E5 37 37 06 5A 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 01 10 07 1A 3A 0E 00 01 50 EE 1F B8 7A 14 00 00 06 04 43 81 C8 9B 76 00 00 00 00 D1 9B 56 E8 A7 DD 02 00 FB FF 01 00 23 83 00 0E 27 08 00 00 00 00 06 00 85 FD E8 02 24 01 C3 A0 3C 37 3F 06 78 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 01 10 07 1A 3A 0E 00 01 80 B7 83 BA 7A 14 00 00 06 04 43 1F 65 9C 76 00 00 00 00 CA 9B 4E E8 B4 DD FF FF EF FF 06 00 23 83 00 0E 27 08 FB FF 00 00 00 00 85 FD E8 02 25 01 55 CB 2C 37 47 06 95 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 01 10 07 1A 3A 0E 00 01 B0 80 E7 BC 7A 14 00 00 06 04 43 BD 01 9D 76 00 00 00 00 C1 9B 53 E8 BE DD FC FF 05 00 0B 00 23 83 00 0E 27 08 FA FF FE FF FD FF 85 FD E8 02 25 01 C7 BB 3E 37 4F 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 01 10 07 1A 3A 0E 00 01 E0 49 4B BF 7A 14 00 00 06 04 43 5B 9E 9D 76 00 00 00 00 BB 9B 63 E8 BB DD F8 FF 04 00 0F 00 23 83 00 0E 27 08 01 00 00 00 00 00 85 FD E8 02 26 01 37 5F 21 37 57 06 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 01 10 07 1A 3A 0E 00 01 F8 16 AF C1 7A 14 00 00 06 04 43 FA 3A 9E 76 00 00 00 00 BA 9B 6C E8 B9 DD FF FF FA FF 12 00 23 83 00 0E 27 08 00 00 01 00 00 00 85 FD E9 02 26 01 DA 2E 06 37 5F 06 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 01 10 07 1A 3A 0E 00 01 28 E0 12 C4 7A 14 00 00 06 04 43 98 D7 9E 76 00 00 00 00 B4 9B 77 E8 C6 DD 00 00 FD FF 0F 00 24 83 00 0E 27 08 00 00 00 00 00 00 86 FD E9 02 27 01 38 93 E2 36 67 06 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 01 10 07 1A 3A 0E 00 01 58 A9 76 C6 7A 14 00 00 06 04 43 36 74 9F 76 00 00 00 00 AC 9B 80 E8 D2 DD F9 FF 00 00 06 00 24 83 00 0E 27 08 FE FF FF FF 00 00 86 FD E9 02 27 01 3D 55 AF 36 6F 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 01 10 07 1A 3A 0E 00 01 88 72 DA C8 7A 14 00 00 06 04 43 D4 10 A0 76 00 00 00 00 AB 9B 86 E8 D5 DD FA FF F6 FF FF FF 24 83 00 0E 27 08 0B 00 F5 FF 05 00 87 FD E9 02 28 01 B9 28 81 37 77 06 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 01 10 07 1A 3A 0E 00 01 B8 3B 3E CB 7A 14 00 00 06 04 83 72 AD A0 76 00 00 00 00 A8 9B 7B E8 E0 DD 0E 00 FE FF 09 00 24 83 00 0E 27 08 FA FF 05 00 01 00 87 FD EA 02 28 01 CD 10 F0 37 7F 06 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 01 10 07 1A 3A 0E 00 01 E8 04 A2 CD 7A 14 00 00 06 04 83 10 4A A1 76 00 00 00 00 A8 9B 7E E8 EC DD 08 00 FD FF 0B 00 24 83 00 0E 27 08 FE FF 00 00 FD FF 87 FD EA 02 29 01 A1 90 F5 37 87 06 A2 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 01 10 07 1A 3A 0E 00 01 18 CE 05 D0 7A 14 00 00 06 04 83 AE E6 A1 76 00 00 00 00 A8 9B 98 E8 EC DD F9 FF 16 00 16 00 24 83 00 0E 27 08 FF FF FA FF FE FF 88 FD EA 02 29 01 17 76 01 38 8F 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 01 10 07 1A 3A 0E 00 01 30 9B 69 D2 7A 14 00 00 06 04 83 4D 83 A2 76 00 00 00 00 9D 9B BE E8 E5 DD EB FF 09 00 18 00 24 83 00 0E 27 08 02 00 02 00 04 00 88 FD EA 02 29 01 E8 4E 0E 38 97 06 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 01 10 07 1A 3A 0E 00 01 60 64 CD D4 7A 14 00 00 06 04 83 EB 1F A3 76 00 00 00 00 93 9B D6 E8 E6 DD FB FF FC FF 10 00 24 83 00 0E 27 08 02 00 07 00 05 00 89 FD EB 02 2A 01 85 7F 11 38 9F 06 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 01 10 07 1A 3A 0E 00 01 90 2D 31 D7 7A 14 00 00 06 04 83 89 BC A3 76 00 00 00 00 8F 9B DD E8 F7 DD 08 00 F4 FF 09 00 24 83 00 0E 27 08 05 00 00 00 02 00 8A FD EB 02 2B 01 F2 37 09 38 A7 06 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 01 10 07 1A 3A 0E 00 01 C0 F6 94 D9 7A 14 00 00 06 04 43 27 59 A4 76 00 00 00 00 8B 9B DB E8 12 DE 05 00 FA FF 0B 00 24 83 00 0E 27 08 FC FF 01 00 FD FF 8A FD EC 02 2B 01 55 45 5F 37 AF 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 01 10 07 1A 3A 0E 00 01 F0 BF F8 DB 7A 14 00 00 06 04 43 C5 F5 A4 76 00 00 00 00 84 9B E4 E8 23 DE F8 FF FA FF 0D 00 24 83 00 0E 27 08 00 00 FF FF FD FF 8B FD EC 02 2B 01 B5 DE 2F 37 B7 06 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 01 10 07 1A 3A 0E 00 01 20 89 5C DE 7A 14 00 00 06 04 43 63 92 A5 76 00 00 00 00 78 9B F2 E8 2D DE F0 FF FE FF 0C 00 24 83 00 0E 27 08 00 00 00 00 FD FF 8B FD EC 02 2B 01 18 EF 55 37 BF 06 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 01 10 07 1A 3A 0E 00 01 50 52 C0 E0 7A 14 00 00 06 04 43 01 2F A6 76 00 00 00 00 6D 9B FF E8 35 DE F8 FF F9 FF 0E 00 25 83 00 0E 27 08 00 00 06 00 00 00 8C FD ED 02 2C 01 C3 5C 2B 37 C7 06 A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 01 10 07 1A 3A 0E 00 01 80 1B 24 E3 7A 14 00 00 06 04 43 9F CB A6 76 00 00 00 00 65 9B 0F E9 41 DE F9 FF 00 00 10 00 25 83 00 0E 27 08 00 00 00 00 FD FF 8C FD ED 02 2C 01 34 5C 0F 37 CF 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 01 10 07 1A 3A 0E 00 01 98 E8 87 E5 7A 14 00 00 06 04 43 3E 68 A7 76 00 00 00 00 5F 9B 1B E9 3E DE F3 FF 0D 00 FC FF 25 83 00 0E 27 08 00 00 F8 FF FD FF 8D FD ED 02 2C 01 B8 BE 4C 37 D7 06 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 01 10 07 1A 3A 0E 00 01 C8 B1 EB E7 7A 14 00 00 06 04 43 DC 04 A8 76 00 00 00 00 5C 9B 20 E9 29 DE F8 FF 06 00 FC FF 25 83 00 0E 27 08 03 00 03 00 05 00 8E FD EE 02 2C 01 DC B4 66 37 DF 06 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 01 10 07 1A 3A 0E 00 01 F8 7A 4F EA 7A 14 00 00 06 04 43 7A A1 A8 76 00 00 00 00 57 9B 18 E9 29 DE 00 00 EE FF 04 00 25 83 00 0E 27 08 00 00 05 00 06 00 8E FD EE 02 2D 01 43 74 87 37 E7 06 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 01 10 07 1A 3A 0E 00 01 28 44 B3 EC 7A 14 00 00 06 04 43 18 3E A9 76 00 00 00 00 4F 9B 0D E9 41 DE FC FF E7 FF 00 00 25 83 00 0E 27 08 F5 FF 04 00 FF FF 8E FD EE 02 2E 01 CE B2 9B 37 EF 06 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 01 10 07 1A 3A 0E 00 01 58 0D 17 EF 7A 14 00 00 06 04 83 B6 DA A9 76 00 00 00 00 49 9B 12 E9 5B DE 00 00 FE FF 16 00 25 83 00 0E 27 08 F5 FF 03 00 01 00 8E FD EF 02 2E 01 8C 9C 3C 38 F7 06 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 01 10 07 1A 3A 0E 00 01 88 D6 7A F1 7A 14 00 00 06 04 83 54 77 AA 76 00 00 00 00 3F 9B 25 E9 78 DE 02 00 F1 FF 21 00 25 83 00 0E 27 08 FC FF 00 00 01 00 8F FD F0 02 2F 01 58 2C 51 38 FF 06 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 01 10 07 1A 3A 0E 00 01 B8 9F DE F3 7A 14 00 00 06 04 83 F2 13 AB 76 00 00 00 00 3C 9B 36 E9 8A DE FF FF 08 00 0E 00 25 83 00 0E 27 08 03 00 F7 FF FB FF 8F FD EF 02 2F 01 EB 6C 60 38 07 07 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 01 10 07 1A 3A 0E 00 01 D0 6C 42 F6 7A 14 00 00 06 04 83 91 B0 AB 76 00 00 00 00 38 9B 46 E9 86 DE F7 FF 03 00 09 00 25 83 00 0E 27 08 0C 00 FD FF 02 00 90 FD F0 02 2F 01 D6 9B 86 38 0F 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 01 10 07 1A 3A 0E 00 01 00 36 A6 F8 7A 14 00 00 06 04 83 2F 4D AC 76 00 00 00 00 2C 9B 52 E9 90 DE F7 FF F2 FF 10 00 25 83 00 0E 27 08 07 00 00 00 04 00 92 FD F0 02 30 01 78 07 8A 38 17 07 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 01 10 07 1A 3A 0E 00 01 30 FF 09 FB 7A 14 00 00 06 04 83 CD E9 AC 76 00 00 00 00 1C 9B 58 E9 A6 DE FF FF F5 FF 0A 00 25 83 00 0E 27 08 00 00 05 00 03 00 92 FD F1 02 31 01 10 43 89 38 1F 07 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 01 10 07 1A 3A 0E 00 01 60 C8 6D FD 7A 14 00 00 06 04 83 6B 86 AD 76 00 00 00 00 14 9B 60 E9 B7 DE 01 00 F7 FF 0E 00 26 83 00 0E 27 08 01 00 06 00 06 00 93 FD F1 02 31 01 3E 37 34 38 27 07 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 01 10 07 1A 3A 0E 00 01 90 91 D1 FF 7A 14 00 00 06 04 83 09 23 AE 76 00 00 00 00 0C 9B 67 E9 CD DE FF FF FA FF 0E 00 26 83 00 0E 27 08 00 00 01 00 00 00 94 FD F2 02 32 01 4A 35 0D 38 2F 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 01 10 07 1A 3A 0E 00 01 C0 5A 35 02 7B 14 00 00 06 04 83 A7 BF AE 76 00 00 00 00 07 9B 76 E9 D6 DE FD FF 05 00 0B 00 26 83 00 0E 27 08 00 00 00 00 00 00 94 FD F2 02 32 01 97 17 F9 37 37 07 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 01 10 07 1A 3A 0E 00 01 F0 23 99 04 7B 14 00 00 06 04 43 45 5C AF 76 00 00 00 00 05 9B 86 E9 D6 DE FD FF 05 00 08 00 26 83 00 0E 27 08 04 00 01 00 01 00 95 FD F3 02 33 01 78 A3 77 37 3F 07 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 01 10 07 1A 3A 0E 00 01 08 F1 FC 06 7B 14 00 00 06 04 43 E4 F8 AF 76 00 00 00 00 02 9B 92 E9 DC DE 01 00 FC FF 0F 00 26 83 00 0E 27 08 02 00 04 00 03 00 96 FD F3 02 34 01 05 E7 1C 37 47 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 01 10 07 1A 3A 0E 00 01 38 BA 60 09 7B 14 00 00 06 04 43 82 95 B0 76 00 00 00 00 F9 9A 9D E9 F3 DE FE FF F2 FF 13 00 26 83 00 0E 27 08 00 00 02 00 FE FF 97 FD F4 02 34 01 BE C7 EE 36 4F 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 01 10 07 1A 3A 0E 00 01 68 83 C4 0B 7B 14 00 00 06 04 43 20 32 B1 76 00 00 00 00 F0 9A AD E9 07 DF F7 FF FE FF 10 00 26 83 00 0E 27 08 00 00 FC FF FC FF 98 FD F4 02 34 01 E0 8B 83 36 57 07 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 01 10 07 1A 3A 0E 00 01 98 4C 28 0E 7B 14 00 00 06 04 43 BE CE B1 76 00 00 00 00 E7 9A BD E9 13 DF 04 00 00 00 0D 00 26 83 00 0E 27 08 07 00 F9 FF FE FF 98 FD F5 02 34 01 24 D0 FD 36 5F 07 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 01 10 07 1A 3A 0E 00 01 C8 15 8C 10 7B 14 00 00 06 04 83 5C 6B B2 76 00 00 00 00 E0 9A B8 E9 12 DF 00 00 FE FF FF FF 26 83 00 0E 27 08 FA FF 0E 00 01 00 99 FD F5 02 35 01 45 A0 1C 38 67 07 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 01 10 07 1A 3A 0E 00 01 F8 DE EF 12 7B 14 00 00 06 04 83 FA 07 B3 76 00 00 00 00 E6 9A BE E9 0C DF 00 00 02 00 00 00 26 83 00 0E 27 08 08 00 00 00 05 00 9A FD F5 02 35 01 E7 22 35 38 6F 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 01 10 07 1A 3A 0E 00 01 28 A8 53 15 7B 14 00 00 06 04 83 98 A4 B3 76 00 00 00 00 E1 9A B5 E9 1C DF FD FF EC FF 00 00 26 83 00 0E 27 08 03 00 FF FF 01 00 9B FD F6 02 36 01 6F F8 37 38 77 07 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 02 10 07 1A 3A 0E 00 01 40 75 B7 17 7B 14 00 00 06 04 83 37 41 B4 76 00 00 00 00 DC 9A AE E9 28 DF FE FF F9 FF 00 00 27 83 00 0E 27 08 01 00 FF FF 02 00 9C FD F6 02 37 01 12 6B 35 38 7F 07 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 02 10 07 1A 3A 0E 00 01 70 3E 1B 1A 7B 14 00 00 06 04 83 D5 DD B4 76 00 00 00 00 D4 9A AD E9 31 DF FB FF F7 FF 01 00 27 83 00 0E 27 08 01 00 00 00 05 00 9C FD F7 02 37 01 18 63 38 38 87 07 A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 02 10 07 1A 3A 0E 00 01 A0 07 7F 1C 7B 14 00 00 06 04 83 73 7A B5 76 00 00 00 00 D0 9A AE E9 38 DF FC FF FE FF FE FF 27 83 00 0E 27 08 00 00 FB FF 01 00 9D FD F7 02 38 01 6E 7B 38 38 8F 07 A2 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 02 10 07 1A 3A 0E 00 01 D0 D0 E2 1E 7B 14 00 00 06 04 43 11 17 B6 76 00 00 00 00 D0 9A AE E9 30 DF 02 00 07 00 FC FF 27 83 00 0E 27 08 FF FF 00 00 01 00 9D FD F7 02 38 01 6D 09 A1 37 97 07 91 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 02 10 07 1A 3A 0E 00 01 00 9A 46 21 7B 14 00 00 06 04 43 AF B3 B6 76 00 00 00 00 D3 9A B1 E9 24 DF FD FF 01 00 FD FF 27 83 00 0E 27 08 01 00 FD FF 02 00 9D FD F7 02 39 01 11 78 B8 36 9F 07 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 02 10 07 1A 3A 0E 00 01 30 63 AA 23 7B 14 00 00 06 04 43 4D 50 B7 76 00 00 00 00 D1 9A B0 E9 1F DF FD FF 05 00 FF FF 27 83 03 0E 27 08 FE FF FF FF FF FF 9E FD F7 02 39 01 BD EA 90 36 A7 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 02 10 07 1A 3A 0E 00 01 48 30 0E 26 7B 14 00 00 06 04 43 EC EC B7 76 00 00 00 00 CF 9A B3 E9 1A DF FD FF 01 00 03 00 27 83 03 0E 27 08 00 00 00 00 03 00 9E FD F7 02 39 01 0D 28 8B 36 AF 07 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 02 10 07 1A 3A 0E 00 01 78 F9 71 28 7B 14 00 00 06 04 43 8A 89 B8 76 00 00 00 00 CA 9A B4 E9 21 DF 01 00 F9 FF 06 00 27 83 03 0E 27 08 FE FF 02 00 02 00 9F FD F8 02 3A 01 58 E0 A5 36 B7 07 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 02 10 07 1A 3A 0E 00 01 A8 C2 D5 2A 7B 14 00 00 06 04 43 28 26 B9 76 00 00 00 00 C8 9A B5 E9 29 DF 04 00 00 00 01 00 27 83 03 0E 27 08 FD FF FF FF FF FF 9F FD F8 02 3A 01 A8 63 8F 36 BF 07 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 02 10 07 1A 3A 0E 00 01 D8 8B 39 2D 7B 14 00 00 06 04 43 C6 C2 B9 76 00 00 00 00 CA 9A B7 E9 2A DF 02 00 08 00 04 00 27 83 03 0E 27 08 FA FF 00 00 FB FF 9F FD F8 02 3A 01 5C CE 41 36 C7 07 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 02 10 07 1A 3A 0E 00 01 08 55 9D 2F 7B 14 00 00 06 04 43 64 5F BA 76 00 00 00 00 CA 9A CA E9 21 DF FC FF 10 00 11 00 27 83 03 0E 27 08 FD FF 07 00 00 00 9F FD F8 02 3A 01 E5 FF C3 36 CF 07 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 02 10 07 1A 3A 0E 00 01 38 1E 01 32 7B 14 00 00 06 04 43 02 FC BA 76 00 00 00 00 CA 9A E0 E9 1F DF F4 FF 01 00 01 00 27 83 03 0E 27 08 05 00 F8 FF 00 00 A0 FD F8 02 3A 01 24 22 97 37 D7 07 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 02 10 07 1A 3A 0E 00 01 68 E7 64 34 7B 14 00 00 06 04 43 A0 98 BB 76 00 00 00 00 CB 9A E6 E9 1F DF 06 00 07 00 09 00 28 83 03 0E 27 08 00 00 06 00 00 00 A0 FD F9 02 3B 01 68 90 D8 37 DF 07 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 02 10 07 1A 3A 0E 00 01 80 B4 C8 36 7B 14 00 00 06 04 43 3F 35 BC 76 00 00 00 00 CB 9A ED E9 2E DF 06 00 F0 FF 10 00 28 83 03 0E 27 08 07 00 01 00 01 00 A1 FD F9 02 3B 01 56 4A D7 37 E7 07 A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 02 10 07 1A 3A 0E 00 01 B0 7D 2C 39 7B 14 00 00 06 04 83 DD D1 BC 76 00 00 00 00 C4 9A EA E9 4B DF FF FF E6 FF 02 00 28 83 03 0E 27 08 04 00 FC FF FB FF A1 FD F9 02 3B 01 DC 7E 08 38 EF 07 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 02 10 07 1A 3A 0E 00 01 E0 46 90 3B 7B 14 00 00 06 04 83 7B 6E BD 76 00 00 00 00 BB 9A DD E9 5A DF F4 FF F6 FF F4 FF 28 83 03 0E 27 08 05 00 FD FF FC FF A2 FD F9 02 3B 01 E8 4C 2C 38 F7 07 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 02 10 07 1A 3A 0E 00 01 10 10 F4 3D 7B 14 00 00 06 04 83 19 0B BE 76 00 00 00 00 B0 9A CC E9 5E DF F9 FF EE FF F8 FF 28 83 03 0E 27 08 02 00 03 00 01 00 A3 FD FA 02 3B 01 A5 31 29 38 FF 07 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 02 10 07 1A 3A 0E 00 01 40 D9 57 40 7B 14 00 00 06 04 83 B7 A7 BE 76 00 00 00 00 AA 9A B6 E9 67 DF FA FF F2 FF F1 FF 28 83 03 0E 27 08 FA FF 00 00 02 00 A3 FD FA 02 3C 01 68 B1 FC 37 07 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 02 10 07 1A 3A 0E 00 01 70 A2 BB 42 7B 14 00 00 06 04 83 55 44 BF 76 00 00 00 00 AA 9A A4 E9 68 DF 04 00 00 00 F9 FF 28 83 03 0E 27 08 F8 FF 05 00 00 00 A3 FD FA 02 3C 01 12 83 00 38 0F 08 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 02 10 07 1A 3A 0E 00 01 88 6F 1F 45 7B 14 00 00 06 04 83 F4 E0 BF 76 00 00 00 00 AD 9A A3 E9 64 DF 01 00 07 00 01 00 28 83 03 0E 27 08 FB FF 00 00 00 00 A3 FD FA 02 3C 01 92 9E 0A 38 17 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 02 10 07 1A 3A 0E 00 01 B8 38 83 47 7B 14 00 00 06 04 83 92 7D C0 76 00 00 00 00 AF 9A AD E9 5C DF FC FF 0F 00 04 00 28 83 03 0E 27 08 FD FF FF FF FD FF A3 FD FA 02 3D 01 19 28 E5 37 1F 08 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 02 10 07 1A 3A 0E 00 01 E8 01 E7 49 7B 14 00 00 06 04 43 30 1A C1 76 00 00 00 00 B1 9A BF E9 4D DF FA FF 0C 00 07 00 28 83 03 0E 27 08 02 00 FF FF 00 00 A3 FD FA 02 3D 01 30 94 9D 37 27 08 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 02 10 07 1A 3A 0E 00 01 18 CB 4A 4C 7B 14 00 00 06 04 43 CE B6 C1 76 00 00 00 00 AD 9A CD E9 48 DF FE FF 03 00 08 00 28 83 03 0E 27 08 00 00 00 00 00 00 A3 FD FA 02 3D 01 C3 FF 90 37 2F 08 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 02 10 07 1A 3A 0E 00 01 48 94 AE 4E 7B 14 00 00 06 04 43 6C 53 C2 76 00 00 00 00 AB 9A D3 E9 43 DF F9 FF 05 00 FC FF 28 83 03 0E 27 08 FF FF FE FF FE FF A3 FD FA 02 3D 01 3C 6C 9D 37 37 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 02 10 07 1A 3A 0E 00 01 78 5D 12 51 7B 14 00 00 06 04 43 0A F0 C2 76 00 00 00 00 A8 9A D8 E9 3B DF FA FF 06 00 01 00 29 83 03 0E 27 08 00 00 00 00 00 00 A4 FD FA 02 3D 01 0E 05 31 37 3F 08 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 02 10 07 1A 3A 0E 00 01 90 2A 76 53 7B 14 00 00 06 04 43 A9 8C C3 76 00 00 00 00 A0 9A DF E9 36 DF F8 FF 00 00 04 00 29 83 03 0E 27 08 01 00 FE FF 00 00 A4 FD FA 02 3E 01 F1 81 AB 36 47 08 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 02 10 07 1A 3A 0E 00 01 C0 F3 D9 55 7B 14 00 00 06 04 43 47 29 C4 76 00 00 00 00 98 9A DC E9 33 DF F4 FF FC FF F6 FF 29 83 03 0E 27 08 FA FF 06 00 00 00 A4 FD FA 02 3E 01 5B 10 5D 37 4F 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 02 10 07 1A 3A 0E 00 01 F0 BC 3D 58 7B 14 00 00 06 04 83 E5 C5 C4 76 00 00 00 00 9B 9A DE E9 2F DF 07 00 06 00 05 00 29 83 03 0E 27 08 FE FF 04 00 04 00 A4 FD FA 02 3E 01 85 2E 02 38 57 08 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 02 10 07 1A 3A 0E 00 01 20 86 A1 5A 7B 14 00 00 06 04 83 83 62 C5 76 00 00 00 00 9C 9A DF E9 3A DF 01 00 F9 FF 04 00 29 83 03 0E 27 08 00 00 FE FF 01 00 A4 FD FA 02 3F 01 DA 50 03 38 5F 08 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 02 10 07 1A 3A 0E 00 01 50 4F 05 5D 7B 14 00 00 06 04 83 21 FF C5 76 00 00 00 00 9B 9A E1 E9 42 DF 01 00 04 00 05 00 29 83 03 0E 27 08 FF FF 00 00 FE FF A4 FD FA 02 3F 01 8E 5B F6 37 67 08 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 02 10 07 1A 3A 0E 00 01 80 18 69 5F 7B 14 00 00 06 04 83 BF 9B C6 76 00 00 00 00 99 9A E5 E9 42 DF FA FF FF FF 00 00 29 83 03 0E 27 08 05 00 FC FF 01 00 A4 FD FA 02 3F 01 14 D2 05 38 6F 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 02 10 07 1A 3A 0E 00 01 98 E5 CC 61 7B 14 00 00 06 04 83 5E 38 C7 76 00 00 00 00 95 9A E2 E9 45 DF 00 00 FA FF 00 00 29 83 03 0E 27 08 00 00 00 00 01 00 A5 FD FA 02 3F 01 6D 6A 03 38 77 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 02 10 07 1A 3A 0E 00 01 C8 AE 30 64 7B 14 00 00 06 04 83 FC D4 C7 76 00 00 00 00 90 9A D7 E9 46 DF FD FF 00 00 F3 FF 29 83 03 0E 27 08 FE FF FF FF FF FF A5 FD FA 02 3F 01 A2 B0 DB 37 7F 08 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 02 10 07 1A 3A 0E 00 01 F8 77 94 66 7B 14 00 00 06 04 43 9A 71 C8 76 00 00 00 00 92 9A CF E9 3A DF FC FF 04 00 F7 FF 29 83 03 0E 27 08 00 00 00 00 03 00 A5 FD FA 02 40 01 EE 73 F3 36 87 08 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 02 10 07 1A 3A 0E 00 01 28 41 F8 68 7B 14 00 00 06 04 43 38 0E C9 76 00 00 00 00 8F 9A CD E9 34 DF F8 FF FE FF FF FF 29 83 03 0E 27 08 FE FF 01 00 02 00 A5 FD FA 02 40 01 A4 32 C0 36 8F 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 02 10 07 1A 3A 0E 00 01 58 0A 5C 6B 7B 14 00 00 06 04 43 D6 AA C9 76 00 00 00 00 8C 9A D0 E9 32 DF FF FF 05 00 01 00 2A 83 03 0E 27 08 FF FF FD FF 02 00 A5 FD FA 02 40 01 47 7D F3 36 97 08 9D 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 02 10 07 1A 3A 0E 00 01 88 D3 BF 6D 7B 14 00 00 06 04 43 74 47 CA 76 00 00 00 00 8B 9A D4 E9 30 DF FF FF 00 00 01 00 2A 83 03 0E 27 08 00 00 01 00 04 00 A5 FD FA 02 41 01 68 53 DB 36 9F 08 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 02 10 07 1A 3A 0E 00 01 A0 A0 23 70 7B 14 00 00 06 04 43 13 E4 CA 76 00 00 00 00 8C 9A D6 E9 35 DF 05 00 00 00 07 00 2A 83 03 0E 27 08 FD FF FE FF FF FF A4 FD FA 02 41 01 6C CE 06 37 A7 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 02 10 07 1A 3A 0E 00 01 D0 69 87 72 7B 14 00 00 06 04 43 B1 80 CB 76 00 00 00 00 8E 9A DD E9 32 DF FC FF 06 00 00 00 2A 83 03 0E 27 08 01 00 FA FF FE FF A5 FD FA 02 41 01 17 D8 2C 37 AF 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 02 10 07 1A 3A 0E 00 01 00 33 EB 74 7B 14 00 00 06 04 43 4F 1D CC 76 00 00 00 00 8D 9A E5 E9 2B DF F8 FF 01 00 02 00 2A 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 41 01 37 8E 30 37 B7 08 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 02 10 07 1A 3A 0E 00 01 30 FC 4E 77 7B 14 00 00 06 04 43 ED B9 CC 76 00 00 00 00 8C 9A EF E9 2B DF 00 00 FE FF 02 00 2A 83 03 0E 27 08 06 00 F6 FF 00 00 A5 FD FA 02 41 01 6D 5D 9A 37 BF 08 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 02 10 07 1A 3A 0E 00 01 60 C5 B2 79 7B 14 00 00 06 04 83 8B 56 CD 76 00 00 00 00 86 9A E7 E9 2F DF 03 00 00 00 02 00 2A 83 03 0E 27 08 F6 FF 08 00 FF FF A5 FD FA 02 41 01 48 62 EB 37 C7 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 02 10 07 1A 3A 0E 00 01 90 8E 16 7C 7B 14 00 00 06 04 83 29 F3 CD 76 00 00 00 00 88 9A EE E9 31 DF 00 00 FA FF 0A 00 2A 83 03 0E 27 08 01 00 01 00 03 00 A5 FD FA 02 42 01 8A 3E 00 38 CF 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 02 10 07 1A 3A 0E 00 01 A8 5B 7A 7E 7B 14 00 00 06 04 83 C8 8F CE 76 00 00 00 00 80 9A F3 E9 41 DF F7 FF F9 FF 0A 00 2A 83 03 0E 27 08 FC FF FF FF FD FF A5 FD FA 02 42 01 24 FD E6 37 D7 08 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 02 10 07 1A 3A 0E 00 01 D8 24 DE 80 7B 14 00 00 06 04 83 66 2C CF 76 00 00 00 00 7B 9A 00 EA 41 DF FA FF 08 00 06 00 2A 83 03 0E 27 08 FF FF 00 00 01 00 A5 FD FA 02 42 01 48 E2 DA 37 DF 08 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 02 10 07 1A 3A 0E 00 01 08 EE 41 83 7B 14 00 00 06 04 43 04 C9 CF 76 00 00 00 00 78 9A 0B EA 3D DF FC FF 02 00 04 00 2A 83 03 0E 27 08 00 00 01 00 03 00 A5 FD FA 02 42 01 14 FF C8 37 E7 08 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 02 10 07 1A 3A 0E 00 01 38 B7 A5 85 7B 14 00 00 06 04 43 A2 65 D0 76 00 00 00 00 76 9A 13 EA 3C DF F9 FF FF FF 00 00 2A 83 03 0E 27 08 07 00 FC FF 01 00 A6 FD FA 02 42 01 CA 6A CA 37 EF 08 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 02 10 07 1A 3A 0E 00 01 68 80 09 88 7B 14 00 00 06 04 43 40 02 D1 76 00 00 00 00 74 9A 13 EA 39 DF 02 00 09 00 FE FF 2B 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 C4 34 54 37 F7 08 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 02 10 07 1A 3A 0E 00 01 98 49 6D 8A 7B 14 00 00 06 04 43 DE 9E D1 76 00 00 00 00 78 9A 14 EA 2F DF FE FF 03 00 FA FF 2B 83 03 0E 27 08 01 00 FD FF FF FF A6 FD FA 02 43 01 48 3F C9 36 FF 08 9B 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 02 10 07 1A 3A 0E 00 01 B0 16 D1 8C 7B 14 00 00 06 04 43 7D 3B D2 76 00 00 00 00 76 9A 14 EA 27 DF FC FF 00 00 01 00 2B 83 03 0E 27 08 FF FF 01 00 FF FF A6 FD FA 02 43 01 87 EA D7 36 07 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 02 10 07 1A 3A 0E 00 01 E0 DF 34 8F 7B 14 00 00 06 04 43 1B D8 D2 76 00 00 00 00 74 9A 1A EA 22 DF FF FF 04 00 00 00 2B 83 03 0E 27 08 00 00 00 00 02 00 A6 FD FA 02 43 01 F6 A7 DC 36 0F 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 02 10 07 1A 3A 0E 00 01 10 A9 98 91 7B 14 00 00 06 04 43 B9 74 D3 76 00 00 00 00 73 9A 18 EA 20 DF FE FF 00 00 FD FF 2B 83 03 0E 27 08 00 00 02 00 01 00 A6 FD FA 02 43 01 9A 79 E4 36 17 09 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 02 10 07 1A 3A 0E 00 01 40 72 FC 93 7B 14 00 00 06 04 43 57 11 D4 76 00 00 00 00 73 9A 14 EA 20 DF 03 00 FF FF FF FF 2B 83 03 0E 27 08 FE FF 00 00 FF FF A6 FD FA 02 43 01 CB 4F D2 36 1F 09 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 02 10 07 1A 3A 0E 00 01 70 3B 60 96 7B 14 00 00 06 04 43 F5 AD D4 76 00 00 00 00 75 9A 10 EA 1C DF FD FF 04 00 F8 FF 2B 83 03 0E 27 08 FF FF FC FF 00 00 A6 FD FA 02 43 01 98 22 B1 36 27 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 02 10 07 1A 3A 0E 00 01 A0 04 C4 98 7B 14 00 00 06 04 43 93 4A D5 76 00 00 00 00 74 9A 0C EA 15 DF FF FF 00 00 00 00 2B 83 03 0E 27 08 FD FF 01 00 01 00 A6 FD FA 02 43 01 44 83 CF 36 2F 09 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 02 10 07 1A 3A 0E 00 01 B8 D1 27 9B 7B 14 00 00 06 04 43 32 E7 D5 76 00 00 00 00 73 9A 0C EA 11 DF 02 00 05 00 03 00 2B 83 03 0E 27 08 FF FF 00 00 00 00 A6 FD FA 02 43 01 12 0A D5 36 37 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 02 10 07 1A 3A 0E 00 01 E8 9A 8B 9D 7B 14 00 00 06 04 43 D0 83 D6 76 00 00 00 00 74 9A 0A EA 0B DF F9 FF 01 00 F6 FF 2B 83 03 0E 27 08 F8 FF 04 00 00 00 A6 FD F9 02 43 01 C2 B9 5E 37 3F 09 9D 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 02 10 07 1A 3A 0E 00 01 18 64 EF 9F 7B 14 00 00 06 04 83 6E 20 D7 76 00 00 00 00 78 9A 11 EA 04 DF 00 00 0E 00 08 00 2B 83 03 0E 27 08 FA FF 00 00 01 00 A5 FD FA 02 44 01 D3 75 E1 37 47 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 02 10 07 1A 3A 0E 00 01 48 2D 53 A2 7B 14 00 00 06 04 83 0C BD D7 76 00 00 00 00 79 9A 1E EA 08 DF 00 00 00 00 0C 00 2C 83 03 0E 27 08 01 00 FC FF FF FF A5 FD FA 02 44 01 46 F5 E8 37 4F 09 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 02 10 07 1A 3A 0E 00 01 78 F6 B6 A4 7B 14 00 00 06 04 43 AA 59 D8 76 00 00 00 00 77 9A 2E EA 08 DF 01 00 0C 00 0B 00 2C 83 03 0E 27 08 00 00 00 00 00 00 A5 FD FA 02 44 01 1F C0 DF 37 57 09 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 02 10 07 1A 3A 0E 00 01 A8 BF 1A A7 7B 14 00 00 06 04 43 48 F6 D8 76 00 00 00 00 77 9A 3C EA 07 DF 00 00 01 00 09 00 2C 83 03 0E 27 08 04 00 03 00 03 00 A6 FD FA 02 44 01 9E 29 D6 37 5F 09 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 02 10 07 1A 3A 0E 00 01 C0 8C 7E A9 7B 14 00 00 06 04 43 E7 92 D9 76 00 00 00 00 77 9A 3E EA 0D DF 04 00 FA FF 02 00 2C 83 03 0E 27 08 04 00 FF FF 01 00 A6 FD FA 02 44 01 D6 89 CA 37 67 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 02 10 07 1A 3A 0E 00 01 F0 55 E2 AB 7B 14 00 00 06 04 83 85 2F DA 76 00 00 00 00 75 9A 34 EA 0F DF FC FF FE FF F1 FF 2C 83 03 0E 27 08 04 00 FE FF FC FF A6 FD FA 02 44 01 90 A7 DC 37 6F 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 02 10 07 1A 3A 0E 00 01 20 1F 46 AE 7B 14 00 00 06 04 43 23 CC DA 76 00 00 00 00 78 9A 27 EA 04 DF 03 00 03 00 F2 FF 2C 83 03 0E 27 08 01 00 00 00 03 00 A6 FD FA 02 44 01 24 73 3B 37 77 09 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 02 10 07 1A 3A 0E 00 01 50 E8 A9 B0 7B 14 00 00 06 04 43 C1 68 DB 76 00 00 00 00 7B 9A 18 EA FF DE 00 00 FA FF F6 FF 2C 83 03 0E 27 08 FE FF 00 00 02 00 A6 FD FA 02 44 01 1D 19 26 37 7F 09 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 02 10 07 1A 3A 0E 00 01 80 B1 0D B3 7B 14 00 00 06 04 43 5F 05 DC 76 00 00 00 00 7C 9A 12 EA FE DE 04 00 04 00 00 00 2C 83 03 0E 27 08 FC FF FF FF 00 00 A6 FD FA 02 44 01 39 75 3C 37 87 09 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C2 02 10 07 1A 3A 0E 00 01 98 7E 71 B5 7B 14 00 00 06 04 43 FE A1 DC 76 00 00 00 00 7D 9A 13 EA FE DE 00 00 02 00 01 00 2C 83 03 0E 27 08 FD FF FD FF 00 00 A6 FD F9 02 44 01 E5 EA 45 37 8F 09 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C3 02 10 07 1A 3A 0E 00 01 C8 47 D5 B7 7B 14 00 00 06 04 43 9C 3E DD 76 00 00 00 00 7D 9A 1A EA FC DE 01 00 06 00 08 00 2C 83 03 0E 27 08 F9 FF 00 00 FF FF A5 FD F9 02 44 01 DA 97 68 37 97 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C4 02 10 07 1A 3A 0E 00 01 F8 10 39 BA 7B 14 00 00 06 04 43 3A DB DD 76 00 00 00 00 81 9A 2A EA F5 DE 00 00 0B 00 09 00 2C 83 03 0E 27 08 01 00 FE FF 01 00 A5 FD F9 02 44 01 12 7A 10 37 9F 09 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C5 02 10 07 1A 3A 0E 00 01 28 DA 9C BC 7B 14 00 00 06 04 43 D8 77 DE 76 00 00 00 00 81 9A 35 EA F5 DE 04 00 00 00 09 00 2C 83 03 0E 27 08 00 00 01 00 00 00 A5 FD F9 02 44 01 92 33 EC 36 A7 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C6 02 10 07 1A 3A 0E 00 01 58 A3 00 BF 7B 14 00 00 06 04 43 76 14 DF 76 00 00 00 00 85 9A 3A EA FD DE 0A 00 02 00 04 00 2D 83 03 0E 27 08 FC FF 00 00 FB FF A5 FD F9 02 44 01 D8 CE 06 37 AF 09 A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C7 02 10 07 1A 3A 0E 00 01 88 6C 64 C1 7B 14 00 00 06 04 43 14 B1 DF 76 00 00 00 00 8B 9A 3D EA F4 DE 03 00 0E 00 FE FF 2D 83 03 0E 27 08 00 00 FF FF FD FF A5 FD F9 02 43 01 25 A8 D6 36 B7 09 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C8 02 10 07 1A 3A 0E 00 01 A0 39 C8 C3 7B 14 00 00 06 04 43 B3 4D E0 76 00 00 00 00 91 9A 3B EA EC DE F8 FF FB FF F4 FF 2D 83 03 0E 27 08 03 00 F8 FF FE FF A5 FD F9 02 43 01 E4 B1 A0 37 BF 09 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C9 02 10 07 1A 3A 0E 00 01 D0 02 2C C6 7B 14 00 00 06 04 83 51 EA E0 76 00 00 00 00 92 9A 30 EA E9 DE 05 00 03 00 00 00 2D 83 03 0E 27 08 FB FF 03 00 00 00 A5 FD F9 02 43 01 E3 99 D9 37 C7 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CA 02 10 07 1A 3A 0E 00 01 00 CC 8F C8 7B 14 00 00 06 04 43 EF 86 E1 76 00 00 00 00 92 9A 2C EA F1 DE 01 00 F3 FF 05 00 2D 83 03 0E 27 08 01 00 00 00 02 00 A5 FD F9 02 43 01 C4 9A D1 37 CF 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CB 02 10 07 1A 3A 0E 00 01 30 95 F3 CA 7B 14 00 00 06 04 83 8D 23 E2 76 00 00 00 00 8E 9A 2C EA 03 DF 05 00 FB FF 0C 00 2D 83 03 0E 27 08 FC FF FE FF FE FF A5 FD F9 02 43 01 F3 64 D5 37 D7 09 A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CC 02 10 07 1A 3A 0E 00 01 60 5E 57 CD 7B 14 00 00 06 04 83 2B C0 E2 76 00 00 00 00 8B 9A 33 EA 08 DF F7 FF 02 00 04 00 2D 83 03 0E 27 08 00 00 FD FF FF FF A5 FD F9 02 43 01 3A 44 E0 37 DF 09 A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CD 02 10 07 1A 3A 0E 00 01 78 2B BB CF 7B 14 00 00 06 04 83 CA 5C E3 76 00 00 00 00 86 9A 3E EA 07 DF FD FF 04 00 08 00 2D 83 03 0E 27 08 FD FF 03 00 FF FF A5 FD F9 02 43 01 0E C9 E4 37 E7 09 A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CE 02 10 07 1A 3A 0E 00 01 A8 F4 1E D2 7B 14 00 00 06 04 43 68 F9 E3 76 00 00 00 00 87 9A 4B EA FC DE FA FF 13 00 FC FF 2D 83 03 0E 27 08 00 00 FC FF FD FF A5 FD F9 02 42 01 85 9A B3 37 EF 09 A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 CF 02 10 07 1A 3A 0E 00 01 D8 BD 82 D4 7B 14 00 00 06 04 43 06 96 E4 76 00 00 00 00 8B 9A 51 EA E2 DE F8 FF 13 00 F9 FF 2D 83 03 0E 27 08 FF FF 02 00 FE FF A5 FD F9 02 42 01 A0 A9 42 37 F7 09 A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D0 02 10 07 1A 3A 0E 00 01 08 87 E6 D6 7B 14 00 00 06 04 43 A4 32 E5 76 00 00 00 00 8E 9A 58 EA CE DE F7 FF 0A 00 00 00 2D 83 03 0E 27 08 01 00 02 00 00 00 A5 FD FA 02 42 01 09 DC 57 37 FF 09 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D1 02 10 07 1A 3A 0E 00 01 38 50 4A D9 7B 14 00 00 06 04 43 42 CF E5 76 00 00 00 00 85 9A 68 EA CD DE F2 FF FF FF 0F 00 2D 83 03 0E 27 08 01 00 05 00 00 00 A5 FD FA 02 42 01 74 E1 79 37 07 0A A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D2 02 10 07 1A 3A 0E 00 01 68 19 AE DB 7B 14 00 00 06 04 43 E0 6B E6 76 00 00 00 00 78 9A 80 EA DB DE F8 FF FB FF 14 00 2E 83 03 0E 27 08 01 00 03 00 01 00 A5 FD FA 02 42 01 73 73 75 37 0F 0A A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D3 02 10 07 1A 3A 0E 00 01 80 E6 11 DE 7B 14 00 00 06 04 43 7F 08 E7 76 00 00 00 00 71 9A 90 EA EA DE FF FF FE FF 0D 00 2E 83 03 0E 27 08 02 00 FF FF FE FF A5 FD FA 02 42 01 FD 64 76 37 17 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D4 02 10 07 1A 3A 0E 00 01 B0 AF 75 E0 7B 14 00 00 06 04 43 1D A5 E7 76 00 00 00 00 6E 9A 96 EA F1 DE 03 00 00 00 03 00 2E 83 03 0E 27 08 00 00 00 00 00 00 A6 FD FA 02 42 01 85 02 43 37 1F 0A 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D5 02 10 07 1A 3A 0E 00 01 E0 78 D9 E2 7B 14 00 00 06 04 43 BB 41 E8 76 00 00 00 00 6F 9A 8E EA F0 DE 00 00 FE FF F4 FF 2E 83 03 0E 27 08 00 00 FE FF FF FF A6 FD FA 02 42 01 50 1D 52 37 27 0A A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D6 02 10 07 1A 3A 0E 00 01 10 42 3D E5 7B 14 00 00 06 04 43 59 DE E8 76 00 00 00 00 71 9A 7F EA F1 DE 05 00 F5 FF F9 FF 2E 83 03 0E 27 08 00 00 FF FF FF FF A6 FD FA 02 42 01 45 B6 2A 37 2F 0A A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D7 02 10 07 1A 3A 0E 00 01 40 0B A1 E7 7B 14 00 00 06 04 43 F7 7A E9 76 00 00 00 00 70 9A 74 EA F9 DE 0A 00 F9 FF 01 00 2E 83 03 0E 27 08 FC FF FC FF FE FF A6 FD FA 02 42 01 E4 9F 39 37 37 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D8 02 10 07 1A 3A 0E 00 01 58 D8 04 EA 7B 14 00 00 06 04 43 96 17 EA 76 00 00 00 00 6C 9A 66 EA F8 DE F4 FF F9 FF EF FF 2E 83 03 0E 27 08 F7 FF 01 00 FB FF A6 FD FA 02 42 01 D8 CC E5 37 3F 0A A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 D9 02 10 07 1A 3A 0E 00 01 88 A1 68 EC 7B 14 00 00 06 04 83 34 B4 EA 76 00 00 00 00 6E 9A 67 EA EF DE FC FF 01 00 01 00 2E 83 03 0E 27 08 00 00 03 00 05 00 A6 FD FA 02 42 01 75 41 28 38 47 0A A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DA 02 10 07 1A 3A 0E 00 01 B8 6A CC EE 7B 14 00 00 06 04 83 D2 50 EB 76 00 00 00 00 6A 9A 60 EA FF DE 00 00 F0 FF 01 00 2E 83 03 0E 27 08 00 00 F9 FF 00 00 A6 FD FA 02 42 01 7A 2B 2C 38 4F 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DB 02 10 07 1A 3A 0E 00 01 E8 33 30 F1 7B 14 00 00 06 04 83 70 ED EB 76 00 00 00 00 65 9A 5D EA 08 DF 00 00 00 00 06 00 2E 83 03 0E 27 08 FC FF FF FF FF FF A6 FD FA 02 42 01 D7 03 26 38 57 0A A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DC 02 10 07 1A 3A 0E 00 01 18 FD 93 F3 7B 14 00 00 06 04 83 0E 8A EC 76 00 00 00 00 5E 9A 69 EA 0A DF F6 FF 00 00 09 00 2E 83 03 0E 27 08 00 00 00 00 04 00 A6 FD FA 02 43 01 F1 AB 23 38 5F 0A 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DD 02 10 07 1A 3A 0E 00 01 30 CA F7 F5 7B 14 00 00 06 04 83 AD 26 ED 76 00 00 00 00 58 9A 74 EA 0F DF 00 00 02 00 0D 00 2F 83 03 0E 27 08 01 00 FC FF 03 00 A6 FD FA 02 43 01 2A 43 1A 38 67 0A A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DE 02 10 07 1A 3A 0E 00 01 60 93 5B F8 7B 14 00 00 06 04 43 4B C3 ED 76 00 00 00 00 54 9A 7B EA 11 DF 02 00 01 00 07 00 2F 83 03 0E 27 08 FD FF 04 00 02 00 A6 FD FA 02 43 01 80 4C BC 37 6F 0A A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 DF 02 10 07 1A 3A 0E 00 01 90 5C BF FA 7B 14 00 00 06 04 43 E9 5F EE 76 00 00 00 00 55 9A 86 EA 18 DF 06 00 04 00 10 00 2F 83 03 0E 27 08 FE FF 00 00 00 00 A6 FD FA 02 43 01 B6 51 49 37 77 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E0 02 10 07 1A 3A 0E 00 01 C0 25 23 FD 7B 14 00 00 06 04 43 87 FC EE 76 00 00 00 00 54 9A 96 EA 1F DF FF FF 07 00 12 00 2F 83 03 0E 27 08 FC FF 01 00 FF FF A6 FD FA 02 43 01 45 7E 2F 37 7F 0A 9B 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E1 02 10 07 1A 3A 0E 00 01 F0 EE 86 FF 7B 14 00 00 06 04 43 25 99 EF 76 00 00 00 00 52 9A AC EA 21 DF FF FF 05 00 0E 00 2F 83 03 0E 27 08 02 00 00 00 01 00 A6 FD FA 02 43 01 14 1E 0A 37 87 0A A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E2 02 10 07 1A 3A 0E 00 01 20 B8 EA 01 7C 14 00 00 06 04 43 C3 35 F0 76 00 00 00 00 4E 9A B4 EA 26 DF FC FF FC FF 05 00 2F 83 03 0E 27 08 01 00 00 00 00 00 A7 FD FB 02 44 01 E7 E1 25 37 8F 0A A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E3 02 10 07 1A 3A 0E 00 01 38 85 4E 04 7C 14 00 00 06 04 43 62 D2 F0 76 00 00 00 00 4B 9A B4 EA 2E DF FF FF FA FF 01 00 2F 83 03 0E 27 08 00 00 FE FF 00 00 A7 FD FB 02 44 01 50 23 1F 37 97 0A 91 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E4 02 10 07 1A 3A 0E 00 01 68 4E B2 06 7C 14 00 00 06 04 43 00 6F F1 76 00 00 00 00 47 9A AE EA 36 DF FD FF F7 FF FD FF 2F 83 03 0E 27 08 FE FF FF FF 00 00 A8 FD FB 02 44 01 DC 57 07 37 9F 0A A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E5 02 10 07 1A 3A 0E 00 01 98 17 16 09 7C 14 00 00 06 04 43 9E 0B F2 76 00 00 00 00 44 9A A6 EA 39 DF 00 00 FD FF FE FF 2F 83 03 0E 27 08 FE FF 01 00 01 00 A8 FD FB 02 44 01 CB E1 93 36 A7 0A A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E6 02 10 07 1A 3A 0E 00 01 C8 E0 79 0B 7C 14 00 00 06 04 43 3C A8 F2 76 00 00 00 00 40 9A A4 EA 3A DF 07 00 04 00 0A 00 2F 83 03 0E 27 08 FC FF 03 00 01 00 A8 FD FB 02 44 01 1E 35 16 37 AF 0A A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E7 02 10 07 1A 3A 0E 00 01 F8 A9 DD 0D 7C 14 00 00 06 04 43 DA 44 F3 76 00 00 00 00 3E 9A A3 EA 39 DF EF FF FD FF F3 FF 2F 83 03 0E 27 08 FA FF FE FF 00 00 A8 FD FB 02 44 01 0F F8 D8 37 B7 0A A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E8 02 10 07 1A 3A 0E 00 01 10 77 41 10 7C 14 00 00 06 04 83 79 E1 F3 76 00 00 00 00 41 9A A6 EA 29 DF 01 00 14 00 00 00 2F 83 03 0E 27 08 FE FF 04 00 04 00 A8 FD FB 02 45 01 17 BB 3E 38 BF 0A 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 E9 02 10 07 1A 3A 0E 00 01 40 40 A5 12 7C 14 00 00 06 04 83 17 7E F4 76 00 00 00 00 45 9A A5 EA 2E DF 0A 00 F4 FF 08 00 30 83 03 0E 27 08 03 00 FF FF 03 00 A8 FD FC 02 45 01 AC D9 40 38 C7 0A A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EA 02 10 07 1A 3A 0E 00 01 70 09 09 15 7C 14 00 00 06 04 83 B5 1A F5 76 00 00 00 00 45 9A A0 EA 3E DF 07 00 F9 FF 06 00 30 83 03 0E 27 08 FB FF FF FF FD FF A9 FD FB 02 45 01 2A 13 46 38 CF 0A A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EB 02 10 07 1A 3A 0E 00 01 A0 D2 6C 17 7C 14 00 00 06 04 83 53 B7 F5 76 00 00 00 00 42 9A A5 EA 42 DF FA FF 04 00 03 00 30 83 03 0E 27 08 FF FF FD FF FD FF A9 FD FB 02 45 01 58 03 4C 38 D7 0A 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EC 02 10 07 1A 3A 0E 00 01 D0 9B D0 19 7C 14 00 00 06 04 83 F1 53 F6 76 00 00 00 00 3D 9A A9 EA 42 DF FF FF 03 00 04 00 30 83 03 0E 27 08 FC FF 03 00 00 00 A9 FD FB 02 45 01 62 22 45 38 DF 0A 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 ED 02 10 07 1A 3A 0E 00 01 E8 68 34 1C 7C 14 00 00 06 04 83 90 F0 F6 76 00 00 00 00 3E 9A A6 EA 3B DF FF FF 04 00 F8 FF 30 83 03 0E 27 08 FF FF 03 00 00 00 A9 FD FC 02 45 01 8F 58 F8 37 E7 0A A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EE 02 10 07 1A 3A 0E 00 01 18 32 98 1E 7C 14 00 00 06 04 43 2E 8D F7 76 00 00 00 00 44 9A A2 EA 34 DF 03 00 02 00 FE FF 30 83 03 0E 27 08 FE FF 01 00 01 00 A9 FD FC 02 45 01 EA B8 3E 37 EF 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 EF 02 10 07 1A 3A 0E 00 01 48 FB FB 20 7C 14 00 00 06 04 43 CC 29 F8 76 00 00 00 00 48 9A A1 EA 35 DF 02 00 01 00 02 00 30 83 03 0E 27 08 FE FF FB FF FD FF A9 FD FC 02 45 01 0F 85 43 37 F7 0A A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F0 02 10 07 1A 3A 0E 00 01 78 C4 5F 23 7C 14 00 00 06 04 43 6A C6 F8 76 00 00 00 00 49 9A A6 EA 31 DF FC FF 09 00 00 00 30 83 03 0E 27 08 00 00 FA FF FD FF A9 FD FC 02 45 01 7E 66 65 37 FF 0A A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F1 02 10 07 1A 3A 0E 00 01 A8 8D C3 25 7C 14 00 00 06 04 43 08 63 F9 76 00 00 00 00 44 9A AE EA 2D DF F6 FF FB FF 07 00 30 83 03 0E 27 08 01 00 02 00 00 00 AA FD FC 02 45 01 FF 03 55 37 07 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F2 02 10 07 1A 3A 0E 00 01 D8 56 27 28 7C 14 00 00 06 04 43 A6 FF F9 76 00 00 00 00 3F 9A B7 EA 38 DF 02 00 FD FF 0B 00 30 83 03 0E 27 08 00 00 FF FF FF FF AA FD FC 02 45 01 68 B0 82 37 0F 0B A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F3 02 10 07 1A 3A 0E 00 01 F0 23 8B 2A 7C 14 00 00 06 04 43 45 9C FA 76 00 00 00 00 3A 9A BB EA 3B DF FC FF FD FF 01 00 30 83 03 0E 27 08 FD FF 03 00 00 00 AA FD FC 02 45 01 D1 D2 8C 37 17 0B A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F4 02 10 07 1A 3A 0E 00 01 20 ED EE 2C 7C 14 00 00 06 04 43 E3 38 FB 76 00 00 00 00 37 9A BD EA 3E DF FF FF 02 00 02 00 30 83 03 0E 27 08 FF FF 02 00 00 00 AA FD FC 02 45 01 30 73 93 37 1F 0B 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F5 02 10 07 1A 3A 0E 00 01 50 B6 52 2F 7C 14 00 00 06 04 43 81 D5 FB 76 00 00 00 00 35 9A BD EA 3B DF 06 00 03 00 02 00 31 83 03 0E 27 08 01 00 00 00 02 00 AA FD FC 02 45 01 34 C4 8E 37 27 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F6 02 10 07 1A 3A 0E 00 01 80 7F B6 31 7C 14 00 00 06 04 83 1F 72 FC 76 00 00 00 00 35 9A B2 EA 3A DF 00 00 F5 FF F6 FF 31 83 03 0E 27 08 FA FF 07 00 00 00 AA FD FC 02 46 01 98 63 F8 37 2F 0B A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F7 02 10 07 1A 3A 0E 00 01 B0 48 1A 34 7C 14 00 00 06 04 83 BD 0E FD 76 00 00 00 00 3F 9A AE EA 3B DF 09 00 08 00 01 00 31 83 03 0E 27 08 01 00 FE FF 01 00 AA FD FC 02 46 01 8C 32 2C 38 37 0B 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F8 02 10 07 1A 3A 0E 00 01 C8 15 7E 36 7C 14 00 00 06 04 83 5C AB FD 76 00 00 00 00 3A 9A AC EA 4B DF FA FF E7 FF 07 00 31 83 03 0E 27 08 01 00 00 00 00 00 AB FD FC 02 46 01 A0 A9 26 38 3F 0B 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 F9 02 10 07 1A 3A 0E 00 01 F8 DE E1 38 7C 14 00 00 06 04 83 FA 47 FE 76 00 00 00 00 31 9A AB EA 66 DF 00 00 04 00 08 00 31 83 03 0E 27 08 F6 FF FA FF F6 FF AA FD FC 02 46 01 6F 98 2B 38 47 0B A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FA 02 10 07 1A 3A 0E 00 01 28 A8 45 3B 7C 14 00 00 06 04 83 98 E4 FE 76 00 00 00 00 2E 9A B0 EA 5C DF F6 FF 00 00 FB FF 31 83 03 0E 27 08 03 00 01 00 00 00 AA FD FC 02 46 01 28 CB 2F 38 4F 0B A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FB 02 10 07 1A 3A 0E 00 01 58 71 A9 3D 7C 14 00 00 06 04 83 36 81 FF 76 00 00 00 00 2E 9A A9 EA 59 DF 05 00 FD FF 00 00 31 83 03 0E 27 08 FD FF 01 00 01 00 AB FD FC 02 46 01 50 B5 2F 38 57 0B A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FC 02 10 07 1A 3A 0E 00 01 88 3A 0D 40 7C 14 00 00 06 04 83 D4 1D 00 77 00 00 00 00 2F 9A 9F EA 55 DF FF FF 00 00 F5 FF 31 83 03 0E 27 08 FE FF 01 00 00 00 AB FD FC 02 46 01 4C BA 05 38 5F 0B A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FD 02 10 07 1A 3A 0E 00 01 A0 07 71 42 7C 14 00 00 06 04 43 73 BA 00 77 00 00 00 00 31 9A 9A EA 50 DF 01 00 03 00 01 00 31 83 03 0E 27 08 FB FF 01 00 00 00 AB FD FC 02 46 01 CD 66 8C 37 67 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FE 02 10 07 1A 3A 0E 00 01 D0 D0 D4 44 7C 14 00 00 06 04 43 11 57 01 77 00 00 00 00 33 9A 9C EA 52 DF 01 00 02 00 04 00 31 83 03 0E 27 08 FF FF FC FF 01 00 AB FD FC 02 46 01 53 35 78 37 6F 0B A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 FF 02 10 07 1A 3A 0E 00 01 00 9A 38 47 7C 14 00 00 06 04 43 AF F3 01 77 00 00 00 00 31 9A A1 EA 4F DF FA FF 03 00 03 00 31 83 03 0E 27 08 FE FF FE FF 00 00 AB FD FC 02 46 01 D8 9D 59 37 77 0B A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 80 03 10 07 1A 3A 0E 00 01 30 63 9C 49 7C 14 00 00 06 04 43 4D 90 02 77 00 00 00 00 2A 9A AA EA 52 DF F5 FF FA FF 08 00 32 83 03 0E 27 08 FC FF 00 00 00 00 AB FD FC 02 47 01 86 4A 18 37 7F 0B 9A 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 81 03 10 07 1A 3A 0E 00 01 60 2C 00 4C 7C 14 00 00 06 04 43 EB 2C 03 77 00 00 00 00 23 9A B4 EA 56 DF FE FF 09 00 05 00 32 83 03 0E 27 08 FB FF FD FF FD FF AA FD FC 02 47 01 CC E5 22 37 87 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 82 03 10 07 1A 3A 0E 00 01 78 F9 63 4E 7C 14 00 00 06 04 43 8A C9 03 77 00 00 00 00 24 9A B8 EA 4F DF 01 00 FB FF 00 00 32 83 03 0E 27 08 03 00 00 00 03 00 AB FD FC 02 47 01 6E 46 FE 36 8F 0B 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 83 03 10 07 1A 3A 0E 00 01 A8 C2 C7 50 7C 14 00 00 06 04 43 28 66 04 77 00 00 00 00 24 9A B3 EA 59 DF 01 00 F5 FF 04 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 47 01 54 C5 CE 36 97 0B 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 84 03 10 07 1A 3A 0E 00 01 D8 8B 2B 53 7C 14 00 00 06 04 43 C6 02 05 77 00 00 00 00 20 9A B3 EA 5F DF 03 00 08 00 04 00 32 83 03 0E 27 08 FF FF F8 FF FA FF AB FD FC 02 47 01 A3 DE E5 36 9F 0B 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 85 03 10 07 1A 3A 0E 00 01 08 55 8F 55 7C 14 00 00 06 04 83 64 9F 05 77 00 00 00 00 1B 9A B0 EA 58 DF F7 FF FC FF FA FF 32 83 03 0E 27 08 F9 FF 0B 00 00 00 AB FD FC 02 47 01 6C 63 DA 37 A7 0B A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 86 03 10 07 1A 3A 0E 00 01 38 1E F3 57 7C 14 00 00 06 04 83 02 3C 06 77 00 00 00 00 1D 9A B6 EA 54 DF 02 00 03 00 05 00 32 83 03 0E 27 08 00 00 00 00 03 00 AB FD FC 02 47 01 7F 7F 37 38 AF 0B A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 87 03 10 07 1A 3A 0E 00 01 50 EB 56 5A 7C 14 00 00 06 04 83 A1 D8 06 77 00 00 00 00 1B 9A B9 EA 5F DF F9 FF F8 FF 02 00 32 83 03 0E 27 08 00 00 FE FF FF FF AB FD FC 02 48 01 50 82 34 38 B7 0B 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 88 03 10 07 1A 3A 0E 00 01 80 B4 BA 5C 7C 14 00 00 06 04 83 3F 75 07 77 00 00 00 00 1A 9A C0 EA 61 DF FE FF 06 00 04 00 32 83 03 0E 27 08 02 00 FA FF 01 00 AC FD FC 02 48 01 1D D2 3C 38 BF 0B A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 89 03 10 07 1A 3A 0E 00 01 B0 7D 1E 5F 7C 14 00 00 06 04 83 DD 11 08 77 00 00 00 00 12 9A C6 EA 5F DF F3 FF FE FF 01 00 32 83 03 0E 27 08 01 00 00 00 02 00 AC FD FC 02 48 01 62 D5 45 38 C7 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8A 03 10 07 1A 3A 0E 00 01 E0 46 82 61 7C 14 00 00 06 04 83 7B AE 08 77 00 00 00 00 0E 9A C8 EA 64 DF 04 00 FD FF 04 00 32 83 03 0E 27 08 00 00 FE FF 00 00 AC FD FD 02 48 01 4F 78 51 38 CF 0B A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8B 03 10 07 1A 3A 0E 00 01 10 10 E6 63 7C 14 00 00 06 04 83 19 4B 09 77 00 00 00 00 0B 9A C4 EA 66 DF FF FF FD FF FC FF 32 83 03 0E 27 08 00 00 00 00 01 00 AC FD FC 02 49 01 C1 A9 16 38 D7 0B A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8C 03 10 07 1A 3A 0E 00 01 28 DD 49 66 7C 14 00 00 06 04 43 B8 E7 09 77 00 00 00 00 09 9A C1 EA 69 DF 06 00 FF FF 05 00 33 83 03 0E 27 08 FC FF 02 00 01 00 AC FD FD 02 49 01 5E 93 8F 37 DF 0B 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8D 03 10 07 1A 3A 0E 00 01 58 A6 AD 68 7C 14 00 00 06 04 43 56 84 0A 77 00 00 00 00 09 9A C3 EA 6A DF FB FF 00 00 FF FF 33 83 03 0E 27 08 00 00 FB FF 00 00 AC FD FC 02 49 01 18 B5 9F 37 E7 0B A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8E 03 10 07 1A 3A 0E 00 01 88 6F 11 6B 7C 14 00 00 06 04 43 F4 20 0B 77 00 00 00 00 04 9A C3 EA 68 DF F9 FF FB FF 00 00 33 83 03 0E 27 08 00 00 00 00 01 00 AD FD FC 02 49 01 8C 97 9F 37 EF 0B A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 8F 03 10 07 1A 3A 0E 00 01 B8 38 75 6D 7C 14 00 00 06 04 43 92 BD 0B 77 00 00 00 00 FF 99 C1 EA 6D DF FC FF FA FF FF FF 33 83 03 0E 27 08 00 00 FE FF 00 00 AD FD FC 02 49 01 3D C8 8E 37 F7 0B A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 90 03 10 07 1A 3A 0E 00 01 E8 01 D9 6F 7C 14 00 00 06 04 43 30 5A 0C 77 00 00 00 00 FA 99 BC EA 71 DF FD FF FC FF 00 00 33 83 03 0E 27 08 FD FF 01 00 01 00 AD FD FC 02 4A 01 39 33 7C 37 FF 0B 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 91 03 10 07 1A 3A 0E 00 01 00 CF 3C 72 7C 14 00 00 06 04 43 CF F6 0C 77 00 00 00 00 F5 99 BD EA 74 DF F8 FF FC FF 00 00 33 83 03 0E 27 08 FC FF FD FF 00 00 AD FD FC 02 4A 01 04 9C 5B 37 07 0C A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 92 03 10 07 1A 3A 0E 00 01 30 98 A0 74 7C 14 00 00 06 04 43 6D 93 0D 77 00 00 00 00 F2 99 C6 EA 77 DF FF FF 03 00 0A 00 33 83 03 0E 27 08 FF FF FF FF 01 00 AC FD FC 02 4A 01 7C E5 38 37 0F 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 93 03 10 07 1A 3A 0E 00 01 60 61 04 77 7C 14 00 00 06 04 43 0B 30 0E 77 00 00 00 00 ED 99 D4 EA 7B DF 04 00 03 00 14 00 33 83 03 0E 27 08 FF FF 01 00 02 00 AD FD FC 02 4A 01 64 D7 28 37 17 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 94 03 10 07 1A 3A 0E 00 01 90 2A 68 79 7C 14 00 00 06 04 43 A9 CC 0E 77 00 00 00 00 EA 99 DC EA 81 DF FB FF FF FF 03 00 33 83 03 0E 27 08 FA FF 04 00 FD FF AD FD FC 02 4A 01 3E 36 A1 37 1F 0C A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 95 03 10 07 1A 3A 0E 00 01 C0 F3 CB 7B 7C 14 00 00 06 04 43 47 69 0F 77 00 00 00 00 EC 99 EC EA 7E DF 00 00 10 00 0C 00 33 83 03 0E 27 08 00 00 03 00 01 00 AD FD FD 02 4B 01 5A 4D D8 37 27 0C A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 96 03 10 07 1A 3A 0E 00 01 D8 C0 2F 7E 7C 14 00 00 06 04 43 E6 05 10 77 00 00 00 00 EA 99 FA EA 86 DF FC FF F7 FF 0C 00 33 83 03 0E 27 08 03 00 FF FF 01 00 AD FD FD 02 4B 01 44 04 DE 37 2F 0C A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 97 03 10 07 1A 3A 0E 00 01 08 8A 93 80 7C 14 00 00 06 04 43 84 A2 10 77 00 00 00 00 E6 99 05 EB 94 DF 04 00 02 00 0D 00 33 83 03 0E 27 08 FF FF FF FF FD FF AE FD FD 02 4B 01 F4 D2 D7 37 37 0C 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 98 03 10 07 1A 3A 0E 00 01 38 53 F7 82 7C 14 00 00 06 04 83 22 3F 11 77 00 00 00 00 E2 99 10 EB 9B DF F7 FF FD FF 04 00 34 83 03 0E 27 08 05 00 FF FF 02 00 AE FD FD 02 4B 01 83 36 E0 37 3F 0C 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 99 03 10 07 1A 3A 0E 00 01 68 1C 5B 85 7C 14 00 00 06 04 83 C0 DB 11 77 00 00 00 00 DC 99 13 EB A2 DF 04 00 FC FF 05 00 34 83 03 0E 27 08 00 00 03 00 01 00 AF FD FD 02 4C 01 68 05 DB 37 47 0C A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9A 03 10 07 1A 3A 0E 00 01 80 E9 BE 87 7C 14 00 00 06 04 43 5F 78 12 77 00 00 00 00 DA 99 0F EB A7 DF FC FF FE FF FB FF 34 83 03 0E 27 08 FA FF FE FF FC FF AF FD FD 02 4C 01 06 7B 90 37 4F 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9B 03 10 07 1A 3A 0E 00 01 B0 B2 22 8A 7C 14 00 00 06 04 43 FD 14 13 77 00 00 00 00 D9 99 13 EB A0 DF FF FF 0C 00 04 00 34 83 03 0E 27 08 FA FF 02 00 FD FF AF FD FE 02 4C 01 A4 70 3D 37 57 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9C 03 10 07 1A 3A 0E 00 01 E0 7B 86 8C 7C 14 00 00 06 04 43 9B B1 13 77 00 00 00 00 D9 99 23 EB 92 DF F3 FF 0C 00 04 00 34 83 03 0E 27 08 00 00 FD FF FE FF AF FD FD 02 4C 01 A6 E2 37 37 5F 0C 9A 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9D 03 10 07 1A 3A 0E 00 01 10 45 EA 8E 7C 14 00 00 06 04 43 39 4E 14 77 00 00 00 00 D5 99 35 EB 85 DF FC FF 0A 00 08 00 34 83 03 0E 27 08 00 00 04 00 02 00 AF FD FE 02 4C 01 92 9A 39 37 67 0C A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9E 03 10 07 1A 3A 0E 00 01 40 0E 4E 91 7C 14 00 00 06 04 43 D7 EA 14 77 00 00 00 00 D6 99 3D EB 84 DF FF FF 02 00 03 00 34 83 03 0E 27 08 01 00 FE FF 00 00 B0 FD FE 02 4C 01 6B FD 15 37 6F 0C A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 9F 03 10 07 1A 3A 0E 00 01 58 DB B1 93 7C 14 00 00 06 04 43 76 87 15 77 00 00 00 00 D4 99 3F EB 83 DF 03 00 00 00 00 00 34 83 03 0E 27 08 05 00 06 00 03 00 B0 FD FE 02 4C 01 76 6B 0D 37 77 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A0 03 10 07 1A 3A 0E 00 01 88 A4 15 96 7C 14 00 00 06 04 43 14 24 16 77 00 00 00 00 DA 99 29 EB 8C DF 0B 00 E5 FF E9 FF 34 83 03 0E 27 08 0C 00 FF FF 01 00 B1 FD FE 02 4D 01 BF 8D 54 37 7F 0C A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A1 03 10 07 1A 3A 0E 00 01 B8 6D 79 98 7C 14 00 00 06 04 43 B2 C0 16 77 00 00 00 00 E1 99 FA EA 95 DF 0E 00 F6 FF E5 FF 34 83 03 0E 27 08 FE FF FD FF FA FF B1 FD FE 02 4D 01 6C 52 38 37 87 0C A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A2 03 10 07 1A 3A 0E 00 01 E8 36 DD 9A 7C 14 00 00 06 04 43 50 5D 17 77 00 00 00 00 E4 99 DB EA 93 DF 04 00 F7 FF F0 FF 34 83 03 0E 27 08 F7 FF 02 00 01 00 B1 FD FE 02 4D 01 29 8A 67 37 8F 0C A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A3 03 10 07 1A 3A 0E 00 01 18 00 41 9D 7C 14 00 00 06 04 43 EE F9 17 77 00 00 00 00 E5 99 C6 EA 94 DF F7 FF F3 FF ED FF 35 83 03 0E 27 08 F8 FF FB FF FF FF B1 FD FE 02 4D 01 74 A0 8D 37 97 0C 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A4 03 10 07 1A 3A 0E 00 01 30 CD A4 9F 7C 14 00 00 06 04 83 8D 96 18 77 00 00 00 00 E8 99 BC EA 92 DF 08 00 0E 00 05 00 35 83 03 0E 27 08 F2 FF 02 00 FD FF B0 FD FE 02 4D 01 55 E6 28 38 9F 0C 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A5 03 10 07 1A 3A 0E 00 01 60 96 08 A2 7C 14 00 00 06 04 83 2B 33 19 77 00 00 00 00 EC 99 C7 EA 90 DF 08 00 00 00 14 00 35 83 03 0E 27 08 FE FF 00 00 02 00 B0 FD FE 02 4D 01 EE 98 2F 38 A7 0C A4 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A6 03 10 07 1A 3A 0E 00 01 90 5F 6C A4 7C 14 00 00 06 04 83 C9 CF 19 77 00 00 00 00 ED 99 D5 EA 9C DF 06 00 00 00 11 00 35 83 03 0E 27 08 FD FF FA FF FB FF B0 FD FE 02 4D 01 FB 8D 29 38 AF 0C A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A7 03 10 07 1A 3A 0E 00 01 C0 28 D0 A6 7C 14 00 00 06 04 83 67 6C 1A 77 00 00 00 00 EE 99 E2 EA 9E DF FF FF 08 00 0A 00 35 83 03 0E 27 08 02 00 FC FF 00 00 B0 FD FD 02 4D 01 42 77 2C 38 B7 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A8 03 10 07 1A 3A 0E 00 01 F0 F1 33 A9 7C 14 00 00 06 04 83 05 09 1B 77 00 00 00 00 EA 99 ED EA A5 DF FD FF F5 FF 0D 00 35 83 03 0E 27 08 02 00 03 00 03 00 B0 FD FE 02 4D 01 C9 49 28 38 BF 0C 9E 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 A9 03 10 07 1A 3A 0E 00 01 08 BF 97 AB 7C 14 00 00 06 04 83 A4 A5 1B 77 00 00 00 00 E4 99 ED EA B6 DF FB FF F3 FF 01 00 35 83 03 0E 27 08 FE FF FF FF 01 00 B0 FD FE 02 4D 01 EA AE 15 38 C7 0C A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AA 03 10 07 1A 3A 0E 00 01 38 88 FB AD 7C 14 00 00 06 04 43 42 42 1C 77 00 00 00 00 E1 99 E9 EA C3 DF 05 00 FF FF 08 00 35 83 03 0E 27 08 FA FF 04 00 01 00 B0 FD FE 02 4D 01 D2 77 B1 37 CF 0C A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AB 03 10 07 1A 3A 0E 00 01 68 51 5F B0 7C 14 00 00 06 04 43 E0 DE 1C 77 00 00 00 00 E0 99 EE EA CF DF FC FF FE FF 0A 00 35 83 03 0E 27 08 FE FF FF FF 00 00 B1 FD FE 02 4D 01 BC D2 88 37 D7 0C A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AC 03 10 07 1A 3A 0E 00 01 98 1A C3 B2 7C 14 00 00 06 04 43 7E 7B 1D 77 00 00 00 00 DA 99 FF EA D9 DF FE FF 01 00 12 00 35 83 03 0E 27 08 FD FF 00 00 01 00 B1 FD FE 02 4E 01 85 3E 83 37 DF 0C A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AD 03 10 07 1A 3A 0E 00 01 C8 E3 26 B5 7C 14 00 00 06 04 43 1C 18 1E 77 00 00 00 00 D9 99 12 EB DD DF 00 00 05 00 0B 00 35 83 03 0E 27 08 02 00 FD FF FF FF B1 FD FE 02 4E 01 B1 61 5B 37 E7 0C A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AE 03 10 07 1A 3A 0E 00 01 E0 B0 8A B7 7C 14 00 00 06 04 43 BB B4 1E 77 00 00 00 00 DA 99 1F EB DB DF 02 00 05 00 07 00 35 83 03 0E 27 08 03 00 02 00 00 00 B2 FD FF 02 4E 01 15 00 47 37 EF 0C A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 AF 03 10 07 1A 3A 0E 00 01 10 7A EE B9 7C 14 00 00 06 04 43 59 51 1F 77 00 00 00 00 DD 99 21 EB E0 DF 07 00 FD FF 00 00 36 83 03 0E 27 08 00 00 00 00 FF FF B2 FD FF 02 4E 01 0D 18 2F 37 F7 0C 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B0 03 10 07 1A 3A 0E 00 01 40 43 52 BC 7C 14 00 00 06 04 43 F7 ED 1F 77 00 00 00 00 E0 99 19 EB E4 DF 03 00 FC FF FD FF 36 83 03 0E 27 08 00 00 FF FF FD FF B2 FD FF 02 4D 01 94 CE C7 36 FF 0C 9B 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B1 03 10 07 1A 3A 0E 00 01 70 0C B6 BE 7C 14 00 00 06 04 43 95 8A 20 77 00 00 00 00 DE 99 15 EB E8 DF FA FF 00 00 03 00 36 83 03 0E 27 08 F8 FF 02 00 FD FF B2 FD FF 02 4D 01 D5 65 A1 36 07 0D A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B2 03 10 07 1A 3A 0E 00 01 88 D9 19 C1 7C 14 00 00 06 04 43 34 27 21 77 00 00 00 00 DC 99 16 EB EC DF F6 FF F7 FF F8 FF 36 83 03 0E 27 08 02 00 F2 FF FC FF B3 FD FF 02 4D 01 BF 8D 85 37 0F 0D A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B3 03 10 07 1A 3A 0E 00 01 B8 A2 7D C3 7C 14 00 00 06 04 83 D2 C3 21 77 00 00 00 00 DA 99 0F EB E5 DF 04 00 0F 00 03 00 36 83 03 0E 27 08 F8 FF 06 00 00 00 B2 FD 00 03 4D 01 23 71 07 38 17 0D A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B4 03 10 07 1A 3A 0E 00 01 E8 6B E1 C5 7C 14 00 00 06 04 83 70 60 22 77 00 00 00 00 DC 99 18 EB E7 DF 09 00 F1 FF 10 00 36 83 03 0E 27 08 02 00 01 00 06 00 B3 FD 00 03 4E 01 77 EB 12 38 1F 0D A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B5 03 10 07 1A 3A 0E 00 01 18 35 45 C8 7C 14 00 00 06 04 83 0E FD 22 77 00 00 00 00 DA 99 1B EB FB DF 02 00 FB FF 0B 00 36 83 03 0E 27 08 FB FF FD FF FE FF B3 FD 00 03 4E 01 0B 1A 16 38 27 0D A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B6 03 10 07 1A 3A 0E 00 01 48 FE A8 CA 7C 14 00 00 06 04 83 AC 99 23 77 00 00 00 00 D7 99 25 EB 04 E0 00 00 01 00 0C 00 36 83 03 0E 27 08 FE FF FE FF 00 00 B3 FD 00 03 4E 01 57 B6 14 38 2F 0D A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B7 03 10 07 1A 3A 0E 00 01 60 CB 0C CD 7C 14 00 00 06 04 83 4B 36 24 77 00 00 00 00 D2 99 31 EB 0B E0 FC FF FC FF 08 00 36 83 03 0E 27 08 01 00 00 00 01 00 B4 FD 00 03 4E 01 3B 73 17 38 37 0D A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B8 03 10 07 1A 3A 0E 00 01 90 94 70 CF 7C 14 00 00 06 04 83 E9 D2 24 77 00 00 00 00 CE 99 34 EB 12 E0 FB FF FC FF 01 00 36 83 03 0E 27 08 FC FF 00 00 FF FF B4 FD 00 03 4E 01 03 A4 07 38 3F 0D A6 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 B9 03 10 07 1A 3A 0E 00 01 C0 5D D4 D1 7C 14 00 00 06 04 43 87 6F 25 77 00 00 00 00 CE 99 36 EB 17 E0 06 00 01 00 07 00 36 83 03 0E 27 08 FC FF 02 00 00 00 B4 FD 01 03 4E 01 B6 31 7D 37 47 0D A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BA 03 10 07 1A 3A 0E 00 01 F0 26 38 D4 7C 14 00 00 06 04 43 25 0C 26 77 00 00 00 00 D2 99 3C EB 1C E0 02 00 FF FF 05 00 37 83 03 0E 27 08 FE FF FE FF FF FF B5 FD 01 03 4E 01 D8 E1 05 37 4F 0D A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BB 03 10 07 1A 3A 0E 00 01 20 F0 9B D6 7C 14 00 00 06 04 43 C3 A8 26 77 00 00 00 00 D3 99 44 EB 1E E0 FE FF 0B 00 06 00 37 83 03 0E 27 08 FA FF FD FF FA FF B5 FD 01 03 4E 01 E1 8A F3 36 57 0D 9F 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BC 03 10 07 1A 3A 0E 00 01 38 BD FF D8 7C 14 00 00 06 04 43 62 45 27 77 00 00 00 00 D2 99 55 EB 18 E0 00 00 05 00 0D 00 37 83 03 0E 27 08 00 00 00 00 01 00 B5 FD 01 03 4E 01 D2 5C FB 36 5F 0D 9C 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BD 03 10 07 1A 3A 0E 00 01 68 86 63 DB 7C 14 00 00 06 04 43 00 E2 27 77 00 00 00 00 D1 99 61 EB 1E E0 05 00 FE FF 0B 00 37 83 03 0E 27 08 FE FF FF FF 00 00 B5 FD 01 03 4E 01 06 78 E6 36 67 0D A3 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BE 03 10 07 1A 3A 0E 00 01 98 4F C7 DD 7C 14 00 00 06 04 43 9E 7E 28 77 00 00 00 00 D4 99 67 EB 1F E0 04 00 08 00 01 00 37 83 03 0E 27 08 FD FF FF FF 00 00 B6 FD 01 03 4E 01 51 EF C4 36 6F 0D A1 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 BF 03 10 07 1A 3A 0E 00 01 C8 18 2B E0 7C 14 00 00 06 04 43 3C 1B 29 77 00 00 00 00 D6 99 6D EB 1E E0 01 00 01 00 07 00 37 83 03 0E 27 08 FF FF FE FF 00 00 B6 FD 02 03 4E 01 62 B9 57 36 77 0D A0 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C0 03 10 07 1A 3A 0E 00 01 F8 E1 8E E2 7C 14 00 00 06 04 43 DA B7 29 77 00 00 00 00 D4 99 79 EB 27 E0 12 00 00 00 18 00 37 83 03 0E 27 08 00 00 00 00 04 00 B6 FD 02 03 4E 01 0F 45 5C 37 7F 0D A5 00
-4F 00 0B 05 04 00 04 00 17 00 00 00 10 00 43 00 08 C1 03 10 07 1A 3A 0E 00 01 10 AF F2 E4 7C 14 00 00 06 04 83 79 54 2A 77 00 00 00 00 D3 99 79 EB 33 E0 FF FF F5 FF 00 00 37 83 03 0E 27 08 F7 FF 06 00 FF FF B7 FD 02 03 4E 01 5F 84 22 38 87 0D A4 00
diff --git a/head-tracking/README.md b/head-tracking/README.md
new file mode 100644
index 0000000..8a3e2f5
--- /dev/null
+++ b/head-tracking/README.md
@@ -0,0 +1,46 @@
+# AirPods Head Tracking Project
+
+This project implements head tracking with AirPods by gathering sensor data over Bluetooth, processing orientation and acceleration values, and detecting head gestures. The codebase is split into the following components:
+
+- **Connection and Data Collection**
+ The project uses a custom ConnectionManager (imported in multiple files) to connect via Bluetooth to AirPods. Once connected, sensor packets are received in raw hex format. An AirPodsTracker class (in `plot.py`) handles the start/stop of tracking, logging of raw data, and parsing of packets into useful fields.
+
+- **Orientation Calculation and Visualization**
+ The `HeadOrientation` class (in `head_orientation.py`) is responsible for:
+ - **Calibration:**
+ A set number of samples (default 10) are collected to calculate the neutral (baseline) values for the sensors. For example:
+ `o1_neutral = np.mean(samples[:, 0])`
+ - **Calculating Angles:**
+ For each new packet, the raw orientation values are normalized by subtracting the neutral baseline. Then:
+ - **Pitch** is computed as:
+ ```
+ pitch = (o2_norm + o3_norm) / 2 / 32000 * 180
+ ```
+ This averages the deviations from neutral, scales the result to degrees (assuming a sensor range around 32000), thus giving a smooth estimation of up/down tilt.
+ - **Yaw** is computed as:
+ ```
+ yaw = (o2_norm - o3_norm) / 2 / 32000 * 180
+ ```
+ Here, the difference between the two sensor axes is used to detect left/right rotation.
+ - **ASCII Visualization:**
+ Based on the calculated pitch and yaw, an ASCII art "face" is generated. The algorithm rotates points on a circle using simple trigonometric formulas (with scaling factors based on sensor depth) to build an approximate visual representation of head orientation.
+
+- **Live Plotting and Interactive Commands**
+ The code offers both terminal-based plotting and graphical plotting via matplotlib. The AirPodsTracker manages live plotting by maintaining a buffer of recent packets. When in terminal mode, the code uses libraries like `asciichartpy` and `drawille` to render charts; in graphical mode, it creates live-updating plots.
+
+- **Gesture Detection**
+ The `GestureDetector` class (in `gestures.py`) processes the head tracking data to detect nodding ("Yes") or head shaking ("No"):
+ - **Smoothing:**
+ Raw horizontal and vertical sensor data undergo moving-average smoothing using small fixed-size buffers. This reduces noise and provides a steadier signal.
+ - **Peak and Trough Detection:**
+ The code monitors small sections (e.g. the last 4 values) to compute variance and dynamically determine thresholds for direction changes. When a significant reversal (e.g. from increasing to decreasing) is detected that surpasses the dynamic threshold value (derived partly from a fixed threshold and variance), a peak or trough is recorded.
+ - **Rhythm Consistency:**
+ Time intervals between detected peaks are captured. The consistency of these intervals (by comparing them to their mean and computing relative variance) is used to evaluate whether the movement is rhythmic—a trait of intentional gestures.
+ - **Confidence Calculation:**
+ Multiple factors are considered:
+ - **Amplitude Factor:** Compares the average detected peak amplitude with a constant (like 600) to provide a normalized measure.
+ - **Rhythm Factor:** Derived from the consistency of the time intervals of the peaks.
+ - **Alternation Factor:** Verifies that the signal alternates (for instance, switching between positive and negative values).
+ - **Isolation Factor:** Checks that movement on the target axis (vertical for nodding, horizontal for shaking) dominates over the non-target axis.
+
+ A weighted sum of these factors forms a confidence score which, if above a predefined threshold (e.g. 0.7), confirms a detected gesture.
\ No newline at end of file
diff --git a/head-tracking/airpods-are-in-the-case.txt b/head-tracking/airpods-are-in-the-case.txt
deleted file mode 100644
index 14e9a86..0000000
--- a/head-tracking/airpods-are-in-the-case.txt
+++ /dev/null
@@ -1,123 +0,0 @@
-04 00 04 00 17 00 00 00 10 00 45 00 08 F2 17 10 03 3A 3E 08 0E 1A 3A 01 F8 DE 9D 78 66 06 00 00 03 00 40 67 07 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 2F 03 CC FF 6E 06 2F 03 CE FF 6C 02 29 48 D7 36 21 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F3 17 10 03 3A 3E 08 0E 1A 3A 01 B8 90 01 7B 66 06 00 00 03 00 42 FF A3 A1 5D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6D 06 2F 03 CE FF 6C 02 66 4A E3 36 29 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F4 17 10 03 3A 3E 08 0E 1A 3A 01 90 3E 65 7D 66 06 00 00 03 00 42 96 40 A2 5D 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 03 00 03 00 03 00 2E 03 CD FF 6F 06 2F 03 CE FF 6C 02 79 7C BF 36 31 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F5 17 10 03 3A 3E 08 0E 1A 3A 01 50 F0 C8 7F 66 06 00 00 03 00 43 2E DD A2 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2F 03 CE FF 6C 02 06 02 B4 36 39 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F6 17 10 03 3A 3E 08 0E 1A 3A 01 10 A2 2C 82 66 06 00 00 03 00 43 C6 79 A3 5D 00 00 00 00 3B 07 79 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2F 03 CE FF 6C 02 AB 08 B6 36 41 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F7 17 10 03 3A 3E 08 0E 1A 3A 01 D0 53 90 84 66 06 00 00 03 00 43 5E 16 A4 5D 00 00 00 00 3E 07 84 72 02 00 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2F 03 CE FF 6D 02 C0 F3 CA 36 49 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F8 17 10 03 3A 3E 08 0E 1A 3A 01 90 05 F4 86 66 06 00 00 03 00 43 F6 B2 A4 5D 00 00 00 00 3D 07 81 72 01 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 AA BF C3 36 51 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F9 17 10 03 3A 3E 08 0E 1A 3A 01 50 B7 57 89 66 06 00 00 03 00 43 8E 4F A5 5D 00 00 00 00 3C 07 7F 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 AD 91 A3 36 59 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FA 17 10 03 3A 3E 08 0E 1A 3A 01 10 69 BB 8B 66 06 00 00 03 00 43 26 EC A5 5D 00 00 00 00 3C 07 80 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2F 03 CE FF 6D 02 1D 91 AA 36 61 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FB 17 10 03 3A 3E 08 0E 1A 3A 01 D0 1A 1F 8E 66 06 00 00 03 00 43 BE 88 A6 5D 00 00 00 00 3D 07 7F 72 00 00 01 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BA F4 B0 36 69 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FC 17 10 03 3A 3E 08 0E 1A 3A 01 A8 C8 82 90 66 06 00 00 03 00 43 55 25 A7 5D 00 00 00 00 3E 07 7F 72 01 00 00 00 01 00 01 00 04 00 04 00 04 00 02 00 00 00 00 00 2F 03 CE FF 6D 02 33 B8 9C 36 71 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FD 17 10 03 3A 3E 08 0E 1A 3A 01 68 7A E6 92 66 06 00 00 03 00 43 ED C1 A7 5D 00 00 00 00 3D 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 01 00 2F 03 CE FF 6D 02 BB 96 99 36 79 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FE 17 10 03 3A 3E 08 0E 1A 3A 01 28 2C 4A 95 66 06 00 00 03 00 43 85 5E A8 5D 00 00 00 00 3E 07 7D 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 02 00 2F 03 CE FF 6D 02 A0 A1 AC 36 81 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FF 17 10 03 3A 3E 08 0E 1A 3A 01 E8 DD AD 97 66 06 00 00 03 00 43 1D FB A8 5D 00 00 00 00 3E 07 7D 72 00 00 01 00 01 00 01 00 04 00 04 00 04 00 01 00 00 00 01 00 2F 03 CE FF 6D 02 93 AE B9 36 89 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 80 18 10 03 3A 3E 08 0E 1A 3A 01 A8 8F 11 9A 66 06 00 00 03 00 43 B5 97 A9 5D 00 00 00 00 3F 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2F 03 CD FF 6D 02 51 EF BD 36 91 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 81 18 10 03 3A 3E 08 0E 1A 3A 01 80 3D 75 9C 66 06 00 00 03 00 43 4C 34 AA 5D 00 00 00 00 3E 07 7D 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 D2 88 BB 36 99 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 82 18 10 03 3A 3E 08 0E 1A 3A 01 40 EF D8 9E 66 06 00 00 03 00 43 E4 D0 AA 5D 00 00 00 00 3F 07 7C 72 00 00 01 00 01 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 67 34 B9 36 A1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 83 18 10 03 3A 3E 08 0E 1A 3A 01 00 A1 3C A1 66 06 00 00 03 00 43 7C 6D AB 5D 00 00 00 00 3F 07 7D 72 FF FF 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 A9 31 AE 36 A9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 84 18 10 03 3A 3E 08 0E 1A 3A 01 C0 52 A0 A3 66 06 00 00 03 00 43 14 0A AC 5D 00 00 00 00 40 07 7D 72 FF FF FF FF 01 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 95 47 CA 36 B1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 85 18 10 03 3A 3E 08 0E 1A 3A 01 80 04 04 A6 66 06 00 00 03 00 43 AC A6 AC 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 00 00 FF FF 00 00 2E 03 CD FF 6D 02 BB B3 BF 36 B9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 86 18 10 03 3A 3E 08 0E 1A 3A 01 58 B2 67 A8 66 06 00 00 03 00 43 43 43 AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 06 0F C6 36 C1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 87 18 10 03 3A 3E 08 0E 1A 3A 01 18 64 CB AA 66 06 00 00 03 00 43 DB DF AD 5D 00 00 00 00 40 07 7C 72 00 00 00 00 FF FF 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 7B EE BD 36 C9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 88 18 10 03 3A 3E 08 0E 1A 3A 01 D8 15 2F AD 66 06 00 00 03 00 43 73 7C AE 5D 00 00 00 00 40 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 DF 9B DA 36 D1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 89 18 10 03 3A 3E 08 0E 1A 3A 01 98 C7 92 AF 66 06 00 00 03 00 43 0B 19 AF 5D 00 00 00 00 41 07 7C 72 01 00 00 00 00 00 00 00 04 00 04 00 04 00 03 00 00 00 01 00 2E 03 CD FF 6D 02 8F CB E2 36 D9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8A 18 10 03 3A 3E 08 0E 1A 3A 01 70 75 F6 B1 66 06 00 00 03 00 43 A2 B5 AF 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 26 7A DE 36 E1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8B 18 10 03 3A 3E 08 0E 1A 3A 01 30 27 5A B4 66 06 00 00 03 00 43 3A 52 B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 00 00 2E 03 CD FF 6D 02 99 BC BD 36 E9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8C 18 10 03 3A 3E 08 0E 1A 3A 01 F0 D8 BD B6 66 06 00 00 03 00 43 D2 EE B0 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 04 00 04 00 04 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 6D 51 BA 36 F1 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8D 18 10 03 3A 3E 08 0E 1A 3A 01 B0 8A 21 B9 66 06 00 00 03 00 43 6A 8B B1 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 01 00 00 00 04 00 04 00 04 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C5 03 D4 36 F9 5E 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8E 18 10 03 3A 3E 08 0E 1A 3A 01 88 38 85 BB 66 06 00 00 03 00 43 01 28 B2 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 E8 E5 C9 36 01 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8F 18 10 03 3A 3E 08 0E 1A 3A 01 48 EA E8 BD 66 06 00 00 03 00 43 99 C4 B2 5D 00 00 00 00 41 07 7B 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 C8 5F B9 36 09 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 90 18 10 03 3A 3E 08 0E 1A 3A 01 08 9C 4C C0 66 06 00 00 03 00 43 31 61 B3 5D 00 00 00 00 40 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 83 C4 9D 36 11 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 91 18 10 03 3A 3E 08 0E 1A 3A 01 C8 4D B0 C2 66 06 00 00 03 00 43 C9 FD B3 5D 00 00 00 00 41 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 F9 0A 9E 36 19 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 92 18 10 03 3A 3E 08 0E 1A 3A 01 A0 FB 13 C5 66 06 00 00 03 00 43 60 9A B4 5D 00 00 00 00 41 07 7B 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 54 B2 96 36 21 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 93 18 10 03 3A 3E 08 0E 1A 3A 01 60 AD 77 C7 66 06 00 00 03 00 43 F8 36 B5 5D 00 00 00 00 40 07 7B 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 FB 64 A2 36 29 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 94 18 10 03 3A 3E 08 0E 1A 3A 01 20 5F DB C9 66 06 00 00 03 00 43 90 D3 B5 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 21 48 9D 36 31 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 95 18 10 03 3A 3E 08 0E 1A 3A 01 E0 10 3F CC 66 06 00 00 03 00 43 28 70 B6 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 93 25 AC 36 39 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 96 18 10 03 3A 3E 08 0E 1A 3A 01 B8 BE A2 CE 66 06 00 00 03 00 43 BF 0C B7 5D 00 00 00 00 40 07 7B 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 7B 3B CB 36 41 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 97 18 10 03 3A 3E 08 0E 1A 3A 01 78 70 06 D1 66 06 00 00 03 00 43 57 A9 B7 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 9C 2B E3 36 49 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 98 18 10 03 3A 3E 08 0E 1A 3A 01 38 22 6A D3 66 06 00 00 03 00 43 EF 45 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 F1 0D E8 36 51 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 99 18 10 03 3A 3E 08 0E 1A 3A 01 F8 D3 CD D5 66 06 00 00 03 00 43 87 E2 B8 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 F0 1A DF 36 59 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9A 18 10 03 3A 3E 08 0E 1A 3A 01 D0 81 31 D8 66 06 00 00 03 00 43 1E 7F B9 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 BB 9A CB 36 61 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9B 18 10 03 3A 3E 08 0E 1A 3A 01 90 33 95 DA 66 06 00 00 03 00 43 B6 1B BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 AF D3 36 69 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9C 18 10 03 3A 3E 08 0E 1A 3A 01 50 E5 F8 DC 66 06 00 00 03 00 43 4E B8 BA 5D 00 00 00 00 40 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 47 33 C4 36 71 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9D 18 10 03 3A 3E 08 0E 1A 3A 01 10 97 5C DF 66 06 00 00 03 00 43 E6 54 BB 5D 00 00 00 00 41 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 5D 2C 9C 36 79 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9E 18 10 03 3A 3E 08 0E 1A 3A 01 E8 44 C0 E1 66 06 00 00 03 00 43 7D F1 BB 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 0B 5E A3 36 81 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9F 18 10 03 3A 3E 08 0E 1A 3A 01 A8 F6 23 E4 66 06 00 00 03 00 43 15 8E BC 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D9 21 A3 36 89 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A0 18 10 03 3A 3E 08 0E 1A 3A 01 68 A8 87 E6 66 06 00 00 03 00 43 AD 2A BD 5D 00 00 00 00 41 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 82 84 A9 36 91 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A1 18 10 03 3A 3E 08 0E 1A 3A 01 40 56 EB E8 66 06 00 00 03 00 43 44 C7 BD 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 44 90 A7 36 99 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A2 18 10 03 3A 3E 08 0E 1A 3A 01 00 08 4F EB 66 06 00 00 03 00 43 DC 63 BE 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 FD 3C BA 36 A1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A3 18 10 03 3A 3E 08 0E 1A 3A 01 C0 B9 B2 ED 66 06 00 00 03 00 43 74 00 BF 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 D2 05 C7 36 A9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A4 18 10 03 3A 3E 08 0E 1A 3A 01 80 6B 16 F0 66 06 00 00 03 00 43 0C 9D BF 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 AB 49 BF 36 B1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A5 18 10 03 3A 3E 08 0E 1A 3A 01 58 19 7A F2 66 06 00 00 03 00 43 A3 39 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 31 2E CD 36 B9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A6 18 10 03 3A 3E 08 0E 1A 3A 01 18 CB DD F4 66 06 00 00 03 00 43 3B D6 C0 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 09 DB B5 36 C1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A7 18 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 41 F7 66 06 00 00 03 00 43 D3 72 C1 5D 00 00 00 00 41 07 7A 72 FF FF 00 00 FF FF 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 C9 F9 CA 36 C9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A8 18 10 03 3A 3E 08 0E 1A 3A 01 98 2E A5 F9 66 06 00 00 03 00 43 6B 0F C2 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 5E 1C C2 36 D1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A9 18 10 03 3A 3E 08 0E 1A 3A 01 70 DC 08 FC 66 06 00 00 03 00 43 02 AC C2 5D 00 00 00 00 42 07 7A 72 FF FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 85 D9 B3 36 D9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AA 18 10 03 3A 3E 08 0E 1A 3A 01 30 8E 6C FE 66 06 00 00 03 00 43 9A 48 C3 5D 00 00 00 00 42 07 7A 72 00 00 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 00 00 2E 03 CD FF 6E 02 89 F5 D3 36 E1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AB 18 10 03 3A 3E 08 0E 1A 3A 01 F0 3F D0 00 67 06 00 00 03 00 43 32 E5 C3 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 5E 85 D3 36 E9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AC 18 10 03 3A 3E 08 0E 1A 3A 01 C8 ED 33 03 67 06 00 00 03 00 43 C9 81 C4 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 FF FF 02 00 2E 03 CD FF 6E 02 26 22 DF 36 F1 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AD 18 10 03 3A 3E 08 0E 1A 3A 01 88 9F 97 05 67 06 00 00 03 00 43 61 1E C5 5D 00 00 00 00 43 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 06 95 DB 36 F9 5F 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AE 18 10 03 3A 3E 08 0E 1A 3A 01 48 51 FB 07 67 06 00 00 03 00 43 F9 BA C5 5D 00 00 00 00 42 07 7A 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 66 B7 D2 36 01 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AF 18 10 03 3A 3E 08 0E 1A 3A 01 08 03 5F 0A 67 06 00 00 03 00 43 91 57 C6 5D 00 00 00 00 42 07 7A 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 FE 66 EE 36 09 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B0 18 10 03 3A 3E 08 0E 1A 3A 01 E0 B0 C2 0C 67 06 00 00 03 00 43 28 F4 C6 5D 00 00 00 00 42 07 7A 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 13 B3 DB 36 11 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B1 18 10 03 3A 3E 08 0E 1A 3A 01 A0 62 26 0F 67 06 00 00 03 00 43 C0 90 C7 5D 00 00 00 00 42 07 79 72 FF FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 B1 04 E7 36 19 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B2 18 10 03 3A 3E 08 0E 1A 3A 01 60 14 8A 11 67 06 00 00 03 00 43 58 2D C8 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 1A BE E6 36 21 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B3 18 10 03 3A 3E 08 0E 1A 3A 01 38 C2 ED 13 67 06 00 00 03 00 43 EF C9 C8 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CE A4 E7 36 29 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B4 18 10 03 3A 3E 08 0E 1A 3A 01 F8 73 51 16 67 06 00 00 03 00 43 87 66 C9 5D 00 00 00 00 42 07 79 72 FE FF 00 00 00 00 FF FF 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 1E DF F0 36 31 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B5 18 10 03 3A 3E 08 0E 1A 3A 01 B8 25 B5 18 67 06 00 00 03 00 43 1F 03 CA 5D 00 00 00 00 42 07 79 72 FE FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 FF FF 01 00 2E 03 CD FF 6E 02 1A 2D E4 36 39 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B6 18 10 03 3A 3E 08 0E 1A 3A 01 78 D7 18 1B 67 06 00 00 03 00 43 B7 9F CA 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E2 B0 D6 36 41 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B7 18 10 03 3A 3E 08 0E 1A 3A 01 50 85 7C 1D 67 06 00 00 03 00 43 4E 3C CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 23 5D C1 36 49 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B8 18 10 03 3A 3E 08 0E 1A 3A 01 10 37 E0 1F 67 06 00 00 03 00 43 E6 D8 CB 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 92 5E CD 36 51 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B9 18 10 03 3A 3E 08 0E 1A 3A 01 D0 E8 43 22 67 06 00 00 03 00 43 7E 75 CC 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 8B E6 C4 36 59 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BA 18 10 03 3A 3E 08 0E 1A 3A 01 A8 96 A7 24 67 06 00 00 03 00 43 15 12 CD 5D 00 00 00 00 42 07 79 72 FD FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 B1 27 DE 36 61 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BB 18 10 03 3A 3E 08 0E 1A 3A 01 68 48 0B 27 67 06 00 00 03 00 43 AD AE CD 5D 00 00 00 00 42 07 79 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 A1 EC C8 36 69 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BC 18 10 03 3A 3E 08 0E 1A 3A 01 28 FA 6E 29 67 06 00 00 03 00 43 45 4B CE 5D 00 00 00 00 42 07 79 72 FD FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 02 00 2E 03 CD FF 6E 02 50 61 D8 36 71 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BD 18 10 03 3A 3E 08 0E 1A 3A 01 E8 AB D2 2B 67 06 00 00 03 00 43 DD E7 CE 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 CE C8 DA 36 79 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BE 18 10 03 3A 3E 08 0E 1A 3A 01 C0 59 36 2E 67 06 00 00 03 00 43 74 84 CF 5D 00 00 00 00 42 07 79 72 FC FF 01 00 01 00 00 00 03 00 03 00 03 00 02 00 01 00 02 00 2E 03 CD FF 6E 02 9A 6D DA 36 81 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BF 18 10 03 3A 3E 08 0E 1A 3A 01 80 0B 9A 30 67 06 00 00 03 00 43 0C 21 D0 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 89 9B D5 36 89 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C0 18 10 03 3A 3E 08 0E 1A 3A 01 40 BD FD 32 67 06 00 00 03 00 43 A4 BD D0 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 72 06 B4 36 91 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C1 18 10 03 3A 3E 08 0E 1A 3A 01 18 6B 61 35 67 06 00 00 03 00 43 3B 5A D1 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 55 DF C2 36 99 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C2 18 10 03 3A 3E 08 0E 1A 3A 01 D8 1C C5 37 67 06 00 00 03 00 43 D3 F6 D1 5D 00 00 00 00 41 07 79 72 FC FF 00 00 01 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 74 F7 D0 36 A1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C3 18 10 03 3A 3E 08 0E 1A 3A 01 98 CE 28 3A 67 06 00 00 03 00 43 6B 93 D2 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 71 C0 C4 36 A9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C4 18 10 03 3A 3E 08 0E 1A 3A 01 58 80 8C 3C 67 06 00 00 03 00 43 03 30 D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 21 D3 B6 36 B1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C5 18 10 03 3A 3E 08 0E 1A 3A 01 30 2E F0 3E 67 06 00 00 03 00 43 9A CC D3 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 CF C1 B8 36 B9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C6 18 10 03 3A 3E 08 0E 1A 3A 01 F0 DF 53 41 67 06 00 00 03 00 43 32 69 D4 5D 00 00 00 00 41 07 79 72 FC FF 01 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 D4 88 B7 36 C1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C7 18 10 03 3A 3E 08 0E 1A 3A 01 B0 91 B7 43 67 06 00 00 03 00 43 CA 05 D5 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 FF FF 03 00 03 00 03 00 02 00 01 00 00 00 2E 03 CD FF 6E 02 A8 80 AB 36 C9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C8 18 10 03 3A 3E 08 0E 1A 3A 01 88 3F 1B 46 67 06 00 00 03 00 43 61 A2 D5 5D 00 00 00 00 40 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 6C D8 B9 36 D1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C9 18 10 03 3A 3E 08 0E 1A 3A 01 48 F1 7E 48 67 06 00 00 03 00 43 F9 3E D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 23 46 C4 36 D9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CA 18 10 03 3A 3E 08 0E 1A 3A 01 08 A3 E2 4A 67 06 00 00 03 00 43 91 DB D6 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 33 F8 D9 36 E1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CB 18 10 03 3A 3E 08 0E 1A 3A 01 E0 50 46 4D 67 06 00 00 03 00 43 28 78 D7 5D 00 00 00 00 42 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 DA 2F DD 36 E9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CC 18 10 03 3A 3E 08 0E 1A 3A 01 A0 02 AA 4F 67 06 00 00 03 00 43 C0 14 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 31 13 DC 36 F1 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CD 18 10 03 3A 3E 08 0E 1A 3A 01 60 B4 0D 52 67 06 00 00 03 00 43 58 B1 D8 5D 00 00 00 00 41 07 79 72 FC FF 00 00 FF FF 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 22 72 DF 36 F9 60 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CE 18 10 03 3A 3E 08 0E 1A 3A 01 20 66 71 54 67 06 00 00 03 00 43 F0 4D D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 73 6E CA 36 01 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CF 18 10 03 3A 3E 08 0E 1A 3A 01 F8 13 D5 56 67 06 00 00 03 00 43 87 EA D9 5D 00 00 00 00 41 07 79 72 FC FF 00 00 00 00 01 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 07 0A C4 36 09 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D0 18 10 03 3A 3E 08 0E 1A 3A 01 B8 C5 38 59 67 06 00 00 03 00 43 1F 87 DA 5D 00 00 00 00 41 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6D 02 F6 BA 9E 36 11 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D1 18 10 03 3A 3E 08 0E 1A 3A 01 78 77 9C 5B 67 06 00 00 03 00 43 B7 23 DB 5D 00 00 00 00 41 07 79 72 FB FF FF FF 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6D 02 F0 20 B7 36 19 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D2 18 10 03 3A 3E 08 0E 1A 3A 01 50 25 00 5E 67 06 00 00 03 00 43 4E C0 DB 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 D1 7E 9C 36 21 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D3 18 10 03 3A 3E 08 0E 1A 3A 01 10 D7 63 60 67 06 00 00 03 00 43 E6 5C DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 01 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6D 02 8B 94 A3 36 29 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D4 18 10 03 3A 3E 08 0E 1A 3A 01 D0 88 C7 62 67 06 00 00 03 00 43 7E F9 DC 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 C9 DA B9 36 31 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D5 18 10 03 3A 3E 08 0E 1A 3A 01 A8 36 2B 65 67 06 00 00 03 00 43 15 96 DD 5D 00 00 00 00 42 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 01 00 01 00 2E 03 CD FF 6E 02 22 07 D8 36 39 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D6 18 10 03 3A 3E 08 0E 1A 3A 01 68 E8 8E 67 67 06 00 00 03 00 43 AD 32 DE 5D 00 00 00 00 43 07 79 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 4E CE E7 36 41 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D7 18 10 03 3A 3E 08 0E 1A 3A 01 28 9A F2 69 67 06 00 00 03 00 43 45 CF DE 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 CB 69 CC 36 49 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D8 18 10 03 3A 3E 08 0E 1A 3A 01 E8 4B 56 6C 67 06 00 00 03 00 43 DD 6B DF 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D6 F8 E0 36 51 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D9 18 10 03 3A 3E 08 0E 1A 3A 01 C0 F9 B9 6E 67 06 00 00 03 00 43 74 08 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 EC AA DD 36 59 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DA 18 10 03 3A 3E 08 0E 1A 3A 01 80 AB 1D 71 67 06 00 00 03 00 43 0C A5 E0 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 00 00 00 00 00 00 2E 03 CD FF 6E 02 55 EF D3 36 61 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DB 18 10 03 3A 3E 08 0E 1A 3A 01 40 5D 81 73 67 06 00 00 03 00 43 A4 41 E1 5D 00 00 00 00 43 07 78 72 FB FF 01 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 00 00 2E 03 CD FF 6E 02 48 1A D8 36 69 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DC 18 10 03 3A 3E 08 0E 1A 3A 01 18 0B E5 75 67 06 00 00 03 00 43 3B DE E1 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 13 D6 D0 36 71 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DD 18 10 03 3A 3E 08 0E 1A 3A 01 D8 BC 48 78 67 06 00 00 03 00 43 D3 7A E2 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 03 00 2E 03 CD FF 6E 02 29 20 DB 36 79 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DE 18 10 03 3A 3E 08 0E 1A 3A 01 98 6E AC 7A 67 06 00 00 03 00 43 6B 17 E3 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 E1 CD D8 36 81 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DF 18 10 03 3A 3E 08 0E 1A 3A 01 70 1C 10 7D 67 06 00 00 03 00 43 02 B4 E3 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 01 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 D7 F4 DB 36 89 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E0 18 10 03 3A 3E 08 0E 1A 3A 01 30 CE 73 7F 67 06 00 00 03 00 43 9A 50 E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 C1 54 D8 36 91 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E1 18 10 03 3A 3E 08 0E 1A 3A 01 F0 7F D7 81 67 06 00 00 03 00 43 32 ED E4 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 5F 88 C6 36 99 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E2 18 10 03 3A 3E 08 0E 1A 3A 01 C8 2D 3B 84 67 06 00 00 03 00 43 C9 89 E5 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 02 00 2E 03 CD FF 6E 02 A7 D9 C9 36 A1 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E3 18 10 03 3A 3E 08 0E 1A 3A 01 88 DF 9E 86 67 06 00 00 03 00 43 61 26 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 00 00 01 00 2E 03 CD FF 6E 02 64 E3 B4 36 A9 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E4 18 10 03 3A 3E 08 0E 1A 3A 01 48 91 02 89 67 06 00 00 03 00 43 F9 C2 E6 5D 00 00 00 00 43 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 01 00 2E 03 CD FF 6E 02 EC D3 C4 36 B1 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E5 18 10 03 3A 3E 08 0E 1A 3A 01 08 43 66 8B 67 06 00 00 03 00 43 91 5F E7 5D 00 00 00 00 42 07 78 72 FB FF 00 00 00 00 00 00 03 00 03 00 03 00 01 00 FF FF 01 00 2E 03 CD FF 6E 02 01 E4 C2 36 B9 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E6 18 10 03 3A 3E 08 0E 1A 3A 01 E0 F0 C9 8D 67 06 00 00 03 00 43 28 FC E7 5D 00 00 00 00 41 07 78 72 FC FF 00 00 FF FF FF FF 03 00 03 00 03 00 06 00 02 00 03 00 2E 03 CD FF 6D 02 EF 0F 33 37 C1 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E7 18 10 03 3A 3E 08 0E 1A 3A 01 A0 A2 2D 90 67 06 00 00 03 00 43 C0 98 E8 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 FE FF 04 00 2E 03 CD FF 6E 02 29 5F 74 37 C9 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E8 18 10 03 3A 3E 08 0E 1A 3A 01 60 54 91 92 67 06 00 00 03 00 43 58 35 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 01 00 2E 03 CD FF 6E 02 FB B7 79 37 D1 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E9 18 10 03 3A 3E 08 0E 1A 3A 01 38 02 F5 94 67 06 00 00 03 00 43 EF D1 E9 5D 00 00 00 00 41 07 78 72 FC FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 02 00 2E 03 CD FF 6E 02 12 03 81 37 D9 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EA 18 10 03 3A 3E 08 0E 1A 3A 01 F8 B3 58 97 67 06 00 00 03 00 43 87 6E EA 5D 00 00 00 00 40 07 77 72 FC FF FF FF 00 00 00 00 03 00 03 00 03 00 01 00 00 00 00 00 2E 03 CD FF 6E 02 A0 67 7D 37 E1 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EB 18 10 03 3A 3E 08 0E 1A 3A 01 B8 65 BC 99 67 06 00 00 03 00 43 1F 0B EB 5D 00 00 00 00 40 07 78 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 03 00 00 00 03 00 2E 03 CD FF 6E 02 5B 04 94 37 E9 61 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EC 18 10 03 3A 3E 08 0E 1A 3A 01 90 13 20 9C 67 06 00 00 03 00 43 B6 A7 EB 5D 00 00 00 00 40 07 77 72 FD FF 00 00 00 00 00 00 03 00 03 00 03 00 02 00 00 00 00 00 2E 03 CD FF 6E 02 86 E3 73 37 F1 61 00 00
diff --git a/head-tracking/combined.py b/head-tracking/combined.py
deleted file mode 100644
index 632644e..0000000
--- a/head-tracking/combined.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import matplotlib.pyplot as plt
-import mplcursors
-import bluetooth
-import threading
-import time
-from matplotlib.animation import FuncAnimation
-
-sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
-
-bt_addr = "28:2D:7F:C2:05:5B"
-psm = 0x1001
-
-sock.connect((bt_addr, psm))
-running = threading.Event()
-
-data = []
-
-def hex_to_base10(hex_string):
- hex_values = hex_string.split()
- base10_values = [int(hex_value, 16) for hex_value in hex_values]
- return base10_values
-
-def listen():
- global running, data
- while not running.is_set():
- res = sock.recv(1024)
- if len(res.hex()) == 162:
- hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
- base10_values = hex_to_base10(hex_string)
- data.append(base10_values)
-
-t = threading.Thread(target=listen)
-t.start()
-
-try:
- byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
- sock.send(byts)
-except:
- ...
-
-def update(frame):
- plt.clf()
- plt.title('Bluetooth Data')
- # columns = [33, 69, 44, 46, 48, 67, 69, 71, 78]
- columns = [34]
- # columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 62, 63, 64, 65, 66, 67, 68, 70,71, 73, 74, 75, 77, 78]
- # columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 46, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80]
- for i in range(len(data[0])):
- if i in columns:
- plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
- # plt.legend()
- plt.xlabel('Time')
- plt.ylabel('Value')
- mplcursors.cursor(hover=True, highlight=True)
-
-fig = plt.figure()
-ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
-
-plt.show()
-
-running.set()
-sock.close()
\ No newline at end of file
diff --git a/head-tracking/connection_manager.py b/head-tracking/connection_manager.py
new file mode 100644
index 0000000..1e18b04
--- /dev/null
+++ b/head-tracking/connection_manager.py
@@ -0,0 +1,62 @@
+import bluetooth
+import logging
+
+class ConnectionManager:
+ INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
+ START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
+ STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
+
+ def __init__(self, bt_addr="28:2D:7F:C2:05:5B", psm=0x1001, logger=None):
+ self.bt_addr = bt_addr
+ self.psm = psm
+ self.logger = logger if logger else logging.getLogger(__name__)
+ self.sock = None
+ self.connected = False
+ self.started = False
+
+ def connect(self):
+ self.logger.info(f"Connecting to {self.bt_addr} on PSM {self.psm:#04x}...")
+ try:
+ self.sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
+ self.sock.connect((self.bt_addr, self.psm))
+ self.connected = True
+ self.logger.info("Connected to AirPods.")
+ self.sock.send(bytes.fromhex(self.INIT_CMD))
+ self.logger.info("Initialization complete.")
+ except Exception as e:
+ self.logger.error(f"Connection failed: {e}")
+ self.connected = False
+ return self.connected
+
+ def send_start(self):
+ if not self.connected:
+ self.logger.error("Not connected. Cannot send START command.")
+ return False
+ if not self.started:
+ self.sock.send(bytes.fromhex(self.START_CMD))
+ self.started = True
+ self.logger.info("START command sent.")
+ else:
+ self.logger.info("START command has already been sent.")
+ return True
+
+ def send_stop(self):
+ if self.connected and self.started:
+ try:
+ self.sock.send(bytes.fromhex(self.STOP_CMD))
+ self.logger.info("STOP command sent.")
+ self.started = False
+ except Exception as e:
+ self.logger.error(f"Error sending STOP command: {e}")
+ else:
+ self.logger.info("Cannot send STOP; not started or not connected.")
+
+ def disconnect(self):
+ if self.sock:
+ try:
+ self.sock.close()
+ self.logger.info("Disconnected from AirPods.")
+ except Exception as e:
+ self.logger.error(f"Error during disconnect: {e}")
+ self.connected = False
+ self.started = False
\ No newline at end of file
diff --git a/head-tracking/data b/head-tracking/data
deleted file mode 120000
index d37aaaf..0000000
--- a/head-tracking/data
+++ /dev/null
@@ -1 +0,0 @@
-./yes
\ No newline at end of file
diff --git a/head-tracking/final.py b/head-tracking/final.py
deleted file mode 100644
index abfc21b..0000000
--- a/head-tracking/final.py
+++ /dev/null
@@ -1,117 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import bluetooth
-import threading
-import time
-
-sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
-
-bt_addr = "28:2D:7F:C2:05:5B"
-psm = 0x1001
-
-sock.connect((bt_addr, psm))
-running = threading.Event()
-
-data = []
-
-def hex_to_base10(hex_string):
- hex_values = hex_string.split()
- base10_values = [int(hex_value, 16) for hex_value in hex_values]
- return base10_values
-
-def listen():
- global running, data
- while not running.is_set():
- res = sock.recv(1024)
- if len(res.hex()) == 162:
- hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
- base10_values = hex_to_base10(hex_string)
- data.append(base10_values)
-
-t = threading.Thread(target=listen)
-t.start()
-
-try:
- byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
- sock.send(byts)
-except:
- ...
-
-start_time = time.time()
-timeout = 10 # seconds
-
-vertical_count = 0
-horizontal_count = 0
-horizontal_fluctuation_count = 0
-initial_131_sequence = True
-
-while time.time() - start_time < timeout:
- if len(data) > 0:
- column_34_data = [row[34] for row in data]
-
- for i in range(len(column_34_data)):
- print(column_34_data[i])
- if initial_131_sequence:
- if column_34_data[i] == 131:
- if i >= 4:
- continue
- else:
- initial_131_sequence = False
-
- if column_34_data[i] == 131 and not initial_131_sequence:
- vertical_count += 1
- horizontal_count = 0
- if vertical_count >= 45:
- print("vertical")
- running.set()
- sock.close()
- exit()
- elif column_34_data[i] == 3:
- horizontal_count += 1
- vertical_count = 0
- if horizontal_count >= 40:
- print("horizontal")
- running.set()
- sock.close()
- exit()
- else:
- vertical_count = 0
- horizontal_count = 0
-
- # Check for horizontal nodding (fluctuation between 3 and 67 or higher)
- fluctuation_window = 40
- if len(column_34_data) >= fluctuation_window:
- fluctuation_count = 0
- for i in range(len(column_34_data) - fluctuation_window + 1):
- segment = column_34_data[i:i+fluctuation_window]
- if any(value == 3 for value in segment) and any(value >= 67 for value in segment):
- count_67 = segment.count(67)
- if count_67 <= 10:
- fluctuation_count += 1
- if fluctuation_count >= 10:
- print("horizontal")
- running.set()
- sock.close()
- exit()
-
-print("unknown")
-running.set()
-sock.close()
\ No newline at end of file
diff --git a/head-tracking/gestures.py b/head-tracking/gestures.py
new file mode 100644
index 0000000..394b72a
--- /dev/null
+++ b/head-tracking/gestures.py
@@ -0,0 +1,381 @@
+import bluetooth
+import threading
+import time
+import logging
+import statistics
+from collections import deque
+
+class Colors:
+ RESET = "\033[0m"
+ BOLD = "\033[1m"
+ RED = "\033[91m"
+ GREEN = "\033[92m"
+ YELLOW = "\033[93m"
+ BLUE = "\033[94m"
+ MAGENTA = "\033[95m"
+ CYAN = "\033[96m"
+ WHITE = "\033[97m"
+ BG_BLACK = "\033[40m"
+
+class ColorFormatter(logging.Formatter):
+ FORMATS = {
+ logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
+ logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
+ logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
+ }
+
+ def format(self, record):
+ log_fmt = self.FORMATS.get(record.levelno)
+ formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
+ return formatter.format(record)
+
+handler = logging.StreamHandler()
+handler.setFormatter(ColorFormatter())
+log = logging.getLogger(__name__)
+log.setLevel(logging.INFO)
+log.addHandler(handler)
+log.propagate = False
+
+class GestureDetector:
+ INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
+ START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
+ STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
+
+ def __init__(self, conn=None):
+ self.sock = None
+ self.bt_addr = "28:2D:7F:C2:05:5B"
+ self.psm = 0x1001
+ self.running = False
+ self.data_lock = threading.Lock()
+
+ self.horiz_buffer = deque(maxlen=100)
+ self.vert_buffer = deque(maxlen=100)
+
+ self.horiz_avg_buffer = deque(maxlen=5)
+ self.vert_avg_buffer = deque(maxlen=5)
+
+ self.horiz_peaks = []
+ self.horiz_troughs = []
+ self.vert_peaks = []
+ self.vert_troughs = []
+
+ self.last_peak_time = 0
+ self.peak_intervals = deque(maxlen=5)
+
+ self.peak_threshold = 400
+ self.direction_change_threshold = 175
+ self.rhythm_consistency_threshold = 0.5
+
+ self.horiz_increasing = None
+ self.vert_increasing = None
+
+ self.required_extremes = 3
+ self.detection_timeout = 15
+
+ self.min_confidence_threshold = 0.7
+
+ self.conn = conn
+
+ def connect(self):
+ try:
+ log.info(f"Connecting to AirPods at {self.bt_addr}...")
+ if self.conn is None:
+ from connection_manager import ConnectionManager
+ self.conn = ConnectionManager(self.bt_addr, self.psm, logger=log)
+ if not self.conn.connect():
+ return False
+ else:
+ if not self.conn.connected:
+ if not self.conn.connect():
+ return False
+ self.sock = self.conn.sock
+ log.info(f"{Colors.GREEN}✓ Connected to AirPods via ConnectionManager{Colors.RESET}")
+ return True
+ except Exception as e:
+ log.error(f"{Colors.RED}Connection failed: {e}{Colors.RESET}")
+ return False
+
+ def process_data(self):
+ """Process incoming head tracking data."""
+ self.conn.send_start()
+ log.info(f"{Colors.GREEN}✓ Head tracking activated{Colors.RESET}")
+
+ self.running = True
+ start_time = time.time()
+
+ log.info(f"{Colors.GREEN}Ready! Make a YES or NO gesture{Colors.RESET}")
+ log.info(f"{Colors.YELLOW}Tip: Use natural, moderate speed head movements{Colors.RESET}")
+
+ while self.running:
+ if time.time() - start_time > self.detection_timeout:
+ log.warning(f"{Colors.YELLOW}⚠️ Detection timeout reached. No gesture detected.{Colors.RESET}")
+ self.running = False
+ break
+
+ try:
+ if not self.sock:
+ log.error("Socket not available.")
+ break
+ data = self.sock.recv(1024)
+ formatted = self.format_hex(data)
+ if self.is_valid_tracking_packet(formatted):
+ raw_bytes = bytes.fromhex(formatted.replace(" ", ""))
+ horizontal, vertical = self.extract_orientation_values(raw_bytes)
+
+ if horizontal is not None and vertical is not None:
+ smooth_h, smooth_v = self.apply_smoothing(horizontal, vertical)
+
+ with self.data_lock:
+ self.horiz_buffer.append(smooth_h)
+ self.vert_buffer.append(smooth_v)
+
+ self.detect_peaks_and_troughs()
+ gesture = self.detect_gestures()
+
+ if gesture:
+ self.running = False
+ break
+
+ except Exception as e:
+ if self.running:
+ log.error(f"Data processing error: {e}")
+ break
+
+ def disconnect(self):
+ """Disconnect from socket."""
+ self.conn.disconnect()
+
+ def format_hex(self, data):
+ """Format binary data to readable hex string."""
+ hex_str = data.hex()
+ return ' '.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2))
+
+ def is_valid_tracking_packet(self, hex_string):
+ """Verify packet is a valid head tracking packet."""
+ standard_header = "04 00 04 00 17 00 00 00 10 00 45 00"
+ alternate_header = "04 00 04 00 17 00 00 00 10 00 44 00"
+ if not hex_string.startswith(standard_header) and not hex_string.startswith(alternate_header):
+ return False
+
+ if len(hex_string.split()) < 80:
+ return False
+
+ return True
+
+ def extract_orientation_values(self, raw_bytes):
+ """Extract head orientation data from packet."""
+ try:
+ horizontal = int.from_bytes(raw_bytes[51:53], byteorder='little', signed=True)
+ vertical = int.from_bytes(raw_bytes[53:55], byteorder='little', signed=True)
+
+ return horizontal, vertical
+ except Exception as e:
+ log.debug(f"Failed to extract orientation: {e}")
+ return None, None
+
+ def apply_smoothing(self, horizontal, vertical):
+ """Apply moving average smoothing (Apple-like filtering)."""
+ self.horiz_avg_buffer.append(horizontal)
+ self.vert_avg_buffer.append(vertical)
+
+ smooth_horiz = sum(self.horiz_avg_buffer) / len(self.horiz_avg_buffer)
+ smooth_vert = sum(self.vert_avg_buffer) / len(self.vert_avg_buffer)
+
+ return smooth_horiz, smooth_vert
+
+ def detect_peaks_and_troughs(self):
+ """Detect motion direction changes with Apple-like refinements."""
+ if len(self.horiz_buffer) < 4 or len(self.vert_buffer) < 4:
+ return
+
+ h_values = list(self.horiz_buffer)[-4:]
+ v_values = list(self.vert_buffer)[-4:]
+
+ h_variance = statistics.variance(h_values) if len(h_values) > 1 else 0
+ v_variance = statistics.variance(v_values) if len(v_values) > 1 else 0
+
+ current = self.horiz_buffer[-1]
+ prev = self.horiz_buffer[-2]
+
+ if self.horiz_increasing is None:
+ self.horiz_increasing = current > prev
+
+ dynamic_h_threshold = max(100, min(self.direction_change_threshold, h_variance / 3))
+
+ if self.horiz_increasing and current < prev - dynamic_h_threshold:
+ if abs(prev) > self.peak_threshold:
+ self.horiz_peaks.append((len(self.horiz_buffer)-1, prev, time.time()))
+ direction = "➡️ " if prev > 0 else "⬅️ "
+ log.info(f"{Colors.CYAN}{direction} Horizontal max: {prev} (threshold: {dynamic_h_threshold:.1f}){Colors.RESET}")
+
+ now = time.time()
+ if self.last_peak_time > 0:
+ interval = now - self.last_peak_time
+ self.peak_intervals.append(interval)
+ self.last_peak_time = now
+
+ self.horiz_increasing = False
+
+ elif not self.horiz_increasing and current > prev + dynamic_h_threshold:
+ if abs(prev) > self.peak_threshold:
+ self.horiz_troughs.append((len(self.horiz_buffer)-1, prev, time.time()))
+ direction = "➡️ " if prev > 0 else "⬅️ "
+ log.info(f"{Colors.CYAN}{direction} Horizontal max: {prev} (threshold: {dynamic_h_threshold:.1f}){Colors.RESET}")
+
+ now = time.time()
+ if self.last_peak_time > 0:
+ interval = now - self.last_peak_time
+ self.peak_intervals.append(interval)
+ self.last_peak_time = now
+
+ self.horiz_increasing = True
+
+ current = self.vert_buffer[-1]
+ prev = self.vert_buffer[-2]
+
+ if self.vert_increasing is None:
+ self.vert_increasing = current > prev
+
+ dynamic_v_threshold = max(100, min(self.direction_change_threshold, v_variance / 3))
+
+ if self.vert_increasing and current < prev - dynamic_v_threshold:
+ if abs(prev) > self.peak_threshold:
+ self.vert_peaks.append((len(self.vert_buffer)-1, prev, time.time()))
+ direction = "⬆️ " if prev > 0 else "⬇️ "
+ log.info(f"{Colors.MAGENTA}{direction} Vertical max: {prev} (threshold: {dynamic_v_threshold:.1f}){Colors.RESET}")
+
+ now = time.time()
+ if self.last_peak_time > 0:
+ interval = now - self.last_peak_time
+ self.peak_intervals.append(interval)
+ self.last_peak_time = now
+
+ self.vert_increasing = False
+
+ elif not self.vert_increasing and current > prev + dynamic_v_threshold:
+ if abs(prev) > self.peak_threshold:
+ self.vert_troughs.append((len(self.vert_buffer)-1, prev, time.time()))
+ direction = "⬆️ " if prev > 0 else "⬇️ "
+ log.info(f"{Colors.MAGENTA}{direction} Vertical max: {prev} (threshold: {dynamic_v_threshold:.1f}){Colors.RESET}")
+
+ now = time.time()
+ if self.last_peak_time > 0:
+ interval = now - self.last_peak_time
+ self.peak_intervals.append(interval)
+ self.last_peak_time = now
+
+ self.vert_increasing = True
+
+ def calculate_rhythm_consistency(self):
+ """Calculate how consistent the timing between peaks is (Apple-like)."""
+ if len(self.peak_intervals) < 2:
+ return 0
+
+ mean_interval = statistics.mean(self.peak_intervals)
+ if mean_interval == 0:
+ return 0
+
+ variances = [(i/mean_interval - 1.0) ** 2 for i in self.peak_intervals]
+ consistency = 1.0 - min(1.0, statistics.mean(variances) / self.rhythm_consistency_threshold)
+ return max(0, consistency)
+
+ def calculate_confidence_score(self, extremes, is_vertical=True):
+ """Calculate confidence score for gesture detection (Apple-like)."""
+ if len(extremes) < self.required_extremes:
+ return 0.0
+
+ sorted_extremes = sorted(extremes, key=lambda x: x[0])
+
+ recent = sorted_extremes[-self.required_extremes:]
+
+ avg_amplitude = sum(abs(val) for _, val, _ in recent) / len(recent)
+ amplitude_factor = min(1.0, avg_amplitude / 600)
+
+ rhythm_factor = self.calculate_rhythm_consistency()
+
+ signs = [1 if val > 0 else -1 for _, val, _ in recent]
+ alternating = all(signs[i] != signs[i-1] for i in range(1, len(signs)))
+ alternation_factor = 1.0 if alternating else 0.5
+
+ if is_vertical:
+ vert_amp = sum(abs(val) for _, val, _ in recent) / len(recent)
+ horiz_vals = list(self.horiz_buffer)[-len(recent)*2:]
+ horiz_amp = sum(abs(val) for val in horiz_vals) / len(horiz_vals) if horiz_vals else 0
+ isolation_factor = min(1.0, vert_amp / (horiz_amp + 0.1) * 1.2)
+ else:
+ horiz_amp = sum(abs(val) for _, val, _ in recent)
+ vert_vals = list(self.vert_buffer)[-len(recent)*2:]
+ vert_amp = sum(abs(val) for val in vert_vals) / len(vert_vals) if vert_vals else 0
+ isolation_factor = min(1.0, horiz_amp / (vert_amp + 0.1) * 1.2)
+
+ confidence = (
+ amplitude_factor * 0.4 +
+ rhythm_factor * 0.2 +
+ alternation_factor * 0.2 +
+ isolation_factor * 0.2
+ )
+
+ return confidence
+
+ def detect_gestures(self):
+ """Recognize head gesture patterns with Apple-like intelligence."""
+ if len(self.vert_peaks) + len(self.vert_troughs) >= self.required_extremes:
+ all_extremes = sorted(self.vert_peaks + self.vert_troughs, key=lambda x: x[0])
+
+ confidence = self.calculate_confidence_score(all_extremes, is_vertical=True)
+
+ log.info(f"Vertical motion confidence: {confidence:.2f} (need {self.min_confidence_threshold:.2f})")
+
+ if confidence >= self.min_confidence_threshold:
+ log.info(f"{Colors.GREEN}🎯 \"Yes\" Gesture Detected (confidence: {confidence:.2f}){Colors.RESET}")
+ return "YES"
+
+ if len(self.horiz_peaks) + len(self.horiz_troughs) >= self.required_extremes:
+ all_extremes = sorted(self.horiz_peaks + self.horiz_troughs, key=lambda x: x[0])
+
+ confidence = self.calculate_confidence_score(all_extremes, is_vertical=False)
+
+ log.info(f"Horizontal motion confidence: {confidence:.2f} (need {self.min_confidence_threshold:.2f})")
+
+ if confidence >= self.min_confidence_threshold:
+ log.info(f"{Colors.GREEN}🎯 \"No\" gesture detected (confidence: {confidence:.2f}){Colors.RESET}")
+ return "NO"
+
+ return None
+
+ def start_detection(self):
+ """Begin gesture detection process."""
+ log.info(f"{Colors.BOLD}{Colors.WHITE}Starting gesture detection...{Colors.RESET}")
+
+ if not self.connect():
+ log.error(f"{Colors.RED}Failed to connect to AirPods.{Colors.RESET}")
+ return
+
+ data_thread = threading.Thread(target=self.process_data)
+ data_thread.daemon = True
+ data_thread.start()
+
+ try:
+ data_thread.join(timeout=self.detection_timeout + 2)
+ if data_thread.is_alive():
+ log.warning(f"{Colors.YELLOW}⚠️ Timeout reached. Stopping detection.{Colors.RESET}")
+ self.running = False
+ except KeyboardInterrupt:
+ log.info(f"{Colors.YELLOW}Detection canceled by user.{Colors.RESET}")
+ self.running = False
+ if __name__ == "__main__":
+ self.disconnect()
+ log.info(f"{Colors.GREEN}Gesture detection complete.{Colors.RESET}")
+
+if __name__ == "__main__":
+ print(f"{Colors.BG_BLACK}{Colors.CYAN}╔════════════════════════════════════════╗{Colors.RESET}")
+ print(f"{Colors.BG_BLACK}{Colors.CYAN}║ AirPods Head Gesture Detector ║{Colors.RESET}")
+ print(f"{Colors.BG_BLACK}{Colors.CYAN}╚════════════════════════════════════════╝{Colors.RESET}")
+ print(f"\n{Colors.WHITE}This program detects head gestures using AirPods:{Colors.RESET}")
+ print(f"{Colors.GREEN}• YES: {Colors.WHITE}nodding head up and down{Colors.RESET}")
+ print(f"{Colors.RED}• NO: {Colors.WHITE}shaking head left and right{Colors.RESET}\n")
+
+ detector = GestureDetector()
+ detector.start_detection()
\ No newline at end of file
diff --git a/head-tracking/head_orientation.py b/head-tracking/head_orientation.py
new file mode 100644
index 0000000..d27cb85
--- /dev/null
+++ b/head-tracking/head_orientation.py
@@ -0,0 +1,142 @@
+import math
+import drawille
+import numpy as np
+import logging
+import os
+
+class Colors:
+ RESET = "\033[0m"
+ BOLD = "\033[1m"
+ RED = "\033[91m"
+ GREEN = "\033[92m"
+ YELLOW = "\033[93m"
+ BLUE = "\033[94m"
+ MAGENTA = "\033[95m"
+ CYAN = "\033[96m"
+ WHITE = "\033[97m"
+ BG_BLACK = "\033[40m"
+
+class ColorFormatter(logging.Formatter):
+ FORMATS = {
+ logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
+ logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
+ logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
+ }
+
+ def format(self, record):
+ log_fmt = self.FORMATS.get(record.levelno)
+ formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
+ return formatter.format(record)
+
+handler = logging.StreamHandler()
+handler.setFormatter(ColorFormatter())
+log = logging.getLogger(__name__)
+log.setLevel(logging.INFO)
+log.addHandler(handler)
+log.propagate = False
+
+
+class HeadOrientation:
+ def __init__(self, use_terminal=False):
+ self.orientation_offset = 5500
+ self.o1_neutral = 19000
+ self.o2_neutral = 0
+ self.o3_neutral = 0
+ self.calibration_samples = []
+ self.calibration_complete = False
+ self.calibration_sample_count = 10
+ self.fig = None
+ self.ax = None
+ self.arrow = None
+ self.animation = None
+ self.use_terminal = use_terminal
+
+ def reset_calibration(self):
+ self.calibration_samples = []
+ self.calibration_complete = False
+
+ def add_calibration_sample(self, orientation_values):
+ if len(self.calibration_samples) < self.calibration_sample_count:
+ self.calibration_samples.append(orientation_values)
+ return False
+ if not self.calibration_complete:
+ self._calculate_calibration()
+ return True
+ return True
+
+ def _calculate_calibration(self):
+ if len(self.calibration_samples) < 3:
+ log.warning("Not enough calibration samples")
+ return
+ samples = np.array(self.calibration_samples)
+ self.o1_neutral = np.mean(samples[:, 0])
+ avg_o2 = np.mean(samples[:, 1])
+ avg_o3 = np.mean(samples[:, 2])
+ self.o2_neutral = avg_o2
+ self.o3_neutral = avg_o3
+ log.info("Calibration complete: o1_neutral=%.2f, o2_neutral=%.2f, o3_neutral=%.2f",
+ self.o1_neutral, self.o2_neutral, self.o3_neutral)
+ self.calibration_complete = True
+
+ def calculate_orientation(self, o1, o2, o3):
+ if not self.calibration_complete:
+ return {'pitch': 0, 'yaw': 0}
+ o1_norm = o1 - self.o1_neutral
+ o2_norm = o2 - self.o2_neutral
+ o3_norm = o3 - self.o3_neutral
+ pitch = (o2_norm + o3_norm) / 2 / 32000 * 180
+ yaw = (o2_norm - o3_norm) / 2 / 32000 * 180
+ return {'pitch': pitch, 'yaw': yaw}
+
+ def create_face_art(self, pitch, yaw):
+ if self.use_terminal:
+ try:
+ ts = os.get_terminal_size()
+ width, height = ts.columns, ts.lines * 2
+ except Exception:
+ width, height = 80, 40
+ else:
+ width, height = 80, 40
+ center_x, center_y = width // 2, height // 2
+ radius = (min(width, height) // 2 - 2) // 2
+ pitch_rad = math.radians(pitch)
+ yaw_rad = math.radians(yaw)
+ canvas = drawille.Canvas()
+ def rotate_point(x, y, z, pitch_r, yaw_r):
+ cos_y, sin_y = math.cos(yaw_r), math.sin(yaw_r)
+ cos_p, sin_p = math.cos(pitch_r), math.sin(pitch_r)
+ x1 = x * cos_y - z * sin_y
+ z1 = x * sin_y + z * cos_y
+ y1 = y * cos_p - z1 * sin_p
+ z2 = y * sin_p + z1 * cos_p
+ scale = 1 + (z2 / width)
+ return int(center_x + x1 * scale), int(center_y + y1 * scale)
+ for angle in range(0, 360, 2):
+ rad = math.radians(angle)
+ x = radius * math.cos(rad)
+ y = radius * math.sin(rad)
+ x1, y1 = rotate_point(x, y, 0, pitch_rad, yaw_rad)
+ canvas.set(x1, y1)
+ for eye in [(-radius//2, -radius//3, 2), (radius//2, -radius//3, 2)]:
+ ex, ey, ez = eye
+ x1, y1 = rotate_point(ex, ey, ez, pitch_rad, yaw_rad)
+ for dx in [-1, 0, 1]:
+ for dy in [-1, 0, 1]:
+ canvas.set(x1 + dx, y1 + dy)
+ nx, ny = rotate_point(0, 0, 1, pitch_rad, yaw_rad)
+ for dx in [-1, 0, 1]:
+ for dy in [-1, 0, 1]:
+ canvas.set(nx + dx, ny + dy)
+ smile_depth = radius // 8
+ mouth_local_y = radius // 4
+ mouth_length = radius
+ for x_offset in range(-mouth_length // 2, mouth_length // 2 + 1):
+ norm = abs(x_offset) / (mouth_length / 2)
+ y_offset = int((1 - norm ** 2) * smile_depth)
+ local_x = x_offset
+ local_y = mouth_local_y + y_offset
+ mx, my = rotate_point(local_x, local_y, 0, pitch_rad, yaw_rad)
+ canvas.set(mx, my)
+ return canvas.frame()
diff --git a/head-tracking/main.py b/head-tracking/main.py
deleted file mode 100644
index bb31319..0000000
--- a/head-tracking/main.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import os
-import matplotlib.pyplot as plt
-import mplcursors
-
-def hex_to_base10(hex_string):
- hex_values = hex_string.split()
- base10_values = [int(hex_value, 16) for hex_value in hex_values]
- return base10_values
-
-def convert_file(input_filepath):
- data = []
- with open(input_filepath, 'r') as infile:
- for line in infile:
- base10_line = hex_to_base10(line.strip())
- data.append(base10_line)
- return data
-
-def plot_data(data, title, directory):
- plt.figure()
- plt.title(title)
- # columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 32, 35, 36, 37, 38, 43, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 46, 61, 63, 64, 65, 67, 68, 70, 71, 73, 74, 75, 77]
- columns_to_remove = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]
- for i in range(len(data[0])):
- if i in columns_to_remove:
- continue
- plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
-
- plt.legend()
- plt.xlabel('Time')
- plt.ylabel('Value')
-
- # Add interactive cursor
- mplcursors.cursor(hover=True)
-
- plt.show()
- plt.close()
-
-def process_files(directory):
- for filename in os.listdir(directory):
- if filename.endswith('.txt'):
- input_filepath = os.path.join(directory, filename)
- data = convert_file(input_filepath)
- plot_data(data, f'{filename}', directory)
-
-# Directory containing the files
-directory = 'yes'
-
-# Process each file in the directory
-process_files(directory)
\ No newline at end of file
diff --git a/head-tracking/no/2.txt b/head-tracking/no/2.txt
deleted file mode 100644
index d444826..0000000
--- a/head-tracking/no/2.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1C 10 03 3A 3E 08 0E 1A 3A 01 08 ED A4 83 29 09 00 00 03 00 42 81 04 A2 12 01 00 00 00 00 00 00 00 00 00 FF FF 04 00 04 00 1C 83 1C 83 1C 83 83 FE B2 03 47 04 86 FE B1 03 4A 00 5F 94 03 37 44 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1C 10 03 3A 3E 08 0E 1A 3A 01 50 B2 08 86 29 09 00 00 03 00 42 1E A1 A2 12 01 00 00 00 00 00 00 00 00 00 FC FF 08 00 0A 00 1D 83 1D 83 1D 83 85 FE B5 03 49 04 86 FE B2 03 4A 00 4C 29 E0 36 4C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E4 1C 10 03 3A 3E 08 0E 1A 3A 01 80 7B 6C 88 29 09 00 00 03 00 43 BC 3D A3 12 01 00 00 00 C3 A3 99 EF 42 EE FE FF 0D 00 0C 00 1D 83 1D 83 1D 83 00 00 02 00 01 00 86 FE B2 03 4A 00 3F 26 F3 36 54 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E5 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 44 D0 8A 29 09 00 00 03 00 43 5A DA A3 12 01 00 00 00 BF A3 9F EF 3D EE FA FF 00 00 FC FF 1D 83 1D 83 1D 83 00 00 FD FF 02 00 86 FE B2 03 4A 00 D2 34 5D 37 5C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E6 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 09 34 8D 29 09 00 00 03 00 43 F7 76 A4 12 01 00 00 00 B7 A3 B6 EF 44 EE FF FF 18 00 09 00 1D 83 1D 83 1D 83 FA FF 01 00 FD FF 86 FE B2 03 4A 00 B4 44 70 37 64 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E7 1C 10 03 3A 3E 08 0E 1A 3A 01 28 D3 97 8F 29 09 00 00 03 00 43 95 13 A5 12 01 00 00 00 95 A3 C3 EF 47 EE 01 00 F9 FF 0F 00 1D 83 1D 83 1D 83 07 00 05 00 06 00 86 FE B2 03 4A 00 81 F0 4F 37 6C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E8 1C 10 03 3A 3E 08 0E 1A 3A 01 58 9C FB 91 29 09 00 00 03 00 43 33 B0 A5 12 01 00 00 00 C0 A3 A6 EF 43 EE 1A 00 DC FF 07 00 1D 83 1D 83 1D 83 0F 00 02 00 11 00 86 FE B2 03 4B 00 9C 7C 5C 37 74 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 61 5F 94 29 09 00 00 03 00 83 D0 4C A6 12 01 00 00 00 DC A3 49 EF B5 EE B4 00 64 FF 23 00 1D 83 1D 83 1D 83 26 00 52 00 41 00 89 FE B5 03 4D 00 70 21 85 39 7C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 2A C3 96 29 09 00 00 03 00 03 6E E9 A6 12 01 00 00 00 A4 A4 2D EE 43 F0 24 02 DB FD 45 00 1D 83 1D 83 1D 83 80 00 A9 00 D7 00 8F FE BC 03 56 00 31 B5 F7 3A 84 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1C 10 03 3A 3E 08 0E 1A 3A 01 00 F4 26 99 29 09 00 00 03 00 03 0C 86 A7 12 01 00 00 00 18 A7 1C EB 18 F5 97 04 E8 FA 3D 01 1D 83 1D 83 1D 83 5D 00 8E 00 1E 01 97 FE C8 03 64 00 48 3B F2 3B 8C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1C 10 03 3A 3E 08 0E 1A 3A 01 30 BD 8A 9B 29 09 00 00 03 00 83 AA 22 A8 12 01 00 00 00 0F AB 8A E6 F8 FC B7 05 F0 F8 CE 01 1D 83 1D 83 1D 83 14 00 18 00 41 01 9C FE CB 03 6F 00 2E EA 0B 3C 94 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1C 10 03 3A 3E 08 0E 1A 3A 01 78 82 EE 9D 29 09 00 00 03 00 83 47 BF A8 12 01 00 00 00 4B B0 C6 E0 49 07 22 06 41 F7 3C 02 1D 83 1D 83 1D 83 3F FF 73 FF 3C 00 99 FE C8 03 71 00 58 20 0F 3C 9C 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 4B 52 A0 29 09 00 00 03 00 83 E5 5B A9 12 01 00 00 00 46 B4 BA DC E7 0E 4C 01 8E FD 93 00 1D 83 1D 83 1D 83 53 FE 32 FE F5 FD 85 FE B1 03 4C 00 4D 8B 14 3C A4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 14 B6 A2 29 09 00 00 03 00 83 83 F8 A9 12 01 00 00 00 EF B2 44 DD D5 0D 1A FC C2 03 2C FF 1E 83 1E 83 1E 83 7F FE 45 FE F2 FD 72 FE 97 03 1D 00 72 29 29 3C AC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1C 10 03 3A 3E 08 0E 1A 3A 01 20 DA 19 A5 29 09 00 00 03 00 83 20 95 AA 12 01 00 00 00 66 AD B8 E1 D3 05 96 F9 FD 07 C5 FE 1E 83 1E 83 1E 83 8A FE 40 FF 65 FF 61 FE 89 03 03 00 90 35 1E 3C B4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1C 10 03 3A 3E 08 0E 1A 3A 01 50 A3 7D A7 29 09 00 00 03 00 83 BE 31 AB 12 01 00 00 00 43 A7 11 E9 E3 FA 08 F8 D1 0A 68 FE 1E 83 1E 83 1E 83 4F FE C0 FE 23 00 4F FE 7E 03 00 00 31 1E 88 3B BC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1C 10 03 3A 3E 08 0E 1A 3A 01 80 6C E1 A9 29 09 00 00 03 00 83 5C CE AB 12 01 00 00 00 85 A1 AF F2 12 ED E4 F6 22 0C 52 FE 1E 83 1E 83 1E 83 BD FE 35 FF 44 01 3D FE 72 03 12 00 62 25 2D 3B C4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1C 10 03 3A 3E 08 0E 1A 3A 01 B0 35 45 AC 29 09 00 00 03 00 03 FA 6A AC 12 01 00 00 00 C1 9D EB FC 55 E0 26 F8 7E 0A 41 FF 1E 83 1E 83 1E 83 03 00 F4 FF 60 02 38 FE 71 03 39 00 D6 50 0C 3C CC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1C 10 03 3A 3E 08 0E 1A 3A 01 F8 FA A8 AE 29 09 00 00 03 00 03 97 07 AD 12 01 00 00 00 99 9B E7 02 7D D8 BF FC 7D 02 21 FF 1E 83 1E 83 1E 83 0A 02 49 02 E2 02 4F FE 83 03 71 00 6E A5 52 3D D4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1C 10 03 3A 3E 08 0E 1A 3A 01 28 C4 0C B1 29 09 00 00 03 00 03 35 A4 AD 12 01 00 00 00 E2 9B 5A 02 4F DA A9 04 91 FB 9F 01 1E 83 1E 83 1E 83 C0 01 53 02 5B 02 6B FE AC 03 A0 00 0F 22 16 3E DC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1C 10 03 3A 3E 08 0E 1A 3A 01 58 8D 70 B3 29 09 00 00 03 00 03 D3 40 AE 12 01 00 00 00 CE 9E 31 FD 90 E3 6A 09 44 F6 E9 03 1E 83 1E 83 1E 83 72 00 55 01 56 02 7A FE C6 03 C6 00 7A 27 48 3E E4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1C 10 03 3A 3E 08 0E 1A 3A 01 A0 52 D4 B5 29 09 00 00 03 00 03 70 DD AE 12 01 00 00 00 00 A5 89 F5 E0 F2 52 0B 5F F2 73 04 1E 83 1E 83 1E 83 00 FF D3 FE 72 01 78 FE C5 03 E0 00 34 37 53 3E EC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1C 10 03 3A 3E 08 0E 1A 3A 01 D0 1B 38 B8 29 09 00 00 03 00 03 0E 7A AF 12 01 00 00 00 E3 AA 24 EE 35 FF 82 03 AB FA 73 00 1E 83 1E 83 1E 83 7D FD E6 FC 4A FD 5E FE 9C 03 BB 00 85 DB 55 3E F4 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1C 10 03 3A 3E 08 0E 1A 3A 01 00 E5 9B BA 29 09 00 00 03 00 03 AC 16 B0 12 01 00 00 00 E4 A9 4E EF 3A FD BE FA F3 06 2D FE 1E 83 1E 83 1E 83 64 FD 3C FD 6F FD 3B FE 73 03 78 00 F0 41 66 3E FC 71 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1C 10 03 3A 3E 08 0E 1A 3A 01 48 AA FF BC 29 09 00 00 03 00 03 49 B3 B0 12 01 00 00 00 F3 A3 BD F6 5A F1 30 F6 0A 0C D4 FD 1F 83 1F 83 1F 83 41 FE 9B FE 18 00 28 FE 5B 03 62 00 28 58 4D 3E 04 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1C 10 03 3A 3E 08 0E 1A 3A 01 78 73 63 BF 29 09 00 00 03 00 03 E7 4F B1 12 01 00 00 00 33 9E C4 FF B3 E4 18 F7 AF 07 E0 FC 1F 83 1F 83 1F 83 EC 00 43 00 AB 02 2F FE 5B 03 84 00 5C 20 D8 3D 0C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1C 10 03 3A 3E 08 0E 1A 3A 01 A8 3C C7 C1 29 09 00 00 03 00 03 85 EC B1 12 01 00 00 00 F5 9B 09 02 CA DF 90 01 65 FE 21 00 1F 83 1F 83 1F 83 9E 02 B4 03 9E 03 53 FE 8A 03 B9 00 27 3E 3D 3E 14 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1C 10 03 3A 3E 08 0E 1A 3A 01 D8 05 2B C4 29 09 00 00 03 00 03 23 89 B2 12 01 00 00 00 6E 9E 9F FD D8 E6 EE 07 1B F7 24 03 1F 83 1F 83 1F 83 FB 00 CC 01 96 02 73 FE B6 03 EA 00 7C 4B 94 3E 1C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1C 10 03 3A 3E 08 0E 1A 3A 01 20 CB 8E C6 29 09 00 00 03 00 03 C0 25 B3 12 01 00 00 00 B5 A3 5B F6 20 F5 D3 09 A2 F2 23 04 1F 83 1F 83 1F 83 61 FF 59 FF A0 01 7B FE BC 03 04 01 62 85 9A 3E 24 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1C 10 03 3A 3E 08 0E 1A 3A 01 50 94 F2 C8 29 09 00 00 03 00 03 5E C2 B3 12 01 00 00 00 B8 A9 3F EE A8 02 33 04 67 FA D2 00 1F 83 1F 83 1F 83 F4 FC 46 FD 37 FD 64 FE 9C 03 E2 00 07 B4 92 3E 2C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 80 1D 10 03 3A 3E 08 0E 1A 3A 01 80 5D 56 CB 29 09 00 00 03 00 03 FC 5E B4 12 01 00 00 00 25 A9 7E EE 15 01 E9 FA 62 06 B2 FD 1F 83 1F 83 1F 83 60 FD 34 FD 59 FD 44 FE 72 03 A1 00 38 C0 97 3E 34 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 81 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 26 BA CD 29 09 00 00 03 00 03 9A FB B4 12 01 00 00 00 10 A3 C0 F4 0E F5 54 F6 97 0B 99 FD 1F 83 1F 83 1F 83 41 FE C1 FE 09 00 31 FE 5C 03 88 00 E0 59 97 3E 3C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 82 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 EB 1D D0 29 09 00 00 03 00 03 37 98 B5 12 01 00 00 00 3E 9D B6 FC 24 E8 7C F7 54 07 14 FC 1F 83 1F 83 1F 83 5D 01 98 00 B3 02 3C FE 5E 03 A8 00 19 81 5D 3E 44 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 83 1D 10 03 3A 3E 08 0E 1A 3A 01 28 B5 81 D2 29 09 00 00 03 00 03 D5 34 B6 12 01 00 00 00 C4 9B 3B FD CA E4 BD 03 B9 FC E8 00 1F 83 1F 83 1F 83 46 02 ED 03 83 03 63 FE 98 03 DF 00 7D 19 72 3E 4C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 84 1D 10 03 3A 3E 08 0E 1A 3A 01 58 7E E5 D4 29 09 00 00 03 00 03 73 D1 B6 12 01 00 00 00 44 9F 34 F8 13 ED 89 08 5C F6 0F 03 1F 83 1F 83 1F 83 A5 00 3D 01 43 02 7E FE B9 03 07 01 48 27 94 3E 54 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 85 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 43 49 D7 29 09 00 00 03 00 03 10 6E B7 12 01 00 00 00 4B A5 70 F0 73 FB 5A 07 08 F6 42 02 1F 83 1F 83 1F 83 D4 FD FD FD 16 FF 78 FE B0 03 04 01 D4 D8 94 3E 5C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 86 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 0C AD D9 29 09 00 00 03 00 03 AE 0A B8 12 01 00 00 00 3B A8 E0 EE 20 FF 59 FE F1 03 3B FF 20 83 20 83 20 83 E6 FC 70 FC 30 FD 52 FE 87 03 CA 00 8E 08 93 3E 64 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 87 1D 10 03 3A 3E 08 0E 1A 3A 01 00 D6 10 DC 29 09 00 00 03 00 03 4C A7 B8 12 01 00 00 00 7E A3 53 F4 34 F4 25 F6 D4 0B 7B FC 20 83 20 83 20 83 B8 FD E9 FD 3C FF 36 FE 5F 03 A4 00 D8 07 93 3E 6C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 88 1D 10 03 3A 3E 08 0E 1A 3A 01 30 9F 74 DE 29 09 00 00 03 00 03 EA 43 B9 12 01 00 00 00 8A 9D EF FD 5D E5 A4 F6 1B 09 3B FD 20 83 20 83 20 83 EA 00 3F 00 EC 02 35 FE 5D 03 BC 00 B2 CE 95 3E 74 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 89 1D 10 03 3A 3E 08 0E 1A 3A 01 78 64 D8 E0 29 09 00 00 03 00 03 87 E0 B9 12 01 00 00 00 E7 9A D2 00 CA DF 20 00 AB FF D3 FF 20 83 20 83 20 83 64 02 5D 03 1A 03 59 FE 86 03 ED 00 07 1C 88 3E 7C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 2D 3C E3 29 09 00 00 03 00 03 25 7D BA 12 01 00 00 00 DA 9C CD FC 14 E5 80 07 9C F7 DA 01 20 83 20 83 20 83 67 01 EE 01 9F 02 7B FE B0 03 1B 01 24 A6 80 3E 84 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 F6 9F E5 29 09 00 00 03 00 03 C3 19 BB 12 01 00 00 00 96 A1 FE F4 59 F2 F2 09 64 F3 44 03 20 83 20 83 20 83 40 FF 9E FF 1B 01 82 FE BA 03 2E 01 60 CD 82 3E 8C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1D 10 03 3A 3E 08 0E 1A 3A 01 08 C0 03 E8 29 09 00 00 03 00 03 61 B6 BB 12 01 00 00 00 0D A7 0E EE F3 FD B7 04 1A FC 25 01 20 83 20 83 20 83 F3 FC CF FD 6C FD 65 FE 9F 03 0A 01 25 0E 81 3E 94 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1D 10 03 3A 3E 08 0E 1A 3A 01 50 85 67 EA 29 09 00 00 03 00 03 FE 52 BC 12 01 00 00 00 BC A6 DB EF 5F FB 52 FA DB 07 4E FD 20 83 20 83 20 83 54 FD D5 FC B0 FD 41 FE 72 03 CE 00 4C 28 84 3E 9C 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1D 10 03 3A 3E 08 0E 1A 3A 01 80 4E CB EC 29 09 00 00 03 00 03 9C EF BC 12 01 00 00 00 18 A1 93 F7 FC ED 35 F6 8F 0C D9 FD 20 83 20 83 20 83 C1 FE F5 FE D0 00 2E FE 5D 03 BE 00 52 47 83 3E A4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 17 2F EF 29 09 00 00 03 00 03 3A 8C BD 12 01 00 00 00 4C 9C 8C FE B5 E2 72 F9 36 04 0C FD 20 83 20 83 20 83 11 02 78 01 B3 02 45 FE 66 03 E5 00 9D 45 53 3E AC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 90 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 E0 92 F1 29 09 00 00 03 00 03 D8 28 BE 12 01 00 00 00 6B 9B BE FD 3C E2 42 04 6E FB 6B 00 20 83 20 83 20 83 35 02 18 03 FC 02 6A FE 99 03 13 01 66 25 54 3E B4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 91 1D 10 03 3A 3E 08 0E 1A 3A 01 28 A6 F6 F3 29 09 00 00 03 00 03 75 C5 BE 12 01 00 00 00 75 9E B8 F7 E0 EA D9 07 78 F6 45 02 21 83 21 83 21 83 81 00 FB 00 E0 01 7F FE B4 03 31 01 90 7E 66 3E BC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 92 1D 10 03 3A 3E 08 0E 1A 3A 01 58 6F 5A F6 29 09 00 00 03 00 03 13 62 BF 12 01 00 00 00 A1 A3 29 F0 43 F8 35 09 30 F4 BE 02 21 83 21 83 21 83 FE FE 45 FF B5 00 7D FE B5 03 3B 01 BF E5 69 3E C4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 93 1D 10 03 3A 3E 08 0E 1A 3A 01 88 38 BE F8 29 09 00 00 03 00 03 B1 FE BF 12 01 00 00 00 F9 A8 15 EA 6D 02 42 03 63 FD 2A 00 21 83 21 83 21 83 2C FD 91 FD 66 FD 60 FE 98 03 12 01 02 3F 61 3E CC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 94 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 FD 21 FB 29 09 00 00 03 00 03 4E 9B C0 12 01 00 00 00 2D A8 D6 EB D1 FE 36 FB 2D 07 E1 FD 21 83 21 83 21 83 A9 FD A4 FD DE FD 42 FE 74 03 D8 00 86 2C 65 3E D4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 95 1D 10 03 3A 3E 08 0E 1A 3A 01 00 C7 85 FD 29 09 00 00 03 00 03 EC 37 C1 12 01 00 00 00 D1 A2 E7 F2 8F F2 D7 F6 11 0C 02 FE 21 83 21 83 21 83 73 FE C5 FE 3A 00 2F FE 60 03 C1 00 23 91 5E 3E DC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 96 1D 10 03 3A 3E 08 0E 1A 3A 01 30 90 E9 FF 29 09 00 00 03 00 03 8A D4 C1 12 01 00 00 00 A3 9D 37 FB B6 E5 E1 F7 CA 06 4D FC 21 83 21 83 21 83 BD 01 6A 00 BB 02 3D FE 5F 03 DF 00 50 90 D3 3D E4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 97 1D 10 03 3A 3E 08 0E 1A 3A 01 60 59 4D 02 2A 09 00 00 03 00 03 28 71 C2 12 01 00 00 00 D9 9B 8F FB 97 E2 BB 02 06 FD 64 00 21 83 21 83 21 83 21 02 75 03 01 03 62 FE 90 03 0D 01 5C 40 1C 3E EC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 98 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 1E B1 04 2A 09 00 00 03 00 03 C5 0D C3 12 01 00 00 00 14 9E 8A F6 8B E9 BA 06 7B F7 DC 01 21 83 21 83 21 83 D6 00 45 01 CC 01 7A FE AD 03 2C 01 2C 46 4C 3E F4 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 99 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 E7 14 07 2A 09 00 00 03 00 03 63 AA C3 12 01 00 00 00 53 A2 77 EF 3F F6 7B 08 17 F5 85 02 21 83 21 83 21 83 CB FE 5D FF 0A 00 78 FE B1 03 31 01 B8 99 50 3E FC 72 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1D 10 03 3A 3E 08 0E 1A 3A 01 08 B1 78 09 2A 09 00 00 03 00 03 01 47 C4 12 01 00 00 00 51 A6 C6 EB 7E FD 54 01 F6 00 F6 FF 21 83 21 83 21 83 1E FD 63 FD 7E FD 56 FE 93 03 02 01 AE 71 4F 3E 04 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1D 10 03 3A 3E 08 0E 1A 3A 01 38 7A DC 0B 2A 09 00 00 03 00 03 9F E3 C4 12 01 00 00 00 81 A4 FA EE 0A F7 01 FA 3E 08 99 FD 21 83 21 83 21 83 F7 FD 03 FE 88 FE 3C FE 71 03 D6 00 F7 68 4F 3E 0C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1D 10 03 3A 3E 08 0E 1A 3A 01 80 3F 40 0E 2A 09 00 00 03 00 03 3C 80 C5 12 01 00 00 00 D5 9F D8 F6 51 EA 09 F8 97 0A 7E FE 21 83 21 83 21 83 B8 FF 8A FF 6C 01 32 FE 66 03 D3 00 58 A6 4E 3E 14 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 08 A4 10 2A 09 00 00 03 00 03 DA 1C C6 12 01 00 00 00 28 9C CE FB 98 E1 25 FB D9 02 D9 FD 22 83 22 83 22 83 FA 01 95 01 31 02 4C FE 71 03 F4 00 5C D3 FE 3D 1C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 D1 07 13 2A 09 00 00 03 00 03 78 B9 C6 12 01 00 00 00 9B 9B F9 F9 3E E2 21 04 E7 FA 11 00 22 83 22 83 22 83 F7 01 74 02 5B 02 6E FE 9B 03 1A 01 14 19 00 3E 24 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1D 10 03 3A 3E 08 0E 1A 3A 01 10 9B 6B 15 2A 09 00 00 03 00 03 16 56 C7 12 01 00 00 00 FB 9D 6F F3 CF EA D7 06 C4 F6 67 01 22 83 22 83 22 83 3B 00 B1 00 05 01 7C FE AF 03 2E 01 75 27 0E 3E 2C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1D 10 03 3A 3E 08 0E 1A 3A 01 58 60 CF 17 2A 09 00 00 03 00 03 B3 F2 C7 12 01 00 00 00 C0 A1 E9 EC 73 F5 83 05 D3 F9 8F 01 22 83 22 83 22 83 1D FE 0F FF 15 FF 6D FE AA 03 22 01 C1 EB 0B 3E 34 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1D 10 03 3A 3E 08 0E 1A 3A 01 88 29 33 1A 2A 09 00 00 03 00 03 51 8F C8 12 01 00 00 00 15 A4 4B EB 17 F9 A4 00 26 01 20 00 22 83 22 83 22 83 06 FE 0D FE 44 FE 53 FE 93 03 FE 00 B4 9B 0A 3E 3C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 F2 96 1C 2A 09 00 00 03 00 03 EF 2B C9 12 01 00 00 00 B6 A2 1F EE 02 F4 8B FB B9 06 B4 FE 22 83 22 83 22 83 9D FE A4 FE F4 FE 41 FE 7B 03 DE 00 D0 4D 0B 3E 44 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 BB FA 1E 2A 09 00 00 03 00 03 8D C8 C9 12 01 00 00 00 AB 9F D7 F3 38 EB 97 FA FF 05 5C FE 22 83 22 83 22 83 94 00 A6 FF 06 01 42 FE 74 03 DD 00 02 34 06 3E 4C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1D 10 03 3A 3E 08 0E 1A 3A 01 30 81 5E 21 2A 09 00 00 03 00 03 2A 65 CA 12 01 00 00 00 9E 9D E5 F5 10 E6 DF FE 0F 01 65 FF 22 83 22 83 22 83 58 01 B5 01 56 01 57 FE 87 03 EE 00 2C 71 81 3D 54 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1D 10 03 3A 3E 08 0E 1A 3A 01 60 4A C2 23 2A 09 00 00 03 00 03 C8 01 CB 12 01 00 00 00 16 9E 6E F4 3A E7 DA 02 00 FD 92 00 22 83 22 83 22 83 F3 00 15 01 CA 00 6A FE 9E 03 FD 00 8A B7 22 3D 5C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1D 10 03 3A 3E 08 0E 1A 3A 01 90 13 26 26 2A 09 00 00 03 00 03 66 9E CB 12 01 00 00 00 8E 9F 3D F1 CB EB 24 03 68 FC B0 00 22 83 22 83 22 83 D1 FF E1 FF B1 FF 6F FE A3 03 FA 00 AB FF 1B 3D 64 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 DC 89 28 2A 09 00 00 03 00 03 04 3B CC 12 01 00 00 00 97 A0 4B EF 08 EE AB 00 A2 FF C7 FF 22 83 22 83 22 83 63 FF 49 FF 38 FF 67 FE 9A 03 E9 00 72 B8 1D 3D 6C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1D 10 03 3A 3E 08 0E 1A 3A 01 08 A2 ED 2A 2A 09 00 00 03 00 03 A1 D7 CC 12 01 00 00 00 5D A0 57 EF BC EC D7 FE 67 01 69 FF 22 83 22 83 22 83 D9 FF A1 FF 99 FF 62 FE 92 03 DB 00 2C 49 1F 3D 74 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1D 10 03 3A 3E 08 0E 1A 3A 01 38 6B 51 2D 2A 09 00 00 03 00 03 3F 74 CD 12 01 00 00 00 9B 9F C0 EF D3 EA 27 FF A9 00 A8 FF 23 83 23 83 23 83 47 00 63 00 F0 FF 65 FE 94 03 D5 00 0C 2F 1B 3D 7C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1D 10 03 3A 3E 08 0E 1A 3A 01 68 34 B5 2F 2A 09 00 00 03 00 03 DD 10 CE 12 01 00 00 00 6C 9F D0 EF 55 EA 5C 00 E7 FF 2B 00 23 83 23 83 23 83 5D 00 72 00 F3 FF 69 FE 9C 03 D2 00 C1 28 02 3D 84 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1D 10 03 3A 3E 08 0E 1A 3A 01 98 FD 18 32 2A 09 00 00 03 00 83 7B AD CE 12 01 00 00 00 BD 9F C3 EF 46 EB AB 00 68 FF 5D 00 23 83 23 83 23 83 32 00 14 00 CA FF 6D FE 9F 03 CE 00 FC 82 EA 3B 8C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 C2 7C 34 2A 09 00 00 03 00 83 18 4A CF 12 01 00 00 00 C1 9F 52 F0 DA EC 22 00 D7 FF 32 00 23 83 23 83 23 83 EC FF DA FF A6 FF 6E FE 9E 03 C6 00 1D 5A 7A 3B 94 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1D 10 03 3A 3E 08 0E 1A 3A 01 10 8C E0 36 2A 09 00 00 03 00 83 B6 E6 CF 12 01 00 00 00 B4 9F DA F0 19 ED 93 FF 57 00 E3 FF 23 83 23 83 23 83 EF FF D5 FF BE FF 6E FE 9C 03 BF 00 3F D4 69 3B 9C 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1D 10 03 3A 3E 08 0E 1A 3A 01 40 55 44 39 2A 09 00 00 03 00 83 54 83 D0 12 01 00 00 00 D0 9F EC F0 3A EC 98 FF 54 00 C3 FF 23 83 23 83 23 83 0B 00 17 00 DB FF 6F FE 9C 03 BB 00 19 74 1E 3B A4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1D 10 03 3A 3E 08 0E 1A 3A 01 70 1E A8 3B 2A 09 00 00 03 00 83 F2 1F D1 12 01 00 00 00 06 A0 F5 F0 83 EB ED FF 44 00 ED FF 23 83 23 83 23 83 1A 00 34 00 E9 FF 70 FE 9F 03 B7 00 C8 C1 0B 3B AC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 E7 0B 3E 2A 09 00 00 03 00 83 90 BC D1 12 01 00 00 00 41 A0 23 F1 62 EB 29 00 0B 00 0F 00 23 83 23 83 23 83 22 00 21 00 ED FF 73 FE A2 03 B4 00 E9 73 97 3A B4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1D 10 03 3A 3E 08 0E 1A 3A 01 E8 AC 6F 40 2A 09 00 00 03 00 83 2D 59 D2 12 01 00 00 00 78 A0 51 F1 A6 EB 37 00 F9 FF 1E 00 23 83 23 83 23 83 0F 00 09 00 D9 FF 74 FE A3 03 B0 00 89 99 4F 3A BC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1D 10 03 3A 3E 08 0E 1A 3A 01 18 76 D3 42 2A 09 00 00 03 00 83 CB F5 D2 12 01 00 00 00 9F A0 87 F1 DE EB 2C 00 02 00 0F 00 23 83 23 83 23 83 11 00 03 00 E4 FF 75 FE A4 03 AC 00 9E AB 30 3A C4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1D 10 03 3A 3E 08 0E 1A 3A 01 48 3F 37 45 2A 09 00 00 03 00 83 69 92 D3 12 01 00 00 00 EC A0 80 F1 2B EC 92 00 BE FF 23 00 23 83 23 83 23 83 0E 00 25 00 EE FF 77 FE A6 03 A8 00 0B 2C EA 39 CC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1D 10 03 3A 3E 08 0E 1A 3A 01 78 08 9B 47 2A 09 00 00 03 00 83 07 2F D4 12 01 00 00 00 7A A1 4D F1 98 EC A2 00 D3 FF 13 00 24 83 24 83 24 83 01 00 00 00 DF FF 78 FE A7 03 A4 00 C8 82 B1 39 D4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1D 10 03 3A 3E 08 0E 1A 3A 01 C0 CD FE 49 2A 09 00 00 03 00 83 A4 CB D4 12 01 00 00 00 D4 A1 48 F1 D7 EC 39 00 FE FF FE FF 24 83 24 83 24 83 0F 00 E0 FF E2 FF 79 FE A6 03 9F 00 46 62 B4 39 DC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1D 10 03 3A 3E 08 0E 1A 3A 01 F0 96 62 4C 2A 09 00 00 03 00 83 42 68 D5 12 01 00 00 00 EC A1 3F F1 D3 EC F8 FF FB FF FC FF 24 83 24 83 24 83 0E 00 00 00 DF FF 7B FE A6 03 9A 00 01 0B A5 39 E4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1D 10 03 3A 3E 08 0E 1A 3A 01 20 60 C6 4E 2A 09 00 00 03 00 83 E0 04 D6 12 01 00 00 00 EE A1 5E F1 BE EC D5 FF 28 00 0E 00 24 83 24 83 24 83 08 00 00 00 DC FF 7C FE A7 03 95 00 B5 AB 9B 39 EC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1D 10 03 3A 3E 08 0E 1A 3A 01 50 29 2A 51 2A 09 00 00 03 00 83 7E A1 D6 12 01 00 00 00 D8 A1 AB F1 96 EC CC FF 34 00 0B 00 24 83 24 83 24 83 12 00 07 00 F3 FF 7D FE A8 03 91 00 85 00 9A 39 F4 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1D 10 03 3A 3E 08 0E 1A 3A 01 98 EE 8D 53 2A 09 00 00 03 00 83 1B 3E D7 12 01 00 00 00 D7 A1 D9 F1 7B EC F7 FF 0E 00 0B 00 24 83 24 83 24 83 11 00 13 00 F4 FF 7F FE A9 03 8E 00 1A 2F 8D 39 FC 73 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1D 10 03 3A 3E 08 0E 1A 3A 01 C8 B7 F1 55 2A 09 00 00 03 00 83 B9 DA D7 12 01 00 00 00 E8 A1 FB F1 78 EC 0B 00 15 00 0D 00 24 83 24 83 24 83 0D 00 0D 00 ED FF 81 FE AB 03 8B 00 DD 24 70 39 04 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 80 55 58 2A 09 00 00 03 00 83 57 77 D8 12 01 00 00 00 F5 A1 24 F2 81 EC 08 00 10 00 0C 00 24 83 24 83 24 83 0B 00 03 00 EB FF 82 FE AC 03 88 00 D9 AD 3D 39 0C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1D 10 03 3A 3E 08 0E 1A 3A 01 28 4A B9 5A 2A 09 00 00 03 00 43 F5 13 D9 12 01 00 00 00 0D A2 46 F2 86 EC 21 00 01 00 0F 00 24 83 24 83 24 83 10 00 06 00 F8 FF 83 FE AD 03 85 00 03 4E DB 37 14 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1D 10 03 3A 3E 08 0E 1A 3A 01 70 0F 1D 5D 2A 09 00 00 03 00 43 92 B0 D9 12 01 00 00 00 33 A2 46 F2 A5 EC 29 00 F2 FF 0C 00 24 83 24 83 24 83 07 00 03 00 ED FF 85 FE AD 03 82 00 D4 2C C8 37 1C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1D 10 03 3A 3E 08 0E 1A 3A 01 A0 D8 80 5F 2A 09 00 00 03 00 43 30 4D DA 12 01 00 00 00 52 A2 4C F2 C8 EC 13 00 FA FF 10 00 24 83 24 83 24 83 04 00 FB FF E9 FF 86 FE AE 03 7F 00 9F 1C D3 37 24 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 A1 E4 61 2A 09 00 00 03 00 83 CE E9 DA 12 01 00 00 00 56 A2 61 F2 DB EC F2 FF 09 00 0D 00 24 83 24 83 24 83 03 00 F8 FF EB FF 86 FE AE 03 7B 00 B9 5B 18 38 2C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1D 10 03 3A 3E 08 0E 1A 3A 01 00 6B 48 64 2A 09 00 00 03 00 43 6C 86 DB 12 01 00 00 00 4D A2 79 F2 D0 EC E7 FF 10 00 07 00 25 83 25 83 25 83 06 00 03 00 EC FF 88 FE AE 03 78 00 F8 19 01 38 34 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1D 10 03 3A 3E 08 0E 1A 3A 01 48 30 AC 66 2A 09 00 00 03 00 43 09 23 DC 12 01 00 00 00 46 A2 93 F2 BE EC EA FF 19 00 03 00 25 83 25 83 25 83 00 00 03 00 E9 FF 88 FE AF 03 76 00 86 35 F2 37 3C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1D 10 03 3A 3E 08 0E 1A 3A 01 78 F9 0F 69 2A 09 00 00 03 00 43 A7 BF DC 12 01 00 00 00 3E A2 C4 F2 9A EC D2 FF 4F 00 0A 00 25 83 25 83 25 83 E8 FF F8 FF C6 FF 88 FE B0 03 72 00 C5 E5 EC 37 44 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1D 10 03 3A 3E 08 0E 1A 3A 01 A8 C2 73 6B 2A 09 00 00 03 00 83 45 5C DD 12 01 00 00 00 07 A2 9E F3 E0 EB 2A FF 4F 01 22 00 25 83 25 83 25 83 D0 FF D3 FF C1 FF 86 FE AE 03 6C 00 C0 05 8F 38 4C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 8B D7 6D 2A 09 00 00 03 00 83 E3 F8 DD 12 01 00 00 00 4D A1 41 F5 97 EA 7C FE EE 00 41 00 25 83 25 83 25 83 6C 00 E2 FF 63 00 89 FE AC 03 6E 00 7C FA C4 39 54 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1D 10 03 3A 3E 08 0E 1A 3A 01 20 51 3B 70 2A 09 00 00 03 00 83 80 95 DE 12 01 00 00 00 17 A0 DA F5 12 EB 1A FF FA FE D2 00 25 83 25 83 25 83 3E 00 61 00 21 00 91 FE B0 03 74 00 76 2F 3D 3A 5C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1D 10 03 3A 3E 08 0E 1A 3A 01 50 1A 9F 72 2A 09 00 00 03 00 83 1E 32 DF 12 01 00 00 00 92 9F CF F5 CA EC 2A 00 04 FF 81 00 25 83 25 83 25 83 F9 FF 0D 00 D9 FF 92 FE B4 03 75 00 EA 09 A8 3A 64 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1D 10 03 3A 3E 08 0E 1A 3A 01 80 E3 02 75 2A 09 00 00 03 00 83 BC CE DF 12 01 00 00 00 8F 9F 70 F5 E2 ED 44 00 99 FF 02 00 25 83 25 83 25 83 D6 FF F5 FF C5 FF 93 FE B4 03 74 00 93 20 A8 3A 6C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 AC 66 77 2A 09 00 00 03 00 83 5A 6B E0 12 01 00 00 00 B6 9F 42 F5 FF ED 0C 00 F5 FF F3 FF 25 83 25 83 25 83 F3 FF FC FF EF FF 94 FE B4 03 74 00 F2 55 A8 3A 74 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1D 10 03 3A 3E 08 0E 1A 3A 01 F8 71 CA 79 2A 09 00 00 03 00 83 F7 07 E1 12 01 00 00 00 C4 9F 47 F5 D1 ED F2 FF 30 00 04 00 25 83 25 83 25 83 FC FF 0C 00 F9 FF 95 FE B5 03 75 00 41 DA A7 3A 7C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1D 10 03 3A 3E 08 0E 1A 3A 01 28 3B 2E 7C 2A 09 00 00 03 00 83 95 A4 E1 12 01 00 00 00 D1 9F 6E F5 B0 ED 01 00 15 00 16 00 25 83 25 83 25 83 0B 00 07 00 FF FF 98 FE B7 03 77 00 DA 94 88 3A 84 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1D 10 03 3A 3E 08 0E 1A 3A 01 58 04 92 7E 2A 09 00 00 03 00 83 33 41 E2 12 01 00 00 00 DE 9F 85 F5 B7 ED 11 00 F8 FF 18 00 25 83 25 83 25 83 10 00 03 00 00 00 9B FE B7 03 78 00 EA D4 59 3A 8C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1D 10 03 3A 3E 08 0E 1A 3A 01 88 CD F5 80 2A 09 00 00 03 00 83 D1 DD E2 12 01 00 00 00 E8 9F 90 F5 D1 ED 0D 00 03 00 07 00 26 83 26 83 26 83 07 00 FA FF F8 FF 9D FE B8 03 79 00 BF ED 2B 38 94 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1D 10 03 3A 3E 08 0E 1A 3A 01 D0 92 59 83 2A 09 00 00 03 00 83 6E 7A E3 12 01 00 00 00 EE 9F 9A F5 D4 ED 01 00 04 00 FA FF 26 83 26 83 26 83 09 00 FA FF F4 FF A0 FE B8 03 7A 00 A6 7A 57 38 9C 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1D 10 03 3A 3E 08 0E 1A 3A 01 00 5C BD 85 2A 09 00 00 03 00 83 0C 17 E4 12 01 00 00 00 F2 9F 98 F5 C3 ED 00 00 08 00 F2 FF 26 83 26 83 26 83 04 00 06 00 F2 FF A2 FE B8 03 7A 00 29 B1 59 38 A4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1D 10 03 3A 3E 08 0E 1A 3A 01 30 25 21 88 2A 09 00 00 03 00 83 AA B3 E4 12 01 00 00 00 FC 9F 94 F5 BB ED 05 00 FB FF F7 FF 26 83 26 83 26 83 0C 00 04 00 F9 FF A3 FE B9 03 7B 00 57 BD 57 38 AC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1D 10 03 3A 3E 08 0E 1A 3A 01 60 EE 84 8A 2A 09 00 00 03 00 83 48 50 E5 12 01 00 00 00 02 A0 8C F5 C4 ED 08 00 F5 FF 0A 00 26 83 26 83 26 83 05 00 08 00 F5 FF A5 FE BA 03 7B 00 83 EA 00 38 B4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1D 10 03 3A 3E 08 0E 1A 3A 01 90 B7 E8 8C 2A 09 00 00 03 00 83 E6 EC E5 12 01 00 00 00 05 A0 8D F5 D4 ED 01 00 F8 FF 01 00 26 83 26 83 26 83 03 00 FF FF F5 FF A7 FE BA 03 7C 00 1A C4 08 38 BC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1D 10 03 3A 3E 08 0E 1A 3A 01 D8 7C 4C 8F 2A 09 00 00 03 00 83 83 89 E6 12 01 00 00 00 07 A0 8A F5 D5 ED F9 FF 08 00 F5 FF 26 83 26 83 26 83 00 00 FD FF F5 FF A8 FE BB 03 7C 00 55 51 0A 38 C4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1D 10 03 3A 3E 08 0E 1A 3A 01 08 46 B0 91 2A 09 00 00 03 00 43 21 26 E7 12 01 00 00 00 09 A0 8B F5 C2 ED FB FF 06 00 F1 FF 26 83 26 83 26 83 06 00 00 00 FF FF AA FE BB 03 7D 00 CB CF 9E 37 CC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1D 10 03 3A 3E 08 0E 1A 3A 01 38 0F 14 94 2A 09 00 00 03 00 43 BF C2 E7 12 01 00 00 00 11 A0 75 F5 B3 ED 16 00 F5 FF E0 FF 26 83 26 83 26 83 02 00 08 00 FF FF AB FE BB 03 7E 00 A6 9C 78 37 D4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1D 10 03 3A 3E 08 0E 1A 3A 01 68 D8 77 96 2A 09 00 00 03 00 83 5D 5F E8 12 01 00 00 00 41 A0 37 F5 9A ED 58 00 E8 FF C8 FF 26 83 26 83 26 83 0D 00 15 00 06 00 AC FE BD 03 7F 00 13 BA 1A 38 DC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1D 10 03 3A 3E 08 0E 1A 3A 01 B0 9D DB 98 2A 09 00 00 03 00 83 FA FB E8 12 01 00 00 00 96 A0 F1 F4 9B ED 54 00 12 00 DF FF 26 83 26 83 26 83 F6 FF 01 00 E9 FF AC FE BE 03 7E 00 78 26 8F 38 E4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1D 10 03 3A 3E 08 0E 1A 3A 01 E0 66 3F 9B 2A 09 00 00 03 00 83 98 98 E9 12 01 00 00 00 C6 A0 01 F5 64 ED 0A 00 44 00 F2 FF 27 83 27 83 27 83 FC FF F4 FF F1 FF AC FE BD 03 7D 00 14 65 9A 38 EC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1D 10 03 3A 3E 08 0E 1A 3A 01 10 30 A3 9D 2A 09 00 00 03 00 83 36 35 EA 12 01 00 00 00 C5 A0 2F F5 13 ED E0 FF 35 00 F4 FF 27 83 27 83 27 83 0B 00 FB FF FE FF AD FE BD 03 7C 00 67 C3 E9 38 F4 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1D 10 03 3A 3E 08 0E 1A 3A 01 40 F9 06 A0 2A 09 00 00 03 00 83 D4 D1 EA 12 01 00 00 00 BE A0 44 F5 F0 EC F9 FF 00 00 05 00 27 83 27 83 27 83 0D 00 06 00 02 00 AE FE BD 03 7C 00 ED 89 EB 38 FC 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1D 10 03 3A 3E 08 0E 1A 3A 01 88 BE 6A A2 2A 09 00 00 03 00 83 71 6E EB 12 01 00 00 00 C1 A0 3E F5 0D ED 10 00 DE FF 06 00 27 83 27 83 27 83 07 00 FF FF FD FF AF FE BD 03 7C 00 92 04 EC 38 04 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1D 10 03 3A 3E 08 0E 1A 3A 01 B8 87 CE A4 2A 09 00 00 03 00 83 0F 0B EC 12 01 00 00 00 C6 A0 1D F5 31 ED 07 00 E5 FF EB FF 27 83 27 83 27 83 FC FF F8 FF F0 FF AF FE BD 03 7C 00 61 0B E3 38 0C 75 00 00
diff --git a/head-tracking/no/no.txt b/head-tracking/no/no.txt
deleted file mode 100644
index 20497b1..0000000
--- a/head-tracking/no/no.txt
+++ /dev/null
@@ -1,123 +0,0 @@
-04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1A 10 03 3A 3E 08 0E 1A 3A 01 B8 95 C7 C5 2C 07 00 00 03 00 40 EE FA 64 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 10 62 10 62 10 A3 FD 3D 03 20 04 A6 FD 36 03 23 00 73 3A BB 37 99 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1A 10 03 3A 3E 08 0E 1A 3A 01 60 4B 2B C8 2C 07 00 00 03 00 42 87 97 65 90 00 00 00 00 00 00 00 00 00 00 00 00 01 00 09 00 18 00 18 00 18 00 A7 FD 3A 03 22 04 A6 FD 36 03 23 00 58 50 AC 37 A1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1A 10 03 3A 3E 08 0E 1A 3A 01 20 FD 8E CA 2C 07 00 00 03 00 42 1F 34 66 90 00 00 00 00 00 00 00 00 00 00 FE FF 01 00 09 00 18 00 18 00 18 00 A7 FD 3C 03 25 04 A6 FD 37 03 23 00 3C 70 7A 37 A9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 B2 F2 CC 2C 07 00 00 03 00 43 B8 D0 66 90 00 00 00 00 1D A8 9D E4 66 E3 FF FF 04 00 07 00 18 00 18 00 18 00 00 00 00 00 00 00 A6 FD 37 03 23 00 57 9B 51 37 B1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1A 10 03 3A 3E 08 0E 1A 3A 01 70 68 56 CF 2C 07 00 00 03 00 43 51 6D 67 90 00 00 00 00 1C A8 A3 E4 69 E3 00 00 FF FF 01 00 18 00 18 00 18 00 03 00 FF FF 00 00 A6 FD 37 03 23 00 68 8E D6 36 B9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1A 10 03 3A 3E 08 0E 1A 3A 01 18 1E BA D1 2C 07 00 00 03 00 43 EA 09 68 90 00 00 00 00 1E A8 A0 E4 6F E3 05 00 F8 FF 00 00 18 00 18 00 18 00 05 00 FF FF FF FF A6 FD 37 03 23 00 BB 1C E4 36 C1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1A 10 03 3A 3E 08 0E 1A 3A 01 C0 D3 1D D4 2C 07 00 00 03 00 43 83 A6 68 90 00 00 00 00 1A A8 AA E4 89 E3 FF FF F6 FF 02 00 18 00 18 00 18 00 00 00 FE FF FE FF A6 FD 37 03 23 00 2D 37 EB 36 C9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1A 10 03 3A 3E 08 0E 1A 3A 01 80 85 81 D6 2C 07 00 00 03 00 43 1B 43 69 90 00 00 00 00 15 A8 AA E4 98 E3 FC FF F3 FF 04 00 18 00 18 00 18 00 00 00 FF FF 00 00 A7 FD 38 03 23 00 5B 7B E1 36 D1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1A 10 03 3A 3E 08 0E 1A 3A 01 28 3B E5 D8 2C 07 00 00 03 00 43 B4 DF 69 90 00 00 00 00 15 A8 A2 E4 A4 E3 02 00 F1 FF 0E 00 18 00 18 00 18 00 FE FF 02 00 00 00 A7 FD 38 03 23 00 D4 7D FB 36 D9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 F0 48 DB 2C 07 00 00 03 00 43 4D 7C 6A 90 00 00 00 00 14 A8 9C E4 B7 E3 FF FF EC FF 0A 00 18 00 18 00 18 00 01 00 00 00 02 00 A7 FD 38 03 23 00 49 81 05 37 E1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1A 10 03 3A 3E 08 0E 1A 3A 01 78 A6 AC DD 2C 07 00 00 03 00 43 E6 18 6B 90 00 00 00 00 11 A8 93 E4 D4 E3 07 00 E5 FF 0B 00 18 00 18 00 18 00 04 00 FE FF 04 00 A7 FD 38 03 23 00 02 C7 11 37 E9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1A 10 03 3A 3E 08 0E 1A 3A 01 20 5C 10 E0 2C 07 00 00 03 00 43 7F B5 6B 90 00 00 00 00 0D A8 7D E4 01 E4 14 00 D7 FF 15 00 19 00 19 00 19 00 01 00 09 00 00 00 A7 FD 39 03 23 00 89 6A 2D 37 F1 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1A 10 03 3A 3E 08 0E 1A 3A 01 C8 11 74 E2 2C 07 00 00 03 00 83 18 52 6C 90 00 00 00 00 16 A8 72 E4 46 E4 39 00 E4 FF 34 00 19 00 19 00 19 00 FC FF 15 00 02 00 A7 FD 3B 03 23 00 FC 50 79 38 F9 69 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1A 10 03 3A 3E 08 0E 1A 3A 01 88 C3 D7 E4 2C 07 00 00 03 00 83 B0 EE 6C 90 00 00 00 00 37 A8 6B E4 BC E4 5E 00 BB FF 44 00 19 00 19 00 19 00 0A 00 06 00 0D 00 A8 FD 3C 03 24 00 09 E4 93 38 01 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1A 10 03 3A 3E 08 0E 1A 3A 01 30 79 3B E7 2C 07 00 00 03 00 83 49 8B 6D 90 00 00 00 00 64 A8 39 E4 5E E5 75 00 94 FF 41 00 19 00 19 00 19 00 0C 00 06 00 0B 00 AA FD 3D 03 24 00 8A E8 96 38 09 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1A 10 03 3A 3E 08 0E 1A 3A 01 D8 2E 9F E9 2C 07 00 00 03 00 83 E2 27 6E 90 00 00 00 00 99 A8 DB E3 37 E6 AA 00 6A FF 41 00 19 00 19 00 19 00 0D 00 0F 00 10 00 AC FD 3E 03 25 00 18 A5 98 38 11 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1A 10 03 3A 3E 08 0E 1A 3A 01 80 E4 02 EC 2C 07 00 00 03 00 83 7B C4 6E 90 00 00 00 00 FA A8 37 E3 60 E7 0B 01 02 FF 4E 00 19 00 19 00 19 00 20 00 28 00 28 00 AE FD 41 03 26 00 F8 CE C6 38 19 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1A 10 03 3A 3E 08 0E 1A 3A 01 28 9A 66 EE 2C 07 00 00 03 00 83 14 61 6F 90 00 00 00 00 A3 A9 38 E2 2D E9 9C 01 9E FE 72 00 19 00 19 00 19 00 20 00 31 00 38 00 B1 FD 45 03 28 00 4A 24 52 39 21 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1A 10 03 3A 3E 08 0E 1A 3A 01 D0 4F CA F0 2C 07 00 00 03 00 83 AD FD 6F 90 00 00 00 00 BA AA C0 E0 C0 EB 3D 02 05 FE A6 00 19 00 19 00 19 00 0F 00 2C 00 2F 00 B5 FD 49 03 2A 00 27 4D 92 39 29 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1A 10 03 3A 3E 08 0E 1A 3A 01 78 05 2E F3 2C 07 00 00 03 00 83 46 9A 70 90 00 00 00 00 32 AC 27 DF DF EE 5B 02 05 FE CB 00 19 00 19 00 19 00 EC FF F6 FF 0C 00 B6 FD 4A 03 29 00 EC 15 9C 39 31 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1A 10 03 3A 3E 08 0E 1A 3A 01 38 B7 91 F5 2C 07 00 00 03 00 83 DE 36 71 90 00 00 00 00 A3 AD C2 DD ED F1 07 02 3D FE C6 00 19 00 19 00 19 00 D6 FF C8 FF F2 FF B7 FD 4A 03 24 00 A7 8C AD 39 39 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1A 10 03 3A 3E 08 0E 1A 3A 01 E0 6C F5 F7 2C 07 00 00 03 00 83 77 D3 71 90 00 00 00 00 C1 AE B4 DC 6B F4 55 01 C2 FE 9F 00 19 00 19 00 19 00 BE FF AF FF CA FF B7 FD 47 03 1E 00 00 2E ED 39 41 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1A 10 03 3A 3E 08 0E 1A 3A 01 88 22 59 FA 2C 07 00 00 03 00 83 10 70 72 90 00 00 00 00 4E AF 3F DC E9 F5 76 00 86 FF 65 00 19 00 19 00 19 00 C1 FF A5 FF C7 FF B7 FD 44 03 15 00 C4 E2 1E 3A 49 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 80 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D8 BC FC 2C 07 00 00 03 00 83 A9 0C 73 90 00 00 00 00 3C AF 44 DC 5E F6 B1 FF 0A 00 30 00 1A 00 1A 00 1A 00 CE FF BA FF D4 FF B9 FD 43 03 0E 00 28 3A 3A 3A 51 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 81 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 8D 20 FF 2C 07 00 00 03 00 83 42 A9 73 90 00 00 00 00 B3 AE B7 DC 00 F6 35 FF 99 00 0A 00 1A 00 1A 00 1A 00 D0 FF D3 FF DA FF BA FD 43 03 08 00 36 11 28 3A 59 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 82 1B 10 03 3A 3E 08 0E 1A 3A 01 80 43 84 01 2D 07 00 00 03 00 83 DB 45 74 90 00 00 00 00 03 AE 76 DD E0 F4 DF FE FC 00 EA FF 1A 00 1A 00 1A 00 DA FF D9 FF E9 FF BC FD 43 03 03 00 7B 0A 19 3A 61 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 83 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F9 E7 03 2D 07 00 00 03 00 83 74 E2 74 90 00 00 00 00 37 AD 75 DE 27 F3 90 FE 51 01 D0 FF 1A 00 1A 00 1A 00 E6 FF E2 FF F9 FF BF FD 44 03 00 00 EC 66 1B 3A 69 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 84 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 AA 4B 06 2D 07 00 00 03 00 83 0C 7F 75 90 00 00 00 00 31 AC BB DF 1A F1 4C FE 7C 01 BF FF 1A 00 1A 00 1A 00 F2 FF E5 FF 02 00 C1 FD 45 03 00 00 82 87 06 3A 71 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 85 1B 10 03 3A 3E 08 0E 1A 3A 01 90 60 AF 08 2D 07 00 00 03 00 83 A5 1B 76 90 00 00 00 00 F9 AA 2A E1 DE EE F5 FD D3 01 A5 FF 1A 00 1A 00 1A 00 D8 FF D2 FF EC FF C2 FD 46 03 FF FF E0 E9 D4 39 79 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 86 1B 10 03 3A 3E 08 0E 1A 3A 01 38 16 13 0B 2D 07 00 00 03 00 43 3E B8 76 90 00 00 00 00 76 A9 18 E3 1E EC 87 FD 21 02 B9 FF 1A 00 1A 00 1A 00 E2 FF D5 FF FE FF C3 FD 46 03 FF FF 6C B9 6C 39 81 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 87 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 CB 76 0D 2D 07 00 00 03 00 43 D7 54 77 90 00 00 00 00 A0 A7 7E E5 09 E9 DE FC DE 02 BF FF 1A 00 1A 00 1A 00 AD FF C2 FF D8 FF C1 FD 44 03 FF FF CD DA 54 39 89 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 88 1B 10 03 3A 3E 08 0E 1A 3A 01 88 81 DA 0F 2D 07 00 00 03 00 43 70 F1 77 90 00 00 00 00 9D A5 C9 E8 1E E5 6A FC 51 03 BE FF 1A 00 1A 00 1A 00 DB FF CB FF 17 00 C0 FD 42 03 02 00 5A E4 79 39 91 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 89 1B 10 03 3A 3E 08 0E 1A 3A 01 30 37 3E 12 2D 07 00 00 03 00 83 09 8E 78 90 00 00 00 00 9A A3 60 EC 0E E1 52 FC 63 03 D3 FF 1A 00 1A 00 1A 00 EB FF FB FF 2F 00 C0 FD 42 03 09 00 07 D8 7E 39 99 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 EC A1 14 2D 07 00 00 03 00 83 A2 2A 79 90 00 00 00 00 ED A1 11 F0 44 DD 9E FC 44 03 F3 FF 1A 00 1A 00 1A 00 F6 FF F8 FF 39 00 C1 FD 43 03 12 00 E1 14 84 39 A1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1B 10 03 3A 3E 08 0E 1A 3A 01 98 9E 05 17 2D 07 00 00 03 00 83 3A C7 79 90 00 00 00 00 90 A0 B6 F3 B6 D9 C8 FC 0C 03 02 00 1A 00 1A 00 1A 00 0D 00 FC FF 4B 00 C1 FD 43 03 1D 00 8A 01 66 39 A9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1B 10 03 3A 3E 08 0E 1A 3A 01 40 54 69 19 2D 07 00 00 03 00 83 D3 63 7A 90 00 00 00 00 71 9F 22 F7 98 D6 14 FD F1 02 10 00 1B 00 1B 00 1B 00 F5 FF 05 00 28 00 C1 FD 43 03 27 00 2E A6 59 39 B1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 09 CD 1B 2D 07 00 00 03 00 83 6C 00 7B 90 00 00 00 00 AF 9E 7F FA 86 D3 45 FD D1 02 00 00 1B 00 1B 00 1B 00 21 00 12 00 52 00 C1 FD 43 03 32 00 2F 73 32 39 B9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1B 10 03 3A 3E 08 0E 1A 3A 01 90 BF 30 1E 2D 07 00 00 03 00 83 05 9D 7B 90 00 00 00 00 18 9E 59 FD 18 D1 E0 FD 0D 02 16 00 1B 00 1B 00 1B 00 35 00 3D 00 4F 00 C3 FD 45 03 3F 00 7D 5F 85 39 C1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1B 10 03 3A 3E 08 0E 1A 3A 01 38 75 94 20 2D 07 00 00 03 00 83 9E 39 7C 90 00 00 00 00 D1 9D 7A FF 5D CF C4 FE 7E 01 1C 00 1B 00 1B 00 1B 00 44 00 5A 00 4D 00 C5 FD 48 03 4B 00 54 52 17 3A C9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 90 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 2A F8 22 2D 07 00 00 03 00 83 37 D6 7C 90 00 00 00 00 D2 9D B6 00 6B CE AC FF A7 00 3B 00 1B 00 1B 00 1B 00 4C 00 69 00 4B 00 C8 FD 4C 03 56 00 B7 1F 85 3A D1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 91 1B 10 03 3A 3E 08 0E 1A 3A 01 88 E0 5B 25 2D 07 00 00 03 00 83 D0 72 7D 90 00 00 00 00 00 9E 17 01 69 CE 87 00 BC FF 62 00 1B 00 1B 00 1B 00 5A 00 65 00 4F 00 CB FD 50 03 60 00 EE 97 BD 3A D9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 92 1B 10 03 3A 3E 08 0E 1A 3A 01 30 96 BF 27 2D 07 00 00 03 00 83 69 0F 7E 90 00 00 00 00 46 9E 9C 00 6E CF 56 01 DB FE 89 00 1B 00 1B 00 1B 00 48 00 54 00 40 00 CF FD 54 03 69 00 1C 76 EA 3A E1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 93 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 47 23 2A 2D 07 00 00 03 00 83 01 AC 7E 90 00 00 00 00 BF 9E 69 FF 3A D1 0E 02 4B FE A6 00 1B 00 1B 00 1B 00 36 00 45 00 3A 00 D1 FD 57 03 70 00 2A E1 05 3B E9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 94 1B 10 03 3A 3E 08 0E 1A 3A 01 98 FD 86 2C 2D 07 00 00 03 00 83 9A 48 7F 90 00 00 00 00 74 9F 8A FD BC D3 A5 02 83 FD AC 00 1B 00 1B 00 1B 00 3B 00 2A 00 5B 00 D4 FD 59 03 77 00 20 AB 08 3B F1 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 95 1B 10 03 3A 3E 08 0E 1A 3A 01 40 B3 EA 2E 2D 07 00 00 03 00 83 33 E5 7F 90 00 00 00 00 54 A0 D0 FA 1E D7 33 03 BE FC A7 00 1B 00 1B 00 1B 00 2E 00 1D 00 58 00 D8 FD 5B 03 7D 00 03 A8 EE 3A F9 6A 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 96 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 68 4E 31 2D 07 00 00 03 00 83 CC 81 80 90 00 00 00 00 8B A1 54 F7 3E DB B5 03 25 FC 91 00 1B 00 1B 00 1B 00 17 00 0B 00 4E 00 DC FD 5D 03 81 00 A3 89 B7 3A 01 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 97 1B 10 03 3A 3E 08 0E 1A 3A 01 90 1E B2 33 2D 07 00 00 03 00 83 65 1E 81 90 00 00 00 00 34 A3 4F F3 DD DF 0C 04 D6 FB 8F 00 1B 00 1B 00 1B 00 07 00 04 00 4E 00 DF FD 5F 03 83 00 ED E5 78 3A 09 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 98 1B 10 03 3A 3E 08 0E 1A 3A 01 38 D4 15 36 2D 07 00 00 03 00 83 FE BA 81 90 00 00 00 00 45 A5 08 EF FA E4 39 04 76 FB A8 00 1C 00 1C 00 1C 00 FC FF F2 FF 58 00 E3 FD 61 03 84 00 99 24 16 3A 11 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 99 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 89 79 38 2D 07 00 00 03 00 83 97 57 82 90 00 00 00 00 AD A7 AA EA 7D EA 38 04 5E FB B4 00 1C 00 1C 00 1C 00 E9 FF E5 FF 5B 00 E5 FD 62 03 82 00 8E A3 92 39 19 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1B 10 03 3A 3E 08 0E 1A 3A 01 88 3F DD 3A 2D 07 00 00 03 00 83 30 F4 82 90 00 00 00 00 61 AA 63 E6 22 F0 24 04 78 FB BC 00 1C 00 1C 00 1C 00 D3 FF DE FF 3F 00 E8 FD 63 03 7E 00 5C 8E 08 39 21 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1B 10 03 3A 3E 08 0E 1A 3A 01 30 F5 40 3D 2D 07 00 00 03 00 83 C9 90 83 90 00 00 00 00 48 AD 74 E2 86 F5 C9 03 D7 FB 8B 00 1C 00 1C 00 1C 00 C9 FF BC FF 2E 00 EA FD 62 03 76 00 B2 12 47 39 29 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 A6 A4 3F 2D 07 00 00 03 00 83 61 2D 84 90 00 00 00 00 2A B0 DA DE 43 FA 4E 03 4F FC 4E 00 1C 00 1C 00 1C 00 C1 FF B1 FF 1C 00 EB FD 61 03 6C 00 D1 B2 BA 39 31 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1B 10 03 3A 3E 08 0E 1A 3A 01 98 5C 08 42 2D 07 00 00 03 00 83 FA C9 84 90 00 00 00 00 D8 B2 B0 DB 26 FE CD 02 FC FC 22 00 1C 00 1C 00 1C 00 B7 FF CB FF FF FF EC FD 60 03 60 00 95 BB E8 39 39 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1B 10 03 3A 3E 08 0E 1A 3A 01 40 12 6C 44 2D 07 00 00 03 00 83 93 66 85 90 00 00 00 00 45 B5 2F D9 45 01 4D 02 AD FD 17 00 1C 00 1C 00 1C 00 B4 FF CE FF E9 FF EC FD 5F 03 51 00 CA AA EB 39 41 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 C7 CF 46 2D 07 00 00 03 00 83 2C 03 86 90 00 00 00 00 40 B7 93 D7 A2 03 D6 01 A1 FE 38 00 1C 00 1C 00 1C 00 AC FF D3 FF E0 FF EB FD 5F 03 41 00 73 6A F0 39 49 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1B 10 03 3A 3E 08 0E 1A 3A 01 90 7D 33 49 2D 07 00 00 03 00 83 C5 9F 86 90 00 00 00 00 BE B8 F5 D6 45 05 43 01 70 FF 51 00 1C 00 1C 00 1C 00 BF FF B8 FF EA FF EB FD 5E 03 31 00 A6 3A FD 39 51 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1B 10 03 3A 3E 08 0E 1A 3A 01 38 33 97 4B 2D 07 00 00 03 00 83 5E 3C 87 90 00 00 00 00 6D B9 ED D6 06 06 48 00 1B 00 2C 00 1C 00 1C 00 1C 00 C8 FF AA FF DA FF ED FD 5B 03 21 00 E0 A0 28 3A 59 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 E8 FA 4D 2D 07 00 00 03 00 83 F7 D8 87 90 00 00 00 00 1C B9 69 D7 B1 05 32 FF C2 00 05 00 1C 00 1C 00 1C 00 D6 FF AA FF CA FF EF FD 58 03 10 00 39 FF 40 3A 61 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1B 10 03 3A 3E 08 0E 1A 3A 01 88 9E 5E 50 2D 07 00 00 03 00 83 90 75 88 90 00 00 00 00 CD B7 61 D8 59 04 54 FE 6B 01 ED FF 1C 00 1C 00 1C 00 C4 FF C4 FF C3 FF F1 FD 57 03 01 00 9C 7B 32 3A 69 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1B 10 03 3A 3E 08 0E 1A 3A 01 30 54 C2 52 2D 07 00 00 03 00 83 29 12 89 90 00 00 00 00 C0 B5 00 DA 14 02 6C FD 31 02 BE FF 1D 00 1D 00 1D 00 C5 FF 9C FF C6 FF F2 FD 55 03 F4 FF 8C 81 52 3A 71 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1B 10 03 3A 3E 08 0E 1A 3A 01 F0 05 26 55 2D 07 00 00 03 00 83 C1 AE 89 90 00 00 00 00 D9 B2 0D DC 8F FE 4A FC CF 02 60 FF 1D 00 1D 00 1D 00 CB FF 98 FF D7 FF F4 FD 52 03 EA FF AE DB B9 3A 79 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1B 10 03 3A 3E 08 0E 1A 3A 01 98 BB 89 57 2D 07 00 00 03 00 83 5A 4B 8A 90 00 00 00 00 43 AF BA DE F9 F9 6A FB A9 03 56 FF 1D 00 1D 00 1D 00 B2 FF 9F FF F9 FF F4 FD 50 03 E4 FF E9 C0 DE 3A 81 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1B 10 03 3A 3E 08 0E 1A 3A 01 40 71 ED 59 2D 07 00 00 03 00 83 F3 E7 8A 90 00 00 00 00 49 AB 0A E2 8C F4 D7 FA C8 03 28 FF 1D 00 1D 00 1D 00 E1 FF B8 FF 41 00 F6 FD 4F 03 E6 FF 44 A3 04 3B 89 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 26 51 5C 2D 07 00 00 03 00 83 8C 84 8B 90 00 00 00 00 79 A7 8A E5 0B EF D8 FA 17 04 4C FF 1D 00 1D 00 1D 00 BA FF D9 FF 35 00 F5 FD 50 03 ED FF DC AF EB 3A 91 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1B 10 03 3A 3E 08 0E 1A 3A 01 90 DC B4 5E 2D 07 00 00 03 00 83 25 21 8C 90 00 00 00 00 16 A4 A5 E9 60 E9 EF FA 42 04 73 FF 1D 00 1D 00 1D 00 DB FF E7 FF 67 00 F4 FD 51 03 F7 FF E8 66 D6 3A 99 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1B 10 03 3A 3E 08 0E 1A 3A 01 38 92 18 61 2D 07 00 00 03 00 83 BE BD 8C 90 00 00 00 00 48 A1 C9 ED 1E E4 67 FB FC 03 94 FF 1D 00 1D 00 1D 00 FB FF 0A 00 72 00 F4 FD 53 03 05 00 72 5D DD 3A A1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 47 7C 63 2D 07 00 00 03 00 83 57 5A 8D 90 00 00 00 00 3A 9F A3 F1 99 DF 3F FC A5 03 CF FF 1D 00 1D 00 1D 00 FB FF 37 00 54 00 F4 FD 56 03 14 00 0A 6C CB 3A A9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1B 10 03 3A 3E 08 0E 1A 3A 01 88 FD DF 65 2D 07 00 00 03 00 83 F0 F6 8D 90 00 00 00 00 FB 9D 55 F5 CC DB 2B FD 32 03 1F 00 1D 00 1D 00 1D 00 12 00 22 00 51 00 F4 FD 59 03 24 00 C4 5B E7 3A B1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1B 10 03 3A 3E 08 0E 1A 3A 01 30 B3 43 68 2D 07 00 00 03 00 83 89 93 8E 90 00 00 00 00 1D 9D A6 F8 86 D8 27 FD 07 03 EC FF 1D 00 1D 00 1D 00 09 00 F3 FF 41 00 F3 FD 58 03 32 00 AE D5 A4 3A B9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 68 A7 6A 2D 07 00 00 03 00 83 22 30 8F 90 00 00 00 00 50 9C B2 FB 54 D5 F6 FC DD 02 AF FF 1D 00 1D 00 1D 00 10 00 E3 FF 27 00 F2 FD 55 03 3F 00 6B D7 9A 3A C1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1B 10 03 3A 3E 08 0E 1A 3A 01 98 1A 0B 6D 2D 07 00 00 03 00 83 BA CC 8F 90 00 00 00 00 8A 9B AF FE 2D D2 F1 FC D2 02 C0 FF 1D 00 1D 00 1D 00 0F 00 0D 00 3C 00 F0 FD 52 03 4C 00 E6 A0 9C 3A C9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1B 10 03 3A 3E 08 0E 1A 3A 01 40 D0 6E 6F 2D 07 00 00 03 00 83 53 69 90 90 00 00 00 00 ED 9A 6F 01 6B CF 5F FD 49 02 C3 FF 1E 00 1E 00 1E 00 31 00 42 00 5C 00 EE FD 51 03 5C 00 D0 3E B1 3A D1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 85 D2 71 2D 07 00 00 03 00 03 EC 05 91 90 00 00 00 00 8F 9A 5E 03 8F CD B2 FE 1E 01 F2 FF 1E 00 1E 00 1E 00 60 00 96 00 7B 00 EE FD 54 03 6D 00 1D 67 11 3B D9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1B 10 03 3A 3E 08 0E 1A 3A 01 90 3B 36 74 2D 07 00 00 03 00 03 85 A2 91 90 00 00 00 00 96 9A 10 04 01 CD 53 00 27 00 3D 00 1E 00 1E 00 1E 00 5C 00 AE 00 66 00 EE FD 5A 03 7D 00 10 F7 6C 3B E1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1B 10 03 3A 3E 08 0E 1A 3A 01 38 F1 99 76 2D 07 00 00 03 00 83 1E 3F 92 90 00 00 00 00 0F 9B C4 03 A3 CD CD 01 0B FF B4 00 1E 00 1E 00 1E 00 5F 00 91 00 6F 00 EF FD 5F 03 8C 00 ED A9 B2 3B E9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 A6 FD 78 2D 07 00 00 03 00 83 B7 DB 92 90 00 00 00 00 CF 9B 7E 02 8B CF E7 02 04 FE E9 00 1E 00 1E 00 1E 00 54 00 74 00 7D 00 F1 FD 62 03 99 00 E2 F3 D4 3B F1 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1B 10 03 3A 3E 08 0E 1A 3A 01 88 5C 61 7B 2D 07 00 00 03 00 83 50 78 93 90 00 00 00 00 E2 9C 24 00 C4 D2 0F 04 C0 FC 0F 01 1E 00 1E 00 1E 00 4D 00 56 00 A0 00 F3 FD 66 03 A6 00 84 96 F5 3B F9 6B 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1B 10 03 3A 3E 08 0E 1A 3A 01 30 12 C5 7D 2D 07 00 00 03 00 83 E9 14 94 90 00 00 00 00 6D 9E 8B FC 6F D7 33 05 8D FB 40 01 1E 00 1E 00 1E 00 27 00 4E 00 A7 00 F6 FD 69 03 B1 00 F1 09 09 3C 01 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 C7 28 80 2D 07 00 00 03 00 83 82 B1 94 90 00 00 00 00 D5 A0 2E F8 5D DD 0A 06 1E FB 7D 01 1E 00 1E 00 1E 00 E5 FF 10 00 97 00 F7 FD 6C 03 B8 00 D8 F3 06 3C 09 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1B 10 03 3A 3E 08 0E 1A 3A 01 80 7D 8C 82 2D 07 00 00 03 00 83 1B 4E 95 90 00 00 00 00 27 A4 8E F3 F7 E3 52 06 DE FA 92 01 1E 00 1E 00 1E 00 C8 FF D3 FF 8D 00 F8 FD 6D 03 BA 00 7A 37 D1 3B 11 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1B 10 03 3A 3E 08 0E 1A 3A 01 28 33 F0 84 2D 07 00 00 03 00 83 B4 EA 95 90 00 00 00 00 0E A8 EB EE CE EA 25 06 D9 FA 4F 01 1E 00 1E 00 1E 00 B9 FF 9B FF 8C 00 F9 FD 6B 03 B8 00 9E DD 92 3B 19 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1B 10 03 3A 3E 08 0E 1A 3A 01 E8 E4 53 87 2D 07 00 00 03 00 83 4C 87 96 90 00 00 00 00 B3 AC AA E9 41 F1 90 06 BD FA 45 00 1E 00 1E 00 1E 00 E9 FF BE FF B8 00 FD FD 69 03 B2 00 F0 BB 7E 3B 21 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1B 10 03 3A 3E 08 0E 1A 3A 01 90 9A B7 89 2D 07 00 00 03 00 83 E5 23 97 90 00 00 00 00 AA B2 90 E3 E0 F7 62 07 EA F9 AD 00 1E 00 1E 00 1E 00 CD FF 08 00 E0 00 02 FE 6B 03 AC 00 2C CF 3E 3B 29 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1B 10 03 3A 3E 08 0E 1A 3A 01 38 50 1B 8C 2D 07 00 00 03 00 83 7E C0 97 90 00 00 00 00 41 B9 26 DE 9C FF A7 06 C8 FA 4E 01 1F 00 1F 00 1F 00 42 FF 57 FF 0E 00 FE FD 67 03 9A 00 7A 9B 0A 3B 31 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 05 7F 8E 2D 07 00 00 03 00 83 17 5D 98 90 00 00 00 00 85 BE B7 DA 7E 05 D1 03 E1 FC A1 00 1F 00 1F 00 1F 00 36 FF B5 FE 86 FF F7 FD 56 03 7B 00 71 E8 05 3B 39 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1B 10 03 3A 3E 08 0E 1A 3A 01 88 BB E2 90 2D 07 00 00 03 00 83 B0 F9 98 90 00 00 00 00 B3 C0 EE D8 B0 07 7C 00 2B FF D7 FF 1F 00 1F 00 1F 00 6C FF 0D FF 64 FF F1 FD 44 03 56 00 08 5A 1D 3B 41 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1B 10 03 3A 3E 08 0E 1A 3A 01 30 71 46 93 2D 07 00 00 03 00 83 49 96 99 90 00 00 00 00 6D C0 B4 D8 71 07 1B FF 77 00 E0 FF 1F 00 1F 00 1F 00 B0 FF C1 FF BB FF EF FD 3E 03 36 00 9E 1A 1A 3B 49 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 26 AA 95 2D 07 00 00 03 00 83 E2 32 9A 90 00 00 00 00 57 BF 4A D9 A3 06 E9 FE D8 00 12 00 1F 00 1F 00 1F 00 C9 FF E9 FF D6 FF F1 FD 3F 03 1D 00 C5 D9 F3 3A 51 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1B 10 03 3A 3E 08 0E 1A 3A 01 80 DC 0D 98 2D 07 00 00 03 00 83 7B CF 9A 90 00 00 00 00 E4 BD 52 DA 41 05 6A FE 4F 01 C6 FF 1F 00 1F 00 1F 00 EE FF DA FF EC FF F4 FD 3F 03 07 00 4C F1 DD 3A 59 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1B 10 03 3A 3E 08 0E 1A 3A 01 28 92 71 9A 2D 07 00 00 03 00 83 14 6C 9B 90 00 00 00 00 1C BC 71 DB 48 03 D6 FD 9D 01 9E FF 1F 00 1F 00 1F 00 D2 FF CB FF D3 FF F8 FD 3F 03 F4 FF A7 43 DA 3A 61 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 47 D5 9C 2D 07 00 00 03 00 83 AD 08 9C 90 00 00 00 00 96 B9 30 DD 90 00 DD FC 41 02 7E FF 1F 00 1F 00 1F 00 DB FF 96 FF E9 FF FA FD 3D 03 E2 FF 4A DC A8 3A 69 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1B 10 03 3A 3E 08 0E 1A 3A 01 78 FD 38 9F 2D 07 00 00 03 00 83 46 A5 9C 90 00 00 00 00 1A B6 65 DF FE FC E2 FB AD 02 77 FF 1F 00 1F 00 1F 00 E4 FF 9D FF 09 00 FD FD 3B 03 D6 FF 4A B3 9C 3A 71 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1B 10 03 3A 3E 08 0E 1A 3A 01 20 B3 9C A1 2D 07 00 00 03 00 83 DF 41 9D 90 00 00 00 00 F8 B1 F2 E1 D9 F8 12 FB 2E 03 69 FF 1F 00 1F 00 1F 00 AD FF 9F FF E6 FF FE FD 3A 03 CD FF E8 E4 E0 3A 79 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1B 10 03 3A 3E 08 0E 1A 3A 01 E0 64 00 A4 2D 07 00 00 03 00 83 77 DE 9D 90 00 00 00 00 91 AD 63 E5 C7 F3 95 FA F7 03 3A FF 1F 00 1F 00 1F 00 D1 FF AC FF 3A 00 FF FD 3A 03 CB FF E6 7B 03 3B 81 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1B 10 03 3A 3E 08 0E 1A 3A 01 88 1A 64 A6 2D 07 00 00 03 00 83 10 7B 9E 90 00 00 00 00 44 A9 04 E9 86 EE 79 FA 9C 03 55 FF 1F 00 1F 00 1F 00 F2 FF D8 FF 5A 00 02 FE 3D 03 D1 FF 16 8F 17 3B 89 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1B 10 03 3A 3E 08 0E 1A 3A 01 30 D0 C7 A8 2D 07 00 00 03 00 83 A9 17 9F 90 00 00 00 00 65 A5 9C EC AD E9 C2 FA A0 03 65 FF 20 00 20 00 20 00 D5 FF 00 00 3E 00 04 FE 41 03 DA FF 75 CC 14 3B 91 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1B 10 03 3A 3E 08 0E 1A 3A 01 D8 85 2B AB 2D 07 00 00 03 00 83 42 B4 9F 90 00 00 00 00 41 A2 6F F0 F2 E4 50 FB 9A 03 79 FF 20 00 20 00 20 00 14 00 0A 00 86 00 06 FE 46 03 E8 FF BA 24 16 3B 99 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1B 10 03 3A 3E 08 0E 1A 3A 01 80 3B 8F AD 2D 07 00 00 03 00 83 DB 50 A0 90 00 00 00 00 D5 9F 4E F3 09 E1 73 FC 57 02 6B FF 20 00 20 00 20 00 23 00 6E 00 68 00 0A FE 4D 03 FA FF 92 47 18 3B A1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1B 10 03 3A 3E 08 0E 1A 3A 01 28 F1 F2 AF 2D 07 00 00 03 00 83 74 ED A0 90 00 00 00 00 58 9E 96 F5 1B DE 7E FD 3C 02 AC FF 20 00 20 00 20 00 19 00 64 00 3C 00 0B FE 56 03 08 00 31 5D 44 3B A9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 A6 56 B2 2D 07 00 00 03 00 83 0D 8A A1 90 00 00 00 00 7A 9D 9C F7 C3 DB 0E FE C5 01 C0 FF 20 00 20 00 20 00 38 00 2D 00 5B 00 0D FE 5A 03 18 00 F1 03 50 3B B1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1B 10 03 3A 3E 08 0E 1A 3A 01 78 5C BA B4 2D 07 00 00 03 00 83 A6 26 A2 90 00 00 00 00 DB 9C C7 F8 2C DA 05 FF D6 00 CB FF 20 00 20 00 20 00 2F 00 6C 00 44 00 0F FE 5F 03 28 00 84 04 5E 3B B9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1B 10 03 3A 3E 08 0E 1A 3A 01 20 12 1E B7 2D 07 00 00 03 00 83 3F C3 A2 90 00 00 00 00 C7 9C 64 F9 3C D9 D7 FF A4 00 E3 FF 20 00 20 00 20 00 38 00 5E 00 3C 00 0F FE 64 03 36 00 84 A6 89 3B C1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 C7 81 B9 2D 07 00 00 03 00 83 D8 5F A3 90 00 00 00 00 01 9D 80 F9 FB D8 82 00 F6 FF 17 00 20 00 20 00 20 00 34 00 4D 00 33 00 10 FE 67 03 43 00 8E 7A 95 3B C9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1B 10 03 3A 3E 08 0E 1A 3A 01 70 7D E5 BB 2D 07 00 00 03 00 83 71 FC A3 90 00 00 00 00 7A 9D 3A F9 47 D9 EB 00 C6 FF 23 00 20 00 20 00 20 00 1C 00 1D 00 15 00 10 FE 69 03 4D 00 43 04 91 3B D1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1B 10 03 3A 3E 08 0E 1A 3A 01 18 33 49 BE 2D 07 00 00 03 00 83 0A 99 A4 90 00 00 00 00 FA 9D CA F8 CA D9 EB 00 AD FF 03 00 20 00 20 00 20 00 15 00 FD FF 12 00 0F FE 68 03 55 00 CD C5 3E 3B D9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 E8 AC C0 2D 07 00 00 03 00 83 A3 35 A5 90 00 00 00 00 69 9E 30 F8 61 DA F0 00 78 FF FE FF 20 00 20 00 20 00 18 00 05 00 13 00 0E FE 67 03 5B 00 FB 08 10 3B E1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1B 10 03 3A 3E 08 0E 1A 3A 01 68 9E 10 C3 2D 07 00 00 03 00 83 3C D2 A5 90 00 00 00 00 D2 9E 6A F7 1C DB 01 01 51 FF 01 00 20 00 20 00 20 00 1B 00 0E 00 18 00 0E FE 67 03 61 00 B4 52 EA 3A E9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1B 10 03 3A 3E 08 0E 1A 3A 01 10 54 74 C5 2D 07 00 00 03 00 83 D5 6E A6 90 00 00 00 00 48 9F 7E F6 17 DC 30 01 2D FF 10 00 21 00 21 00 21 00 0C 00 12 00 0F 00 0D FE 68 03 66 00 C4 29 5D 3A F1 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1B 10 03 3A 3E 08 0E 1A 3A 01 D0 05 D8 C7 2D 07 00 00 03 00 83 6D 0B A7 90 00 00 00 00 D7 9F 86 F5 2E DD 59 01 1D FF 1F 00 21 00 21 00 21 00 16 00 18 00 2D 00 0D FE 69 03 6B 00 DE CC AC 39 F9 6C 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1B 10 03 3A 3E 08 0E 1A 3A 01 78 BB 3B CA 2D 07 00 00 03 00 83 06 A8 A7 90 00 00 00 00 86 A0 2D F4 9C DE BF 01 84 FE 20 00 21 00 21 00 21 00 22 00 33 00 2E 00 0F FE 6B 03 70 00 DE 8A 2B 39 01 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1B 10 03 3A 3E 08 0E 1A 3A 01 20 71 9F CC 2D 07 00 00 03 00 83 9F 44 A8 90 00 00 00 00 85 A1 95 F2 71 E0 21 02 A3 FE 3E 00 21 00 21 00 21 00 FC FF 25 00 0B 00 0E FE 6E 03 72 00 2E 4E CB 39 09 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1B 10 03 3A 3E 08 0E 1A 3A 01 C8 26 03 CF 2D 07 00 00 03 00 83 38 E1 A8 90 00 00 00 00 D1 A2 0A F1 56 E2 43 02 AA FE 39 00 21 00 21 00 21 00 E5 FF F1 FF F9 FF 0D FE 6F 03 71 00 53 F0 E7 39 11 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1B 10 03 3A 3E 08 0E 1A 3A 01 70 DC 66 D1 2D 07 00 00 03 00 83 D1 7D A9 90 00 00 00 00 32 A4 96 EF D3 E3 EB 01 F3 FE 00 00 21 00 21 00 21 00 F3 FF CE FF 00 00 0C FE 6E 03 6E 00 3C 77 0A 3A 19 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1B 10 03 3A 3E 08 0E 1A 3A 01 18 92 CA D3 2D 07 00 00 03 00 83 6A 1A AA 90 00 00 00 00 4F A5 12 EE 12 E5 7A 01 C3 FE D5 FF 21 00 21 00 21 00 FB FF CD FF FA FF 0C FE 6C 03 6B 00 68 5A 61 3A 21 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1B 10 03 3A 3E 08 0E 1A 3A 01 C0 47 2E D6 2D 07 00 00 03 00 83 03 B7 AA 90 00 00 00 00 2B A6 AB EC 1F E6 0B 01 30 FF BF FF 21 00 21 00 21 00 E0 FF C2 FF DA FF 0B FE 6A 03 64 00 46 28 80 3A 29 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DC 1B 10 03 3A 3E 08 0E 1A 3A 01 68 FD 91 D8 2D 07 00 00 03 00 83 9C 53 AB 90 00 00 00 00 BC A6 91 EB A7 E6 9B 00 4D FF A7 FF 21 00 21 00 21 00 F4 FF D2 FF ED FF 0A FE 68 03 5E 00 D8 E4 94 3A 31 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DD 1B 10 03 3A 3E 08 0E 1A 3A 01 10 B3 F5 DA 2D 07 00 00 03 00 83 35 F0 AB 90 00 00 00 00 12 A7 8F EA F0 E6 49 00 76 FF 9D FF 21 00 21 00 21 00 ED FF D5 FF E9 FF 08 FE 66 03 58 00 9C 62 88 3A 39 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DE 1B 10 03 3A 3E 08 0E 1A 3A 01 B8 68 59 DD 2D 07 00 00 03 00 83 CE 8C AC 90 00 00 00 00 31 A7 C5 E9 06 E7 07 00 A2 FF AE FF 21 00 21 00 21 00 E7 FF E8 FF EB FF 06 FE 65 03 53 00 55 F1 7C 3A 41 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DF 1B 10 03 3A 3E 08 0E 1A 3A 01 60 1E BD DF 2D 07 00 00 03 00 83 67 29 AD 90 00 00 00 00 2C A7 37 E9 01 E7 E3 FF B0 FF B9 FF 21 00 21 00 21 00 F6 FF EF FF FD FF 05 FE 64 03 4F 00 06 20 78 3A 49 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E0 1B 10 03 3A 3E 08 0E 1A 3A 01 08 D4 20 E2 2D 07 00 00 03 00 83 00 C6 AD 90 00 00 00 00 1A A7 B4 E8 FD E6 EB FF 9F FF BB FF 22 00 22 00 22 00 08 00 00 00 0B 00 04 FE 65 03 4C 00 88 25 24 3A 51 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E1 1B 10 03 3A 3E 08 0E 1A 3A 01 B0 89 84 E4 2D 07 00 00 03 00 83 99 62 AE 90 00 00 00 00 16 A7 16 E8 25 E7 16 00 92 FF C9 FF 22 00 22 00 22 00 F7 FF 0E 00 FE FF 02 FE 66 03 4A 00 91 6C F9 39 59 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1B 10 03 3A 3E 08 0E 1A 3A 01 58 3F E8 E6 2D 07 00 00 03 00 83 32 FF AE 90 00 00 00 00 2A A7 9F E7 56 E7 29 00 BE FF DE FF 22 00 22 00 22 00 F1 FF 02 00 FD FF 00 FE 66 03 47 00 B3 52 9F 39 61 6D 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1B 10 03 3A 3E 08 0E 1A 3A 01 00 F5 4B E9 2D 07 00 00 03 00 83 CB 9B AF 90 00 00 00 00 3F A7 50 E7 7C E7 17 00 D6 FF E7 FF 22 00 22 00 22 00 F0 FF F0 FF FF FF FD FD 66 03 45 00 03 8E 21 39 69 6D 00 00
diff --git a/head-tracking/plot.py b/head-tracking/plot.py
new file mode 100644
index 0000000..38ccea1
--- /dev/null
+++ b/head-tracking/plot.py
@@ -0,0 +1,860 @@
+import struct
+import bluetooth
+import threading
+import time
+from datetime import datetime
+import numpy as np
+import matplotlib.pyplot as plt
+from matplotlib.animation import FuncAnimation
+import os
+import asciichartpy as acp
+from rich.live import Live
+from rich.layout import Layout
+from rich.panel import Panel
+from rich.console import Console
+import drawille
+from head_orientation import HeadOrientation
+import logging
+from connection_manager import ConnectionManager
+
+class Colors:
+ RESET = "\033[0m"
+ BOLD = "\033[1m"
+ RED = "\033[91m"
+ GREEN = "\033[92m"
+ YELLOW = "\033[93m"
+ BLUE = "\033[94m"
+ MAGENTA = "\033[95m"
+ CYAN = "\033[96m"
+ WHITE = "\033[97m"
+ BG_BLACK = "\033[40m"
+
+class ColorFormatter(logging.Formatter):
+ FORMATS = {
+ logging.DEBUG: Colors.BLUE + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.INFO: Colors.GREEN + "%(message)s" + Colors.RESET,
+ logging.WARNING: Colors.YELLOW + "%(message)s" + Colors.RESET,
+ logging.ERROR: Colors.RED + "[%(levelname)s] %(message)s" + Colors.RESET,
+ logging.CRITICAL: Colors.RED + Colors.BOLD + "[%(levelname)s] %(message)s" + Colors.RESET
+ }
+
+ def format(self, record):
+ log_fmt = self.FORMATS.get(record.levelno)
+ formatter = logging.Formatter(log_fmt, datefmt="%H:%M:%S")
+ return formatter.format(record)
+
+handler = logging.StreamHandler()
+handler.setFormatter(ColorFormatter())
+logger = logging.getLogger("airpods-head-tracking")
+logger.setLevel(logging.INFO)
+logger.addHandler(handler)
+logger.propagate = True
+
+INIT_CMD = "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00"
+NOTIF_CMD = "04 00 04 00 0F 00 FF FF FE FF"
+START_CMD = "04 00 04 00 17 00 00 00 10 00 10 00 08 A1 02 42 0B 08 0E 10 02 1A 05 01 40 9C 00 00"
+STOP_CMD = "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00"
+
+KEY_FIELDS = {
+ "orientation 1": (43, 2),
+ "orientation 2": (45, 2),
+ "orientation 3": (47, 2),
+
+ "Horizontal Acceleration": (51, 2),
+ "Vertical Acceleration": (53, 2),
+
+ "unkown 1": (61, 2),
+ "unkown 2 ": (49, 2),
+}
+
+class AirPodsTracker:
+ def __init__(self):
+ self.sock = None
+ self.recording = False
+ self.log_file = None
+ self.listener_thread = None
+ self.bt_addr = "28:2D:7F:C2:05:5B"
+ self.psm = 0x1001
+ self.raw_packets = []
+ self.parsed_packets = []
+ self.live_data = []
+ self.live_plotting = False
+ self.animation = None
+ self.fig = None
+ self.axes = None
+ self.lines = {}
+ self.selected_fields = []
+ self.data_lock = threading.Lock()
+ self.orientation_offset = 5500
+ self.use_terminal = True # '--terminal' in sys.argv
+ self.orientation_visualizer = HeadOrientation(use_terminal=self.use_terminal)
+
+ self.conn = None
+
+ def connect(self):
+ try:
+ logger.info("Trying to connect to %s on PSM 0x%04X...", self.bt_addr, self.psm)
+ self.conn = ConnectionManager(self.bt_addr, self.psm, logger=logger)
+ if not self.conn.connect():
+ logger.error("Connection failed via ConnectionManager.")
+ return False
+ self.sock = self.conn.sock
+ self.sock.send(bytes.fromhex(NOTIF_CMD))
+ logger.info("Sent initialization command.")
+
+ self.listener_thread = threading.Thread(target=self.listen, daemon=True)
+ self.listener_thread.start()
+ return True
+ except Exception as e:
+ logger.error("Connection error: %s", e)
+ return False
+
+ def start_tracking(self, duration=None):
+ if not self.recording:
+ self.conn.send_start()
+ filename = "head_tracking_" + datetime.now().strftime("%Y%m%d_%H%M%S") + ".log"
+ self.log_file = open(filename, "w")
+ self.recording = True
+ logger.info("Recording started. Saving data to %s", filename)
+
+ if duration is not None and duration > 0:
+ def auto_stop():
+ time.sleep(duration)
+ if self.recording:
+ self.stop_tracking()
+ logger.info("Recording automatically stopped after %s seconds.", duration)
+
+ timer_thread = threading.Thread(target=auto_stop, daemon=True)
+ timer_thread.start()
+ logger.info("Will automatically stop recording after %s seconds.", duration)
+ else:
+ logger.info("Already recording.")
+
+ def stop_tracking(self):
+ if self.recording:
+ self.conn.send_stop()
+ self.recording = False
+ if self.log_file is not None:
+ self.log_file.close()
+ self.log_file = None
+ logger.info("Recording stopped.")
+ else:
+ logger.info("Not currently recording.")
+
+ def format_hex(self, data):
+ hex_str = data.hex()
+ return ' '.join(hex_str[i:i + 2] for i in range(0, len(hex_str), 2))
+
+ def parse_raw_packet(self, hex_string):
+ return bytes.fromhex(hex_string.replace(" ", ""))
+
+ def interpret_bytes(self, raw_bytes, start, length, data_type="signed_short"):
+ if start + length > len(raw_bytes):
+ return None
+
+ if data_type == "signed_short":
+ return int.from_bytes(raw_bytes[start:start + 2], byteorder='little', signed=True)
+ elif data_type == "unsigned_short":
+ return int.from_bytes(raw_bytes[start:start + 2], byteorder='little', signed=False)
+ elif data_type == "signed_short_be":
+ return int.from_bytes(raw_bytes[start:start + 2], byteorder='big', signed=True)
+ elif data_type == "float_le":
+ if start + 4 <= len(raw_bytes):
+ return struct.unpack('f', raw_bytes[start:start + 4])[0]
+ return None
+
+ def normalize_orientation(self, value, field_name):
+ if 'orientation' in field_name.lower():
+ return value + self.orientation_offset
+
+ return value
+
+ def parse_packet_all_fields(self, raw_bytes):
+ packet = {}
+
+ packet["seq_num"] = int.from_bytes(raw_bytes[12:14], byteorder='little')
+
+ for field_name, (start, length) in KEY_FIELDS.items():
+ if field_name == "float_val" and start + 4 <= len(raw_bytes):
+ packet[field_name] = self.interpret_bytes(raw_bytes, start, 4, "float_le")
+ else:
+ raw_value = self.interpret_bytes(raw_bytes, start, length, "signed_short")
+ if raw_value is not None:
+ packet[field_name] = self.normalize_orientation(raw_value, field_name)
+
+ for i in range(30, min(90, len(raw_bytes) - 1), 2):
+ field_name = f"byte_{i:02d}"
+ raw_value = self.interpret_bytes(raw_bytes, i, 2, "signed_short")
+ if raw_value is not None:
+ packet[field_name] = self.normalize_orientation(raw_value, field_name)
+
+ return packet
+
+ def apply_dark_theme(self, fig, axes):
+ fig.patch.set_facecolor('#1e1e1e')
+ for ax in axes:
+ ax.set_facecolor('#2d2d2d')
+
+ ax.title.set_color('white')
+ ax.xaxis.label.set_color('white')
+ ax.yaxis.label.set_color('white')
+ ax.tick_params(colors='white')
+ ax.tick_params(axis='x', colors='white')
+ ax.tick_params(axis='y', colors='white')
+
+ ax.grid(True, color='#555555', alpha=0.3, linestyle='--')
+
+ for spine in ax.spines.values():
+ spine.set_color('#555555')
+
+ legend = ax.get_legend()
+ if (legend):
+ legend.get_frame().set_facecolor('#2d2d2d')
+ legend.get_frame().set_alpha(0.7)
+ for text in legend.get_texts():
+ text.set_color('white')
+
+ def listen(self):
+ while True:
+ try:
+ data = self.sock.recv(1024)
+ formatted = self.format_hex(data)
+ timestamp = datetime.now().isoformat()
+
+ is_valid = self.is_valid_tracking_packet(formatted)
+
+ if not self.live_plotting:
+ if is_valid:
+ logger.info("%s - Response: %s...", timestamp, formatted[:60])
+ else:
+ logger.info("%s - Skipped non-tracking packet.", timestamp)
+
+ if is_valid:
+ if self.recording and self.log_file is not None:
+ self.log_file.write(formatted + "\n")
+ self.log_file.flush()
+
+ try:
+ raw_bytes = self.parse_raw_packet(formatted)
+ packet = self.parse_packet_all_fields(raw_bytes)
+
+ with self.data_lock:
+ self.live_data.append(packet)
+ if len(self.live_data) > 300:
+ self.live_data.pop(0)
+
+ except Exception as e:
+ logger.error(f"Error parsing packet: {e}")
+
+ except Exception as e:
+ logger.error("Error receiving data: %s", e)
+ break
+
+ def load_log_file(self, filepath):
+ self.raw_packets = []
+ self.parsed_packets = []
+ try:
+ with open(filepath, 'r') as f:
+ for line in f:
+ line = line.strip()
+ if line:
+ try:
+ raw_bytes = self.parse_raw_packet(line)
+ self.raw_packets.append(raw_bytes)
+ packet = self.parse_packet_all_fields(raw_bytes)
+
+ min_seq_num = min(
+ [parsed_packet["seq_num"] for parsed_packet in self.parsed_packets], default=0
+ )
+
+ if packet["seq_num"] > min_seq_num:
+ self.parsed_packets.append(packet)
+
+ except Exception as e:
+ logger.error(f"Error parsing line: {e}")
+
+ logger.info(f"Loaded {len(self.parsed_packets)} packets from {filepath}")
+ return True
+ except Exception as e:
+ logger.error(f"Error loading log file: {e}")
+ return False
+
+ def extract_field_values(self, field_name, data_source='loaded'):
+ if data_source == 'loaded':
+ data = self.parsed_packets
+ else:
+ with self.data_lock:
+ data = self.live_data.copy()
+
+ values = [packet.get(field_name, 0) for packet in data if field_name in packet]
+
+ if data_source == 'live' and len(values) > 5:
+ try:
+ values = np.array(values, dtype=float)
+ values = np.convolve(values, np.ones(5) / 5, mode='valid')
+ except Exception as e:
+ logger.warning(f"Smoothing error (non-critical): {e}")
+
+ return values
+
+ def is_valid_tracking_packet(self, hex_string):
+ standard_header = "04 00 04 00 17 00 00 00 10 00"
+
+ if not hex_string.startswith(standard_header):
+ if self.live_plotting:
+ logger.warning("Invalid packet header: %s", hex_string[:30])
+ return False
+
+ if len(hex_string.split()) < 80:
+ if self.live_plotting:
+ logger.warning("Invalid packet length: %s", hex_string[:30])
+ return False
+
+ return True
+
+
+ def plot_fields(self, field_names=None):
+ if not self.parsed_packets:
+ logger.error("No data to plot. Load a log file first.")
+ return
+
+ if field_names is None:
+ field_names = list(KEY_FIELDS.keys())
+
+ if not self.orientation_visualizer.calibration_complete:
+ if len(self.parsed_packets) < self.orientation_visualizer.calibration_sample_count:
+ logger.error("Not enough packets for calibration. Need at least 10 packets.")
+ return
+ for packet in self.parsed_packets[:self.orientation_visualizer.calibration_sample_count]:
+ self.orientation_visualizer.add_calibration_sample([
+ packet.get('orientation 1', 0),
+ packet.get('orientation 2', 0),
+ packet.get('orientation 3', 0)
+ ])
+
+ if self.use_terminal:
+ self._plot_fields_terminal(field_names)
+
+ else:
+ acceleration_fields = [f for f in field_names if 'acceleration' in f.lower()]
+ orientation_fields = [f for f in field_names if 'orientation' in f.lower()]
+ other_fields = [f for f in field_names if f not in acceleration_fields + orientation_fields]
+
+ fig, axes = plt.subplots(3, 1, figsize=(14, 12), sharex=True)
+ self.apply_dark_theme(fig, axes)
+
+ acceleration_colors = ['#FFFF00', '#00FFFF']
+ orientation_colors = ['#FF00FF', '#00FF00', '#FFA500']
+ other_colors = ['#52b788', '#f4a261', '#e76f51', '#2a9d8f']
+
+ if acceleration_fields:
+ for i, field in enumerate(acceleration_fields):
+ values = self.extract_field_values(field)
+ axes[0].plot(values, label=field, color=acceleration_colors[i % len(acceleration_colors)], linewidth=2)
+ axes[0].set_title("Acceleration Data", fontsize=14)
+ axes[0].legend()
+
+ if orientation_fields:
+ for i, field in enumerate(orientation_fields):
+ values = self.extract_field_values(field)
+ axes[1].plot(values, label=field, color=orientation_colors[i % len(orientation_colors)], linewidth=2)
+ axes[1].set_title("Orientation Data", fontsize=14)
+ axes[1].legend()
+
+ if other_fields:
+ for i, field in enumerate(other_fields):
+ values = self.extract_field_values(field)
+ axes[2].plot(values, label=field, color=other_colors[i % len(other_colors)], linewidth=2)
+ axes[2].set_title("Other Fields", fontsize=14)
+ axes[2].legend()
+
+ plt.xlabel("Packet Index", fontsize=12)
+ plt.tight_layout()
+ plt.show()
+
+ def _plot_fields_terminal(self, field_names):
+ """Internal method for terminal-based plotting"""
+ terminal_width = os.get_terminal_size().columns
+ plot_width = min(terminal_width - 10, 120)
+ plot_height = 15
+
+ acceleration_fields = [f for f in field_names if 'acceleration' in f.lower()]
+ orientation_fields = [f for f in field_names if 'orientation' in f.lower()]
+ other_fields = [f for f in field_names if f not in acceleration_fields + orientation_fields]
+
+ def plot_group(fields, title):
+ if not fields:
+ return
+
+ print(f"\n{title}")
+ print("=" * len(title))
+
+ for field in fields:
+ values = self.extract_field_values(field)
+ if len(values) > plot_width:
+ values = values[-plot_width:]
+
+ if title == "Acceleration Data":
+ chart = acp.plot(values, {'height': plot_height})
+ print(chart)
+ else:
+ chart = acp.plot(values, {'height': plot_height})
+ print(chart)
+
+ print(f"Min: {min(values):.2f}, Max: {max(values):.2f}, " +
+ f"Mean: {np.mean(values):.2f}")
+ print()
+
+ plot_group(acceleration_fields, "Acceleration Data")
+ plot_group(orientation_fields, "Orientation Data")
+ plot_group(other_fields, "Other Fields")
+
+ def create_braille_plot(self, values, width=80, height=20, y_label=True, fixed_y_min=None, fixed_y_max=None):
+ canvas = drawille.Canvas()
+ if fixed_y_min is None or fixed_y_max is None:
+ local_min, local_max = min(values), max(values)
+ else:
+ local_min, local_max = fixed_y_min, fixed_y_max
+ y_range = local_max - local_min or 1
+ x_step = max(1, len(values) // width)
+ for i, v in enumerate(values[::x_step]):
+ y = int(((v - local_min) / y_range) * (height * 2 - 1))
+ canvas.set(i, y)
+ frame = canvas.frame()
+ if y_label:
+ lines = frame.split('\n')
+ labeled_lines = []
+ for idx, line in enumerate(lines):
+ if idx == 0:
+ labeled_lines.append(f"{local_max:6.0f} {line}")
+ elif idx == len(lines)-1:
+ labeled_lines.append(f"{local_min:6.0f} {line}")
+ else:
+ labeled_lines.append(" " + line)
+ frame = "\n".join(labeled_lines)
+ return frame
+
+ def _start_live_plotting_terminal(self, record_data=False, duration=None):
+ import sys, select, tty, termios
+ old_settings = termios.tcgetattr(sys.stdin)
+ tty.setcbreak(sys.stdin.fileno())
+ console = Console()
+ term_width = console.width
+ plot_width = round(min(term_width / 2 - 15, 120))
+ ori_height = 10
+
+ def make_compact_layout():
+ layout = Layout()
+ layout.split_column(
+ Layout(name="header", size=3),
+ Layout(name="main", ratio=1),
+ )
+ layout["main"].split_row(
+ Layout(name="accelerations", ratio=1),
+ Layout(name="orientations", ratio=1)
+ )
+ layout["accelerations"].split_column(
+ Layout(name="vertical", ratio=1),
+ Layout(name="horizontal", ratio=1)
+ )
+ layout["orientations"].split_column(
+ Layout(name="face", ratio=1),
+ Layout(name="raw", ratio=1)
+ )
+ return layout
+
+ layout = make_compact_layout()
+
+ try:
+ import time
+ with Live(layout, refresh_per_second=20, screen=True) as live:
+ while True:
+ if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
+ ch = sys.stdin.read(1)
+ if ch == 'p':
+ self.paused = not self.paused
+ logger.info("Paused" if self.paused else "Resumed")
+ if self.paused:
+ time.sleep(0.1)
+ rec_str = " [red][REC][/red]" if record_data else ""
+ left = "AirPods Head Tracking - v1.0.0"
+ right = "Ctrl+C - Close | p - Pause" + rec_str
+ status = "[bold red]Paused[/bold red]"
+ header = list(" " * term_width)
+ header[0:len(left)] = list(left)
+ header[term_width - len(right):] = list(right)
+ start = (term_width - len(status)) // 2
+ header[start:start+len(status)] = list(status)
+ header_text = "".join(header)
+ layout["header"].update(Panel(header_text, style="bold white on black"))
+ continue
+
+ with self.data_lock:
+ if len(self.live_data) < 1:
+ continue
+ latest = self.live_data[-1]
+ data = self.live_data[-plot_width:]
+
+ if not self.orientation_visualizer.calibration_complete:
+ sample = [
+ latest.get('orientation 1', 0),
+ latest.get('orientation 2', 0),
+ latest.get('orientation 3', 0)
+ ]
+ self.orientation_visualizer.add_calibration_sample(sample)
+ time.sleep(0.05)
+ rec_str = " [red][REC][/red]" if record_data else ""
+
+ left = "AirPods Head Tracking - v1.0.0"
+ status = "[bold yellow]Calibrating...[/bold yellow]"
+ right = "Ctrl+C - Close | p - Pause"
+ remaining = max(term_width - len(left) - len(right), 0)
+ header_text = f"{left}{status.center(remaining)}{right}{rec_str}"
+ layout["header"].update(Panel(header_text, style="bold white on black"))
+ live.refresh()
+ continue
+
+ o1 = latest.get('orientation 1', 0)
+ o2 = latest.get('orientation 2', 0)
+ o3 = latest.get('orientation 3', 0)
+ orientation = self.orientation_visualizer.calculate_orientation(o1, o2, o3)
+ pitch = orientation['pitch']
+ yaw = orientation['yaw']
+
+ h_accel = [p.get('Horizontal Acceleration', 0) for p in data]
+ v_accel = [p.get('Vertical Acceleration', 0) for p in data]
+ if len(h_accel) > plot_width:
+ h_accel = h_accel[-plot_width:]
+ if len(v_accel) > plot_width:
+ v_accel = v_accel[-plot_width:]
+ global_min = min(min(v_accel), min(h_accel))
+ global_max = max(max(v_accel), max(h_accel))
+ config_acc = {'height': 20, 'min': global_min, 'max': global_max}
+ vert_plot = acp.plot(v_accel, config_acc)
+ horiz_plot = acp.plot(h_accel, config_acc)
+
+ rec_str = " [red][REC][/red]" if record_data else ""
+ left = "AirPods Head Tracking - v1.0.0"
+ right = "Ctrl+C - Close | p - Pause" + rec_str
+ status = "[bold green]Live[/bold green]"
+ header = list(" " * term_width)
+ header[0:len(left)] = list(left)
+ header[term_width - len(right):] = list(right)
+ start = (term_width - len(status)) // 2
+ header[start:start+len(status)] = list(status)
+ header_text = "".join(header)
+ layout["header"].update(Panel(header_text, style="bold white on black"))
+
+ face_art = self.orientation_visualizer.create_face_art(pitch, yaw)
+ layout["accelerations"]["vertical"].update(Panel(
+ "[bold yellow]Vertical Acceleration[/]\n" +
+ vert_plot + "\n" +
+ f"Cur: {v_accel[-1]:6.1f} | Min: {min(v_accel):6.1f} | Max: {max(v_accel):6.1f}",
+ style="yellow"
+ ))
+ layout["accelerations"]["horizontal"].update(Panel(
+ "[bold cyan]Horizontal Acceleration[/]\n" +
+ horiz_plot + "\n" +
+ f"Cur: {h_accel[-1]:6.1f} | Min: {min(h_accel):6.1f} | Max: {max(h_accel):6.1f}",
+ style="cyan"
+ ))
+ layout["orientations"]["face"].update(Panel(face_art, title="[green]Orientation - Visualization[/]", style="green"))
+
+ o2_values = [p.get('orientation 2', 0) for p in data[-plot_width:]]
+ o3_values = [p.get('orientation 3', 0) for p in data[-plot_width:]]
+ o2_values = o2_values[:plot_width]
+ o3_values = o3_values[:plot_width]
+ common_min = min(min(o2_values), min(o3_values))
+ common_max = max(max(o2_values), max(o3_values))
+ config_ori = {'height': ori_height, 'min': common_min, 'max': common_max, 'format': "{:6.0f}"}
+ chart_o2 = acp.plot(o2_values, config_ori)
+ chart_o3 = acp.plot(o3_values, config_ori)
+ layout["orientations"]["raw"].update(Panel(
+ "[bold yellow]Orientation 1:[/]\n" + chart_o2 + "\n" +
+ f"Cur: {o2_values[-1]:6.1f} | Min: {min(o2_values):6.1f} | Max: {max(o2_values):6.1f}\n\n" +
+ "[bold green]Orientation 2:[/]\n" + chart_o3 + "\n" +
+ f"Cur: {o3_values[-1]:6.1f} | Min: {min(o3_values):6.1f} | Max: {max(o3_values):6.1f}",
+ title="[cyan]Orientation Raw[/]", style="yellow"
+ ))
+ live.refresh()
+ time.sleep(0.05)
+ except KeyboardInterrupt:
+ logger.info("\nStopped.")
+ if record_data:
+ self.stop_tracking()
+ else:
+ if self.sock:
+ self.sock.send(bytes.fromhex(STOP_CMD))
+ finally:
+ termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
+
+ def _start_live_plotting(self, record_data=False, duration=None):
+ terminal_width = os.get_terminal_size().columns
+ plot_width = min(terminal_width - 10, 80)
+ plot_height = 10
+
+ try:
+ while True:
+ os.system('clear' if os.name == 'posix' else 'cls')
+ with self.data_lock:
+ if len(self.live_data) == 0:
+ print("\nWaiting for data...")
+ time.sleep(0.1)
+ continue
+
+ data = self.live_data[-plot_width:]
+
+ acceleration_fields = [f for f in KEY_FIELDS.keys() if 'acceleration' in f.lower()]
+ orientation_fields = [f for f in KEY_FIELDS.keys() if 'orientation' in f.lower()]
+ other_fields = [f for f in KEY_FIELDS.keys() if f not in acceleration_fields + orientation_fields]
+
+ def plot_group(fields, title):
+ if not fields:
+ return
+
+ print(f"\n{title}")
+ print("=" * len(title))
+
+ for field in fields:
+ values = [packet.get(field, 0) for packet in data if field in packet]
+ if len(values) > 0:
+ chart = acp.plot(values, {'height': plot_height})
+ print(chart)
+ print(f"Current: {values[-1]:.2f}, " +
+ f"Min: {min(values):.2f}, Max: {max(values):.2f}")
+ print()
+
+ plot_group(acceleration_fields, "Acceleration Data")
+ plot_group(orientation_fields, "Orientation Data")
+ plot_group(other_fields, "Other Fields")
+
+ print("\nPress Ctrl+C to stop plotting")
+ time.sleep(0.1)
+
+ except KeyboardInterrupt:
+ logger.info("\nLive plotting stopped.")
+ self.sock.send(bytes.fromhex(STOP_CMD))
+ if record_data:
+ self.stop_tracking()
+ self.live_plotting = False
+
+ def start_live_plotting(self, record_data=False, duration=None):
+ if self.sock is None:
+ if not self.connect():
+ logger.error("Could not connect to AirPods. Live plotting aborted.")
+ return
+ if not self.recording and record_data:
+ self.start_tracking(duration)
+ logger.info("Recording enabled during live plotting")
+ elif not self.recording:
+ self.sock.send(bytes.fromhex(START_CMD))
+ logger.info("Head tracking started (not recording to file)")
+ with self.data_lock:
+ self.live_data = []
+ self.live_plotting = True
+ self.paused = False
+ if self.use_terminal:
+ self._start_live_plotting_terminal(record_data, duration)
+ else:
+ from matplotlib.gridspec import GridSpec, GridSpecFromSubplotSpec
+ fig = plt.figure(figsize=(14, 6))
+ gs = GridSpec(1, 2, width_ratios=[1, 1])
+ ax_accel = fig.add_subplot(gs[0])
+ subgs = GridSpecFromSubplotSpec(2, 1, subplot_spec=gs[1], height_ratios=[2, 1])
+ ax_head_top = fig.add_subplot(subgs[0], projection='3d')
+ ax_ori = fig.add_subplot(subgs[1])
+
+ ax_accel.set_title("Acceleration Data")
+ ax_accel.set_xlabel("Packet Index")
+ ax_accel.set_ylabel("Acceleration")
+ ax_accel.legend(loc='upper right', framealpha=0.7)
+ fig.patch.set_facecolor('#1e1e1e')
+ ax_accel.set_facecolor('#2d2d2d')
+ self.apply_dark_theme(fig, [ax_accel, ax_head_top, ax_ori])
+ plt.ion()
+
+ def update_plot(_):
+ with self.data_lock:
+ data = self.live_data.copy()
+ if len(data) == 0:
+ return
+
+ latest = data[-1]
+
+ if not self.orientation_visualizer.calibration_complete:
+ sample = [
+ latest.get('orientation 1', 0),
+ latest.get('orientation 2', 0),
+ latest.get('orientation 3', 0)
+ ]
+ self.orientation_visualizer.add_calibration_sample(sample)
+ ax_head_top.cla()
+ ax_head_top.text(0.5, 0.5, "Calibrating... please wait", horizontalalignment='center', verticalalignment='center', transform=ax_head_top.transAxes, color='white')
+ fig.canvas.draw_idle()
+ return
+
+ h_accel = [p.get('Horizontal Acceleration', 0) for p in data]
+ v_accel = [p.get('Vertical Acceleration', 0) for p in data]
+ x_vals = list(range(len(h_accel)))
+ ax_accel.cla()
+ ax_accel.plot(x_vals, v_accel, label='Vertical Acceleration', color='#FFFF00', linewidth=2)
+ ax_accel.plot(x_vals, h_accel, label='Horizontal Acceleration', color='#00FFFF', linewidth=2)
+ ax_accel.set_title("Acceleration Data")
+ ax_accel.set_xlabel("Packet Index")
+ ax_accel.set_ylabel("Acceleration")
+ ax_accel.legend(loc='upper right', framealpha=0.7)
+ ax_accel.set_facecolor('#2d2d2d')
+ ax_accel.title.set_color('white')
+ ax_accel.xaxis.label.set_color('white')
+ ax_accel.yaxis.label.set_color('white')
+
+ latest = data[-1]
+ o1 = latest.get('orientation 1', 0)
+ o2 = latest.get('orientation 2', 0)
+ o3 = latest.get('orientation 3', 0)
+ orientation = self.orientation_visualizer.calculate_orientation(o1, o2, o3)
+ pitch = orientation['pitch']
+ yaw = orientation['yaw']
+
+ ax_head_top.cla()
+ ax_head_top.set_title("Head Orientation")
+ ax_head_top.set_xlim([-1, 1])
+ ax_head_top.set_ylim([-1, 1])
+ ax_head_top.set_zlim([-1, 1])
+ ax_head_top.set_facecolor('#2d2d2d')
+ pitch_rad = np.radians(pitch)
+ yaw_rad = np.radians(yaw)
+ Rz = np.array([
+ [np.cos(yaw_rad), np.sin(yaw_rad), 0],
+ [-np.sin(yaw_rad), np.cos(yaw_rad), 0],
+ [0, 0, 1]
+ ])
+ Ry = np.array([
+ [np.cos(pitch_rad), 0, np.sin(pitch_rad)],
+ [0, 1, 0],
+ [-np.sin(pitch_rad), 0, np.cos(pitch_rad)]
+ ])
+ R = Rz @ Ry
+ dir_vec = R @ np.array([1, 0, 0])
+ ax_head_top.quiver(0, 0, 0, dir_vec[0], dir_vec[1], dir_vec[2],
+ color='r', length=0.8, linewidth=3)
+
+ ax_ori.cla()
+ o2_values = [p.get('orientation 2', 0) for p in data]
+ o3_values = [p.get('orientation 3', 0) for p in data]
+ x_range = list(range(len(o2_values)))
+ ax_ori.plot(x_range, o2_values, label='Orientation 1', color='red', linewidth=2)
+ ax_ori.plot(x_range, o3_values, label='Orientation 2', color='green', linewidth=2)
+ ax_ori.set_facecolor('#2d2d2d')
+ ax_ori.tick_params(colors='white')
+ ax_ori.set_title("Orientation Raw")
+ ax_ori.legend(facecolor='#2d2d2d', edgecolor='#555555',
+ labelcolor='white', loc='upper right')
+ ax_ori.text(0.95, 0.9, f"Pitch: {pitch:.1f}°\nYaw: {yaw:.1f}°",
+ transform=ax_ori.transAxes, color='white',
+ ha='right', va='top', bbox=dict(facecolor='#2d2d2d', alpha=0.5))
+ fig.canvas.draw_idle()
+ self.animation = FuncAnimation(
+ fig, update_plot,
+ interval=20,
+ blit=False,
+ cache_frame_data=False
+ )
+ plt.show(block=True)
+ self.sock.send(bytes.fromhex(STOP_CMD))
+ logger.info("Stopping head tracking AirPods.")
+ if self.recording and record_data:
+ self.stop_tracking()
+ logger.info("Recording stopped after sending close command")
+ else:
+ logger.info("Live plotting ended (no recording to stop).")
+ self.live_plotting = False
+ self.animation = None
+ plt.ioff()
+
+ def interactive_mode(self):
+ from prompt_toolkit import PromptSession
+ session = PromptSession("> ")
+ logger.info("\nAirPods Head Tracking Analyzer")
+ print("------------------------------")
+ logger.info("Commands:")
+ print(" connect - connect to your AirPods")
+ print(" start [seconds] - start recording head tracking data, optionally for specified duration")
+ print(" stop - stop recording")
+ print(" load - load and parse a log file")
+ print(" plot - plot all sensor data fields")
+ print(" live [seconds] - start live plotting (without recording), optionally stop recording after seconds")
+ print(" liver [seconds] - start live plotting with recording, optionally stop recording after seconds")
+ print(" gestures - start gesture detection")
+ print(" quit - exit the program")
+
+ while True:
+ try:
+ cmd_input = session.prompt("> ")
+ cmd_parts = cmd_input.strip().split()
+ if not cmd_parts:
+ continue
+ cmd = cmd_parts[0].lower()
+ if cmd == "connect":
+ self.connect()
+ elif cmd == "start":
+ duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
+ self.start_tracking(duration)
+ elif cmd == "stop":
+ self.stop_tracking()
+ elif cmd == "load" and len(cmd_parts) > 1:
+ self.load_log_file(cmd_parts[1])
+ elif cmd == "plot":
+ self.plot_fields()
+ elif cmd == "live":
+ duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
+ logger.info("Starting live plotting mode (without recording)%s.",
+ f" for {duration} seconds" if duration else "")
+ self.start_live_plotting(record_data=False, duration=duration)
+ elif cmd == "liver":
+ duration = float(cmd_parts[1]) if len(cmd_parts) > 1 else None
+ logger.info("Starting live plotting mode WITH recording%s.",
+ f" for {duration} seconds" if duration else "")
+ self.start_live_plotting(record_data=True, duration=duration)
+ elif cmd == "gestures":
+ from gestures import GestureDetector
+ if self.conn is not None:
+ detector = GestureDetector(conn=self.conn)
+ else:
+ detector = GestureDetector()
+ detector.start_detection()
+ elif cmd == "quit":
+ logger.info("Exiting.")
+ if self.conn != None:
+ self.conn.disconnect()
+ break
+ elif cmd == "help":
+ logger.info("\nAirPods Head Tracking Analyzer")
+ logger.info("------------------------------")
+ logger.info("Commands:")
+ logger.info(" connect - connect to your AirPods")
+ logger.info(" start [seconds] - start recording head tracking data, optionally for specified duration")
+ logger.info(" stop - stop recording")
+ logger.info(" load - load and parse a log file")
+ logger.info(" plot - plot all sensor data fields")
+ logger.info(" live [seconds] - start live plotting (without recording), optionally stop recording after seconds")
+ logger.info(" liver [seconds] - start live plotting with recording, optionally stop recording after seconds")
+ logger.info(" gestures - start gesture detection")
+ logger.info(" quit - exit the program")
+ else:
+ logger.info("Unknown command. Type 'help' to see available commands.")
+ except KeyboardInterrupt:
+ logger.info("Use 'quit' to exit.")
+ except EOFError:
+ logger.info("Exiting.")
+ if self.conn != None:
+ self.conn.disconnect()
+ break
+
+if __name__ == "__main__":
+ import sys
+ tracker = AirPodsTracker()
+ tracker.interactive_mode()
\ No newline at end of file
diff --git a/head-tracking/requirements.txt b/head-tracking/requirements.txt
new file mode 100644
index 0000000..0a66bdc
--- /dev/null
+++ b/head-tracking/requirements.txt
@@ -0,0 +1,6 @@
+drawille
+numpy
+pybluez
+matplotlib
+asciichartpy
+rich
\ No newline at end of file
diff --git a/head-tracking/review.py b/head-tracking/review.py
deleted file mode 100644
index 9883e18..0000000
--- a/head-tracking/review.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import matplotlib.pyplot as plt
-import mplcursors
-import bluetooth
-import threading
-import time
-from matplotlib.animation import FuncAnimation
-
-sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
-
-bt_addr = "28:2D:7F:C2:05:5B"
-psm = 0x1001
-
-sock.connect((bt_addr, psm))
-running = threading.Event()
-
-data = []
-start_column = 0
-columns_per_view = 5
-paused = False
-
-def hex_to_base10(hex_string):
- hex_values = hex_string.split()
- base10_values = [int(hex_value, 16) for hex_value in hex_values]
- return base10_values
-
-def listen():
- global running, data
- while not running.is_set():
- res = sock.recv(1024)
- if len(res.hex()) == 162:
- hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
- base10_values = hex_to_base10(hex_string)
- data.append(base10_values)
-
-t = threading.Thread(target=listen)
-t.start()
-
-try:
- byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
- sock.send(byts)
-except:
- ...
-
-def update(frame):
- if not paused:
- plt.clf()
- plt.title('Bluetooth Data')
- end_column = start_column + columns_per_view
- for i in range(start_column, min(end_column, len(data[0]))):
- plt.plot([row[i] for row in data], label=f'Column {i}', alpha=0.6, linewidth=1.2)
- plt.xlabel('Time')
- plt.ylabel('Value')
- mplcursors.cursor(hover=True, highlight=True)
-
-def on_key(event):
- global start_column, paused
- if event.key == ' ':
- start_column += columns_per_view
- if start_column >= len(data[0]):
- start_column = 0
- elif event.key == 'p':
- paused = not paused
-
-fig = plt.figure()
-fig.tight_layout()
-fig.canvas.mpl_connect('key_press_event', on_key)
-ani = FuncAnimation(fig, update, interval=0.5, repeat=True, cache_frame_data=False)
-
-plt.show()
-
-running.set()
-sock.close()
\ No newline at end of file
diff --git a/head-tracking/test-head.py b/head-tracking/test-head.py
deleted file mode 100644
index 9eb1ecd..0000000
--- a/head-tracking/test-head.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import bluetooth
-import threading
-
-sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
-
-bt_addr = "28:2D:7F:C2:05:5B"
-psm = 0x1001
-
-sock.connect((bt_addr, psm))
-running = threading.Event()
-
-def listen():
- global running
- while not running.is_set():
- res = sock.recv(1024)
- if len(res.hex()) == 162:
- print(" ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2)))
-
-t = threading.Thread(target=listen)
-t.start()
-
-try:
- byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
- sock.send(byts)
- import time
- time.sleep(5)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7E 10 02 42 0B 08 4E 10 02 1A 05 01 00 00 00 00".split(" "))
- sock.send(byts)
-except:
- ...
-running.set()
-sock.close()
diff --git a/head-tracking/tk.py b/head-tracking/tk.py
deleted file mode 100644
index 0d02981..0000000
--- a/head-tracking/tk.py
+++ /dev/null
@@ -1,120 +0,0 @@
-# AirPods like Normal (ALN) - Bringing Apple-only features to Linux and Android for seamless AirPods functionality!
-#
-# Copyright (C) 2024 Kavish Devar
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import matplotlib.pyplot as plt
-import mplcursors
-import bluetooth
-import threading
-import time
-from matplotlib.animation import FuncAnimation
-import tkinter as tk
-from tkinter import ttk
-
-sock = bluetooth.BluetoothSocket(bluetooth.L2CAP)
-
-bt_addr = "28:2D:7F:C2:05:5B"
-psm = 0x1001
-
-sock.connect((bt_addr, psm))
-running = threading.Event()
-
-data = []
-selected_columns = list(range(80))
-
-def hex_to_base10(hex_string):
- hex_values = hex_string.split()
- base10_values = [int(hex_value, 16) for hex_value in hex_values]
- return base10_values
-
-def listen():
- global running, data
- while not running.is_set():
- res = sock.recv(1024)
- if len(res.hex()) == 162:
- hex_string = " ".join(res.hex()[i:i+2].upper() for i in range(0, len(res.hex()), 2))
- base10_values = hex_to_base10(hex_string)
- data.append(base10_values)
-
-t = threading.Thread(target=listen)
-t.start()
-
-try:
- byts = bytes(int(b, 16) for b in "00 00 04 00 01 00 02 00 00 00 00 00 00 00 00 00".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 0F 00 FF FF FE FF".split(" "))
- sock.send(byts)
- byts = bytes(int(b, 16) for b in "04 00 04 00 17 00 00 00 10 00 11 00 08 7C 10 02 42 0B 08 4E 10 02 1A 05 01 40 9C 00 00".split(" "))
- sock.send(byts)
-except:
- ...
-
-def update(frame):
- plt.clf()
- plt.title('Bluetooth Data')
- for i in range(len(data[0])):
- if i in selected_columns:
- plt.plot([row[i] for row in data], label=f'Column {i}', alpha=1, linewidth=1.2)
- plt.xlabel('Time')
- plt.ylabel('Value')
- mplcursors.cursor(hover=True, highlight=True)
-
-def on_checkbox_change():
- global selected_columns
- selected_columns = [i for i, var in enumerate(checkbox_vars) if var.get()]
-
-def create_checkbox_window():
- root = tk.Tk()
- root.title("Select Columns")
- frame = ttk.Frame(root)
- frame.pack(fill=tk.BOTH, expand=True)
- canvas = tk.Canvas(frame)
- scrollbar = ttk.Scrollbar(frame, orient="vertical", command=canvas.yview)
- scrollable_frame = ttk.Frame(canvas)
-
- scrollable_frame.bind(
- "",
- lambda e: canvas.configure(
- scrollregion=canvas.bbox("all")
- )
- )
-
- canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
- canvas.configure(yscrollcommand=scrollbar.set)
-
- global checkbox_vars
- checkbox_vars = []
- for i in range(80):
- var = tk.BooleanVar(value=True)
- checkbox = ttk.Checkbutton(scrollable_frame, text=f"Column {i}", variable=var, command=on_checkbox_change)
- checkbox.pack(anchor='w')
- checkbox_vars.append(var)
-
- canvas.pack(side="left", fill=tk.BOTH, expand=True)
- scrollbar.pack(side="right", fill="y")
-
- root.mainloop()
-
-checkbox_thread = threading.Thread(target=create_checkbox_window)
-checkbox_thread.start()
-
-fig = plt.figure()
-fig.tight_layout()
-ani = FuncAnimation(fig, update, interval=500, repeat=True, cache_frame_data=False)
-
-plt.show()
-
-running.set()
-sock.close()
\ No newline at end of file
diff --git a/head-tracking/yes/1.txt b/head-tracking/yes/1.txt
deleted file mode 100644
index 4019548..0000000
--- a/head-tracking/yes/1.txt
+++ /dev/null
@@ -1,125 +0,0 @@
-04 00 04 00 17 00 00 00 10 00 45 00 08 98 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 E4 00 50 A9 23 00 00 03 04 43 C6 2A 22 58 00 00 00 00 0A B0 24 3A 4C F0 EB FF 14 00 F8 FF 51 8F 51 8F 51 8F 0A 00 00 00 FE FF A9 01 8F 03 BE 00 8A 97 95 36 19 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 99 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 C9 60 52 A9 23 00 00 03 04 43 65 C6 22 58 00 00 00 00 F4 AF 24 3A 47 F0 E9 FF FF FF F4 FF 51 8F 51 8F 51 8F 02 00 FF FF FF FF AA 01 8F 03 BE 00 19 B0 D2 36 21 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9A 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 AE C0 54 A9 23 00 00 03 04 43 04 62 23 58 00 00 00 00 DF AF 1D 3A 4C F0 EF FF 04 00 F4 FF 51 8F 51 8F 51 8F F8 FF 00 00 04 00 A9 01 8F 03 BF 00 52 5C CF 36 29 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9B 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 93 20 57 A9 23 00 00 03 04 43 A3 FD 23 58 00 00 00 00 D1 AF 1E 3A 42 F0 FC FF 12 00 ED FF 51 8F 51 8F 51 8F FC FF 09 00 01 00 A8 01 90 03 C0 00 1C 97 29 37 31 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9C 1D 10 01 3A 3E 08 0E 1A 3A 01 08 79 80 59 A9 23 00 00 03 04 43 42 99 24 58 00 00 00 00 C3 AF 16 3A 1C F0 02 00 15 00 DD FF 51 8F 51 8F 51 8F 00 00 03 00 00 00 A8 01 90 03 C1 00 F9 C3 88 37 39 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9D 1D 10 01 3A 3E 08 0E 1A 3A 01 38 5A E0 5B A9 23 00 00 03 04 43 E0 34 25 58 00 00 00 00 AB AF 0B 3A E7 EF F4 FF 24 00 D2 FF 52 8F 52 8F 52 8F F9 FF FF FF 01 00 A7 01 90 03 C1 00 16 BD 83 37 41 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9E 1D 10 01 3A 3E 08 0E 1A 3A 01 50 3F 40 5E A9 23 00 00 03 04 43 7F D0 25 58 00 00 00 00 73 AF F1 39 8F EF D9 FF 2B 00 76 FF 52 8F 52 8F 52 8F FF FF 0C 00 08 00 A6 01 91 03 C2 00 73 61 0D 38 49 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 9F 1D 10 01 3A 3E 08 0E 1A 3A 01 68 24 A0 60 A9 23 00 00 03 04 83 1E 6C 26 58 00 00 00 00 DE AE 8F 39 D9 EE BB FF 59 00 DA FE 52 8F 52 8F 52 8F FA FF 18 00 06 00 A5 01 93 03 C4 00 92 0D D6 38 51 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A0 1D 10 01 3A 3E 08 0E 1A 3A 01 80 09 00 63 A9 23 00 00 03 04 83 BD 07 27 58 00 00 00 00 E6 AD D3 38 92 ED 9C FF 92 00 41 FE 52 8F 52 8F 52 8F FB FF 14 00 04 00 A1 01 95 03 C6 00 F8 8C 18 39 59 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A1 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 EA 5F 65 A9 23 00 00 03 00 83 5B A3 27 58 00 00 00 00 8B AC BF 37 AC EB 94 FF D7 00 A8 FD 52 8F 52 8F 52 8F 0A 00 0D 00 08 00 9D 01 97 03 C8 00 DE D9 63 39 61 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A2 1D 10 01 3A 3E 08 0E 1A 3A 01 C8 CF BF 67 A9 23 00 00 03 00 83 FA 3E 28 58 00 00 00 00 F7 AA 7C 36 6C E9 2B FF BC 00 9C FD 52 8F 52 8F 52 8F 11 00 E7 FF 1B 00 97 01 98 03 CB 00 86 84 71 39 69 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A3 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 B4 1F 6A A9 23 00 00 03 00 83 99 DA 28 58 00 00 00 00 62 A9 98 35 34 E7 40 FF A8 01 D9 FD 52 8F 52 8F 52 8F F6 FF F8 FF 0E 00 8C 01 9A 03 D1 00 2E 72 71 39 71 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A4 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 99 7F 6C A9 23 00 00 03 00 83 38 76 29 58 00 00 00 00 5D A8 39 35 D3 E4 83 FF 16 01 94 FE 52 8F 52 8F 52 8F 24 00 C8 FF BB FF 81 01 9A 03 D3 00 CE 4E 14 3A 79 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A5 1D 10 01 3A 3E 08 0E 1A 3A 01 28 7B DF 6E A9 23 00 00 03 00 83 D6 11 2A 58 00 00 00 00 BF A7 E7 34 E2 E3 D2 FF 3F 00 6B FF 52 8F 52 8F 52 8F FD FF 0B 00 F5 FF 75 01 9C 03 D6 00 CF CC 1F 3A 81 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A6 1D 10 01 3A 3E 08 0E 1A 3A 01 40 60 3F 71 A9 23 00 00 03 00 83 75 AD 2A 58 00 00 00 00 A0 A7 CF 34 AF E3 06 00 F1 FF 31 00 52 8F 52 8F 52 8F FC FF FC FF 00 00 67 01 9F 03 DB 00 A3 68 13 3A 89 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A7 1D 10 01 3A 3E 08 0E 1A 3A 01 58 45 9F 73 A9 23 00 00 03 00 83 14 49 2B 58 00 00 00 00 F5 A7 15 35 39 E4 4C 00 8D FF F6 00 52 8F 52 8F 52 8F 10 00 F8 FF F2 FF 5B 01 A1 03 DF 00 95 C1 00 3A 91 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A8 1D 10 01 3A 3E 08 0E 1A 3A 01 70 2A FF 75 A9 23 00 00 03 04 83 B3 E4 2B 58 00 00 00 00 CC A8 A8 35 95 E5 97 00 29 FF B8 01 53 8F 53 8F 53 8F FE FF 09 00 0A 00 52 01 A4 03 E3 00 F2 CA F7 39 99 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 A9 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 0B 5F 78 A9 23 00 00 03 00 83 51 80 2C 58 00 00 00 00 4E AA C1 36 4C E7 FA 00 86 FF 86 02 53 8F 53 8F 53 8F 16 00 F5 FF 0C 00 4B 01 A5 03 E7 00 C1 EB FC 39 A1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AA 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 F0 BE 7A A9 23 00 00 03 00 83 F0 1B 2D 58 00 00 00 00 AC AC 9E 38 AA E9 EF 00 CD FE C6 03 53 8F 53 8F 53 8F 03 00 EC FF ED FF 4A 01 A4 03 E7 00 79 2F C5 39 A9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AB 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 D5 1E 7D A9 23 00 00 03 00 83 8F B7 2D 58 00 00 00 00 4D AF AE 3A B6 EC 16 01 63 FF 25 03 53 8F 53 8F 53 8F B7 FF 56 00 18 00 48 01 A8 03 E8 00 B0 84 F9 39 B1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AC 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 BA 7E 7F A9 23 00 00 03 00 83 2E 53 2E 58 00 00 00 00 B8 B1 54 3C 41 EE 24 01 F9 FF 0B 02 53 8F 53 8F 53 8F C6 FF 1E 00 19 00 49 01 AA 03 E8 00 29 E2 17 3A B9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AD 1D 10 01 3A 3E 08 0E 1A 3A 01 00 A0 DE 81 A9 23 00 00 03 00 83 CD EE 2E 58 00 00 00 00 77 B3 8A 3D B0 EE C1 00 61 00 07 01 53 8F 53 8F 53 8F F8 FF F3 FF 06 00 4E 01 A8 03 E6 00 0F C0 19 3A C1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AE 1D 10 01 3A 3E 08 0E 1A 3A 01 30 81 3E 84 A9 23 00 00 03 00 83 6B 8A 2F 58 00 00 00 00 45 B4 37 3E 8C EE 2F 00 60 00 0C 00 53 8F 53 8F 53 8F 0D 00 F5 FF F0 FF 56 01 A4 03 E2 00 E7 FD 21 3A C9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 AF 1D 10 01 3A 3E 08 0E 1A 3A 01 48 66 9E 86 A9 23 00 00 03 00 83 0A 26 30 58 00 00 00 00 DC B3 FF 3D D6 ED C0 FF 7B 00 A1 FE 53 8F 53 8F 53 8F F5 FF 03 00 FF FF 5D 01 A3 03 DF 00 A3 46 1D 3A D1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B0 1D 10 01 3A 3E 08 0E 1A 3A 01 60 4B FE 88 A9 23 00 00 03 00 83 A9 C1 30 58 00 00 00 00 44 B2 EB 3C 42 EC 43 FF 96 00 6B FD 53 8F 53 8F 53 8F DF FF 03 00 07 00 60 01 A2 03 DD 00 C6 DA 0C 3A D9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B1 1D 10 01 3A 3E 08 0E 1A 3A 01 78 30 5E 8B A9 23 00 00 03 00 83 48 5D 31 58 00 00 00 00 E4 AF 4D 3B 18 EA B7 FE 7B 00 05 FD 53 8F 53 8F 53 8F F0 FF EE FF 04 00 61 01 A0 03 DC 00 34 0D E6 39 E1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B2 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 11 BE 8D A9 23 00 00 03 00 83 E6 F8 31 58 00 00 00 00 4C AD 8D 39 06 E8 F6 FE 93 00 ED FC 53 8F 53 8F 53 8F 2D 00 1F 00 DC FF 5F 01 A3 03 DC 00 36 55 BA 39 E9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B3 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 F6 1D 90 A9 23 00 00 03 00 83 85 94 32 58 00 00 00 00 3D AB C8 37 60 E6 4B FF DB FF FB FD 53 8F 53 8F 53 8F 4F 00 F2 FF D2 FF 5E 01 A5 03 DB 00 C4 AB C7 39 F1 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B4 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 DB 7D 92 A9 23 00 00 03 00 83 24 30 33 58 00 00 00 00 F3 A9 74 36 0B E6 9D FF 76 FF 25 FF 54 8F 54 8F 54 8F 05 00 11 00 0A 00 59 01 A7 03 DE 00 42 72 BD 39 F9 74 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B5 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 C0 DD 94 A9 23 00 00 03 00 83 C3 CB 33 58 00 00 00 00 7B A9 BB 35 12 E6 10 00 BE FF D9 FF 54 8F 54 8F 54 8F E8 FF 03 00 17 00 4F 01 A9 03 E2 00 10 E3 D2 39 01 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B6 1D 10 01 3A 3E 08 0E 1A 3A 01 08 A6 3D 97 A9 23 00 00 03 00 83 62 67 34 58 00 00 00 00 AB A9 AB 35 51 E6 53 00 B6 FF 87 00 54 8F 54 8F 54 8F F2 FF 00 00 02 00 47 01 AB 03 E5 00 90 F4 D0 39 09 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B7 1D 10 01 3A 3E 08 0E 1A 3A 01 38 87 9D 99 A9 23 00 00 03 04 83 00 03 35 58 00 00 00 00 61 AA 0F 36 03 E7 9B 00 A2 FF 4A 01 54 8F 54 8F 54 8F 0C 00 E4 FF F3 FF 41 01 AC 03 E7 00 CC 5D B1 39 11 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B8 1D 10 01 3A 3E 08 0E 1A 3A 01 50 6C FD 9B A9 23 00 00 03 00 83 9F 9E 35 58 00 00 00 00 BC AB 1B 37 4C E8 BE 00 7E FF 7A 02 54 8F 54 8F 54 8F 30 00 C1 FF E4 FF 3F 01 AA 03 E7 00 34 79 04 3A 19 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 B9 1D 10 01 3A 3E 08 0E 1A 3A 01 68 51 5D 9E A9 23 00 00 03 00 83 3E 3A 36 58 00 00 00 00 AD AD BE 38 EF EA AB 00 0A FF 3E 03 54 8F 54 8F 54 8F F9 FF 0B 00 FA FF 3F 01 A9 03 E5 00 FB 14 04 3A 21 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BA 1D 10 01 3A 3E 08 0E 1A 3A 01 80 36 BD A0 A9 23 00 00 03 00 83 DD D5 36 58 00 00 00 00 AD AF 51 3A DF ED 74 00 E8 FE CB 02 54 8F 54 8F 54 8F D5 FF 41 00 16 00 41 01 AC 03 E5 00 52 E4 36 3A 29 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BB 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 17 1D A3 A9 23 00 00 03 00 83 7B 71 37 58 00 00 00 00 27 B1 4D 3B E8 EF 58 00 92 FF 85 01 54 8F 54 8F 54 8F B6 FF 2C 00 30 00 43 01 AE 03 E5 00 B9 14 73 3A 31 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BC 1D 10 01 3A 3E 08 0E 1A 3A 01 C8 FC 7C A5 A9 23 00 00 03 00 83 1A 0D 38 58 00 00 00 00 E1 B1 E5 3B 8E F0 23 00 17 00 4D 00 54 8F 54 8F 54 8F DC FF 15 00 18 00 48 01 AD 03 E5 00 EB 13 82 3A 39 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BD 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 E1 DC A7 A9 23 00 00 03 00 83 B9 A8 38 58 00 00 00 00 CD B1 E7 3B 39 F0 0E 00 81 00 47 FF 54 8F 54 8F 54 8F EB FF 10 00 11 00 4D 01 AC 03 E4 00 7B B8 81 3A 41 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BE 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 C6 3C AA A9 23 00 00 03 00 83 58 44 39 58 00 00 00 00 38 B1 77 3B 07 EF D1 FF 65 00 AB FE 54 8F 54 8F 54 8F 07 00 EC FF F8 FF 54 01 AA 03 E1 00 BD 5F 4A 3A 49 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 BF 1D 10 01 3A 3E 08 0E 1A 3A 01 28 A8 9C AC A9 23 00 00 03 04 83 F6 DF 39 58 00 00 00 00 17 B0 96 3A A9 ED 80 FF 6E 00 3D FE 55 8F 55 8F 55 8F FF FF E4 FF F7 FF 58 01 A7 03 DF 00 91 04 30 3A 51 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C0 1D 10 01 3A 3E 08 0E 1A 3A 01 40 8D FC AE A9 23 00 00 03 00 83 95 7B 3A 58 00 00 00 00 9C AE 81 39 34 EC 5D FF 6F 00 CE FD 55 8F 55 8F 55 8F 17 00 05 00 F0 FF 5A 01 A7 03 DD 00 C8 43 19 3A 59 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C1 1D 10 01 3A 3E 08 0E 1A 3A 01 58 72 5C B1 A9 23 00 00 03 04 83 34 17 3B 58 00 00 00 00 E1 AC 23 38 A5 EA 14 FF 47 00 C4 FD 55 8F 55 8F 55 8F 15 00 07 00 F7 FF 5B 01 A7 03 DD 00 58 9B 6B 39 61 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C2 1D 10 01 3A 3E 08 0E 1A 3A 01 70 57 BC B3 A9 23 00 00 03 00 83 D3 B2 3B 58 00 00 00 00 03 AB 99 36 0E E9 62 FF 78 00 65 FD 55 8F 55 8F 55 8F 1A 00 24 00 EC FF 58 01 AA 03 DD 00 F4 88 C9 39 69 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C3 1D 10 01 3A 3E 08 0E 1A 3A 01 88 3C 1C B6 A9 23 00 00 03 00 83 72 4E 3C 58 00 00 00 00 7A A9 FC 34 1D E7 90 FF 39 00 FE FD 55 8F 55 8F 55 8F 38 00 DB FF DA FF 55 01 AA 03 DD 00 E8 76 F6 39 71 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C4 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 1D 7C B8 A9 23 00 00 03 00 83 10 EA 3C 58 00 00 00 00 6F A8 B0 33 0A E6 E1 FF E7 FF C6 FE 55 8F 55 8F 55 8F 01 00 E2 FF FF FF 4E 01 AA 03 DF 00 9C 94 06 3A 79 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C5 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 02 DC BA A9 23 00 00 03 00 83 AF 85 3D 58 00 00 00 00 F8 A7 02 33 AE E5 F4 FF DE FF B7 FF 55 8F 55 8F 55 8F E7 FF FE FF 07 00 44 01 AB 03 E2 00 BD C9 10 3A 81 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C6 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 E7 3B BD A9 23 00 00 03 00 83 4E 21 3E 58 00 00 00 00 02 A8 EF 32 D5 E5 2C 00 C2 FF 6E 00 55 8F 55 8F 55 8F F5 FF 0A 00 00 00 3A 01 AE 03 E5 00 72 58 07 3A 89 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C7 1D 10 01 3A 3E 08 0E 1A 3A 01 00 CD 9B BF A9 23 00 00 03 04 83 ED BC 3E 58 00 00 00 00 8E A8 4E 33 7E E6 78 00 9D FF 35 01 55 8F 55 8F 55 8F 0F 00 FD FF F6 FF 32 01 B0 03 E7 00 77 D5 06 3A 91 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C8 1D 10 01 3A 3E 08 0E 1A 3A 01 30 AE FB C1 A9 23 00 00 03 00 83 8B 58 3F 58 00 00 00 00 BD A9 3B 34 DD E7 C8 00 5A FF 5A 02 55 8F 55 8F 55 8F 19 00 F5 FF F3 FF 2E 01 B1 03 E7 00 5C A1 A7 39 99 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 C9 1D 10 01 3A 3E 08 0E 1A 3A 01 48 93 5B C4 A9 23 00 00 03 00 83 2A F4 3F 58 00 00 00 00 9D AB C6 35 49 EA DE 00 FB FE EF 02 55 8F 55 8F 55 8F 00 00 39 00 FD FF 2D 01 B3 03 E6 00 FB 6D CA 39 A1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CA 1D 10 01 3A 3E 08 0E 1A 3A 01 60 78 BB C6 A9 23 00 00 03 00 83 C9 8F 40 58 00 00 00 00 85 AD FF 36 89 EC BB 00 3F FF 3A 02 55 8F 55 8F 55 8F C3 FF 00 00 12 00 2C 01 B5 03 E6 00 A0 BA 08 3A A9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CB 1D 10 01 3A 3E 08 0E 1A 3A 01 78 5D 1B C9 A9 23 00 00 03 00 83 68 2B 41 58 00 00 00 00 BE AE EC 37 37 EE 2E 00 87 FF 5E 01 56 8F 56 8F 56 8F D4 FF 11 00 0F 00 2D 01 B5 03 E5 00 31 46 D7 39 B1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CC 1D 10 01 3A 3E 08 0E 1A 3A 01 90 42 7B CB A9 23 00 00 03 00 83 07 C7 41 58 00 00 00 00 35 AF 3A 38 3D EF F4 FF 93 FF 60 00 56 8F 56 8F 56 8F D8 FF 0A 00 12 00 30 01 B5 03 E4 00 C4 F1 DF 39 B9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CD 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 23 DB CD A9 23 00 00 03 00 83 A5 62 42 58 00 00 00 00 0F AF 0B 38 60 EF ED FF 14 00 78 FF 56 8F 56 8F 56 8F FB FF 04 00 FB FF 34 01 B5 03 E2 00 8F 57 DE 39 C1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CE 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 08 3B D0 A9 23 00 00 03 00 83 44 FE 42 58 00 00 00 00 6F AE 65 37 BC EE B2 FF 22 00 D9 FE 56 8F 56 8F 56 8F F0 FF E6 FF FE FF 38 01 B2 03 DF 00 2A 60 FD 39 C9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 CF 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 ED 9A D2 A9 23 00 00 03 04 83 E3 99 43 58 00 00 00 00 50 AD 7B 36 B3 ED 4D FF 40 00 4E FE 56 8F 56 8F 56 8F E5 FF F4 FF F8 FF 3A 01 B1 03 DD 00 55 5A 03 3A D1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D0 1D 10 01 3A 3E 08 0E 1A 3A 01 28 AA F9 D4 A9 23 00 00 03 00 83 82 35 44 58 00 00 00 00 B5 AB 3F 35 4B EC 29 FF 80 00 96 FD 56 8F 56 8F 56 8F E9 FF 1A 00 00 00 39 01 B2 03 DC 00 8F 5D 74 39 D9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D1 1D 10 01 3A 3E 08 0E 1A 3A 01 58 8B 59 D7 A9 23 00 00 03 00 83 20 D1 44 58 00 00 00 00 D0 A9 A6 33 2C EA 44 FF AA 00 29 FD 56 8F 56 8F 56 8F 17 00 26 00 EB FF 38 01 B5 03 DC 00 A8 DE D0 39 E1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D2 1D 10 01 3A 3E 08 0E 1A 3A 01 70 70 B9 D9 A9 23 00 00 03 00 83 BF 6C 45 58 00 00 00 00 2D A8 D1 31 C7 E7 DF FF 97 00 64 FD 56 8F 56 8F 56 8F 31 00 0F 00 E8 FF 34 01 B8 03 DC 00 26 DE 0D 3A E9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D3 1D 10 01 3A 3E 08 0E 1A 3A 01 88 55 19 DC A9 23 00 00 03 00 83 5E 08 46 58 00 00 00 00 76 A7 6F 30 F4 E5 17 00 07 00 32 FF 56 8F 56 8F 56 8F 22 00 AA FF 00 00 2F 01 B6 03 DD 00 D4 E5 93 3A F1 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D4 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 3A 79 DE A9 23 00 00 03 00 83 FD A3 46 58 00 00 00 00 7D A7 42 30 EB E5 35 00 F6 FF 64 00 56 8F 56 8F 56 8F D1 FF 0B 00 17 00 25 01 B7 03 E0 00 49 A9 9B 3A F9 75 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D5 1D 10 01 3A 3E 08 0E 1A 3A 01 D0 1B D9 E0 A9 23 00 00 03 00 83 9B 3F 47 58 00 00 00 00 FA A7 B7 30 3F E6 57 00 00 00 B8 00 56 8F 56 8F 56 8F ED FF 1C 00 FA FF 1B 01 BA 03 E1 00 95 D2 98 3A 01 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D6 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 00 39 E3 A9 23 00 00 03 00 83 3A DB 47 58 00 00 00 00 A8 A8 4E 31 D6 E6 61 00 C8 FF 15 01 56 8F 56 8F 56 8F 03 00 FA FF F3 FF 15 01 BC 03 E1 00 62 9C 96 3A 09 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D7 1D 10 01 3A 3E 08 0E 1A 3A 01 00 E6 98 E5 A9 23 00 00 03 04 83 D9 76 48 58 00 00 00 00 82 A9 20 32 BE E7 7A 00 C2 FF D0 01 57 8F 57 8F 57 8F 23 00 DA FF E8 FF 12 01 BC 03 E0 00 DA B6 8F 3A 11 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D8 1D 10 01 3A 3E 08 0E 1A 3A 01 18 CB F8 E7 A9 23 00 00 03 00 83 78 12 49 58 00 00 00 00 0A AB A7 33 79 E9 C2 00 9B FF E6 02 57 8F 57 8F 57 8F 36 00 DB FF DF FF 13 01 BB 03 DE 00 6C 02 80 3A 19 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 D9 1D 10 01 3A 3E 08 0E 1A 3A 01 30 B0 58 EA A9 23 00 00 03 00 83 17 AE 49 58 00 00 00 00 4A AD CA 35 28 EC D3 00 1A FF 8C 03 57 8F 57 8F 57 8F 29 00 F9 FF D5 FF 18 01 BA 03 DA 00 B8 49 1B 3A 21 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DA 1D 10 01 3A 3E 08 0E 1A 3A 01 60 91 B8 EC A9 23 00 00 03 00 83 B5 49 4A 58 00 00 00 00 6E AF 83 37 40 EF 73 00 09 FF D5 02 57 8F 57 8F 57 8F A4 FF 27 00 28 00 1B 01 BA 03 D8 00 CA 59 A0 39 29 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DB 1D 10 01 3A 3E 08 0E 1A 3A 01 78 76 18 EF A9 23 00 00 03 00 83 54 E5 4A 58 00 00 00 00 CD B0 B8 38 04 F1 51 00 EE FF 14 01 57 8F 57 8F 57 8F C0 FF 4C 00 29 00 1E 01 BC 03 D8 00 F6 30 14 3A 31 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DC 1D 10 01 3A 3E 08 0E 1A 3A 01 90 5B 78 F1 A9 23 00 00 03 00 83 F3 80 4B 58 00 00 00 00 17 B1 09 39 27 F1 D7 FF 54 00 BA FF 57 8F 57 8F 57 8F D7 FF 16 00 21 00 24 01 BC 03 D7 00 FD CA 1F 3A 39 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DD 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 40 D8 F3 A9 23 00 00 03 00 83 92 1C 4C 58 00 00 00 00 AF B0 FD 38 3D F0 D9 FF 67 00 20 FF 57 8F 57 8F 57 8F 2F 00 D1 FF E3 FF 2E 01 B9 03 D4 00 4D 17 1D 3A 41 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DE 1D 10 01 3A 3E 08 0E 1A 3A 01 D8 21 38 F6 A9 23 00 00 03 00 83 30 B8 4C 58 00 00 00 00 11 B0 A5 38 B5 EF A2 FF 1F 00 67 FF 57 8F 57 8F 57 8F 08 00 E0 FF F0 FF 36 01 B4 03 D0 00 B0 7E 32 3A 49 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 DF 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 06 98 F8 A9 23 00 00 03 04 83 CF 53 4D 58 00 00 00 00 A7 AF 80 38 99 EF B2 FF 03 00 AC FF 57 8F 57 8F 57 8F 00 00 06 00 F4 FF 3C 01 B2 03 CD 00 B2 0B 33 3A 51 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E0 1D 10 01 3A 3E 08 0E 1A 3A 01 08 EC F7 FA A9 23 00 00 03 04 83 6E EF 4D 58 00 00 00 00 70 AF 6B 38 96 EF D3 FF 1D 00 C9 FF 57 8F 57 8F 57 8F ED FF 16 00 0D 00 40 01 B1 03 CC 00 28 29 38 3A 59 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E1 1D 10 01 3A 3E 08 0E 1A 3A 01 20 D1 57 FD A9 23 00 00 03 04 83 0D 8B 4E 58 00 00 00 00 55 AF 6F 38 65 EF F2 FF 32 00 E1 FF 57 8F 57 8F 57 8F F6 FF 15 00 08 00 44 01 B1 03 CC 00 75 E4 06 3A 61 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E2 1D 10 01 3A 3E 08 0E 1A 3A 01 38 B6 B7 FF A9 23 00 00 03 04 83 AC 26 4F 58 00 00 00 00 43 AF 7A 38 1D EF 00 00 35 00 E4 FF 58 8F 58 8F 58 8F F9 FF 0B 00 08 00 48 01 B1 03 CB 00 04 CD BC 39 69 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E3 1D 10 01 3A 3E 08 0E 1A 3A 01 68 97 17 02 AA 23 00 00 03 04 83 4A C2 4F 58 00 00 00 00 34 AF 85 38 DC EE 00 00 2C 00 E7 FF 58 8F 58 8F 58 8F FE FF 0A 00 01 00 4C 01 B1 03 CB 00 48 17 BB 39 71 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E4 1D 10 01 3A 3E 08 0E 1A 3A 01 80 7C 77 04 AA 23 00 00 03 04 83 E9 5D 50 58 00 00 00 00 25 AF 83 38 A6 EE FE FF 10 00 DE FF 58 8F 58 8F 58 8F 01 00 FD FF FA FF 4F 01 B0 03 CA 00 51 A4 3F 39 79 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E5 1D 10 01 3A 3E 08 0E 1A 3A 01 98 61 D7 06 AA 23 00 00 03 04 83 88 F9 50 58 00 00 00 00 0C AF 6C 38 89 EE F0 FF 01 00 D9 FF 58 8F 58 8F 58 8F FD FF F7 FF FB FF 52 01 AF 03 C9 00 35 C6 01 39 81 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E6 1D 10 01 3A 3E 08 0E 1A 3A 01 B0 46 37 09 AA 23 00 00 03 04 83 27 95 51 58 00 00 00 00 DE AE 4A 38 74 EE E6 FF 06 00 BF FF 58 8F 58 8F 58 8F 00 00 08 00 FC FF 55 01 AE 03 C8 00 52 4E FD 38 89 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E7 1D 10 01 3A 3E 08 0E 1A 3A 01 E0 27 97 0B AA 23 00 00 03 04 83 C5 30 52 58 00 00 00 00 AE AE 0B 38 4A EE F9 FF F2 FF C3 FF 58 8F 58 8F 58 8F F7 FF FB FF 00 00 57 01 AD 03 C8 00 5B 82 B4 38 91 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E8 1D 10 01 3A 3E 08 0E 1A 3A 01 F8 0C F7 0D AA 23 00 00 03 04 83 64 CC 52 58 00 00 00 00 8E AE D7 37 35 EE 00 00 EE FF D9 FF 58 8F 58 8F 58 8F F7 FF 06 00 03 00 58 01 AD 03 C8 00 B5 0C 3A 38 99 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 E9 1D 10 01 3A 3E 08 0E 1A 3A 01 10 F2 56 10 AA 23 00 00 03 04 83 03 68 53 58 00 00 00 00 82 AE B8 37 21 EE 07 00 00 00 EB FF 58 8F 58 8F 58 8F F7 FF 02 00 00 00 59 01 AD 03 C7 00 5C 2D 09 38 A1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EA 1D 10 01 3A 3E 08 0E 1A 3A 01 28 D7 B6 12 AA 23 00 00 03 04 83 A2 03 54 58 00 00 00 00 7D AE AC 37 1B EE 06 00 FC FF 02 00 58 8F 58 8F 58 8F F3 FF 02 00 FF FF 5A 01 AD 03 C7 00 DD 2C D4 37 A9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EB 1D 10 01 3A 3E 08 0E 1A 3A 01 40 BC 16 15 AA 23 00 00 03 04 43 41 9F 54 58 00 00 00 00 84 AE B0 37 1D EE 06 00 00 00 0A 00 58 8F 58 8F 58 8F F4 FF 04 00 02 00 5B 01 AD 03 C7 00 20 42 BF 37 B1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EC 1D 10 01 3A 3E 08 0E 1A 3A 01 70 9D 76 17 AA 23 00 00 03 04 43 DF 3A 55 58 00 00 00 00 8C AE BC 37 14 EE 00 00 13 00 05 00 58 8F 58 8F 58 8F F5 FF 05 00 04 00 5C 01 AC 03 C7 00 69 E7 83 37 B9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 ED 1D 10 01 3A 3E 08 0E 1A 3A 01 88 82 D6 19 AA 23 00 00 03 04 43 7E D6 55 58 00 00 00 00 93 AE D4 37 FD ED 00 00 1F 00 0A 00 58 8F 58 8F 58 8F FC FF 02 00 FE FF 5D 01 AC 03 C7 00 56 C0 11 37 C1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EE 1D 10 01 3A 3E 08 0E 1A 3A 01 A0 67 36 1C AA 23 00 00 03 04 43 1D 72 56 58 00 00 00 00 9B AE DD 37 E7 ED 0E 00 06 00 00 00 59 8F 59 8F 59 8F FD FF 00 00 FE FF 5E 01 AC 03 C6 00 E0 72 1B 37 C9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 EF 1D 10 01 3A 3E 08 0E 1A 3A 01 B8 4C 96 1E AA 23 00 00 03 04 43 BC 0D 57 58 00 00 00 00 A0 AE DB 37 D8 ED 0B 00 00 00 FA FF 59 8F 59 8F 59 8F 01 00 04 00 FB FF 5F 01 AC 03 C6 00 E4 89 FD 36 D1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F0 1D 10 01 3A 3E 08 0E 1A 3A 01 E8 2D F6 20 AA 23 00 00 03 04 43 5A A9 57 58 00 00 00 00 9E AE C8 37 D1 ED 02 00 F2 FF F4 FF 59 8F 59 8F 59 8F FF FF 00 00 FA FF 60 01 AC 03 C5 00 4A C1 09 37 D9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F1 1D 10 01 3A 3E 08 0E 1A 3A 01 00 13 56 23 AA 23 00 00 03 04 43 F9 44 58 58 00 00 00 00 94 AE B5 37 D0 ED FC FF F8 FF F6 FF 59 8F 59 8F 59 8F F9 FF 00 00 F9 FF 61 01 AC 03 C4 00 9E 6E 02 37 E1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F2 1D 10 01 3A 3E 08 0E 1A 3A 01 18 F8 B5 25 AA 23 00 00 03 04 43 98 E0 58 58 00 00 00 00 8F AE A8 37 CF ED FF FF 04 00 00 00 59 8F 59 8F 59 8F F5 FF FB FF FE FF 61 01 AB 03 C4 00 7B D9 43 37 E9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F3 1D 10 01 3A 3E 08 0E 1A 3A 01 30 DD 15 28 AA 23 00 00 03 04 43 37 7C 59 58 00 00 00 00 92 AE B2 37 CA ED 03 00 0E 00 0A 00 59 8F 59 8F 59 8F FD FF FE FF FA FF 62 01 AB 03 C3 00 7E 65 57 37 F1 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F4 1D 10 01 3A 3E 08 0E 1A 3A 01 48 C2 75 2A AA 23 00 00 03 04 43 D6 17 5A 58 00 00 00 00 A4 AE CE 37 D1 ED F7 FF 05 00 32 00 59 8F 59 8F 59 8F 00 00 F5 FF F5 FF 62 01 AA 03 C2 00 49 7B ED 37 F9 76 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F5 1D 10 01 3A 3E 08 0E 1A 3A 01 78 A3 D5 2C AA 23 00 00 03 04 43 74 B3 5A 58 00 00 00 00 B4 AE F1 37 02 EE F1 FF FA FF 2F 00 59 8F 59 8F 59 8F FA FF 08 00 00 00 63 01 AA 03 C2 00 9E 05 FF 37 01 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F6 1D 10 01 3A 3E 08 0E 1A 3A 01 90 88 35 2F AA 23 00 00 03 04 83 13 4F 5B 58 00 00 00 00 BF AE 0B 38 20 EE F8 FF 04 00 14 00 59 8F 59 8F 59 8F F7 FF 09 00 01 00 64 01 AB 03 C2 00 39 7A 1C 38 09 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F7 1D 10 01 3A 3E 08 0E 1A 3A 01 A8 6D 95 31 AA 23 00 00 03 04 83 B2 EA 5B 58 00 00 00 00 C2 AE 17 38 20 EE FF FF 07 00 00 00 59 8F 59 8F 59 8F FC FF 07 00 FE FF 65 01 AB 03 C2 00 E8 BC 36 38 11 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F8 1D 10 01 3A 3E 08 0E 1A 3A 01 C0 52 F5 33 AA 23 00 00 03 04 83 51 86 5C 58 00 00 00 00 BB AE 12 38 0D EE 00 00 0D 00 EF FF 59 8F 59 8F 59 8F FA FF 03 00 01 00 65 01 AB 03 C2 00 2F 07 3D 38 19 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 F9 1D 10 01 3A 3E 08 0E 1A 3A 01 F0 33 55 36 AA 23 00 00 03 04 83 EF 21 5D 58 00 00 00 00 B0 AE 0A 38 EE ED FB FF 09 00 E7 FF 59 8F 59 8F 59 8F 01 00 FE FF FB FF 66 01 AB 03 C2 00 2C 03 2D 38 21 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FA 1D 10 01 3A 3E 08 0E 1A 3A 01 08 19 B5 38 AA 23 00 00 03 04 83 8E BD 5D 58 00 00 00 00 9C AE FB 37 DE ED F2 FF FC FF F4 FF 5A 8F 5A 8F 5A 8F FA FF F8 FF F9 FF 67 01 AA 03 C2 00 06 FE 0C 38 29 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FB 1D 10 01 3A 3E 08 0E 1A 3A 01 20 FE 14 3B AA 23 00 00 03 04 83 2D 59 5E 58 00 00 00 00 8A AE F1 37 E4 ED F5 FF FF FF F2 FF 5A 8F 5A 8F 5A 8F F9 FF 05 00 04 00 67 01 AA 03 C2 00 A9 FA 02 38 31 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FC 1D 10 01 3A 3E 08 0E 1A 3A 01 38 E3 74 3D AA 23 00 00 03 04 43 CC F4 5E 58 00 00 00 00 7E AE F0 37 D5 ED FD FF 12 00 F2 FF 5A 8F 5A 8F 5A 8F FD FF 06 00 00 00 68 01 AA 03 C2 00 FE C0 F8 37 39 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FD 1D 10 01 3A 3E 08 0E 1A 3A 01 50 C8 D4 3F AA 23 00 00 03 04 43 6B 90 5F 58 00 00 00 00 7A AE F4 37 C8 ED FF FF 05 00 00 00 5A 8F 5A 8F 5A 8F FE FF 03 00 FD FF 68 01 AA 03 C2 00 D3 A5 BF 37 41 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FE 1D 10 01 3A 3E 08 0E 1A 3A 01 80 A9 34 42 AA 23 00 00 03 04 43 09 2C 60 58 00 00 00 00 79 AE F7 37 C7 ED 00 00 03 00 02 00 5A 8F 5A 8F 5A 8F FA FF 03 00 00 00 68 01 AA 03 C2 00 95 29 9C 37 49 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 FF 1D 10 01 3A 3E 08 0E 1A 3A 01 98 8E 94 44 AA 23 00 00 03 04 43 A8 C7 60 58 00 00 00 00 78 AE F9 37 C3 ED FE FF 04 00 FF FF 5A 8F 5A 8F 5A 8F FC FF 00 00 00 00 69 01 AA 03 C3 00 73 B0 9C 37 51 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 80 1E 10 01 3A 3E 08 0E 1A 3A 01 B0 73 F4 46 AA 23 00 00 03 04 43 47 63 61 58 00 00 00 00 74 AE F7 37 C0 ED FC FF 01 00 FD FF 5A 8F 5A 8F 5A 8F FA FF 03 00 00 00 69 01 AA 03 C3 00 FC 53 89 37 59 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 81 1E 10 01 3A 3E 08 0E 1A 3A 01 C8 58 54 49 AA 23 00 00 03 04 43 E6 FE 61 58 00 00 00 00 6F AE F7 37 BA ED 00 00 03 00 FC FF 5A 8F 5A 8F 5A 8F FC FF 02 00 FE FF 69 01 AA 03 C3 00 9C C0 26 37 61 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 82 1E 10 01 3A 3E 08 0E 1A 3A 01 F8 39 B4 4B AA 23 00 00 03 04 43 84 9A 62 58 00 00 00 00 6C AE F5 37 B5 ED FC FF 08 00 02 00 5A 8F 5A 8F 5A 8F FA FF 00 00 01 00 69 01 AA 03 C3 00 4F C5 AA 36 69 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 83 1E 10 01 3A 3E 08 0E 1A 3A 01 10 1F 14 4E AA 23 00 00 03 04 43 23 36 63 58 00 00 00 00 6A AE FC 37 AE ED FE FF 09 00 00 00 5A 8F 5A 8F 5A 8F FB FF 00 00 00 00 69 01 AA 03 C3 00 38 D1 66 36 71 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 84 1E 10 01 3A 3E 08 0E 1A 3A 01 28 04 74 50 AA 23 00 00 03 04 43 C2 D1 63 58 00 00 00 00 68 AE 02 38 A9 ED FF FF 06 00 00 00 5A 8F 5A 8F 5A 8F FD FF 03 00 01 00 69 01 AA 03 C4 00 B6 66 74 36 79 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 85 1E 10 01 3A 3E 08 0E 1A 3A 01 40 E9 D3 52 AA 23 00 00 03 04 43 61 6D 64 58 00 00 00 00 69 AE 0C 38 A4 ED FF FF 07 00 07 00 5B 8F 5B 8F 5B 8F 00 00 01 00 00 00 69 01 AA 03 C4 00 4E E8 6D 36 81 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 86 1E 10 01 3A 3E 08 0E 1A 3A 01 58 CE 33 55 AA 23 00 00 03 04 43 00 09 65 58 00 00 00 00 6E AE 18 38 A5 ED FF FF 05 00 0D 00 5B 8F 5B 8F 5B 8F 00 00 01 00 00 00 69 01 AA 03 C4 00 4D 1E 75 36 89 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 87 1E 10 01 3A 3E 08 0E 1A 3A 01 88 AF 93 57 AA 23 00 00 03 04 43 9E A4 65 58 00 00 00 00 72 AE 1F 38 AB ED 00 00 FF FF 06 00 5B 8F 5B 8F 5B 8F FD FF 02 00 00 00 6A 01 AA 03 C4 00 9C BA 8C 36 91 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 88 1E 10 01 3A 3E 08 0E 1A 3A 01 A0 94 F3 59 AA 23 00 00 03 04 43 3D 40 66 58 00 00 00 00 75 AE 23 38 B0 ED FF FF 00 00 08 00 5B 8F 5B 8F 5B 8F FE FF 00 00 00 00 6A 01 A9 03 C5 00 4E C6 5B 36 99 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 89 1E 10 01 3A 3E 08 0E 1A 3A 01 B8 79 53 5C AA 23 00 00 03 04 43 DC DB 66 58 00 00 00 00 79 AE 27 38 B4 ED 03 00 FE FF 07 00 5B 8F 5B 8F 5B 8F FD FF FD FF FC FF 6A 01 A9 03 C5 00 1E 75 7C 36 A1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8A 1E 10 01 3A 3E 08 0E 1A 3A 01 D0 5E B3 5E AA 23 00 00 03 04 43 7B 77 67 58 00 00 00 00 7E AE 27 38 BB ED 02 00 F9 FF 00 00 5B 8F 5B 8F 5B 8F FE FF 00 00 01 00 6A 01 A9 03 C5 00 09 01 94 36 A9 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8B 1E 10 01 3A 3E 08 0E 1A 3A 01 00 40 13 61 AA 23 00 00 03 04 43 19 13 68 58 00 00 00 00 7D AE 27 38 B9 ED 00 00 0C 00 FA FF 5B 8F 5B 8F 5B 8F FD FF 08 00 02 00 6B 01 A9 03 C5 00 9B 3A 1F 37 B1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8C 1E 10 01 3A 3E 08 0E 1A 3A 01 18 25 73 63 AA 23 00 00 03 04 43 B8 AE 68 58 00 00 00 00 7E AE 2B 38 A8 ED 00 00 0A 00 FF FF 5B 8F 5B 8F 5B 8F FD FF 00 00 02 00 6B 01 A9 03 C5 00 0C B8 33 37 B9 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8D 1E 10 01 3A 3E 08 0E 1A 3A 01 30 0A D3 65 AA 23 00 00 03 04 43 57 4A 69 58 00 00 00 00 80 AE 30 38 9E ED 01 00 07 00 00 00 5B 8F 5B 8F 5B 8F FC FF 00 00 00 00 6B 01 A9 03 C6 00 E2 ED 23 37 C1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8E 1E 10 01 3A 3E 08 0E 1A 3A 01 48 EF 32 68 AA 23 00 00 03 04 43 F6 E5 69 58 00 00 00 00 82 AE 31 38 9B ED 06 00 FC FF FF FF 5B 8F 5B 8F 5B 8F FD FF 04 00 FF FF 6B 01 A9 03 C6 00 4A 8D 33 37 C9 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 8F 1E 10 01 3A 3E 08 0E 1A 3A 01 60 D4 92 6A AA 23 00 00 03 04 43 95 81 6A 58 00 00 00 00 84 AE 2C 38 9B ED 00 00 FE FF 05 00 5B 8F 5B 8F 5B 8F FA FF 00 00 03 00 6B 01 A9 03 C6 00 6C 59 3A 37 D1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 90 1E 10 01 3A 3E 08 0E 1A 3A 01 90 B5 F2 6C AA 23 00 00 03 04 43 33 1D 6B 58 00 00 00 00 89 AE 33 38 9D ED 00 00 01 00 0B 00 5B 8F 5B 8F 5B 8F FF FF 01 00 FB FF 6B 01 A9 03 C6 00 49 60 2A 37 D9 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 91 1E 10 01 3A 3E 08 0E 1A 3A 01 A8 9A 52 6F AA 23 00 00 03 04 43 D2 B8 6B 58 00 00 00 00 8E AE 34 38 A5 ED 00 00 00 00 0D 00 5C 8F 5C 8F 5C 8F FC FF FE FF FF FF 6B 01 A9 03 C6 00 6E 4F FC 36 E1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 92 1E 10 01 3A 3E 08 0E 1A 3A 01 C0 7F B2 71 AA 23 00 00 03 04 43 71 54 6C 58 00 00 00 00 90 AE 39 38 A9 ED 01 00 03 00 03 00 5C 8F 5C 8F 5C 8F FC FF 01 00 FE FF 6B 01 A9 03 C6 00 09 8D BA 36 E9 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 93 1E 10 01 3A 3E 08 0E 1A 3A 01 D8 64 12 74 AA 23 00 00 03 04 43 10 F0 6C 58 00 00 00 00 92 AE 3B 38 AA ED 00 00 02 00 03 00 5C 8F 5C 8F 5C 8F FA FF FF FF 00 00 6B 01 A9 03 C6 00 5D AD BB 36 F1 77 00 00
-04 00 04 00 17 00 00 00 10 00 45 00 08 94 1E 10 01 3A 3E 08 0E 1A 3A 01 08 46 72 76 AA 23 00 00 03 04 43 AE 8B 6D 58 00 00 00 00 96 AE 47 38 A7 ED FF FF 07 00 05 00 5C 8F 5C 8F 5C 8F 00 00 00 00 FD FF 6C 01 A8 03 C6 00 6C E2 B0 36 F9 77 00 00
diff --git a/head-tracking/yes/converted.txt b/head-tracking/yes/converted.txt
deleted file mode 100644
index 41efe11..0000000
--- a/head-tracking/yes/converted.txt
+++ /dev/null
@@ -1,125 +0,0 @@
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,152 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,228 , 0 , 80 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,198 , 42 , 34 ,88 ,0 ,0 ,0 ,0 , 10 ,176 , 36 ,58 , 76 ,240 ,235 ,255 , 20 , 0 ,248 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 10 , 0 , 0 , 0 ,254 ,255 ,169 ,1 ,143 ,3 ,190 ,0 ,138 ,151 ,149 ,54 , 25 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,153 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,201 , 96 , 82 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,101 ,198 , 34 ,88 ,0 ,0 ,0 ,0 ,244 ,175 , 36 ,58 , 71 ,240 ,233 ,255 ,255 ,255 ,244 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 2 , 0 ,255 ,255 ,255 ,255 ,170 ,1 ,143 ,3 ,190 ,0 , 25 ,176 ,210 ,54 , 33 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,154 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,174 ,192 , 84 ,169 ,35 ,0 ,0 ,3 ,4 , 67 , 4 , 98 , 35 ,88 ,0 ,0 ,0 ,0 ,223 ,175 , 29 ,58 , 76 ,240 ,239 ,255 , 4 , 0 ,244 ,255 ,81 ,143 ,81 ,143 ,81 ,143 ,248 ,255 , 0 , 0 , 4 , 0 ,169 ,1 ,143 ,3 ,191 ,0 , 82 , 92 ,207 ,54 , 41 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,155 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,147 , 32 , 87 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,163 ,253 , 35 ,88 ,0 ,0 ,0 ,0 ,209 ,175 , 30 ,58 , 66 ,240 ,252 ,255 , 18 , 0 ,237 ,255 ,81 ,143 ,81 ,143 ,81 ,143 ,252 ,255 , 9 , 0 , 1 , 0 ,168 ,1 ,144 ,3 ,192 ,0 , 28 ,151 , 41 ,55 , 49 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,156 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,121 ,128 , 89 ,169 ,35 ,0 ,0 ,3 ,4 , 67 , 66 ,153 , 36 ,88 ,0 ,0 ,0 ,0 ,195 ,175 , 22 ,58 , 28 ,240 , 2 , 0 , 21 , 0 ,221 ,255 ,81 ,143 ,81 ,143 ,81 ,143 , 0 , 0 , 3 , 0 , 0 , 0 ,168 ,1 ,144 ,3 ,193 ,0 ,249 ,195 ,136 ,55 , 57 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,157 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 , 90 ,224 , 91 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,224 , 52 , 37 ,88 ,0 ,0 ,0 ,0 ,171 ,175 , 11 ,58 ,231 ,239 ,244 ,255 , 36 , 0 ,210 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,249 ,255 ,255 ,255 , 1 , 0 ,167 ,1 ,144 ,3 ,193 ,0 , 22 ,189 ,131 ,55 , 65 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,158 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 , 63 , 64 , 94 ,169 ,35 ,0 ,0 ,3 ,4 , 67 ,127 ,208 , 37 ,88 ,0 ,0 ,0 ,0 ,115 ,175 ,241 ,57 ,143 ,239 ,217 ,255 , 43 , 0 ,118 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,255 ,255 , 12 , 0 , 8 , 0 ,166 ,1 ,145 ,3 ,194 ,0 ,115 , 97 , 13 ,56 , 73 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,159 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 , 36 ,160 , 96 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 30 ,108 , 38 ,88 ,0 ,0 ,0 ,0 ,222 ,174 ,143 ,57 ,217 ,238 ,187 ,255 , 89 , 0 ,218 ,254 ,82 ,143 ,82 ,143 ,82 ,143 ,250 ,255 , 24 , 0 , 6 , 0 ,165 ,1 ,147 ,3 ,196 ,0 ,146 , 13 ,214 ,56 , 81 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,160 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 , 9 , 0 , 99 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,189 , 7 , 39 ,88 ,0 ,0 ,0 ,0 ,230 ,173 ,211 ,56 ,146 ,237 ,156 ,255 ,146 , 0 , 65 ,254 ,82 ,143 ,82 ,143 ,82 ,143 ,251 ,255 , 20 , 0 , 4 , 0 ,161 ,1 ,149 ,3 ,198 ,0 ,248 ,140 , 24 ,57 , 89 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,161 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 ,234 , 95 ,101 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 91 ,163 , 39 ,88 ,0 ,0 ,0 ,0 ,139 ,172 ,191 ,55 ,172 ,235 ,148 ,255 ,215 , 0 ,168 ,253 ,82 ,143 ,82 ,143 ,82 ,143 , 10 , 0 , 13 , 0 , 8 , 0 ,157 ,1 ,151 ,3 ,200 ,0 ,222 ,217 , 99 ,57 , 97 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,162 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 ,207 ,191 ,103 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,250 , 62 , 40 ,88 ,0 ,0 ,0 ,0 ,247 ,170 ,124 ,54 ,108 ,233 , 43 ,255 ,188 , 0 ,156 ,253 ,82 ,143 ,82 ,143 ,82 ,143 , 17 , 0 ,231 ,255 , 27 , 0 ,151 ,1 ,152 ,3 ,203 ,0 ,134 ,132 ,113 ,57 ,105 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,163 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 ,180 , 31 ,106 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,153 ,218 , 40 ,88 ,0 ,0 ,0 ,0 , 98 ,169 ,152 ,53 , 52 ,231 , 64 ,255 ,168 , 1 ,217 ,253 ,82 ,143 ,82 ,143 ,82 ,143 ,246 ,255 ,248 ,255 , 14 , 0 ,140 ,1 ,154 ,3 ,209 ,0 , 46 ,114 ,113 ,57 ,113 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,164 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 ,153 ,127 ,108 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 56 ,118 , 41 ,88 ,0 ,0 ,0 ,0 , 93 ,168 , 57 ,53 ,211 ,228 ,131 ,255 , 22 , 1 ,148 ,254 ,82 ,143 ,82 ,143 ,82 ,143 , 36 , 0 ,200 ,255 ,187 ,255 ,129 ,1 ,154 ,3 ,211 ,0 ,206 , 78 , 20 ,58 ,121 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,165 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,123 ,223 ,110 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,214 , 17 , 42 ,88 ,0 ,0 ,0 ,0 ,191 ,167 ,231 ,52 ,226 ,227 ,210 ,255 , 63 , 0 ,107 ,255 ,82 ,143 ,82 ,143 ,82 ,143 ,253 ,255 , 11 , 0 ,245 ,255 ,117 ,1 ,156 ,3 ,214 ,0 ,207 ,204 , 31 ,58 ,129 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,166 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 , 96 , 63 ,113 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,117 ,173 , 42 ,88 ,0 ,0 ,0 ,0 ,160 ,167 ,207 ,52 ,175 ,227 , 6 , 0 ,241 ,255 , 49 , 0 ,82 ,143 ,82 ,143 ,82 ,143 ,252 ,255 ,252 ,255 , 0 , 0 ,103 ,1 ,159 ,3 ,219 ,0 ,163 ,104 , 19 ,58 ,137 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,167 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 , 69 ,159 ,115 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 20 , 73 , 43 ,88 ,0 ,0 ,0 ,0 ,245 ,167 , 21 ,53 , 57 ,228 , 76 , 0 ,141 ,255 ,246 , 0 ,82 ,143 ,82 ,143 ,82 ,143 , 16 , 0 ,248 ,255 ,242 ,255 , 91 ,1 ,161 ,3 ,223 ,0 ,149 ,193 , 0 ,58 ,145 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,168 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 , 42 ,255 ,117 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,179 ,228 , 43 ,88 ,0 ,0 ,0 ,0 ,204 ,168 ,168 ,53 ,149 ,229 ,151 , 0 , 41 ,255 ,184 , 1 ,83 ,143 ,83 ,143 ,83 ,143 ,254 ,255 , 9 , 0 , 10 , 0 , 82 ,1 ,164 ,3 ,227 ,0 ,242 ,202 ,247 ,57 ,153 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,169 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 , 11 , 95 ,120 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 81 ,128 , 44 ,88 ,0 ,0 ,0 ,0 , 78 ,170 ,193 ,54 , 76 ,231 ,250 , 0 ,134 ,255 ,134 , 2 ,83 ,143 ,83 ,143 ,83 ,143 , 22 , 0 ,245 ,255 , 12 , 0 , 75 ,1 ,165 ,3 ,231 ,0 ,193 ,235 ,252 ,57 ,161 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,170 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 ,240 ,190 ,122 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,240 , 27 , 45 ,88 ,0 ,0 ,0 ,0 ,172 ,172 ,158 ,56 ,170 ,233 ,239 , 0 ,205 ,254 ,198 , 3 ,83 ,143 ,83 ,143 ,83 ,143 , 3 , 0 ,236 ,255 ,237 ,255 , 74 ,1 ,164 ,3 ,231 ,0 ,121 , 47 ,197 ,57 ,169 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,171 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 ,213 , 30 ,125 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,143 ,183 , 45 ,88 ,0 ,0 ,0 ,0 , 77 ,175 ,174 ,58 ,182 ,236 , 22 , 1 , 99 ,255 , 37 , 3 ,83 ,143 ,83 ,143 ,83 ,143 ,183 ,255 , 86 , 0 , 24 , 0 , 72 ,1 ,168 ,3 ,232 ,0 ,176 ,132 ,249 ,57 ,177 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,172 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 ,186 ,126 ,127 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 46 , 83 , 46 ,88 ,0 ,0 ,0 ,0 ,184 ,177 , 84 ,60 , 65 ,238 , 36 , 1 ,249 ,255 , 11 , 2 ,83 ,143 ,83 ,143 ,83 ,143 ,198 ,255 , 30 , 0 , 25 , 0 , 73 ,1 ,170 ,3 ,232 ,0 , 41 ,226 , 23 ,58 ,185 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,173 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,160 ,222 ,129 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,205 ,238 , 46 ,88 ,0 ,0 ,0 ,0 ,119 ,179 ,138 ,61 ,176 ,238 ,193 , 0 , 97 , 0 , 7 , 1 ,83 ,143 ,83 ,143 ,83 ,143 ,248 ,255 ,243 ,255 , 6 , 0 , 78 ,1 ,168 ,3 ,230 ,0 , 15 ,192 , 25 ,58 ,193 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,174 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,129 , 62 ,132 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,107 ,138 , 47 ,88 ,0 ,0 ,0 ,0 , 69 ,180 , 55 ,62 ,140 ,238 , 47 , 0 , 96 , 0 , 12 , 0 ,83 ,143 ,83 ,143 ,83 ,143 , 13 , 0 ,245 ,255 ,240 ,255 , 86 ,1 ,164 ,3 ,226 ,0 ,231 ,253 , 33 ,58 ,201 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,175 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,102 ,158 ,134 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 10 , 38 , 48 ,88 ,0 ,0 ,0 ,0 ,220 ,179 ,255 ,61 ,214 ,237 ,192 ,255 ,123 , 0 ,161 ,254 ,83 ,143 ,83 ,143 ,83 ,143 ,245 ,255 , 3 , 0 ,255 ,255 , 93 ,1 ,163 ,3 ,223 ,0 ,163 , 70 , 29 ,58 ,209 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,176 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 , 75 ,254 ,136 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,169 ,193 , 48 ,88 ,0 ,0 ,0 ,0 , 68 ,178 ,235 ,60 , 66 ,236 , 67 ,255 ,150 , 0 ,107 ,253 ,83 ,143 ,83 ,143 ,83 ,143 ,223 ,255 , 3 , 0 , 7 , 0 , 96 ,1 ,162 ,3 ,221 ,0 ,198 ,218 , 12 ,58 ,217 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,177 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 , 48 , 94 ,139 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 72 , 93 , 49 ,88 ,0 ,0 ,0 ,0 ,228 ,175 , 77 ,59 , 24 ,234 ,183 ,254 ,123 , 0 , 5 ,253 ,83 ,143 ,83 ,143 ,83 ,143 ,240 ,255 ,238 ,255 , 4 , 0 , 97 ,1 ,160 ,3 ,220 ,0 , 52 , 13 ,230 ,57 ,225 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,178 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 , 17 ,190 ,141 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,230 ,248 , 49 ,88 ,0 ,0 ,0 ,0 , 76 ,173 ,141 ,57 , 6 ,232 ,246 ,254 ,147 , 0 ,237 ,252 ,83 ,143 ,83 ,143 ,83 ,143 , 45 , 0 , 31 , 0 ,220 ,255 , 95 ,1 ,163 ,3 ,220 ,0 , 54 , 85 ,186 ,57 ,233 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,179 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,246 , 29 ,144 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,133 ,148 , 50 ,88 ,0 ,0 ,0 ,0 , 61 ,171 ,200 ,55 , 96 ,230 , 75 ,255 ,219 ,255 ,251 ,253 ,83 ,143 ,83 ,143 ,83 ,143 , 79 , 0 ,242 ,255 ,210 ,255 , 94 ,1 ,165 ,3 ,219 ,0 ,196 ,171 ,199 ,57 ,241 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,180 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,219 ,125 ,146 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 36 , 48 , 51 ,88 ,0 ,0 ,0 ,0 ,243 ,169 ,116 ,54 , 11 ,230 ,157 ,255 ,118 ,255 , 37 ,255 ,84 ,143 ,84 ,143 ,84 ,143 , 5 , 0 , 17 , 0 , 10 , 0 , 89 ,1 ,167 ,3 ,222 ,0 , 66 ,114 ,189 ,57 ,249 ,116 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,181 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,192 ,221 ,148 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,195 ,203 , 51 ,88 ,0 ,0 ,0 ,0 ,123 ,169 ,187 ,53 , 18 ,230 , 16 , 0 ,190 ,255 ,217 ,255 ,84 ,143 ,84 ,143 ,84 ,143 ,232 ,255 , 3 , 0 , 23 , 0 , 79 ,1 ,169 ,3 ,226 ,0 , 16 ,227 ,210 ,57 , 1 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,182 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,166 , 61 ,151 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 98 ,103 , 52 ,88 ,0 ,0 ,0 ,0 ,171 ,169 ,171 ,53 , 81 ,230 , 83 , 0 ,182 ,255 ,135 , 0 ,84 ,143 ,84 ,143 ,84 ,143 ,242 ,255 , 0 , 0 , 2 , 0 , 71 ,1 ,171 ,3 ,229 ,0 ,144 ,244 ,208 ,57 , 9 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,183 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,135 ,157 ,153 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 0 , 3 , 53 ,88 ,0 ,0 ,0 ,0 , 97 ,170 , 15 ,54 , 3 ,231 ,155 , 0 ,162 ,255 , 74 , 1 ,84 ,143 ,84 ,143 ,84 ,143 , 12 , 0 ,228 ,255 ,243 ,255 , 65 ,1 ,172 ,3 ,231 ,0 ,204 , 93 ,177 ,57 , 17 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,184 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 ,108 ,253 ,155 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,159 ,158 , 53 ,88 ,0 ,0 ,0 ,0 ,188 ,171 , 27 ,55 , 76 ,232 ,190 , 0 ,126 ,255 ,122 , 2 ,84 ,143 ,84 ,143 ,84 ,143 , 48 , 0 ,193 ,255 ,228 ,255 , 63 ,1 ,170 ,3 ,231 ,0 , 52 ,121 , 4 ,58 , 25 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,185 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 , 81 , 93 ,158 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 62 , 58 , 54 ,88 ,0 ,0 ,0 ,0 ,173 ,173 ,190 ,56 ,239 ,234 ,171 , 0 , 10 ,255 , 62 , 3 ,84 ,143 ,84 ,143 ,84 ,143 ,249 ,255 , 11 , 0 ,250 ,255 , 63 ,1 ,169 ,3 ,229 ,0 ,251 , 20 , 4 ,58 , 33 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,186 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 , 54 ,189 ,160 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,221 ,213 , 54 ,88 ,0 ,0 ,0 ,0 ,173 ,175 , 81 ,58 ,223 ,237 ,116 , 0 ,232 ,254 ,203 , 2 ,84 ,143 ,84 ,143 ,84 ,143 ,213 ,255 , 65 , 0 , 22 , 0 , 65 ,1 ,172 ,3 ,229 ,0 , 82 ,228 , 54 ,58 , 41 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,187 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 , 23 , 29 ,163 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,123 ,113 , 55 ,88 ,0 ,0 ,0 ,0 , 39 ,177 , 77 ,59 ,232 ,239 , 88 , 0 ,146 ,255 ,133 , 1 ,84 ,143 ,84 ,143 ,84 ,143 ,182 ,255 , 44 , 0 , 48 , 0 , 67 ,1 ,174 ,3 ,229 ,0 ,185 , 20 ,115 ,58 , 49 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,188 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 ,252 ,124 ,165 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 26 , 13 , 56 ,88 ,0 ,0 ,0 ,0 ,225 ,177 ,229 ,59 ,142 ,240 , 35 , 0 , 23 , 0 , 77 , 0 ,84 ,143 ,84 ,143 ,84 ,143 ,220 ,255 , 21 , 0 , 24 , 0 , 72 ,1 ,173 ,3 ,229 ,0 ,235 , 19 ,130 ,58 , 57 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,189 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 ,225 ,220 ,167 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,185 ,168 , 56 ,88 ,0 ,0 ,0 ,0 ,205 ,177 ,231 ,59 , 57 ,240 , 14 , 0 ,129 , 0 , 71 ,255 ,84 ,143 ,84 ,143 ,84 ,143 ,235 ,255 , 16 , 0 , 17 , 0 , 77 ,1 ,172 ,3 ,228 ,0 ,123 ,184 ,129 ,58 , 65 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,190 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 ,198 , 60 ,170 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 88 , 68 , 57 ,88 ,0 ,0 ,0 ,0 , 56 ,177 ,119 ,59 , 7 ,239 ,209 ,255 ,101 , 0 ,171 ,254 ,84 ,143 ,84 ,143 ,84 ,143 , 7 , 0 ,236 ,255 ,248 ,255 , 84 ,1 ,170 ,3 ,225 ,0 ,189 , 95 , 74 ,58 , 73 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,191 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,168 ,156 ,172 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,246 ,223 , 57 ,88 ,0 ,0 ,0 ,0 , 23 ,176 ,150 ,58 ,169 ,237 ,128 ,255 ,110 , 0 , 61 ,254 ,85 ,143 ,85 ,143 ,85 ,143 ,255 ,255 ,228 ,255 ,247 ,255 , 88 ,1 ,167 ,3 ,223 ,0 ,145 , 4 , 48 ,58 , 81 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,192 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,141 ,252 ,174 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,149 ,123 , 58 ,88 ,0 ,0 ,0 ,0 ,156 ,174 ,129 ,57 , 52 ,236 , 93 ,255 ,111 , 0 ,206 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 23 , 0 , 5 , 0 ,240 ,255 , 90 ,1 ,167 ,3 ,221 ,0 ,200 , 67 , 25 ,58 , 89 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,193 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,114 , 92 ,177 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 52 , 23 , 59 ,88 ,0 ,0 ,0 ,0 ,225 ,172 , 35 ,56 ,165 ,234 , 20 ,255 , 71 , 0 ,196 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 21 , 0 , 7 , 0 ,247 ,255 , 91 ,1 ,167 ,3 ,221 ,0 , 88 ,155 ,107 ,57 , 97 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,194 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 , 87 ,188 ,179 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,211 ,178 , 59 ,88 ,0 ,0 ,0 ,0 , 3 ,171 ,153 ,54 , 14 ,233 , 98 ,255 ,120 , 0 ,101 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 26 , 0 , 36 , 0 ,236 ,255 , 88 ,1 ,170 ,3 ,221 ,0 ,244 ,136 ,201 ,57 ,105 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,195 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 , 60 , 28 ,182 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,114 , 78 , 60 ,88 ,0 ,0 ,0 ,0 ,122 ,169 ,252 ,52 , 29 ,231 ,144 ,255 , 57 , 0 ,254 ,253 ,85 ,143 ,85 ,143 ,85 ,143 , 56 , 0 ,219 ,255 ,218 ,255 , 85 ,1 ,170 ,3 ,221 ,0 ,232 ,118 ,246 ,57 ,113 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,196 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 , 29 ,124 ,184 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 16 ,234 , 60 ,88 ,0 ,0 ,0 ,0 ,111 ,168 ,176 ,51 , 10 ,230 ,225 ,255 ,231 ,255 ,198 ,254 ,85 ,143 ,85 ,143 ,85 ,143 , 1 , 0 ,226 ,255 ,255 ,255 , 78 ,1 ,170 ,3 ,223 ,0 ,156 ,148 , 6 ,58 ,121 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,197 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 2 ,220 ,186 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,175 ,133 , 61 ,88 ,0 ,0 ,0 ,0 ,248 ,167 , 2 ,51 ,174 ,229 ,244 ,255 ,222 ,255 ,183 ,255 ,85 ,143 ,85 ,143 ,85 ,143 ,231 ,255 ,254 ,255 , 7 , 0 , 68 ,1 ,171 ,3 ,226 ,0 ,189 ,201 , 16 ,58 ,129 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,198 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 ,231 , 59 ,189 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 78 , 33 , 62 ,88 ,0 ,0 ,0 ,0 , 2 ,168 ,239 ,50 ,213 ,229 , 44 , 0 ,194 ,255 ,110 , 0 ,85 ,143 ,85 ,143 ,85 ,143 ,245 ,255 , 10 , 0 , 0 , 0 , 58 ,1 ,174 ,3 ,229 ,0 ,114 , 88 , 7 ,58 ,137 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,199 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,205 ,155 ,191 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,237 ,188 , 62 ,88 ,0 ,0 ,0 ,0 ,142 ,168 , 78 ,51 ,126 ,230 ,120 , 0 ,157 ,255 , 53 , 1 ,85 ,143 ,85 ,143 ,85 ,143 , 15 , 0 ,253 ,255 ,246 ,255 , 50 ,1 ,176 ,3 ,231 ,0 ,119 ,213 , 6 ,58 ,145 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,200 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,174 ,251 ,193 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,139 , 88 , 63 ,88 ,0 ,0 ,0 ,0 ,189 ,169 , 59 ,52 ,221 ,231 ,200 , 0 , 90 ,255 , 90 , 2 ,85 ,143 ,85 ,143 ,85 ,143 , 25 , 0 ,245 ,255 ,243 ,255 , 46 ,1 ,177 ,3 ,231 ,0 , 92 ,161 ,167 ,57 ,153 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,201 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,147 , 91 ,196 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 42 ,244 , 63 ,88 ,0 ,0 ,0 ,0 ,157 ,171 ,198 ,53 , 73 ,234 ,222 , 0 ,251 ,254 ,239 , 2 ,85 ,143 ,85 ,143 ,85 ,143 , 0 , 0 , 57 , 0 ,253 ,255 , 45 ,1 ,179 ,3 ,230 ,0 ,251 ,109 ,202 ,57 ,161 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,202 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,120 ,187 ,198 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,201 ,143 , 64 ,88 ,0 ,0 ,0 ,0 ,133 ,173 ,255 ,54 ,137 ,236 ,187 , 0 , 63 ,255 , 58 , 2 ,85 ,143 ,85 ,143 ,85 ,143 ,195 ,255 , 0 , 0 , 18 , 0 , 44 ,1 ,181 ,3 ,230 ,0 ,160 ,186 , 8 ,58 ,169 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,203 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 , 93 , 27 ,201 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,104 , 43 , 65 ,88 ,0 ,0 ,0 ,0 ,190 ,174 ,236 ,55 , 55 ,238 , 46 , 0 ,135 ,255 , 94 , 1 ,86 ,143 ,86 ,143 ,86 ,143 ,212 ,255 , 17 , 0 , 15 , 0 , 45 ,1 ,181 ,3 ,229 ,0 , 49 , 70 ,215 ,57 ,177 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,204 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 , 66 ,123 ,203 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 7 ,199 , 65 ,88 ,0 ,0 ,0 ,0 , 53 ,175 , 58 ,56 , 61 ,239 ,244 ,255 ,147 ,255 , 96 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,216 ,255 , 10 , 0 , 18 , 0 , 48 ,1 ,181 ,3 ,228 ,0 ,196 ,241 ,223 ,57 ,185 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,205 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 , 35 ,219 ,205 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,165 , 98 , 66 ,88 ,0 ,0 ,0 ,0 , 15 ,175 , 11 ,56 , 96 ,239 ,237 ,255 , 20 , 0 ,120 ,255 ,86 ,143 ,86 ,143 ,86 ,143 ,251 ,255 , 4 , 0 ,251 ,255 , 52 ,1 ,181 ,3 ,226 ,0 ,143 , 87 ,222 ,57 ,193 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,206 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 , 8 , 59 ,208 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 68 ,254 , 66 ,88 ,0 ,0 ,0 ,0 ,111 ,174 ,101 ,55 ,188 ,238 ,178 ,255 , 34 , 0 ,217 ,254 ,86 ,143 ,86 ,143 ,86 ,143 ,240 ,255 ,230 ,255 ,254 ,255 , 56 ,1 ,178 ,3 ,223 ,0 , 42 , 96 ,253 ,57 ,201 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,207 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 ,237 ,154 ,210 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,227 ,153 , 67 ,88 ,0 ,0 ,0 ,0 , 80 ,173 ,123 ,54 ,179 ,237 , 77 ,255 , 64 , 0 , 78 ,254 ,86 ,143 ,86 ,143 ,86 ,143 ,229 ,255 ,244 ,255 ,248 ,255 , 58 ,1 ,177 ,3 ,221 ,0 , 85 , 90 , 3 ,58 ,209 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,208 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,170 ,249 ,212 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,130 , 53 , 68 ,88 ,0 ,0 ,0 ,0 ,181 ,171 , 63 ,53 , 75 ,236 , 41 ,255 ,128 , 0 ,150 ,253 ,86 ,143 ,86 ,143 ,86 ,143 ,233 ,255 , 26 , 0 , 0 , 0 , 57 ,1 ,178 ,3 ,220 ,0 ,143 , 93 ,116 ,57 ,217 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,209 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,139 , 89 ,215 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 32 ,209 , 68 ,88 ,0 ,0 ,0 ,0 ,208 ,169 ,166 ,51 , 44 ,234 , 68 ,255 ,170 , 0 , 41 ,253 ,86 ,143 ,86 ,143 ,86 ,143 , 23 , 0 , 38 , 0 ,235 ,255 , 56 ,1 ,181 ,3 ,220 ,0 ,168 ,222 ,208 ,57 ,225 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,210 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 ,112 ,185 ,217 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,191 ,108 , 69 ,88 ,0 ,0 ,0 ,0 , 45 ,168 ,209 ,49 ,199 ,231 ,223 ,255 ,151 , 0 ,100 ,253 ,86 ,143 ,86 ,143 ,86 ,143 , 49 , 0 , 15 , 0 ,232 ,255 , 52 ,1 ,184 ,3 ,220 ,0 , 38 ,222 , 13 ,58 ,233 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,211 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 , 85 , 25 ,220 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 94 , 8 , 70 ,88 ,0 ,0 ,0 ,0 ,118 ,167 ,111 ,48 ,244 ,229 , 23 , 0 , 7 , 0 , 50 ,255 ,86 ,143 ,86 ,143 ,86 ,143 , 34 , 0 ,170 ,255 , 0 , 0 , 47 ,1 ,182 ,3 ,221 ,0 ,212 ,229 ,147 ,58 ,241 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,212 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 , 58 ,121 ,222 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,253 ,163 , 70 ,88 ,0 ,0 ,0 ,0 ,125 ,167 , 66 ,48 ,235 ,229 , 53 , 0 ,246 ,255 ,100 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,209 ,255 , 11 , 0 , 23 , 0 , 37 ,1 ,183 ,3 ,224 ,0 , 73 ,169 ,155 ,58 ,249 ,117 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,213 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 27 ,217 ,224 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,155 , 63 , 71 ,88 ,0 ,0 ,0 ,0 ,250 ,167 ,183 ,48 , 63 ,230 , 87 , 0 , 0 , 0 ,184 , 0 ,86 ,143 ,86 ,143 ,86 ,143 ,237 ,255 , 28 , 0 ,250 ,255 , 27 ,1 ,186 ,3 ,225 ,0 ,149 ,210 ,152 ,58 , 1 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,214 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 , 0 , 57 ,227 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 58 ,219 , 71 ,88 ,0 ,0 ,0 ,0 ,168 ,168 , 78 ,49 ,214 ,230 , 97 , 0 ,200 ,255 , 21 , 1 ,86 ,143 ,86 ,143 ,86 ,143 , 3 , 0 ,250 ,255 ,243 ,255 , 21 ,1 ,188 ,3 ,225 ,0 , 98 ,156 ,150 ,58 , 9 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,215 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 ,230 ,152 ,229 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,217 ,118 , 72 ,88 ,0 ,0 ,0 ,0 ,130 ,169 , 32 ,50 ,190 ,231 ,122 , 0 ,194 ,255 ,208 , 1 ,87 ,143 ,87 ,143 ,87 ,143 , 35 , 0 ,218 ,255 ,232 ,255 , 18 ,1 ,188 ,3 ,224 ,0 ,218 ,182 ,143 ,58 , 17 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,216 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 ,203 ,248 ,231 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,120 , 18 , 73 ,88 ,0 ,0 ,0 ,0 , 10 ,171 ,167 ,51 ,121 ,233 ,194 , 0 ,155 ,255 ,230 , 2 ,87 ,143 ,87 ,143 ,87 ,143 , 54 , 0 ,219 ,255 ,223 ,255 , 19 ,1 ,187 ,3 ,222 ,0 ,108 , 2 ,128 ,58 , 25 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,217 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,176 , 88 ,234 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 23 ,174 , 73 ,88 ,0 ,0 ,0 ,0 , 74 ,173 ,202 ,53 , 40 ,236 ,211 , 0 , 26 ,255 ,140 , 3 ,87 ,143 ,87 ,143 ,87 ,143 , 41 , 0 ,249 ,255 ,213 ,255 , 24 ,1 ,186 ,3 ,218 ,0 ,184 , 73 , 27 ,58 , 33 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,218 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,145 ,184 ,236 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,181 , 73 , 74 ,88 ,0 ,0 ,0 ,0 ,110 ,175 ,131 ,55 , 64 ,239 ,115 , 0 , 9 ,255 ,213 , 2 ,87 ,143 ,87 ,143 ,87 ,143 ,164 ,255 , 39 , 0 , 40 , 0 , 27 ,1 ,186 ,3 ,216 ,0 ,202 , 89 ,160 ,57 , 41 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,219 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 ,118 , 24 ,239 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 84 ,229 , 74 ,88 ,0 ,0 ,0 ,0 ,205 ,176 ,184 ,56 , 4 ,241 , 81 , 0 ,238 ,255 , 20 , 1 ,87 ,143 ,87 ,143 ,87 ,143 ,192 ,255 , 76 , 0 , 41 , 0 , 30 ,1 ,188 ,3 ,216 ,0 ,246 , 48 , 20 ,58 , 49 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,220 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 , 91 ,120 ,241 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,243 ,128 , 75 ,88 ,0 ,0 ,0 ,0 , 23 ,177 , 9 ,57 , 39 ,241 ,215 ,255 , 84 , 0 ,186 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,215 ,255 , 22 , 0 , 33 , 0 , 36 ,1 ,188 ,3 ,215 ,0 ,253 ,202 , 31 ,58 , 57 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,221 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 , 64 ,216 ,243 ,169 ,35 ,0 ,0 ,3 ,0 ,131 ,146 , 28 , 76 ,88 ,0 ,0 ,0 ,0 ,175 ,176 ,253 ,56 , 61 ,240 ,217 ,255 ,103 , 0 , 32 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 47 , 0 ,209 ,255 ,227 ,255 , 46 ,1 ,185 ,3 ,212 ,0 , 77 , 23 , 29 ,58 , 65 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,222 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 , 33 , 56 ,246 ,169 ,35 ,0 ,0 ,3 ,0 ,131 , 48 ,184 , 76 ,88 ,0 ,0 ,0 ,0 , 17 ,176 ,165 ,56 ,181 ,239 ,162 ,255 , 31 , 0 ,103 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 8 , 0 ,224 ,255 ,240 ,255 , 54 ,1 ,180 ,3 ,208 ,0 ,176 ,126 , 50 ,58 , 73 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,223 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 , 6 ,152 ,248 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,207 , 83 , 77 ,88 ,0 ,0 ,0 ,0 ,167 ,175 ,128 ,56 ,153 ,239 ,178 ,255 , 3 , 0 ,172 ,255 ,87 ,143 ,87 ,143 ,87 ,143 , 0 , 0 , 6 , 0 ,244 ,255 , 60 ,1 ,178 ,3 ,205 ,0 ,178 , 11 , 51 ,58 , 81 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,224 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 ,236 ,247 ,250 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,110 ,239 , 77 ,88 ,0 ,0 ,0 ,0 ,112 ,175 ,107 ,56 ,150 ,239 ,211 ,255 , 29 , 0 ,201 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,237 ,255 , 22 , 0 , 13 , 0 , 64 ,1 ,177 ,3 ,204 ,0 , 40 , 41 , 56 ,58 , 89 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,225 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 32 ,209 , 87 ,253 ,169 ,35 ,0 ,0 ,3 ,4 ,131 , 13 ,139 , 78 ,88 ,0 ,0 ,0 ,0 , 85 ,175 ,111 ,56 ,101 ,239 ,242 ,255 , 50 , 0 ,225 ,255 ,87 ,143 ,87 ,143 ,87 ,143 ,246 ,255 , 21 , 0 , 8 , 0 , 68 ,1 ,177 ,3 ,204 ,0 ,117 ,228 , 6 ,58 , 97 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,226 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,182 ,183 ,255 ,169 ,35 ,0 ,0 ,3 ,4 ,131 ,172 , 38 , 79 ,88 ,0 ,0 ,0 ,0 , 67 ,175 ,122 ,56 , 29 ,239 , 0 , 0 , 53 , 0 ,228 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,249 ,255 , 11 , 0 , 8 , 0 , 72 ,1 ,177 ,3 ,203 ,0 , 4 ,205 ,188 ,57 ,105 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,227 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,104 ,151 , 23 , 2 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 74 ,194 , 79 ,88 ,0 ,0 ,0 ,0 , 52 ,175 ,133 ,56 ,220 ,238 , 0 , 0 , 44 , 0 ,231 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,254 ,255 , 10 , 0 , 1 , 0 , 76 ,1 ,177 ,3 ,203 ,0 , 72 , 23 ,187 ,57 ,113 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,228 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 ,124 ,119 , 4 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,233 , 93 , 80 ,88 ,0 ,0 ,0 ,0 , 37 ,175 ,131 ,56 ,166 ,238 ,254 ,255 , 16 , 0 ,222 ,255 ,88 ,143 ,88 ,143 ,88 ,143 , 1 , 0 ,253 ,255 ,250 ,255 , 79 ,1 ,176 ,3 ,202 ,0 , 81 ,164 , 63 ,57 ,121 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,229 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,152 , 97 ,215 , 6 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,136 ,249 , 80 ,88 ,0 ,0 ,0 ,0 , 12 ,175 ,108 ,56 ,137 ,238 ,240 ,255 , 1 , 0 ,217 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,253 ,255 ,247 ,255 ,251 ,255 , 82 ,1 ,175 ,3 ,201 ,0 , 53 ,198 , 1 ,57 ,129 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,230 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 , 70 , 55 , 9 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 39 ,149 , 81 ,88 ,0 ,0 ,0 ,0 ,222 ,174 , 74 ,56 ,116 ,238 ,230 ,255 , 6 , 0 ,191 ,255 ,88 ,143 ,88 ,143 ,88 ,143 , 0 , 0 , 8 , 0 ,252 ,255 , 85 ,1 ,174 ,3 ,200 ,0 , 82 , 78 ,253 ,56 ,137 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,231 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,224 , 39 ,151 , 11 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,197 , 48 , 82 ,88 ,0 ,0 ,0 ,0 ,174 ,174 , 11 ,56 , 74 ,238 ,249 ,255 ,242 ,255 ,195 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 ,251 ,255 , 0 , 0 , 87 ,1 ,173 ,3 ,200 ,0 , 91 ,130 ,180 ,56 ,145 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,232 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 , 12 ,247 , 13 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,100 ,204 , 82 ,88 ,0 ,0 ,0 ,0 ,142 ,174 ,215 ,55 , 53 ,238 , 0 , 0 ,238 ,255 ,217 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 , 6 , 0 , 3 , 0 , 88 ,1 ,173 ,3 ,200 ,0 ,181 , 12 , 58 ,56 ,153 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,233 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 16 ,242 , 86 , 16 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 3 ,104 , 83 ,88 ,0 ,0 ,0 ,0 ,130 ,174 ,184 ,55 , 33 ,238 , 7 , 0 , 0 , 0 ,235 ,255 ,88 ,143 ,88 ,143 ,88 ,143 ,247 ,255 , 2 , 0 , 0 , 0 , 89 ,1 ,173 ,3 ,199 ,0 , 92 , 45 , 9 ,56 ,161 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,234 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 ,215 ,182 , 18 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,162 , 3 , 84 ,88 ,0 ,0 ,0 ,0 ,125 ,174 ,172 ,55 , 27 ,238 , 6 , 0 ,252 ,255 , 2 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,243 ,255 , 2 , 0 ,255 ,255 , 90 ,1 ,173 ,3 ,199 ,0 ,221 , 44 ,212 ,55 ,169 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,235 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,188 , 22 , 21 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 65 ,159 , 84 ,88 ,0 ,0 ,0 ,0 ,132 ,174 ,176 ,55 , 29 ,238 , 6 , 0 , 0 , 0 , 10 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,244 ,255 , 4 , 0 , 2 , 0 , 91 ,1 ,173 ,3 ,199 ,0 , 32 , 66 ,191 ,55 ,177 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,236 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,112 ,157 ,118 , 23 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,223 , 58 , 85 ,88 ,0 ,0 ,0 ,0 ,140 ,174 ,188 ,55 , 20 ,238 , 0 , 0 , 19 , 0 , 5 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,245 ,255 , 5 , 0 , 4 , 0 , 92 ,1 ,172 ,3 ,199 ,0 ,105 ,231 ,131 ,55 ,185 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,237 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 ,130 ,214 , 25 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,126 ,214 , 85 ,88 ,0 ,0 ,0 ,0 ,147 ,174 ,212 ,55 ,253 ,237 , 0 , 0 , 31 , 0 , 10 , 0 ,88 ,143 ,88 ,143 ,88 ,143 ,252 ,255 , 2 , 0 ,254 ,255 , 93 ,1 ,172 ,3 ,199 ,0 , 86 ,192 , 17 ,55 ,193 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,238 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 ,103 , 54 , 28 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 29 ,114 , 86 ,88 ,0 ,0 ,0 ,0 ,155 ,174 ,221 ,55 ,231 ,237 , 14 , 0 , 6 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,253 ,255 , 0 , 0 ,254 ,255 , 94 ,1 ,172 ,3 ,198 ,0 ,224 ,114 , 27 ,55 ,201 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,239 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 , 76 ,150 , 30 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,188 , 13 , 87 ,88 ,0 ,0 ,0 ,0 ,160 ,174 ,219 ,55 ,216 ,237 , 11 , 0 , 0 , 0 ,250 ,255 ,89 ,143 ,89 ,143 ,89 ,143 , 1 , 0 , 4 , 0 ,251 ,255 , 95 ,1 ,172 ,3 ,198 ,0 ,228 ,137 ,253 ,54 ,209 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,240 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,232 , 45 ,246 , 32 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 90 ,169 , 87 ,88 ,0 ,0 ,0 ,0 ,158 ,174 ,200 ,55 ,209 ,237 , 2 , 0 ,242 ,255 ,244 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,255 ,255 , 0 , 0 ,250 ,255 , 96 ,1 ,172 ,3 ,197 ,0 , 74 ,193 , 9 ,55 ,217 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,241 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 , 19 , 86 , 35 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,249 , 68 , 88 ,88 ,0 ,0 ,0 ,0 ,148 ,174 ,181 ,55 ,208 ,237 ,252 ,255 ,248 ,255 ,246 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,249 ,255 , 0 , 0 ,249 ,255 , 97 ,1 ,172 ,3 ,196 ,0 ,158 ,110 , 2 ,55 ,225 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,242 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 ,248 ,181 , 37 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,152 ,224 , 88 ,88 ,0 ,0 ,0 ,0 ,143 ,174 ,168 ,55 ,207 ,237 ,255 ,255 , 4 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,245 ,255 ,251 ,255 ,254 ,255 , 97 ,1 ,171 ,3 ,196 ,0 ,123 ,217 , 67 ,55 ,233 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,243 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 ,221 , 21 , 40 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 55 ,124 , 89 ,88 ,0 ,0 ,0 ,0 ,146 ,174 ,178 ,55 ,202 ,237 , 3 , 0 , 14 , 0 , 10 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,253 ,255 ,254 ,255 ,250 ,255 , 98 ,1 ,171 ,3 ,195 ,0 ,126 ,101 , 87 ,55 ,241 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,244 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,194 ,117 , 42 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,214 , 23 , 90 ,88 ,0 ,0 ,0 ,0 ,164 ,174 ,206 ,55 ,209 ,237 ,247 ,255 , 5 , 0 , 50 , 0 ,89 ,143 ,89 ,143 ,89 ,143 , 0 , 0 ,245 ,255 ,245 ,255 , 98 ,1 ,170 ,3 ,194 ,0 , 73 ,123 ,237 ,55 ,249 ,118 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,245 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,120 ,163 ,213 , 44 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,116 ,179 , 90 ,88 ,0 ,0 ,0 ,0 ,180 ,174 ,241 ,55 , 2 ,238 ,241 ,255 ,250 ,255 , 47 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,250 ,255 , 8 , 0 , 0 , 0 , 99 ,1 ,170 ,3 ,194 ,0 ,158 , 5 ,255 ,55 , 1 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,246 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 ,136 , 53 , 47 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 19 , 79 , 91 ,88 ,0 ,0 ,0 ,0 ,191 ,174 , 11 ,56 , 32 ,238 ,248 ,255 , 4 , 0 , 20 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,247 ,255 , 9 , 0 , 1 , 0 ,100 ,1 ,171 ,3 ,194 ,0 , 57 ,122 , 28 ,56 , 9 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,247 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,109 ,149 , 49 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,178 ,234 , 91 ,88 ,0 ,0 ,0 ,0 ,194 ,174 , 23 ,56 , 32 ,238 ,255 ,255 , 7 , 0 , 0 , 0 ,89 ,143 ,89 ,143 ,89 ,143 ,252 ,255 , 7 , 0 ,254 ,255 ,101 ,1 ,171 ,3 ,194 ,0 ,232 ,188 , 54 ,56 , 17 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,248 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 , 82 ,245 , 51 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 81 ,134 , 92 ,88 ,0 ,0 ,0 ,0 ,187 ,174 , 18 ,56 , 13 ,238 , 0 , 0 , 13 , 0 ,239 ,255 ,89 ,143 ,89 ,143 ,89 ,143 ,250 ,255 , 3 , 0 , 1 , 0 ,101 ,1 ,171 ,3 ,194 ,0 , 47 , 7 , 61 ,56 , 25 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,249 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,240 , 51 , 85 , 54 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,239 , 33 , 93 ,88 ,0 ,0 ,0 ,0 ,176 ,174 , 10 ,56 ,238 ,237 ,251 ,255 , 9 , 0 ,231 ,255 ,89 ,143 ,89 ,143 ,89 ,143 , 1 , 0 ,254 ,255 ,251 ,255 ,102 ,1 ,171 ,3 ,194 ,0 , 44 , 3 , 45 ,56 , 33 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,250 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 , 25 ,181 , 56 ,170 ,35 ,0 ,0 ,3 ,4 ,131 ,142 ,189 , 93 ,88 ,0 ,0 ,0 ,0 ,156 ,174 ,251 ,55 ,222 ,237 ,242 ,255 ,252 ,255 ,244 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 ,248 ,255 ,249 ,255 ,103 ,1 ,170 ,3 ,194 ,0 , 6 ,254 , 12 ,56 , 41 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,251 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 32 ,254 , 20 , 59 ,170 ,35 ,0 ,0 ,3 ,4 ,131 , 45 , 89 , 94 ,88 ,0 ,0 ,0 ,0 ,138 ,174 ,241 ,55 ,228 ,237 ,245 ,255 ,255 ,255 ,242 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,249 ,255 , 5 , 0 , 4 , 0 ,103 ,1 ,170 ,3 ,194 ,0 ,169 ,250 , 2 ,56 , 49 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,252 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 56 ,227 ,116 , 61 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,204 ,244 , 94 ,88 ,0 ,0 ,0 ,0 ,126 ,174 ,240 ,55 ,213 ,237 ,253 ,255 , 18 , 0 ,242 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,253 ,255 , 6 , 0 , 0 , 0 ,104 ,1 ,170 ,3 ,194 ,0 ,254 ,192 ,248 ,55 , 57 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,253 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 80 ,200 ,212 , 63 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,107 ,144 , 95 ,88 ,0 ,0 ,0 ,0 ,122 ,174 ,244 ,55 ,200 ,237 ,255 ,255 , 5 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,254 ,255 , 3 , 0 ,253 ,255 ,104 ,1 ,170 ,3 ,194 ,0 ,211 ,165 ,191 ,55 , 65 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,254 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,128 ,169 , 52 , 66 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 9 , 44 , 96 ,88 ,0 ,0 ,0 ,0 ,121 ,174 ,247 ,55 ,199 ,237 , 0 , 0 , 3 , 0 , 2 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 3 , 0 , 0 , 0 ,104 ,1 ,170 ,3 ,194 ,0 ,149 , 41 ,156 ,55 , 73 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,255 ,29 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,152 ,142 ,148 , 68 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,168 ,199 , 96 ,88 ,0 ,0 ,0 ,0 ,120 ,174 ,249 ,55 ,195 ,237 ,254 ,255 , 4 , 0 ,255 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,252 ,255 , 0 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 ,115 ,176 ,156 ,55 , 81 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,128 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,176 ,115 ,244 , 70 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 71 , 99 , 97 ,88 ,0 ,0 ,0 ,0 ,116 ,174 ,247 ,55 ,192 ,237 ,252 ,255 , 1 , 0 ,253 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 3 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 ,252 , 83 ,137 ,55 , 89 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,129 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,200 , 88 , 84 , 73 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,230 ,254 , 97 ,88 ,0 ,0 ,0 ,0 ,111 ,174 ,247 ,55 ,186 ,237 , 0 , 0 , 3 , 0 ,252 ,255 ,90 ,143 ,90 ,143 ,90 ,143 ,252 ,255 , 2 , 0 ,254 ,255 ,105 ,1 ,170 ,3 ,195 ,0 ,156 ,192 , 38 ,55 , 97 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,130 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,248 , 57 ,180 , 75 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,132 ,154 , 98 ,88 ,0 ,0 ,0 ,0 ,108 ,174 ,245 ,55 ,181 ,237 ,252 ,255 , 8 , 0 , 2 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,250 ,255 , 0 , 0 , 1 , 0 ,105 ,1 ,170 ,3 ,195 ,0 , 79 ,197 ,170 ,54 ,105 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,131 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 16 , 31 , 20 , 78 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 35 , 54 , 99 ,88 ,0 ,0 ,0 ,0 ,106 ,174 ,252 ,55 ,174 ,237 ,254 ,255 , 9 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,251 ,255 , 0 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,195 ,0 , 56 ,209 ,102 ,54 ,113 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,132 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 40 , 4 ,116 , 80 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,194 ,209 , 99 ,88 ,0 ,0 ,0 ,0 ,104 ,174 , 2 ,56 ,169 ,237 ,255 ,255 , 6 , 0 , 0 , 0 ,90 ,143 ,90 ,143 ,90 ,143 ,253 ,255 , 3 , 0 , 1 , 0 ,105 ,1 ,170 ,3 ,196 ,0 ,182 ,102 ,116 ,54 ,121 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,133 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 64 ,233 ,211 , 82 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 97 ,109 ,100 ,88 ,0 ,0 ,0 ,0 ,105 ,174 , 12 ,56 ,164 ,237 ,255 ,255 , 7 , 0 , 7 , 0 ,91 ,143 ,91 ,143 ,91 ,143 , 0 , 0 , 1 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,196 ,0 , 78 ,232 ,109 ,54 ,129 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,134 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 88 ,206 , 51 , 85 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 0 , 9 ,101 ,88 ,0 ,0 ,0 ,0 ,110 ,174 , 24 ,56 ,165 ,237 ,255 ,255 , 5 , 0 , 13 , 0 ,91 ,143 ,91 ,143 ,91 ,143 , 0 , 0 , 1 , 0 , 0 , 0 ,105 ,1 ,170 ,3 ,196 ,0 , 77 , 30 ,117 ,54 ,137 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,135 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,136 ,175 ,147 , 87 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,158 ,164 ,101 ,88 ,0 ,0 ,0 ,0 ,114 ,174 , 31 ,56 ,171 ,237 , 0 , 0 ,255 ,255 , 6 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 2 , 0 , 0 , 0 ,106 ,1 ,170 ,3 ,196 ,0 ,156 ,186 ,140 ,54 ,145 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,136 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,160 ,148 ,243 , 89 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 61 , 64 ,102 ,88 ,0 ,0 ,0 ,0 ,117 ,174 , 35 ,56 ,176 ,237 ,255 ,255 , 0 , 0 , 8 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,254 ,255 , 0 , 0 , 0 , 0 ,106 ,1 ,169 ,3 ,197 ,0 , 78 ,198 , 91 ,54 ,153 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,137 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,184 ,121 , 83 , 92 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,220 ,219 ,102 ,88 ,0 ,0 ,0 ,0 ,121 ,174 , 39 ,56 ,180 ,237 , 3 , 0 ,254 ,255 , 7 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 ,253 ,255 ,252 ,255 ,106 ,1 ,169 ,3 ,197 ,0 , 30 ,117 ,124 ,54 ,161 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,138 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,208 , 94 ,179 , 94 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,123 ,119 ,103 ,88 ,0 ,0 ,0 ,0 ,126 ,174 , 39 ,56 ,187 ,237 , 2 , 0 ,249 ,255 , 0 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,254 ,255 , 0 , 0 , 1 , 0 ,106 ,1 ,169 ,3 ,197 ,0 , 9 , 1 ,148 ,54 ,169 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,139 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 0 , 64 , 19 , 97 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 25 , 19 ,104 ,88 ,0 ,0 ,0 ,0 ,125 ,174 , 39 ,56 ,185 ,237 , 0 , 0 , 12 , 0 ,250 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 8 , 0 , 2 , 0 ,107 ,1 ,169 ,3 ,197 ,0 ,155 , 58 , 31 ,55 ,177 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,140 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 24 , 37 ,115 , 99 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,184 ,174 ,104 ,88 ,0 ,0 ,0 ,0 ,126 ,174 , 43 ,56 ,168 ,237 , 0 , 0 , 10 , 0 ,255 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 0 , 0 , 2 , 0 ,107 ,1 ,169 ,3 ,197 ,0 , 12 ,184 , 51 ,55 ,185 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,141 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 48 , 10 ,211 ,101 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 87 , 74 ,105 ,88 ,0 ,0 ,0 ,0 ,128 ,174 , 48 ,56 ,158 ,237 , 1 , 0 , 7 , 0 , 0 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,252 ,255 , 0 , 0 , 0 , 0 ,107 ,1 ,169 ,3 ,198 ,0 ,226 ,237 , 35 ,55 ,193 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,142 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 72 ,239 , 50 ,104 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,246 ,229 ,105 ,88 ,0 ,0 ,0 ,0 ,130 ,174 , 49 ,56 ,155 ,237 , 6 , 0 ,252 ,255 ,255 ,255 ,91 ,143 ,91 ,143 ,91 ,143 ,253 ,255 , 4 , 0 ,255 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 74 ,141 , 51 ,55 ,201 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,143 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 96 ,212 ,146 ,106 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,149 ,129 ,106 ,88 ,0 ,0 ,0 ,0 ,132 ,174 , 44 ,56 ,155 ,237 , 0 , 0 ,254 ,255 , 5 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,250 ,255 , 0 , 0 , 3 , 0 ,107 ,1 ,169 ,3 ,198 ,0 ,108 , 89 , 58 ,55 ,209 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,144 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,144 ,181 ,242 ,108 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 51 , 29 ,107 ,88 ,0 ,0 ,0 ,0 ,137 ,174 , 51 ,56 ,157 ,237 , 0 , 0 , 1 , 0 , 11 , 0 ,91 ,143 ,91 ,143 ,91 ,143 ,255 ,255 , 1 , 0 ,251 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 73 , 96 , 42 ,55 ,217 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,145 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,168 ,154 , 82 ,111 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,210 ,184 ,107 ,88 ,0 ,0 ,0 ,0 ,142 ,174 , 52 ,56 ,165 ,237 , 0 , 0 , 0 , 0 , 13 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,252 ,255 ,254 ,255 ,255 ,255 ,107 ,1 ,169 ,3 ,198 ,0 ,110 , 79 ,252 ,54 ,225 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,146 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,192 ,127 ,178 ,113 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,113 , 84 ,108 ,88 ,0 ,0 ,0 ,0 ,144 ,174 , 57 ,56 ,169 ,237 , 1 , 0 , 3 , 0 , 3 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,252 ,255 , 1 , 0 ,254 ,255 ,107 ,1 ,169 ,3 ,198 ,0 , 9 ,141 ,186 ,54 ,233 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,147 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 ,216 ,100 , 18 ,116 ,170 ,35 ,0 ,0 ,3 ,4 , 67 , 16 ,240 ,108 ,88 ,0 ,0 ,0 ,0 ,146 ,174 , 59 ,56 ,170 ,237 , 0 , 0 , 2 , 0 , 3 , 0 ,92 ,143 ,92 ,143 ,92 ,143 ,250 ,255 ,255 ,255 , 0 , 0 ,107 ,1 ,169 ,3 ,198 ,0 , 93 ,173 ,187 ,54 ,241 ,119 ,0 ,0 ,
-4 ,0 ,4 ,0 ,23 ,0 ,0 ,0 ,16 ,0 ,69 ,0 ,8 ,148 ,30 ,16 ,1 ,58 ,62 ,8 ,14 ,26 ,58 ,1 , 8 , 70 ,114 ,118 ,170 ,35 ,0 ,0 ,3 ,4 , 67 ,174 ,139 ,109 ,88 ,0 ,0 ,0 ,0 ,150 ,174 , 71 ,56 ,167 ,237 ,255 ,255 , 7 , 0 , 5 , 0 ,92 ,143 ,92 ,143 ,92 ,143 , 0 , 0 , 0 , 0 ,253 ,255 ,108 ,1 ,168 ,3 ,198 ,0 ,108 ,226 ,176 ,54 ,249 ,119 ,0 ,0 ,
\ No newline at end of file