NEW: release DJI Payload-SDK version 3.3

Signed-off-by: DJI-Martin <DJI-Martin@dji.com>
This commit is contained in:
DJI-Martin
2022-11-18 20:59:40 +08:00
parent 513d3537e2
commit f33308c85b
79 changed files with 1185370 additions and 1979 deletions

View File

@ -906,7 +906,8 @@ static T_DjiReturnCode DjiTest_CameraRotationGimbal(T_TestCameraGimbalRotationAr
return returnCode;
}
if (aircraftBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2) {
if (aircraftBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
returnCode = DjiTest_GimbalRotate(gimbalRotationArgument.rotationMode, gimbalRotationArgument.rotationProperty,
gimbalRotationArgument.rotationValue);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {

View File

@ -34,6 +34,7 @@
#include "test_payload_cam_emu_base.h"
#include "camera_emu/dji_media_file_manage/dji_media_file_core.h"
#include "dji_high_speed_data_channel.h"
#include "dji_aircraft_info.h"
/* Private constants ---------------------------------------------------------*/
#define FFMPEG_CMD_BUF_SIZE (256 + 256)
@ -134,6 +135,8 @@ static const char *s_frameSizeKeyChar = "size";
static T_DjiMediaFileHandle s_mediaFileThumbNailHandle;
static T_DjiMediaFileHandle s_mediaFileScreenNailHandle;
static const uint8_t s_frameAudInfo[VIDEO_FRAME_AUD_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10};
static char s_mediaFileDirPath[DJI_FILE_PATH_SIZE_MAX] = {0};
static bool s_isMediaFileDirPathConfigured = false;
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void)
@ -142,6 +145,12 @@ T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void)
T_DjiReturnCode returnCode;
const T_DjiDataChannelBandwidthProportionOfHighspeedChannel bandwidthProportionOfHighspeedChannel =
{10, 60, 30};
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo = {0};
if (DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft information error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
s_psdkCameraMedia.GetMediaFileDir = GetMediaFileDir;
s_psdkCameraMedia.GetMediaFileOriginInfo = DjiTest_CameraMediaGetFileInfo;
@ -177,10 +186,12 @@ T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void)
UtilBuffer_Init(&s_mediaPlayCommandBufferHandler, s_mediaPlayCommandBuffer, sizeof(s_mediaPlayCommandBuffer));
returnCode = DjiPayloadCamera_RegMediaDownloadPlaybackHandler(&s_psdkCameraMedia);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk camera media function init error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK) {
returnCode = DjiPayloadCamera_RegMediaDownloadPlaybackHandler(&s_psdkCameraMedia);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk camera media function init error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
}
returnCode = DjiHighSpeedDataChannel_SetBandwidthProportion(bandwidthProportionOfHighspeedChannel);
@ -189,21 +200,27 @@ T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
if (DjiPlatform_GetSocketHandler() != NULL) {
if (DjiPlatform_GetHalNetworkHandler() != NULL || DjiPlatform_GetHalUsbBulkHandler() != NULL) {
returnCode = osalHandler->TaskCreate("user_camera_media_task", UserCameraMedia_SendVideoTask, 2048,
NULL, &s_userSendVideoThread);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("user send video task create error.");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
} else {
USER_LOG_WARN(
"Socket handler is null. Probably because socket handler is not be registered. Camera media sample may not be running.");
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_CameraEmuSetMediaFilePath(const char *path)
{
memset(s_mediaFileDirPath, 0, sizeof(s_mediaFileDirPath));
memcpy(s_mediaFileDirPath, path, USER_UTIL_MIN(strlen(path), sizeof(s_mediaFileDirPath) - 1));
s_isMediaFileDirPathConfigured = true;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_CameraMediaGetFileInfo(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo)
{
T_DjiReturnCode returnCode;
@ -1167,7 +1184,11 @@ static void *UserCameraMedia_SendVideoTask(void *arg)
USER_LOG_ERROR("Get file current path error, stat = 0x%08llX", returnCode);
exit(1);
}
snprintf(tempPath, DJI_FILE_PATH_SIZE_MAX, "%smedia_file/PSDK_0005.h264", curFileDirPath);
if (s_isMediaFileDirPathConfigured == true) {
snprintf(tempPath, DJI_FILE_PATH_SIZE_MAX, "%sPSDK_0005.h264", s_mediaFileDirPath);
} else {
snprintf(tempPath, DJI_FILE_PATH_SIZE_MAX, "%smedia_file/PSDK_0005.h264", curFileDirPath);
}
videoFilePath = osalHandler->Malloc(DJI_FILE_PATH_SIZE_MAX);
if (videoFilePath == NULL) {

View File

@ -41,6 +41,7 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode DjiTest_CameraEmuMediaStartService(void);
T_DjiReturnCode DjiTest_CameraEmuSetMediaFilePath(const char *path);
T_DjiReturnCode DjiTest_CameraMediaGetFileInfo(const char *filePath, T_DjiCameraMediaFileInfo *fileInfo);
#ifdef __cplusplus

View File

@ -29,7 +29,7 @@
#include "dji_camera_manager.h"
#include "dji_platform.h"
#include "dji_logger.h"
#include "dji_liveview.h"
/* Private constants ---------------------------------------------------------*/
#define TEST_CAMERA_MANAGER_MEDIA_FILE_NAME_MAX_SIZE 256
#define TEST_CAMERA_MANAGER_MEDIA_DOWNLOAD_FILE_NUM 5
@ -45,15 +45,17 @@ static const T_DjiTestCameraTypeStr s_cameraTypeStrList[] = {
{DJI_CAMERA_TYPE_UNKNOWN, "Unknown"},
{DJI_CAMERA_TYPE_Z30, "Zenmuse Z30"},
{DJI_CAMERA_TYPE_XT2, "Zenmuse XT2"},
{DJI_CAMERA_TYPE_PSDK, "Zenmuse Payload"},
{DJI_CAMERA_TYPE_PSDK, "Payload Camera"},
{DJI_CAMERA_TYPE_XTS, "Zenmuse XTS"},
{DJI_CAMERA_TYPE_H20, "Zenmuse H20"},
{DJI_CAMERA_TYPE_H20T, "Zenmuse H20T"},
{DJI_CAMERA_TYPE_P1, "Zenmuse P1"},
{DJI_CAMERA_TYPE_L1, "Zenmuse L1"},
{DJI_CAMERA_TYPE_M30, "Zenmuse M30"},
{DJI_CAMERA_TYPE_M30T, "Zenmuse M30T"},
{DJI_CAMERA_TYPE_H20N, "Zenmuse H20N"},
{DJI_CAMERA_TYPE_M30, "M30 Camera"},
{DJI_CAMERA_TYPE_M30T, "M30T Camera"},
{DJI_CAMERA_TYPE_M3E, "M3E Camera"},
{DJI_CAMERA_TYPE_M3T, "M3T Camera"},
};
static FILE *s_downloadMediaFile = NULL;
@ -661,6 +663,8 @@ T_DjiReturnCode DjiTest_CameraManagerStartShootIntervalPhoto(E_DjiMountPosition
return returnCode;
}
osalHandler->TaskSleepMs(1000);
/*!< set shoot-photo mode */
USER_LOG_INFO("Set mounted position %d camera's shoot photo mode as interval-photo mode", position);
returnCode = DjiCameraManager_SetShootPhotoMode(position, DJI_CAMERA_MANAGER_SHOOT_PHOTO_MODE_INTERVAL);
@ -825,37 +829,13 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
firmwareVersion.firmware_version[0], firmwareVersion.firmware_version[1],
firmwareVersion.firmware_version[2], firmwareVersion.firmware_version[3]);
E_DjiLiveViewCameraSource liveViewCameraSource;
if (cameraType == DJI_CAMERA_TYPE_H20 || cameraType == DJI_CAMERA_TYPE_H20T) {
USER_LOG_INFO("--> Step 3: Change camera's live view source");
DjiTest_WidgetLogAppend("--> Step 3: Change camera's live view source");
USER_LOG_INFO("Init live view.");
returnCode = DjiLiveview_Init();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init live view failed, error code: 0x%08X\r\n", returnCode);
goto exitLiveViewModule;
}
USER_LOG_INFO("Set mounted position %d camera's live view source to zoom.\r\n",
mountPosition);
liveViewCameraSource = (cameraType == DJI_CAMERA_TYPE_H20) ? DJI_LIVEVIEW_CAMERA_SOURCE_H20_ZOOM :
DJI_LIVEVIEW_CAMERA_SOURCE_H20T_ZOOM;
returnCode = DjiLiveview_StartH264Stream((uint8_t) mountPosition, liveViewCameraSource, NULL);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's live view source failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
}
}
switch (cameraManagerSampleSelect) {
case E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_SHUTTER_SPEED: {
USER_LOG_INFO("--> Function a: Set camera shutter speed to 1/100 s");
DjiTest_WidgetLogAppend("--> Function a: Set camera shutter speed to 1/100 s");
if (cameraType == DJI_CAMERA_TYPE_H20 || cameraType == DJI_CAMERA_TYPE_H20T ||
cameraType == DJI_CAMERA_TYPE_M30 || cameraType == DJI_CAMERA_TYPE_M30T) {
cameraType == DJI_CAMERA_TYPE_M30 || cameraType == DJI_CAMERA_TYPE_M30T ||
cameraType == DJI_CAMERA_TYPE_M3E || cameraType == DJI_CAMERA_TYPE_M3T) {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to manual mode.",
mountPosition);
returnCode = DjiTest_CameraManagerSetExposureMode(mountPosition,
@ -863,7 +843,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
} else {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to shutter priority mode.",
@ -873,7 +853,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
}
@ -884,7 +864,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's shutter speed failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -892,7 +872,8 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
USER_LOG_INFO("--> Function b: Set camera aperture to 400(F/4)");
DjiTest_WidgetLogAppend("--> Function b: Set camera aperture to 400(F/4)");
if (cameraType == DJI_CAMERA_TYPE_H20 || cameraType == DJI_CAMERA_TYPE_H20T
|| cameraType == DJI_CAMERA_TYPE_M30 || cameraType == DJI_CAMERA_TYPE_M30T) {
|| cameraType == DJI_CAMERA_TYPE_M30 || cameraType == DJI_CAMERA_TYPE_M30T
|| cameraType == DJI_CAMERA_TYPE_M3E || cameraType == DJI_CAMERA_TYPE_M3T) {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to manual mode.",
mountPosition);
returnCode = DjiTest_CameraManagerSetExposureMode(mountPosition,
@ -900,7 +881,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
} else {
USER_LOG_INFO("Set mounted position %d camera's exposure mode to aperture priority mode.",
@ -910,7 +891,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
}
@ -920,7 +901,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's aperture failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -934,7 +915,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Set mounted position %d camera's ev value to +0.3ev.",
@ -943,7 +924,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's EV failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -957,7 +938,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's exposure mode failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Set mounted position %d camera's ISO value to 1600.",
@ -966,7 +947,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's iso failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -979,7 +960,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's focus point(0.8,0.8) failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -993,7 +974,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's tap zoom point(5, 0.3m,0.3m) failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 5s...");
@ -1005,7 +986,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's tap zoom point(4, 0.8m,0.7m) failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1017,7 +998,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's optical zoom factor 10x failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 4s...");
osalHandler->TaskSleepMs(4000);
@ -1026,7 +1007,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Set mounted position %d camera's optical zoom factor -5x failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 4s...");
osalHandler->TaskSleepMs(4000);
@ -1040,7 +1021,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera start continuous zoom failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 8s...");
@ -1051,7 +1032,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera stop continuous zoom failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1062,7 +1043,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera shoot single photo failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1073,7 +1054,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera shoot AEB photo failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1085,7 +1066,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera shoot burst photo failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1100,7 +1081,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera shoot internal photo failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 15s...");
@ -1110,7 +1091,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera stop shoot photo failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1121,7 +1102,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera start record video failed, error code: 0x%08X\r\n",
mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
USER_LOG_INFO("Sleep 10s...");
@ -1131,7 +1112,7 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Mounted position %d camera stop record video failed, error code: 0x%08X\r\n",
mountPosition, returnCode);
goto exitLiveViewSource;
goto exitCameraModule;
}
break;
}
@ -1148,23 +1129,6 @@ T_DjiReturnCode DjiTest_CameraManagerRunSample(E_DjiMountPosition mountPosition,
}
}
exitLiveViewSource:
if (cameraType == DJI_CAMERA_TYPE_H20 || cameraType == DJI_CAMERA_TYPE_H20T) {
returnCode = DjiLiveview_StopH264Stream((uint8_t) mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Stop mounted position %d camera's live view failed,"
"error code: 0x%08X\r\n", mountPosition, returnCode);
}
}
exitLiveViewModule:
if (cameraType == DJI_CAMERA_TYPE_H20 || cameraType == DJI_CAMERA_TYPE_H20T) {
returnCode = DjiLiveview_Deinit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Deinit live view failed, error code: 0x%08X\r\n", returnCode);
}
}
exitCameraModule:
returnCode = DjiCameraManager_DeInit();
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {

View File

@ -32,7 +32,7 @@
/* Private constants ---------------------------------------------------------*/
#define FC_SUBSCRIPTION_TASK_FREQ (1)
#define FC_SUBSCRIPTION_TASK_STACK_SIZE (2048)
#define FC_SUBSCRIPTION_TASK_STACK_SIZE (1024)
/* Private types -------------------------------------------------------------*/
@ -45,6 +45,7 @@ static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uin
static T_DjiTaskHandle s_userFcSubscriptionThread;
static bool s_userFcSubscriptionDataShow = false;
static uint8_t s_totalSatelliteNumberUsed = 0;
static uint32_t s_userFcSubscriptionDataCnt = 0;
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode DjiTest_FcSubscriptionStartService(void)
@ -59,7 +60,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ,
DjiTest_FcSubscriptionReceiveQuaternionCallback);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic quaternion error.");
@ -115,6 +116,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
T_DjiFcSubscriptionSingleBatteryInfo singleBatteryInfo = {0};
USER_LOG_INFO("Fc subscription sample start");
s_userFcSubscriptionDataShow = true;
USER_LOG_INFO("--> Step 1: Init fc subscription module");
djiStat = DjiFcSubscription_Init();
@ -124,7 +126,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
}
USER_LOG_INFO("--> Step 2: Subscribe the topics of quaternion, velocity and gps position");
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_10_HZ,
djiStat = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ,
DjiTest_FcSubscriptionReceiveQuaternionCallback);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Subscribe topic quaternion error.");
@ -145,9 +147,9 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
USER_LOG_INFO("--> Step 3: Get latest value of the subscribed topics in the next 20s\r\n");
USER_LOG_INFO("--> Step 3: Get latest value of the subscribed topics in the next 20 seconds\r\n");
for (int i = 0; i < 10; ++i) {
for (int i = 0; i < 20; ++i) {
osalHandler->TaskSleepMs(1000 / FC_SUBSCRIPTION_TASK_FREQ);
djiStat = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY,
(uint8_t *) &velocity,
@ -210,6 +212,7 @@ T_DjiReturnCode DjiTest_FcSubscriptionRunSample(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
s_userFcSubscriptionDataShow = false;
USER_LOG_INFO("Fc subscription sample end");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@ -308,20 +311,23 @@ static T_DjiReturnCode DjiTest_FcSubscriptionReceiveQuaternionCallback(const uin
USER_UTIL_UNUSED(dataSize);
pitch = (dji_f64_t) asinf(-2 * quaternion->q1 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q2) * 57.3;
roll = (dji_f64_t) atan2f(2 * quaternion->q1 * quaternion->q2 + 2 * quaternion->q0 * quaternion->q3,
-2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) *
57.3;
yaw = (dji_f64_t) atan2f(2 * quaternion->q2 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q1,
roll = (dji_f64_t) atan2f(2 * quaternion->q2 * quaternion->q3 + 2 * quaternion->q0 * quaternion->q1,
-2 * quaternion->q1 * quaternion->q1 - 2 * quaternion->q2 * quaternion->q2 + 1) * 57.3;
yaw = (dji_f64_t) atan2f(2 * quaternion->q1 * quaternion->q2 + 2 * quaternion->q0 * quaternion->q3,
-2 * quaternion->q2 * quaternion->q2 - 2 * quaternion->q3 * quaternion->q3 + 1) *
57.3;
if (s_userFcSubscriptionDataShow == true) {
USER_LOG_INFO("receive quaternion data.");
if (s_userFcSubscriptionDataCnt++ % DJI_DATA_SUBSCRIPTION_TOPIC_50_HZ == 0) {
USER_LOG_INFO("receive quaternion data.");
USER_LOG_INFO("timestamp: millisecond %u microsecond %u.", timestamp->millisecond,
timestamp->microsecond);
USER_LOG_INFO("quaternion: %f %f %f %f.", quaternion->q0, quaternion->q1, quaternion->q2,
quaternion->q3);
USER_LOG_INFO("timestamp: millisecond %u microsecond %u.", timestamp->millisecond,
timestamp->microsecond);
USER_LOG_INFO("quaternion: %f %f %f %f.\r\n", quaternion->q0, quaternion->q1, quaternion->q2, quaternion->q3);
USER_LOG_INFO("euler angles: pitch = %.2f roll = %.2f yaw = %.2f.", pitch, yaw, roll);
DjiTest_WidgetLogAppend("pitch = %.2f roll = %.2f yaw = %.2f.", pitch, yaw, roll);
USER_LOG_INFO("euler angles: pitch = %.2f roll = %.2f yaw = %.2f.\r\n", pitch, roll, yaw);
DjiTest_WidgetLogAppend("pitch = %.2f roll = %.2f yaw = %.2f.", pitch, roll, yaw);
}
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;

View File

@ -702,24 +702,32 @@ void DjiTest_FlightControlSetGetParamSample()
/*! Turn on horizontal radar avoid enable */
USER_LOG_INFO("--> Step 3: Turn on horizontal radar obstacle avoidance");
DjiTest_WidgetLogAppend("--> Step 3: Turn on horizontal radar obstacle avoidance");
returnCode = DjiFlightController_SetHorizontalRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
};
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) {
returnCode = DjiFlightController_SetHorizontalRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
};
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 4: Get horizontal radar obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 4: Get horizontal radar obstacle avoidance status\r\n");
returnCode = DjiFlightController_GetHorizontalRadarObstacleAvoidanceEnableStatus(
&horizontalRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) {
returnCode = DjiFlightController_GetHorizontalRadarObstacleAvoidanceEnableStatus(
&horizontalRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get horizontal radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current horizontal radar obstacle avoidance status is %d\r\n",
horizontalRadarObstacleAvoidanceStatus);
}
USER_LOG_INFO("Current horizontal radar obstacle avoidance status is %d\r\n",
horizontalRadarObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Turn on upwards vision avoid enable */
@ -747,23 +755,32 @@ void DjiTest_FlightControlSetGetParamSample()
/*! Turn on upwards radar avoid enable */
USER_LOG_INFO("--> Step 7: Turn on upwards radar obstacle avoidance.");
DjiTest_WidgetLogAppend("--> Step 7: Turn on upwards radar obstacle avoidance.");
returnCode = DjiFlightController_SetUpwardsRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) {
returnCode = DjiFlightController_SetUpwardsRadarObstacleAvoidanceEnableStatus(
DJI_FLIGHT_CONTROLLER_ENABLE_OBSTACLE_AVOIDANCE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Turn on upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
}
s_osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("--> Step 8: Get upwards radar obstacle avoidance status\r\n");
DjiTest_WidgetLogAppend("--> Step 8: Get upwards radar obstacle avoidance status\r\n");
returnCode = DjiFlightController_GetUpwardsRadarObstacleAvoidanceEnableStatus(&upwardsRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30 ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M30T) {
returnCode = DjiFlightController_GetUpwardsRadarObstacleAvoidanceEnableStatus(
&upwardsRadarObstacleAvoidanceStatus);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get upwards radar obstacle avoidance failed, error code: 0x%08X", returnCode);
goto out;
}
USER_LOG_INFO("Current upwards radar obstacle avoidance status is %d\r\n", upwardsRadarObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("Current upwards radar obstacle avoidance status is %d\r\n", upwardsRadarObstacleAvoidanceStatus);
s_osalHandler->TaskSleepMs(1000);
/*! Turn on downwards vision avoid enable */
USER_LOG_INFO("--> Step 9: Turn on downwards visual obstacle avoidance.");
@ -1237,11 +1254,11 @@ bool DjiTest_FlightControlGoHomeAndConfirmLanding(void)
return false;
}
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING)) {
if (!DjiTest_FlightControlCheckActionStarted(DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING)) {
return false;
} else {
while (DjiTest_FlightControlGetValueOfFlightStatus() == DJI_FC_SUBSCRIPTION_FLIGHT_STATUS_IN_AIR &&
DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_AUTO_LANDING) {
DjiTest_FlightControlGetValueOfDisplayMode() == DJI_FC_SUBSCRIPTION_DISPLAY_MODE_FORCE_AUTO_LANDING) {
s_osalHandler->TaskSleepMs(1000);
}
}
@ -1468,9 +1485,9 @@ DjiTest_FlightControlJoystickCtrlAuthSwitchEventCallback(T_DjiFlightControllerJo
}
case DJI_FLIGHT_CONTROLLER_OSDK_GET_JOYSTICK_CTRL_AUTH_EVENT: {
if (eventData.curJoystickCtrlAuthority == DJI_FLIGHT_CONTROLLER_JOYSTICK_CTRL_AUTHORITY_OSDK) {
USER_LOG_INFO("[Event]Osdk request to obtain joystick ctrl authority\r\n");
USER_LOG_INFO("[Event] Request to obtain joystick ctrl authority\r\n");
} else {
USER_LOG_INFO("[Event]Osdk request to release joystick ctrl authority\r\n");
USER_LOG_INFO("[Event] Request to release joystick ctrl authority\r\n");
}
break;
}
@ -1496,7 +1513,7 @@ DjiTest_FlightControlJoystickCtrlAuthSwitchEventCallback(T_DjiFlightControllerJo
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc for low battery land\r\n");
break;
case DJI_FLIGHT_CONTROLLER_OSDK_LOST_GET_JOYSTICK_CTRL_AUTH_EVENT:
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to osdk lost\r\n");
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to sdk lost\r\n");
break;
case DJI_FLIGHT_CONTROLLER_NERA_FLIGHT_BOUNDARY_RESET_JOYSTICK_CTRL_AUTH_EVENT :
USER_LOG_INFO("[Event]Current joystick ctrl authority is reset to rc due to near boundary\r\n");

View File

@ -33,8 +33,37 @@
/* Private constants ---------------------------------------------------------*/
/* Private types -------------------------------------------------------------*/
typedef enum {
DJI_TEST_GIMBAL_ROTATION,
DJI_TEST_GIMBAL_RESET,
} E_DjiTestGimbalAction;
typedef struct {
E_DjiTestGimbalAction action;
T_DjiGimbalManagerRotation rotation;
} T_DjiTestGimbalActionList;
/* Private values -------------------------------------------------------------*/
static const T_DjiTestGimbalActionList s_rotationActionList[] =
{
{.action = DJI_TEST_GIMBAL_RESET},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, -30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, -30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, -30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, -30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, 4, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, -4, 0.2},
{.action = DJI_TEST_GIMBAL_RESET},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, 30, 0, 0, 0.2},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -90, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -60, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_ROTATION, .rotation.rotationMode = DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, -30, 0, 0, 0.5},
{.action = DJI_TEST_GIMBAL_RESET},
};
/* Private functions declaration ---------------------------------------------*/
@ -69,78 +98,42 @@ T_DjiReturnCode DjiTest_GimbalManagerRunSample(E_DjiMountPosition mountPosition,
goto out;
}
USER_LOG_INFO("--> Step 3: Rotate gimbal to target angle in relative angle mode\r\n");
DjiTest_WidgetLogAppend("--> Step 3: Rotate gimbal to target angle in relative angle mode\r\n");
for (int i = 0; i < 3; i++) {
USER_LOG_INFO("Target gimbal pry = (30, 0, 0) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 30, 0, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 30, 0) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 30, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 0, 30) in the body coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_RELATIVE_ANGLE, 0, 0, 30, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal reset.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(2000);
USER_LOG_INFO("--> Step 3: Reset gimbal angles.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
USER_LOG_INFO("--> Step 4: Rotate gimbal to target angle in absolute angle mode\r\n");
DjiTest_WidgetLogAppend("--> Step 4: Rotate gimbal to target angle in absolute angle mode\r\n");
USER_LOG_INFO("--> Step 4: Rotate gimbal to target angle by action list\r\n");
for (int i = 0; i < sizeof(s_rotationActionList) / sizeof(T_DjiTestGimbalActionList); ++i) {
if (s_rotationActionList[i].action == DJI_TEST_GIMBAL_RESET) {
USER_LOG_INFO("Target gimbal reset.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(2000);
} else if (s_rotationActionList[i].action == DJI_TEST_GIMBAL_ROTATION) {
for (int i = 0; i < 3; i++) {
USER_LOG_INFO("Target gimbal pry = (30, 0, 0) in the ground coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, 30, 0, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (30, 0, 0) failed, error code: 0x%08X", returnCode);
if (gimbalMode == DJI_GIMBAL_MODE_FREE &&
s_rotationActionList[i].rotation.rotationMode == DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE) {
continue;
}
USER_LOG_INFO("Target gimbal pry = (%.1f, %.1f, %.1f)",
s_rotationActionList[i].rotation.pitch, s_rotationActionList[i].rotation.roll,
s_rotationActionList[i].rotation.yaw);
rotation = s_rotationActionList[i].rotation;
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (%.1f, %.1f, %.1f) failed, error code: 0x%08X",
s_rotationActionList[i].rotation.pitch, s_rotationActionList[i].rotation.roll,
s_rotationActionList[i].rotation.yaw,
returnCode);
}
osalHandler->TaskSleepMs(1000);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 30, 0) in the ground coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, 0, 30, 0, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 30, 0) failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal pry = (0, 0, 30) in the ground coordinate system");
rotation = (T_DjiGimbalManagerRotation) {DJI_GIMBAL_ROTATION_MODE_ABSOLUTE_ANGLE, 0, 0, 30, 0.5};
returnCode = DjiGimbalManager_Rotate(mountPosition, rotation);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Target gimbal pry = (0, 0, 30) failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(1000);
USER_LOG_INFO("Target gimbal reset.\r\n");
returnCode = DjiGimbalManager_Reset(mountPosition);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Reset gimbal failed, error code: 0x%08X", returnCode);
}
osalHandler->TaskSleepMs(2000);
}
USER_LOG_INFO("--> Step 5: Deinit gimbal manager module");

View File

@ -29,6 +29,7 @@
#include "dji_liveview.h"
#include "dji_logger.h"
#include "dji_platform.h"
#include "dji_aircraft_info.h"
#include "time.h"
/* Private constants ---------------------------------------------------------*/
@ -54,10 +55,17 @@ T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
T_DjiOsalHandler *osalHandler = DjiPlatform_GetOsalHandler();
time_t currentTime = time(NULL);
struct tm *localTime = NULL;
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo = {0};
USER_LOG_INFO("Liveview sample start");
DjiTest_WidgetLogAppend("Liveview sample start");
returnCode = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft base info error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
USER_LOG_INFO("--> Step 1: Init liveview module");
DjiTest_WidgetLogAppend("--> Step 1: Init liveview module");
returnCode = DjiLiveview_Init();
@ -66,23 +74,29 @@ T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
goto out;
}
localTime = localtime(&currentTime);
sprintf(s_fpvCameraStreamFilePath, "fpv_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
USER_LOG_INFO("--> Step 2: Start h264 stream of the fpv and selected payload\r\n");
DjiTest_WidgetLogAppend("--> Step 2: Start h264 stream of the fpv and selected payload\r\n");
returnCode = DjiLiveview_StartH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV, DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT,
DjiTest_FpvCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3E) {
//TODO: how to use on M3E
} else if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3T) {
//TODO: how to use on M3T
} else {
localTime = localtime(&currentTime);
sprintf(s_fpvCameraStreamFilePath, "fpv_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
returnCode = DjiLiveview_StartH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV, DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT,
DjiTest_FpvCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
}
}
localTime = localtime(&currentTime);
sprintf(s_payloadCameraStreamFilePath, "payload%d_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
sprintf(s_payloadCameraStreamFilePath, "payload%d_vis_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
mountPosition, localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
@ -100,13 +114,20 @@ T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
USER_LOG_INFO("--> Step 3: Stop h264 stream of the fpv and selected payload\r\n");
DjiTest_WidgetLogAppend("--> Step 3: Stop h264 stream of the fpv and selected payload");
returnCode = DjiLiveview_StopH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3E) {
//TODO: how to use on M3E
} else if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3T) {
//TODO: how to use on M3T
} else {
returnCode = DjiLiveview_StopH264Stream(DJI_LIVEVIEW_CAMERA_POSITION_FPV, DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of fpv failed, error code: 0x%08X", returnCode);
goto out;
}
}
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition);
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
goto out;
@ -115,6 +136,37 @@ T_DjiReturnCode DjiTest_LiveviewRunSample(E_DjiMountPosition mountPosition)
USER_LOG_INFO("Fpv stream is saved to file: %s", s_fpvCameraStreamFilePath);
USER_LOG_INFO("Payload%d stream is saved to file: %s\r\n", mountPosition, s_payloadCameraStreamFilePath);
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3T) {
USER_LOG_INFO("--> Start h264 stream of the fpv and selected payload\r\n");
localTime = localtime(&currentTime);
sprintf(s_payloadCameraStreamFilePath, "payload%d_ir_stream_%04d%02d%02d_%02d-%02d-%02d.h264",
mountPosition, localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday,
localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
returnCode = DjiLiveview_StartH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_M3T_IR,
DjiTest_PayloadCameraStreamCallback);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
}
for (int i = 0; i < TEST_LIVEVIEW_STREAM_STROING_TIME_IN_SECONDS; ++i) {
USER_LOG_INFO("Storing camera h264 stream, second: %d.", i + 1);
osalHandler->TaskSleepMs(1000);
}
returnCode = DjiLiveview_StopH264Stream((E_DjiLiveViewCameraPosition) mountPosition,
DJI_LIVEVIEW_CAMERA_SOURCE_DEFAULT);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Request to stop h264 of payload %d failed, error code: 0x%08X", mountPosition, returnCode);
goto out;
}
}
USER_LOG_INFO("Fpv stream is saved to file: %s", s_fpvCameraStreamFilePath);
USER_LOG_INFO("Payload%d stream is saved to file: %s\r\n", mountPosition, s_payloadCameraStreamFilePath);
USER_LOG_INFO("--> Step 4: Deinit liveview module");
DjiTest_WidgetLogAppend("--> Step 4: Deinit liveview module");
returnCode = DjiLiveview_Deinit();

View File

@ -34,7 +34,7 @@
/* Private constants ---------------------------------------------------------*/
#define POSITIONING_TASK_FREQ (1)
#define POSITIONING_TASK_STACK_SIZE (2048)
#define POSITIONING_TASK_STACK_SIZE (1024)
#define DJI_TEST_POSITIONING_EVENT_COUNT (2)
#define DJI_TEST_TIME_INTERVAL_AMONG_EVENTS_US (200000)

View File

@ -33,7 +33,7 @@
/* Private constants ---------------------------------------------------------*/
#define DJI_TEST_TIME_SYNC_TASK_FREQ (1)
#define DJI_TEST_TIME_SYNC_TASK_STACK_SIZE (2048)
#define DJI_TEST_TIME_SYNC_TASK_STACK_SIZE (1024)
/* Private types -------------------------------------------------------------*/
@ -160,9 +160,9 @@ static void *DjiTest_TimeSyncTask(void *arg)
continue;
}
USER_LOG_DEBUG("current aircraft time is %d.%d.%d %d:%d %d %d.", aircraftTime.year, aircraftTime.month,
aircraftTime.day, aircraftTime.hour, aircraftTime.minute, aircraftTime.second,
aircraftTime.microsecond);
USER_LOG_DEBUG("current aircraft time is %04d-%02d-%02d %02d:%02d:%02d %d.",
aircraftTime.year, aircraftTime.month, aircraftTime.day,
aircraftTime.hour, aircraftTime.minute, aircraftTime.second, aircraftTime.microsecond);
}
}

View File

@ -452,12 +452,13 @@ static T_DjiReturnCode DjiTest_WaypointV2UploadMission(uint16_t missionNum)
missionInitSettings.actionList = actionList;
returnCode = DjiWaypointV2_UploadMission(&missionInitSettings);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Init waypoint V2 mission setting failed, ErrorCode:0x%lX", returnCode);
return returnCode;
goto out;
}
out:
osalHandler->Free(actionList.actions);
return returnCode;
}

View File

@ -36,6 +36,7 @@
/* Private types -------------------------------------------------------------*/
/* Private values -------------------------------------------------------------*/
static T_DjiWaypointV3MissionState s_lastWaypointV3MissionState = {0};
/* Private functions declaration ---------------------------------------------*/
static T_DjiReturnCode DjiTest_WaypointV3StateCallback(T_DjiWaypointV3MissionState missionState);
@ -73,7 +74,7 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void)
}
/*! Attention: suggest use the exported kmz file by DJI pilot. If use this test file, you need set the longitude as
* 113.94755, latitude as 22.51853 on DJI Assistant 2 simulator */
* 113.94255, latitude as 22.57765 on DJI Assistant 2 simulator */
snprintf(tempPath, DJI_TEST_WAYPOINT_V3_KMZ_FILE_PATH_LEN_MAX, "%s/waypoint_file/waypoint_v3_test_file.kmz",
curFileDirPath);
@ -124,38 +125,26 @@ T_DjiReturnCode DjiTest_WaypointV3RunSample(void)
goto out;
}
for (int i = 0; i < 30; ++i) {
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("Execute pause action");
returnCode = DjiWaypointV3_Action(DJI_WAYPOINT_V3_ACTION_PAUSE);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Execute start action failed.");
goto out;
}
for (int i = 0; i < 5; ++i) {
osalHandler->TaskSleepMs(1000);
}
USER_LOG_INFO("Execute resume action");
returnCode = DjiWaypointV3_Action(DJI_WAYPOINT_V3_ACTION_RESUME);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Execute start action failed.");
goto out;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
out:
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
/* Private functions definition-----------------------------------------------*/
static T_DjiReturnCode DjiTest_WaypointV3StateCallback(T_DjiWaypointV3MissionState missionState)
{
if (s_lastWaypointV3MissionState.state == missionState.state
&& s_lastWaypointV3MissionState.currentWaypointIndex == missionState.currentWaypointIndex
&& s_lastWaypointV3MissionState.wayLineId == missionState.wayLineId) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
USER_LOG_INFO("Waypoint v3 mission state: %d, current waypoint index: %d, wayLine id: %d", missionState.state,
missionState.currentWaypointIndex, missionState.wayLineId);
memcpy(&s_lastWaypointV3MissionState, &missionState, sizeof(T_DjiWaypointV3MissionState));
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -6,240 +6,209 @@
/* Contents of file waypoint_v3_test_file.kmz */
#define waypoint_v3_test_file_kmz_fileName "waypoint_v3_test_file.kmz"
#define waypoint_v3_test_file_kmz_fileSize 3690
#define waypoint_v3_test_file_kmz_fileSize 3186
static const uint8_t waypoint_v3_test_file_kmz_fileBinaryArray[3690] = {
0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA8,
0x54, 0x6C, 0xA8, 0x06, 0x00, 0x00, 0xD9, 0x59, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x77, 0x70,
static const uint8_t waypoint_v3_test_file_kmz_fileBinaryArray[3186] = {
0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x08, 0x08, 0x08, 0x00, 0x22, 0x6D, 0x34, 0x55, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x77, 0x70,
0x6D, 0x7A, 0x2F, 0x74, 0x65, 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x2E, 0x6B, 0x6D, 0x6C, 0xED,
0x9C, 0x6D, 0x6F, 0xDB, 0x36, 0x10, 0xC7, 0xDF, 0xF7, 0x53, 0x04, 0x79, 0xDD, 0xC5, 0xBC, 0x23,
0x8F, 0x0F, 0x85, 0xEB, 0xA2, 0xE8, 0x33, 0xB0, 0xA1, 0xC1, 0x9C, 0x2D, 0xAF, 0x55, 0x5B, 0x49,
0xB4, 0xCA, 0x92, 0x61, 0xCB, 0x75, 0xB3, 0x4F, 0xBF, 0x93, 0x2D, 0xD9, 0x92, 0xAD, 0xB4, 0x03,
0x38, 0x0C, 0x20, 0xC0, 0xA2, 0x40, 0x6B, 0x1D, 0x8F, 0xA2, 0xC8, 0x1F, 0x8F, 0xC7, 0xBF, 0x1E,
0xC6, 0xAF, 0xBE, 0x2F, 0xF2, 0x8B, 0x6F, 0xE9, 0x6A, 0x9D, 0x95, 0xC5, 0xCB, 0x4B, 0xB8, 0x12,
0x97, 0x17, 0x69, 0x31, 0x2B, 0xE7, 0x59, 0x71, 0xFF, 0xF2, 0xF2, 0x8F, 0x9B, 0xF7, 0xBF, 0xD8,
0xCB, 0x57, 0x93, 0x67, 0xE3, 0xAF, 0x5C, 0x8A, 0x4B, 0x16, 0xEB, 0x97, 0x97, 0x0F, 0x55, 0xB5,
0x7C, 0x31, 0x1A, 0x6D, 0xB7, 0xDB, 0xAB, 0x72, 0x99, 0x16, 0xF7, 0xD9, 0xFA, 0xAA, 0x48, 0xAB,
0x11, 0x97, 0x18, 0xE1, 0x15, 0x5E, 0xEE, 0x8B, 0xBD, 0xD8, 0x2E, 0x17, 0x79, 0xAF, 0xEC, 0xFC,
0xAF, 0xEC, 0x6A, 0x56, 0x2E, 0x46, 0x6C, 0xF8, 0x7B, 0xC4, 0xE7, 0xE1, 0x33, 0x4D, 0x9E, 0x5D,
0x5C, 0x8C, 0xDF, 0x96, 0xB3, 0xCD, 0x22, 0x2D, 0xAA, 0xFA, 0x07, 0xFF, 0xAC, 0xFD, 0x5E, 0xCC,
0x56, 0x69, 0x52, 0xA5, 0x37, 0xD9, 0x22, 0x9D, 0x80, 0x56, 0x46, 0xA2, 0xB1, 0x92, 0xA4, 0xC3,
0xF1, 0xE8, 0xD4, 0xDC, 0x71, 0xDA, 0x2C, 0xE7, 0x27, 0x4E, 0xCE, 0x19, 0x00, 0xD3, 0x38, 0x75,
0xCC, 0x1D, 0xA7, 0x45, 0xB6, 0xAE, 0xAF, 0xFC, 0x4D, 0x59, 0xDC, 0x65, 0xF7, 0x7B, 0x43, 0x6B,
0xBA, 0xCB, 0x1F, 0x6F, 0xCA, 0xDB, 0xE4, 0x31, 0xCF, 0x8A, 0xF4, 0xB7, 0x72, 0x9E, 0x4E, 0xD6,
0xC9, 0x5D, 0x9A, 0x3F, 0x36, 0xD5, 0x9D, 0x59, 0xFB, 0xBE, 0x59, 0x91, 0xAD, 0x1F, 0x5E, 0xCF,
0x2A, 0xAE, 0x7B, 0x72, 0x5F, 0x7E, 0x2C, 0x17, 0x69, 0xEB, 0xD7, 0xB5, 0xF4, 0x7C, 0xD2, 0xEF,
0x59, 0xF5, 0xB9, 0xF8, 0xFD, 0xCD, 0xAF, 0xE5, 0xBA, 0x62, 0x1F, 0x6E, 0x52, 0x95, 0x15, 0x9B,
0xD6, 0xAF, 0x67, 0xED, 0xF9, 0x55, 0xC9, 0xD7, 0xF4, 0xF3, 0xDD, 0xDD, 0x34, 0x9D, 0x6D, 0x56,
0x59, 0xF5, 0xF8, 0x31, 0xCD, 0xEE, 0x1F, 0xAA, 0x09, 0x8A, 0xC6, 0x71, 0xD8, 0xDC, 0xAB, 0xE1,
0x3E, 0x2F, 0xBF, 0x24, 0xF9, 0xCD, 0x2A, 0x29, 0xD6, 0x59, 0xDD, 0xAE, 0x24, 0x9F, 0x2E, 0xD3,
0x74, 0x3E, 0xA1, 0xA6, 0x8A, 0xA7, 0xEC, 0xBD, 0x4A, 0xE6, 0xAB, 0xB2, 0x48, 0x3F, 0x15, 0x77,
0x65, 0x7B, 0xB8, 0x67, 0x78, 0x57, 0x6C, 0x16, 0x7F, 0x26, 0xF9, 0x26, 0x9D, 0xE8, 0x76, 0x40,
0x4E, 0x8E, 0x0F, 0x79, 0x4D, 0x37, 0x5F, 0x8E, 0x05, 0x44, 0xD7, 0xAF, 0x67, 0x69, 0xDB, 0x31,
0x1A, 0x6E, 0xC8, 0xBE, 0xC2, 0x25, 0x8F, 0x55, 0x99, 0xCC, 0x87, 0x5A, 0xD8, 0x98, 0x8E, 0x15,
0x52, 0x4B, 0xDA, 0x99, 0x65, 0xD8, 0x73, 0xB0, 0x9D, 0x43, 0xB6, 0x61, 0xF7, 0xEB, 0x72, 0xDF,
0xAF, 0x9F, 0x8A, 0x79, 0xFA, 0xFD, 0xD4, 0xBF, 0x6F, 0xEC, 0x5F, 0xEA, 0xD9, 0x35, 0x35, 0xC7,
0x07, 0xA8, 0x1E, 0xBF, 0x2F, 0xF3, 0x79, 0xBA, 0x3A, 0x41, 0x27, 0x5D, 0x2C, 0xF3, 0x7A, 0x56,
0x3C, 0x2E, 0xD3, 0xC9, 0x36, 0x79, 0x5C, 0x96, 0x59, 0x51, 0xB5, 0xDC, 0x74, 0x6D, 0x3D, 0xAF,
0xCD, 0x3A, 0xFD, 0xF0, 0x04, 0x11, 0x6D, 0xDB, 0x7F, 0x50, 0x64, 0xB0, 0x01, 0x9F, 0x8E, 0xAE,
0x9D, 0x43, 0xBD, 0xA2, 0xDB, 0xFD, 0x5C, 0x7B, 0x53, 0x96, 0x2B, 0x0E, 0x4E, 0x5C, 0x60, 0xFA,
0xB8, 0xBE, 0x4E, 0x56, 0xC9, 0xE2, 0xB4, 0x53, 0x67, 0x87, 0x12, 0xBB, 0x79, 0x79, 0xFB, 0x61,
0x6A, 0x55, 0x1B, 0x38, 0xFA, 0xA6, 0x13, 0xC7, 0x87, 0xDD, 0xD4, 0xD8, 0x59, 0x56, 0x29, 0x37,
0x21, 0xFB, 0x96, 0xDE, 0x94, 0xD3, 0x2A, 0x59, 0x55, 0xD7, 0x9D, 0x7E, 0xE9, 0x94, 0x3A, 0xF1,
0xDF, 0x4F, 0x93, 0x66, 0x82, 0x81, 0x10, 0xBD, 0xD9, 0xD3, 0x9F, 0x77, 0x07, 0x00, 0x9A, 0xC1,
0xE5, 0x68, 0xBB, 0xEB, 0xE7, 0x0F, 0xD7, 0xD3, 0x76, 0x68, 0x4F, 0x2C, 0xFD, 0x81, 0xFF, 0x69,
0x67, 0xEC, 0xAB, 0x4F, 0x36, 0x55, 0xF9, 0x3E, 0xAF, 0x4F, 0xDC, 0x9F, 0xD0, 0xA7, 0xC7, 0xFB,
0x63, 0xF2, 0x64, 0x1C, 0x38, 0xB7, 0xF4, 0x1C, 0x67, 0x49, 0x9E, 0xED, 0x6B, 0x7D, 0x57, 0x24,
0x5F, 0xF2, 0xE3, 0x4C, 0x38, 0x33, 0xF4, 0xA3, 0x4F, 0xB6, 0xE0, 0xFE, 0xB9, 0xCE, 0xAA, 0xD9,
0xC3, 0xAE, 0x57, 0x17, 0x49, 0xB1, 0x49, 0xF2, 0xB6, 0xF3, 0x4E, 0x8C, 0x03, 0x71, 0xEB, 0xB6,
0xE1, 0xF6, 0x63, 0x9A, 0xD4, 0xAB, 0xD6, 0x20, 0x13, 0xDB, 0x7E, 0x99, 0x5D, 0x55, 0x77, 0x65,
0x9E, 0x97, 0xDB, 0x26, 0x84, 0x1F, 0xFB, 0xF5, 0xAC, 0xDC, 0x8F, 0xAB, 0x7A, 0x5D, 0xDC, 0x77,
0xAE, 0x74, 0xD0, 0xF8, 0x44, 0x05, 0x0C, 0xD5, 0x8E, 0xAB, 0x09, 0x2F, 0x85, 0xBB, 0x3F, 0xCF,
0xCF, 0xFE, 0x73, 0x52, 0xEB, 0xC1, 0xE3, 0x5F, 0x34, 0xE9, 0x64, 0x08, 0x7E, 0x50, 0xA4, 0x4F,
0xD6, 0xCF, 0xFB, 0x74, 0xA8, 0xEF, 0x6F, 0x36, 0xAB, 0x62, 0xD7, 0x59, 0x55, 0xB9, 0x6B, 0xE1,
0xEB, 0x62, 0x3E, 0xAD, 0xCA, 0xE5, 0x6D, 0x56, 0x3D, 0xBC, 0xCD, 0xD6, 0xB3, 0xFD, 0x52, 0xC6,
0xAB, 0xCF, 0x9B, 0xCD, 0xEA, 0x5B, 0x52, 0x6D, 0x56, 0xE9, 0xE0, 0xD9, 0x0E, 0xB5, 0xB4, 0x67,
0xBA, 0xCE, 0x93, 0x59, 0xBA, 0x48, 0x56, 0x5F, 0x3B, 0x57, 0x7C, 0xD2, 0x03, 0x7C, 0xE4, 0x38,
0xAB, 0xD7, 0xDD, 0xE3, 0x17, 0x17, 0x00, 0xF2, 0xCA, 0x29, 0x90, 0x46, 0x81, 0xD5, 0x1A, 0xF5,
0x73, 0xC4, 0x2B, 0x42, 0x54, 0xCA, 0x29, 0x6B, 0x8D, 0x00, 0xEC, 0xD6, 0x32, 0x1A, 0xAC, 0x66,
0x3C, 0x1A, 0xEC, 0xF1, 0xAC, 0x17, 0xA9, 0xB3, 0x6E, 0x68, 0x3E, 0x2C, 0xE7, 0x79, 0x9E, 0x2D,
0xD7, 0x65, 0x36, 0x3F, 0x0B, 0x08, 0xA7, 0x96, 0xC1, 0x30, 0xD4, 0x29, 0xFF, 0x30, 0x58, 0xEC,
0x10, 0x62, 0xDB, 0xFA, 0x4F, 0x43, 0xEF, 0x70, 0xED, 0x07, 0xF3, 0x7E, 0x02, 0x9F, 0x79, 0xF5,
0xE6, 0xF5, 0xC0, 0xB9, 0x3A, 0x3C, 0x0C, 0x9C, 0xF1, 0xE9, 0x19, 0x78, 0x5C, 0x11, 0x78, 0x90,
0x9F, 0xF0, 0x3F, 0x9A, 0x0E, 0x4C, 0x9E, 0x11, 0xF0, 0xDF, 0x30, 0x81, 0x46, 0x0B, 0xC9, 0x19,
0xA2, 0x86, 0x86, 0x09, 0xD4, 0x52, 0x29, 0x44, 0x00, 0xE5, 0xC9, 0x04, 0x44, 0x26, 0x02, 0x65,
0x42, 0x82, 0x94, 0xD6, 0x2A, 0xED, 0x1A, 0x26, 0x24, 0x87, 0x0C, 0x92, 0xC6, 0x28, 0x65, 0x3D,
0x99, 0xC0, 0xC8, 0x44, 0xA0, 0x4C, 0x30, 0x05, 0xC2, 0x39, 0x74, 0xBA, 0x45, 0x82, 0x17, 0x12,
0x25, 0x94, 0x06, 0xE9, 0x89, 0x84, 0x8C, 0x48, 0x04, 0x8A, 0x84, 0xB6, 0x12, 0x09, 0x08, 0x45,
0x1B, 0x26, 0xA4, 0x26, 0xA1, 0x0C, 0xF1, 0x3F, 0x9E, 0x4C, 0xA8, 0xC8, 0x44, 0xA0, 0x4C, 0x18,
0x63, 0x90, 0x88, 0xB4, 0x38, 0xA4, 0x13, 0x0A, 0x1C, 0x2A, 0x23, 0x94, 0x6F, 0x8A, 0x49, 0x91,
0x89, 0x40, 0x99, 0xB0, 0x92, 0xFF, 0xD6, 0x4B, 0x87, 0xDA, 0x33, 0x21, 0xAC, 0x34, 0x20, 0x34,
0x0A, 0xF4, 0x4D, 0x27, 0x74, 0x64, 0x22, 0x50, 0x26, 0x8C, 0x71, 0x8E, 0x04, 0x49, 0xB1, 0xCF,
0x27, 0xC0, 0x91, 0xE2, 0xEC, 0x42, 0xF0, 0xA2, 0xE2, 0x1B, 0x27, 0x4C, 0x64, 0x22, 0x50, 0x26,
0xB4, 0x93, 0xCE, 0x5A, 0x4D, 0x68, 0x1B, 0x26, 0x94, 0x20, 0xB2, 0x28, 0xB4, 0x31, 0x9E, 0x4C,
0xD8, 0xC8, 0x44, 0xA8, 0x4C, 0x48, 0xDE, 0x67, 0x80, 0x33, 0x16, 0xF7, 0x4C, 0x58, 0x63, 0x49,
0x08, 0x29, 0xBC, 0xB7, 0x1D, 0x2E, 0x22, 0x11, 0x28, 0x12, 0xBC, 0xC3, 0xB0, 0x1C, 0x16, 0x24,
0x35, 0x4B, 0x87, 0x75, 0xC6, 0x09, 0x34, 0x02, 0x49, 0xFB, 0x2A, 0x56, 0x51, 0xC6, 0x0C, 0x15,
0x0A, 0xDE, 0x7B, 0x3A, 0x4B, 0xC8, 0xC9, 0xE6, 0x61, 0xED, 0x10, 0xC4, 0x4B, 0x09, 0x08, 0xDF,
0x40, 0x01, 0x51, 0xC7, 0x0C, 0x15, 0x0A, 0x8E, 0x11, 0x52, 0x2A, 0xA7, 0x9D, 0x6A, 0xA0, 0x70,
0x56, 0x0B, 0xAD, 0x35, 0x87, 0x0A, 0x5F, 0x28, 0xA2, 0x90, 0x19, 0x2A, 0x14, 0xC2, 0xDA, 0xFA,
0x6E, 0x87, 0x46, 0x38, 0xEC, 0x46, 0xA5, 0xA9, 0xB9, 0x00, 0xDF, 0x2C, 0x13, 0xA2, 0x94, 0x19,
0x2A, 0x14, 0x00, 0x9C, 0x63, 0x6A, 0xAB, 0x1A, 0x75, 0x1B, 0xB4, 0x96, 0x4C, 0x05, 0x48, 0xEF,
0x7B, 0x60, 0x51, 0xC9, 0x0C, 0x16, 0x09, 0x4B, 0x52, 0x5B, 0x61, 0x4C, 0xCB, 0x84, 0x33, 0x1C,
0x34, 0x38, 0xC3, 0x40, 0x6F, 0x28, 0xA2, 0x94, 0x19, 0x2A, 0x14, 0x12, 0xB5, 0x71, 0xA8, 0xAD,
0x74, 0x0D, 0x14, 0x46, 0x0A, 0x67, 0x0D, 0x90, 0xF1, 0xDE, 0x7B, 0x44, 0x2D, 0x33, 0x54, 0x28,
0x98, 0x0A, 0x09, 0xBC, 0x7A, 0x68, 0xD9, 0x46, 0x0A, 0x72, 0x68, 0x2C, 0x6A, 0xE1, 0x9D, 0x66,
0x46, 0x31, 0x33, 0x54, 0x28, 0x78, 0xF3, 0xC9, 0x04, 0x10, 0xB4, 0x48, 0xF0, 0xA6, 0x83, 0x8F,
0x09, 0xE1, 0x2B, 0x6F, 0x43, 0xD4, 0x32, 0x43, 0x45, 0x42, 0xD7, 0xB7, 0x38, 0x08, 0x8C, 0x69,
0x16, 0x0F, 0xE1, 0x48, 0xA3, 0x55, 0x40, 0xCE, 0x5B, 0xA3, 0x88, 0x6A, 0x66, 0xA8, 0x50, 0x90,
0x03, 0x52, 0x0C, 0x06, 0xB5, 0x50, 0x68, 0x24, 0x12, 0x4E, 0xF0, 0x86, 0xD4, 0x13, 0x0A, 0x8C,
0x6A, 0x66, 0xB0, 0x50, 0xA0, 0xB0, 0xAA, 0x4E, 0x2A, 0x5A, 0x28, 0x48, 0x09, 0xE4, 0xCD, 0x07,
0x38, 0xEF, 0x07, 0xF0, 0xA2, 0x9A, 0x19, 0x2A, 0x14, 0x4A, 0x73, 0x06, 0x41, 0x12, 0xC0, 0x1E,
0x84, 0x2B, 0x01, 0xC2, 0x48, 0x8E, 0x1D, 0xBE, 0x50, 0x44, 0x35, 0x33, 0x58, 0x28, 0x04, 0x20,
0x49, 0x85, 0xBA, 0x55, 0x29, 0x24, 0x3A, 0x49, 0x44, 0xCE, 0x80, 0x2F, 0x14, 0x51, 0xCD, 0x0C,
0x15, 0x0A, 0x94, 0x4E, 0x59, 0xA1, 0x00, 0xB1, 0x4D, 0x34, 0xB5, 0x95, 0xF5, 0xD3, 0x15, 0xDE,
0x81, 0x22, 0xCA, 0x99, 0xA1, 0x32, 0xC1, 0xE3, 0x4F, 0x9C, 0x51, 0x48, 0x6A, 0x90, 0x10, 0xC6,
0x10, 0xF1, 0x4F, 0xEF, 0xBB, 0x1E, 0x18, 0xD5, 0xCC, 0x50, 0x99, 0x50, 0x16, 0xD1, 0x82, 0x40,
0x69, 0x9A, 0xFB, 0xA3, 0x46, 0x2B, 0x09, 0x4A, 0xF1, 0x0E, 0xC4, 0x17, 0x8A, 0xA8, 0x66, 0x86,
0x0A, 0x85, 0x06, 0x94, 0xBB, 0xFD, 0x46, 0x0B, 0x85, 0x45, 0xCE, 0x32, 0x19, 0x13, 0xE9, 0x2B,
0x5D, 0x61, 0x54, 0x33, 0x43, 0x85, 0xC2, 0x08, 0xD2, 0x52, 0xE2, 0x31, 0xA3, 0x00, 0xB2, 0xCC,
0x88, 0xE5, 0x5D, 0xA9, 0x2F, 0x14, 0x51, 0xCF, 0x0C, 0x16, 0x0A, 0x5E, 0x2B, 0x0C, 0x10, 0xE8,
0xCE, 0x93, 0x14, 0xA0, 0x88, 0x37, 0xA8, 0xCE, 0x17, 0x8A, 0xA8, 0x67, 0x86, 0x0A, 0x05, 0x6F,
0x33, 0xAC, 0x12, 0xCA, 0x91, 0x6D, 0x1F, 0xA5, 0x20, 0xCE, 0x34, 0xAD, 0x22, 0xE1, 0x0B, 0x85,
0x8C, 0x7A, 0x66, 0xB0, 0x50, 0x28, 0x30, 0xF5, 0x77, 0x88, 0xDA, 0xE5, 0x03, 0xA9, 0xFE, 0xA6,
0x83, 0x33, 0xDE, 0xCF, 0xD7, 0xC8, 0x28, 0x67, 0x86, 0xCA, 0x04, 0x49, 0x47, 0x86, 0x14, 0xA8,
0xE6, 0xAE, 0x39, 0x1A, 0x63, 0xA0, 0xBE, 0x4B, 0x8A, 0xDE, 0x81, 0x22, 0xCA, 0x99, 0xA1, 0x42,
0xA1, 0xEA, 0x77, 0xCA, 0x9D, 0x70, 0x6D, 0x9C, 0x70, 0x00, 0xA8, 0x0D, 0xFA, 0xEF, 0x3D, 0x64,
0x54, 0x33, 0x43, 0x65, 0x42, 0x5A, 0x0D, 0x00, 0xC6, 0x08, 0x73, 0x08, 0x14, 0x0A, 0x04, 0x39,
0xAD, 0x7C, 0xA5, 0x2B, 0x19, 0xE5, 0xCC, 0x60, 0xA1, 0xC0, 0xFA, 0xE5, 0x0E, 0xB0, 0xCD, 0xFB,
0x1E, 0x58, 0x7F, 0x9D, 0x82, 0x40, 0x1A, 0xEB, 0x7D, 0x87, 0x54, 0x46, 0x3D, 0x33, 0x58, 0x28,
0xA4, 0x10, 0x48, 0x8E, 0xB3, 0x8A, 0xE6, 0xCD, 0x30, 0x5D, 0xBF, 0x52, 0x2C, 0x34, 0x79, 0x7F,
0xDF, 0x4A, 0x46, 0x3D, 0x33, 0x54, 0x28, 0xC0, 0x70, 0x3E, 0x61, 0xE1, 0xF0, 0xA6, 0xB9, 0x15,
0x86, 0x78, 0x3F, 0x22, 0xB4, 0xF2, 0xFE, 0x72, 0x4D, 0xD4, 0x33, 0x43, 0x85, 0x02, 0x95, 0x76,
0x64, 0x25, 0x6F, 0x42, 0xF6, 0xCB, 0x87, 0x62, 0x4C, 0x84, 0x04, 0xE5, 0xB4, 0x77, 0x4E, 0x11,
0xF5, 0xCC, 0xFF, 0x1B, 0x8A, 0xF1, 0xE8, 0xF8, 0x45, 0xD7, 0xF1, 0xE8, 0xF8, 0x15, 0xE5, 0x71,
0xFD, 0x25, 0xE6, 0xC9, 0xB3, 0x7F, 0x00, 0x50, 0x4B, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0xD8, 0x8E, 0x16, 0xCE, 0x06, 0x00, 0x00, 0xD6, 0x99, 0x00,
0x00, 0x12, 0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77, 0x61, 0x79, 0x6C, 0x69, 0x6E,
0x65, 0x73, 0x2E, 0x77, 0x70, 0x6D, 0x6C, 0xED, 0x9D, 0xDF, 0x6F, 0xDB, 0x36, 0x10, 0xC7, 0xDF,
0xFB, 0x57, 0x04, 0x79, 0xEE, 0xEC, 0xBB, 0x23, 0x8F, 0x3F, 0x0A, 0xD7, 0x45, 0xD1, 0x34, 0x68,
0x81, 0x0E, 0x0D, 0x96, 0x6C, 0x7D, 0x56, 0x6D, 0x25, 0xD1, 0x22, 0x4B, 0x86, 0x2C, 0x37, 0xED,
0xFE, 0xFA, 0x51, 0xB6, 0xE4, 0x58, 0x8E, 0xB3, 0x16, 0xE0, 0xA0, 0xBC, 0x5C, 0x50, 0x24, 0x15,
0xC9, 0x23, 0x29, 0x8A, 0x1F, 0x1F, 0x49, 0x7D, 0x49, 0x4F, 0xDE, 0x7C, 0x5F, 0xE4, 0x27, 0xDF,
0xD2, 0x6A, 0x95, 0x95, 0xC5, 0xEB, 0x53, 0x1C, 0xC1, 0xE9, 0x49, 0x5A, 0xCC, 0xCA, 0x79, 0x56,
0xDC, 0xBC, 0x3E, 0xFD, 0xF3, 0xEA, 0xFC, 0x37, 0x77, 0xFA, 0x66, 0xFA, 0x62, 0x72, 0x17, 0x52,
0x85, 0x94, 0xC5, 0xEA, 0xF5, 0xE9, 0x6D, 0x5D, 0x2F, 0x5F, 0x8D, 0xC7, 0xF7, 0xF7, 0xF7, 0xA3,
0x72, 0x99, 0x16, 0x37, 0xD9, 0x6A, 0x54, 0xA4, 0xF5, 0x38, 0xA4, 0x18, 0xD3, 0x88, 0x4E, 0xB7,
0xC9, 0x5E, 0xDD, 0x2F, 0x17, 0x79, 0x2F, 0xED, 0xFC, 0xEF, 0x6C, 0x34, 0x2B, 0x17, 0xE3, 0x10,
0xF1, 0xCF, 0x38, 0x94, 0x13, 0x4A, 0x9A, 0xBE, 0x38, 0x39, 0x99, 0x9C, 0x95, 0xB3, 0xF5, 0x22,
0x2D, 0xEA, 0xE6, 0x22, 0x5C, 0x36, 0x76, 0xAF, 0x16, 0xD9, 0xAA, 0xA9, 0xCF, 0xBB, 0xB2, 0xB8,
0xCE, 0x6E, 0xB6, 0x11, 0x5D, 0xD4, 0x75, 0xFE, 0xE3, 0xAA, 0xFC, 0x92, 0xFC, 0xC8, 0xB3, 0x22,
0xFD, 0xBD, 0x9C, 0xA7, 0xD3, 0x55, 0x72, 0x9D, 0xE6, 0x3F, 0x26, 0xE3, 0xE3, 0xB1, 0x7D, 0xDB,
0xAC, 0xC8, 0x56, 0xB7, 0x6F, 0x67, 0x75, 0xC8, 0x7B, 0x7A, 0x53, 0x7E, 0x28, 0x17, 0x69, 0x67,
0xB7, 0x1F, 0xD3, 0xB3, 0x49, 0xBF, 0x67, 0xF5, 0xE7, 0xE2, 0x8F, 0x77, 0x9F, 0xCA, 0x55, 0x1D,
0x6C, 0x42, 0x95, 0xEA, 0xAC, 0x58, 0x77, 0x76, 0xBD, 0xD8, 0x9E, 0x5D, 0x9D, 0xDC, 0xA5, 0x9F,
0xAF, 0xAF, 0x2F, 0xD3, 0xD9, 0xBA, 0xCA, 0xEA, 0x1F, 0x1F, 0xD2, 0xEC, 0xE6, 0xB6, 0x9E, 0x12,
0xB4, 0x86, 0xC7, 0xA3, 0x7B, 0x39, 0xDC, 0xE4, 0xE5, 0xD7, 0x24, 0xBF, 0xAA, 0x92, 0x62, 0x95,
0x35, 0xF5, 0x4A, 0xF2, 0xCB, 0x65, 0x9A, 0xCE, 0xA7, 0xDC, 0x66, 0xF1, 0x54, 0x7C, 0x2F, 0x93,
0x79, 0x55, 0x16, 0xE9, 0xC7, 0xE2, 0xBA, 0xEC, 0x82, 0x7B, 0x11, 0xEF, 0x8B, 0xF5, 0xE2, 0xAF,
0x24, 0x5F, 0xA7, 0x53, 0x63, 0xDB, 0x5C, 0x0F, 0xC2, 0x8F, 0x59, 0x5D, 0xAE, 0xBF, 0x3E, 0x24,
0x80, 0x7D, 0xBB, 0x5E, 0x4C, 0x57, 0x8F, 0xF1, 0xF1, 0x8A, 0x6C, 0x33, 0x5C, 0x86, 0x67, 0x55,
0x26, 0xF3, 0x63, 0x35, 0x6C, 0xA3, 0x1E, 0x32, 0x64, 0x6A, 0xF3, 0x7A, 0x14, 0x73, 0xDC, 0xF2,
0x68, 0x3D, 0x8F, 0xC5, 0x1D, 0x37, 0xBF, 0x28, 0xB7, 0xED, 0xFA, 0xB1, 0x98, 0xA7, 0xDF, 0x0F,
0xED, 0xFB, 0x91, 0xFD, 0x5B, 0x7D, 0x74, 0x4F, 0x6D, 0xF8, 0x91, 0x5E, 0x3D, 0x39, 0x2F, 0xF3,
0x79, 0x5A, 0x1D, 0x74, 0x9D, 0x74, 0xB1, 0xCC, 0x93, 0x3A, 0xFD, 0x38, 0xDF, 0x95, 0xBA, 0x17,
0x74, 0xD0, 0x3B, 0x43, 0x07, 0xAA, 0xD3, 0x6D, 0xF7, 0xD9, 0x74, 0xF8, 0x2A, 0x0D, 0xE9, 0xB2,
0x6F, 0xE9, 0x55, 0x79, 0x59, 0x27, 0x55, 0x7D, 0x51, 0x66, 0x45, 0xBD, 0xEB, 0xAC, 0x87, 0x89,
0x7B, 0x79, 0xDD, 0x6F, 0xB1, 0xD9, 0x2B, 0xF5, 0x21, 0xA4, 0xDF, 0xA7, 0xB2, 0x55, 0x9D, 0x14,
0xB3, 0xF0, 0x40, 0xD8, 0xE9, 0x91, 0xB7, 0x40, 0xA8, 0x9D, 0x56, 0xB6, 0xEB, 0x98, 0xBB, 0xF8,
0xBE, 0xD5, 0xBA, 0x4A, 0x36, 0x78, 0x21, 0x38, 0x35, 0x72, 0x04, 0xC6, 0x3A, 0x8B, 0xE0, 0x75,
0x67, 0xD5, 0xC5, 0xF7, 0xAC, 0x92, 0x75, 0x5D, 0x9E, 0xE7, 0x4D, 0x85, 0xFB, 0x9D, 0xFF, 0x30,
0xBC, 0x33, 0xBA, 0xC8, 0x93, 0x59, 0xBA, 0x48, 0xAA, 0xBB, 0xBD, 0x87, 0xBA, 0x69, 0x83, 0x87,
0xEB, 0x10, 0x32, 0x2B, 0xCB, 0x2A, 0x7C, 0xC2, 0x85, 0x06, 0x5D, 0xED, 0x87, 0x9F, 0x9C, 0x20,
0xAA, 0x91, 0xD7, 0xA8, 0xAC, 0x46, 0x67, 0x0C, 0x99, 0x97, 0x44, 0x23, 0x26, 0xD2, 0xDA, 0x6B,
0xE7, 0x2C, 0x20, 0xED, 0xE7, 0x32, 0x3E, 0x9A, 0xCD, 0x64, 0x7C, 0x50, 0xDE, 0xF6, 0x46, 0xB2,
0x5E, 0x2F, 0xCA, 0xF6, 0xBB, 0xCD, 0xD1, 0x87, 0x19, 0x9A, 0x09, 0x8E, 0x3D, 0xB7, 0x43, 0xA3,
0xF0, 0x8C, 0x96, 0x4D, 0x79, 0xFD, 0xE6, 0xE9, 0x87, 0x3E, 0x61, 0xF2, 0x21, 0x4D, 0x9A, 0x8F,
0xF9, 0x8B, 0xA4, 0x4A, 0x16, 0xBD, 0xE6, 0x39, 0x96, 0x6A, 0xD3, 0x5F, 0xAE, 0xCB, 0x3C, 0x2F,
0xEF, 0xDB, 0xCF, 0xD7, 0x83, 0xA2, 0xF6, 0xD3, 0xFD, 0x2C, 0xB3, 0xB7, 0xC5, 0x4D, 0x9E, 0xEE,
0x77, 0xB3, 0xC7, 0x91, 0x4F, 0x66, 0x11, 0x5A, 0x77, 0xDB, 0xC0, 0xC1, 0x83, 0x6C, 0x7E, 0x5E,
0x3E, 0xFA, 0xCF, 0x41, 0xBE, 0x3B, 0x8B, 0x5F, 0xAA, 0xD6, 0xFB, 0x22, 0xF9, 0xFA, 0x93, 0xCA,
0xB5, 0x49, 0xF6, 0x1E, 0xF9, 0x2F, 0xB4, 0x6B, 0xBF, 0xC4, 0xAB, 0x75, 0x55, 0xFC, 0xA4, 0xE1,
0x9B, 0x24, 0x9B, 0xD6, 0xAC, 0xCB, 0x4D, 0xF5, 0xDF, 0x16, 0xF3, 0xCB, 0xBA, 0x5C, 0x7E, 0xC9,
0xEA, 0xDB, 0xB3, 0x6C, 0x35, 0xDB, 0x3A, 0xA2, 0xE0, 0x3B, 0xDE, 0xAD, 0xAB, 0x6F, 0x49, 0xBD,
0xAE, 0x0E, 0x1F, 0xC8, 0xCE, 0xFE, 0x3F, 0x4B, 0x38, 0x4B, 0x16, 0xCB, 0x50, 0xD9, 0x90, 0x63,
0xFD, 0xE8, 0x9E, 0x0F, 0xE3, 0x9F, 0xBA, 0xE1, 0x23, 0x37, 0xB3, 0x2D, 0x68, 0xBD, 0x4A, 0x2F,
0xEB, 0x2A, 0x69, 0xFA, 0xED, 0xA7, 0xD0, 0x63, 0xA6, 0xD8, 0x1A, 0x1E, 0x86, 0xEF, 0x3E, 0x3F,
0x1F, 0xE1, 0xFB, 0xFF, 0x00, 0x4D, 0xD6, 0x80, 0x52, 0xE1, 0x37, 0xB6, 0x40, 0x93, 0x51, 0x5A,
0x13, 0x21, 0xEA, 0x48, 0xA0, 0x51, 0x80, 0x16, 0xA0, 0x05, 0xE8, 0xA1, 0x81, 0x56, 0xA8, 0x94,
0x73, 0xDA, 0xF8, 0x16, 0x68, 0x15, 0x9C, 0x35, 0x2B, 0x6B, 0xB5, 0x76, 0x91, 0x40, 0x93, 0x00,
0x2D, 0x40, 0x0B, 0xD0, 0x43, 0x03, 0x1D, 0x10, 0x06, 0xEF, 0xC9, 0x9B, 0x8E, 0xE7, 0x30, 0xFE,
0xD6, 0xA0, 0x0D, 0xAA, 0x48, 0x9E, 0x95, 0xF0, 0x2C, 0x3C, 0x0B, 0xCF, 0x43, 0xF3, 0x6C, 0x9C,
0x22, 0x46, 0x26, 0xE8, 0x1C, 0xB4, 0x32, 0x0C, 0xDA, 0x72, 0xF8, 0x13, 0x09, 0xB4, 0x16, 0xA0,
0x05, 0x68, 0x01, 0x7A, 0x68, 0xA0, 0xAD, 0xB5, 0xC4, 0xCC, 0x06, 0x76, 0x53, 0x68, 0x8D, 0x9E,
0xB4, 0x05, 0x1D, 0xBB, 0x26, 0xC6, 0x02, 0xB4, 0x00, 0x2D, 0x40, 0x0F, 0x0D, 0xB4, 0x53, 0xE1,
0x5F, 0x33, 0xE2, 0xD6, 0x5B, 0xA0, 0xC1, 0x29, 0x8B, 0x60, 0x08, 0x28, 0x76, 0x0A, 0x6D, 0x04,
0x68, 0x01, 0x5A, 0x80, 0x1E, 0xDE, 0x43, 0x7B, 0xCF, 0xC0, 0x0A, 0xB6, 0x73, 0x68, 0xF4, 0xAC,
0xC3, 0x8C, 0x1A, 0xC2, 0x58, 0x3C, 0xD6, 0x43, 0x5B, 0x01, 0x5A, 0x80, 0x16, 0xA0, 0x07, 0x9F,
0x43, 0x7B, 0xE5, 0x9D, 0x33, 0x4C, 0xAE, 0x05, 0x5A, 0x03, 0xF3, 0xE6, 0xC5, 0xB9, 0x8D, 0x04,
0xDA, 0x09, 0xD0, 0x02, 0xB4, 0x00, 0x3D, 0x38, 0xD0, 0x0A, 0x9D, 0x41, 0x6F, 0x1D, 0x6D, 0x81,
0x76, 0xD6, 0x31, 0x80, 0x82, 0xE8, 0x45, 0x6E, 0x2F, 0x3C, 0x0B, 0xCF, 0xC2, 0xF3, 0xD0, 0x3C,
0x6B, 0xCB, 0x2E, 0x38, 0x64, 0xC5, 0xED, 0x88, 0xDB, 0x79, 0xEB, 0x81, 0x2C, 0x10, 0x9B, 0x48,
0xA0, 0x51, 0x84, 0x62, 0x42, 0xB4, 0x10, 0x3D, 0xBC, 0xAE, 0x44, 0x19, 0xEF, 0x98, 0xBC, 0x7E,
0x18, 0x72, 0x03, 0x87, 0x11, 0x38, 0x42, 0xAC, 0x8B, 0x46, 0x51, 0x8A, 0x09, 0xD1, 0x42, 0xF4,
0xF0, 0xD2, 0x4F, 0xC5, 0x4A, 0x69, 0x6F, 0xBC, 0x6E, 0x89, 0xF6, 0xCE, 0x80, 0x31, 0x26, 0x38,
0xE9, 0x58, 0xA2, 0x45, 0x2A, 0x26, 0x44, 0x0B, 0xD1, 0x83, 0x13, 0x0D, 0xCE, 0x35, 0x4A, 0x6E,
0x43, 0xB8, 0x7B, 0x71, 0xA5, 0x6C, 0x03, 0x35, 0xC6, 0x2E, 0x8B, 0xA1, 0x88, 0xC5, 0x84, 0x68,
0x21, 0x7A, 0x70, 0xA2, 0x11, 0xD1, 0x5B, 0xE3, 0x74, 0x2B, 0xFE, 0x44, 0x63, 0x54, 0x40, 0x1A,
0x55, 0xF4, 0xE6, 0x0C, 0xD1, 0x8A, 0x09, 0xCF, 0xC2, 0xF3, 0xF0, 0x3C, 0x3B, 0x56, 0xC6, 0x81,
0xB5, 0x1D, 0xD0, 0xDE, 0x06, 0x77, 0x1D, 0x66, 0xD5, 0x14, 0x4D, 0xB4, 0x88, 0xC5, 0x84, 0x68,
0x21, 0x7A, 0xF8, 0x75, 0x31, 0x32, 0xD6, 0x93, 0x71, 0xCA, 0xB7, 0x44, 0x5B, 0x05, 0xDE, 0x59,
0x64, 0x1B, 0xBD, 0xD2, 0x2D, 0x6A, 0x31, 0x21, 0x5A, 0x88, 0x1E, 0xFE, 0xDD, 0x95, 0x22, 0x85,
0x61, 0xD0, 0x6D, 0x54, 0xE7, 0xA3, 0xD9, 0x93, 0x75, 0x64, 0x20, 0x7A, 0x5D, 0x4C, 0xE4, 0x62,
0x42, 0xB4, 0x10, 0x3D, 0xFC, 0x16, 0x4A, 0xC3, 0x01, 0x5F, 0xC6, 0x8E, 0x67, 0x03, 0x14, 0xC2,
0x00, 0x62, 0xD5, 0x9F, 0x28, 0x6A, 0x31, 0xE1, 0x59, 0x78, 0x1E, 0x5E, 0x2D, 0xD6, 0xC8, 0xB7,
0x19, 0xAD, 0x6D, 0xC7, 0xDC, 0xE0, 0xD9, 0x90, 0xD3, 0xC8, 0x3E, 0xFA, 0x5D, 0xB4, 0xE8, 0xC5,
0x84, 0x68, 0x21, 0x7A, 0x78, 0x0F, 0xED, 0x91, 0x75, 0xA0, 0x9A, 0x3B, 0xA2, 0x0D, 0x31, 0x83,
0x07, 0x03, 0xB1, 0xB3, 0xE8, 0xDD, 0xB9, 0x82, 0x42, 0xB4, 0x10, 0x2D, 0x44, 0x0F, 0x78, 0x6C,
0x09, 0x38, 0xDD, 0x4C, 0xA4, 0x3B, 0xA2, 0x59, 0x03, 0x19, 0x0A, 0xA3, 0xEF, 0xE8, 0x73, 0x88,
0x44, 0x2F, 0x26, 0x44, 0x0B, 0xD1, 0xC3, 0xAF, 0x8B, 0x99, 0x30, 0x6B, 0x66, 0x85, 0xE8, 0x76,
0xEA, 0x12, 0x40, 0xB0, 0x2A, 0x78, 0xED, 0x58, 0xA2, 0x45, 0x2F, 0x26, 0x44, 0x0B, 0xD1, 0xC3,
0x13, 0x0D, 0x48, 0xAC, 0x34, 0x99, 0xEE, 0x6D, 0xB4, 0x22, 0xAF, 0x98, 0xD9, 0x5B, 0x8C, 0x25,
0x5A, 0xF4, 0x62, 0x42, 0xB4, 0x10, 0xFD, 0x0C, 0x9A, 0x6E, 0xAF, 0x1D, 0x68, 0x24, 0xEA, 0x56,
0xC6, 0x8C, 0x53, 0xCD, 0x6E, 0xE9, 0x68, 0x17, 0x2D, 0x82, 0x31, 0x01, 0x5A, 0x80, 0x1E, 0x5E,
0x5E, 0x62, 0x3C, 0x87, 0x59, 0xB4, 0xE2, 0x96, 0x67, 0xB0, 0x96, 0x39, 0x5C, 0x46, 0x2B, 0xBA,
0x49, 0xF4, 0x62, 0x02, 0xB4, 0x00, 0x3D, 0xFC, 0x98, 0xDB, 0x11, 0x39, 0x04, 0x52, 0xB6, 0xDD,
0x75, 0x65, 0x8D, 0x56, 0xA8, 0x35, 0x71, 0xB4, 0x8B, 0x16, 0xBD, 0x98, 0x10, 0x2D, 0x44, 0x0F,
0xFF, 0x36, 0x1A, 0x49, 0x6D, 0x56, 0xB7, 0x3B, 0xA2, 0x1D, 0x21, 0xD8, 0xC0, 0xB8, 0x8A, 0xD5,
0x97, 0x90, 0xE8, 0xC5, 0x84, 0x68, 0x21, 0x7A, 0xF8, 0xF3, 0x02, 0x81, 0x8D, 0x52, 0xF4, 0x30,
0x8B, 0x46, 0x76, 0x01, 0x70, 0x07, 0x14, 0xFD, 0x36, 0x5A, 0x14, 0x63, 0x42, 0xB4, 0x10, 0x3D,
0x3C, 0xD1, 0x61, 0x88, 0x6D, 0x91, 0xD1, 0xEC, 0xED, 0x8C, 0x46, 0xCD, 0x88, 0xCE, 0xC7, 0x12,
0x2D, 0x8A, 0x31, 0x21, 0x5A, 0x88, 0x7E, 0x8E, 0x23, 0x40, 0x9D, 0x06, 0xED, 0xD9, 0x75, 0x5B,
0xA3, 0xD9, 0x5A, 0x76, 0x9A, 0x21, 0x96, 0x68, 0x25, 0x8A, 0x31, 0x21, 0x5A, 0x88, 0x7E, 0x06,
0x55, 0x37, 0xDA, 0xE0, 0xA8, 0xA9, 0x1B, 0x75, 0x13, 0x37, 0xDD, 0xC4, 0xDB, 0xE8, 0xC3, 0x0E,
0x94, 0x08, 0xC6, 0x04, 0x68, 0x01, 0x7A, 0x78, 0x09, 0xA8, 0xF2, 0x6C, 0x59, 0xA3, 0x6E, 0x37,
0x52, 0x92, 0xB5, 0x16, 0x9B, 0xBD, 0x57, 0x14, 0xED, 0xA2, 0x45, 0x30, 0x26, 0x44, 0x0B, 0xD1,
0xCF, 0x20, 0x01, 0x6D, 0x86, 0xDC, 0xE0, 0x3B, 0x0F, 0xED, 0x11, 0xC9, 0x58, 0x8A, 0x5F, 0xE9,
0x56, 0xA2, 0x17, 0x13, 0xA0, 0x05, 0xE8, 0xE1, 0xE5, 0x25, 0xCE, 0x20, 0xA2, 0xB5, 0x60, 0x77,
0x2E, 0x5A, 0x23, 0xB0, 0x37, 0x3A, 0x56, 0x5F, 0xA2, 0x44, 0x30, 0x26, 0x44, 0x0B, 0xD1, 0xCF,
0x71, 0x1E, 0x11, 0x13, 0xA2, 0x6B, 0xCF, 0xE9, 0xA6, 0xE6, 0xDB, 0xA3, 0x19, 0x95, 0x75, 0xD1,
0xFB, 0xAE, 0x94, 0x28, 0xC6, 0x84, 0x68, 0x21, 0xFA, 0x19, 0x4E, 0xDE, 0x07, 0x20, 0xF6, 0x61,
0x26, 0xDD, 0x7E, 0x97, 0x86, 0x69, 0xBE, 0xBB, 0x0E, 0x0C, 0x63, 0xF4, 0xA8, 0x5B, 0x14, 0x63,
0x42, 0xB4, 0x10, 0x3D, 0xFC, 0x29, 0xA0, 0x36, 0xCC, 0xA1, 0x1D, 0xEE, 0xBE, 0x8F, 0xD2, 0x81,
0x65, 0x13, 0xC6, 0xDD, 0x46, 0xC7, 0x9E, 0x5F, 0xA2, 0x44, 0x31, 0x26, 0x44, 0x0B, 0xD1, 0xC3,
0xEF, 0xBB, 0xD2, 0xC6, 0xB3, 0x53, 0x9A, 0xDB, 0xA5, 0x6E, 0x1D, 0x18, 0x07, 0x85, 0xDA, 0x9B,
0xE8, 0x79, 0xB4, 0x28, 0xC6, 0x84, 0x68, 0x21, 0xFA, 0x97, 0x89, 0x9E, 0x8C, 0xCF, 0xCB, 0x7C,
0x9E, 0x56, 0xCD, 0xD5, 0x64, 0x7C, 0x56, 0xCE, 0xD6, 0x8B, 0xB4, 0x79, 0x8E, 0x93, 0xF1, 0xDD,
0x22, 0x9F, 0xBE, 0xF8, 0x17, 0x50, 0x4B, 0x01, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xA8, 0x54, 0x6C, 0xA8, 0x06, 0x00, 0x00, 0xD9, 0x59, 0x00,
0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x74, 0x65, 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65,
0x2E, 0x6B, 0x6D, 0x6C, 0x50, 0x4B, 0x01, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0xB3, 0xD8, 0x8E, 0x16, 0xCE, 0x06, 0x00, 0x00, 0xD6, 0x99, 0x00, 0x00,
0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x06,
0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77, 0x61, 0x79, 0x6C, 0x69, 0x6E, 0x65, 0x73, 0x2E,
0x77, 0x70, 0x6D, 0x6C, 0x50, 0x4B, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
0x7F, 0x00, 0x00, 0x00, 0xD5, 0x0D, 0x00, 0x00, 0x00, 0x00
0x5B, 0x4D, 0x8F, 0xDB, 0x36, 0x10, 0xBD, 0xE7, 0x57, 0x08, 0x3E, 0xB5, 0x40, 0x6A, 0x53, 0xDF,
0x52, 0xE0, 0x38, 0xD8, 0x6E, 0x3E, 0x76, 0x91, 0x4D, 0x63, 0xC4, 0x4E, 0xF7, 0x58, 0x30, 0x32,
0x6D, 0xB3, 0x2B, 0x91, 0x86, 0x44, 0xAD, 0xD7, 0x3D, 0x05, 0x28, 0x52, 0xB4, 0x40, 0x4E, 0x2D,
0x8A, 0x1E, 0x8A, 0x1E, 0x52, 0xA0, 0x40, 0x4F, 0xBD, 0x34, 0xC7, 0xB4, 0xFF, 0x66, 0x83, 0xF4,
0x5F, 0x94, 0x92, 0x25, 0x59, 0x94, 0xE8, 0x4D, 0x10, 0x05, 0xD8, 0xAC, 0x6D, 0x9F, 0x2C, 0xCE,
0x7B, 0x43, 0xCD, 0xCC, 0x23, 0x25, 0x0F, 0xE1, 0xEE, 0xAD, 0xB3, 0xC0, 0x57, 0x4E, 0x51, 0x18,
0x61, 0x4A, 0x6E, 0xB6, 0xD4, 0x36, 0x68, 0x29, 0x88, 0x78, 0x74, 0x84, 0xC9, 0xE4, 0x66, 0xEB,
0xF1, 0xF0, 0xEE, 0x67, 0x4E, 0xEB, 0x56, 0xEF, 0x5A, 0xF7, 0x84, 0xA3, 0x38, 0x92, 0x44, 0x37,
0x5B, 0x53, 0xC6, 0x66, 0x37, 0x3A, 0x9D, 0xF9, 0x7C, 0xDE, 0xA6, 0x33, 0x44, 0x26, 0x38, 0x6A,
0x13, 0xC4, 0x3A, 0x1C, 0xD1, 0xD1, 0xDA, 0x5A, 0x6B, 0x09, 0xBB, 0x31, 0x9F, 0x05, 0xBE, 0x80,
0x1D, 0x7D, 0x8D, 0xDB, 0x1E, 0x0D, 0x3A, 0xDC, 0xF0, 0x4D, 0x87, 0xCF, 0xD3, 0x56, 0x5B, 0xBD,
0x6B, 0x8A, 0xD2, 0xBD, 0x4D, 0xBD, 0x38, 0x40, 0x84, 0x25, 0x17, 0xFC, 0x32, 0xE1, 0xDD, 0xF0,
0x42, 0x04, 0x19, 0x1A, 0xE2, 0x00, 0xF5, 0x54, 0xCB, 0xD2, 0x2D, 0x53, 0xD3, 0x55, 0x4B, 0x07,
0x66, 0xB7, 0x53, 0x35, 0x97, 0x48, 0xF1, 0x6C, 0x54, 0x21, 0x19, 0x86, 0x6B, 0x59, 0x76, 0x46,
0x2A, 0x99, 0x4B, 0xA4, 0x00, 0x47, 0x49, 0xE4, 0xFB, 0x94, 0x8C, 0xF1, 0x64, 0x69, 0xC8, 0x4D,
0x63, 0x7F, 0x31, 0xA4, 0xC7, 0x70, 0xE1, 0x63, 0x82, 0x1E, 0xD0, 0x11, 0xEA, 0x45, 0x70, 0x8C,
0xFC, 0x45, 0xE6, 0xAE, 0x66, 0x15, 0xB9, 0x98, 0xE0, 0x68, 0xBA, 0xE7, 0x31, 0xEE, 0xBB, 0x37,
0xA1, 0x07, 0x34, 0x40, 0x39, 0xAF, 0x6C, 0x11, 0x38, 0xE8, 0x0C, 0xB3, 0x87, 0xE4, 0xD1, 0xFE,
0x11, 0x8D, 0x58, 0x0F, 0x9D, 0x21, 0x2F, 0x66, 0x28, 0xF9, 0xBE, 0xC4, 0x66, 0x74, 0x01, 0x54,
0xA1, 0xA7, 0x8C, 0xA5, 0xA9, 0x98, 0xF9, 0x73, 0xE8, 0x9D, 0x14, 0xD4, 0x3A, 0x40, 0xF0, 0xC0,
0xE0, 0x09, 0x7A, 0x38, 0x1E, 0x0F, 0x38, 0x2C, 0xC4, 0x6C, 0x71, 0x80, 0xF0, 0x64, 0xCA, 0x7A,
0x1A, 0xC8, 0xF8, 0x72, 0xB3, 0xE0, 0x61, 0xE2, 0xD3, 0x27, 0xD0, 0x1F, 0x86, 0x90, 0x44, 0x38,
0xF1, 0x0F, 0xFD, 0xC1, 0x0C, 0xA1, 0x51, 0x2F, 0x2F, 0xDC, 0x3A, 0xBB, 0xE0, 0x64, 0x14, 0x52,
0x82, 0x0E, 0xC9, 0x98, 0xE6, 0xC3, 0x82, 0xE1, 0x0E, 0x89, 0x83, 0x2F, 0xA1, 0x1F, 0xA3, 0x9E,
0x9D, 0x57, 0xB6, 0x32, 0x2E, 0x63, 0x0D, 0xE2, 0x27, 0x2B, 0x00, 0x28, 0xF3, 0x04, 0x4B, 0x7E,
0x1F, 0x1D, 0xF9, 0x8D, 0x2C, 0x1D, 0xCE, 0x78, 0xD1, 0x29, 0x1C, 0xC9, 0xEE, 0x30, 0x33, 0xAD,
0x1C, 0x5A, 0x56, 0xE6, 0xAB, 0x66, 0x91, 0x33, 0xA5, 0xF7, 0x29, 0xB3, 0xC9, 0xE9, 0x7D, 0xBA,
0xCC, 0xEB, 0x21, 0x19, 0xA1, 0xB3, 0x2A, 0x5F, 0x34, 0x8A, 0xA1, 0x4A, 0x62, 0x7A, 0x8F, 0x60,
0x4D, 0x53, 0x37, 0x2E, 0x31, 0x5E, 0xED, 0x1D, 0xE2, 0x2D, 0x76, 0x98, 0x38, 0x62, 0x34, 0xE8,
0x2F, 0x91, 0x5F, 0x40, 0xBE, 0x29, 0xF4, 0x07, 0xB7, 0xEF, 0x7F, 0xB5, 0xD7, 0xEF, 0xEF, 0x1D,
0x1D, 0xEE, 0x0D, 0xF2, 0x8D, 0xA6, 0x86, 0xAA, 0xB8, 0x19, 0x53, 0x0F, 0xFA, 0x47, 0x7C, 0x13,
0x64, 0xD3, 0xE2, 0xF6, 0xCB, 0x63, 0x15, 0x78, 0x84, 0x48, 0x44, 0xC3, 0x83, 0x02, 0x9A, 0x5F,
0x4B, 0x61, 0xC7, 0x15, 0xD8, 0x71, 0x15, 0x86, 0x03, 0x38, 0x41, 0x2B, 0x67, 0xD9, 0xA5, 0x0C,
0x74, 0x2C, 0x82, 0x6A, 0x9E, 0x02, 0x4C, 0x06, 0x53, 0x4A, 0xD9, 0x21, 0x61, 0x28, 0x3C, 0x85,
0x7E, 0x01, 0xAF, 0x19, 0x2E, 0x4A, 0xE3, 0x72, 0x4F, 0x11, 0xA5, 0x22, 0x02, 0x97, 0x88, 0xE1,
0x62, 0xC6, 0xB7, 0x68, 0x21, 0xC5, 0x25, 0xC3, 0x85, 0xD4, 0xB4, 0x06, 0xAF, 0x9F, 0xFF, 0xF0,
0xDF, 0x8F, 0x7F, 0x49, 0xF8, 0x62, 0x85, 0x64, 0xFC, 0x07, 0x98, 0xF4, 0x61, 0x08, 0x2B, 0x82,
0x5B, 0x8F, 0xB8, 0xD8, 0x19, 0x3C, 0x7B, 0x9B, 0x33, 0x01, 0x71, 0xA1, 0x33, 0x71, 0xC9, 0xD6,
0x2D, 0xAB, 0xC4, 0x4B, 0xA4, 0x29, 0xCB, 0x7C, 0xD3, 0x02, 0x19, 0xEF, 0x5F, 0xA0, 0xF3, 0xEF,
0x7F, 0x79, 0xF3, 0xE2, 0xCF, 0x8D, 0x2C, 0x90, 0x4C, 0xB6, 0x97, 0x54, 0x20, 0xAD, 0x41, 0x81,
0x5E, 0x3D, 0x3D, 0x7F, 0xF6, 0xF7, 0x46, 0x16, 0x48, 0x96, 0x95, 0x4B, 0x2A, 0x90, 0xFE, 0xFE,
0x05, 0x7A, 0xF3, 0xFC, 0xDB, 0xF3, 0x5F, 0x5F, 0xBE, 0xFE, 0xED, 0xC5, 0x07, 0xA8, 0x91, 0x0A,
0x3E, 0xBE, 0x2A, 0xC9, 0x52, 0x73, 0x49, 0x55, 0x6A, 0xFC, 0x20, 0x52, 0x64, 0x3B, 0xE5, 0xD5,
0x5F, 0x48, 0xB2, 0xA8, 0xAE, 0xF0, 0x42, 0x52, 0xCC, 0x0D, 0x5D, 0x4A, 0xB2, 0xB8, 0x2E, 0xA9,
0x4E, 0xB2, 0x5B, 0x79, 0xD7, 0xA5, 0xF4, 0xF3, 0xCB, 0xF3, 0x7F, 0x7E, 0x3F, 0x7F, 0xFA, 0xEA,
0xCD, 0xBF, 0x3F, 0x9D, 0x3F, 0xFB, 0xE3, 0xF5, 0x8B, 0xEF, 0x14, 0x6B, 0x23, 0x97, 0x95, 0x2C,
0xAA, 0xAB, 0xF7, 0x02, 0xF1, 0x98, 0xF8, 0xD4, 0x3B, 0x51, 0xC6, 0x7E, 0xD2, 0x03, 0x50, 0x3C,
0x4A, 0x58, 0x48, 0x7D, 0x25, 0x44, 0x11, 0x0B, 0x71, 0x8A, 0x8A, 0x94, 0x4F, 0xF8, 0x4F, 0x7B,
0x0F, 0x43, 0x5F, 0x81, 0x8C, 0x21, 0x92, 0x8C, 0x7D, 0xBA, 0x91, 0x05, 0xB5, 0x3F, 0x9E, 0x82,
0x36, 0x78, 0x65, 0xEF, 0xFB, 0x08, 0x46, 0x48, 0x19, 0x20, 0x1F, 0x79, 0x4C, 0xC9, 0x26, 0x57,
0xD2, 0x38, 0x36, 0xB2, 0x6A, 0xCE, 0x06, 0x56, 0x6D, 0x00, 0x83, 0x99, 0x8F, 0x36, 0xB2, 0x5C,
0xEE, 0xC7, 0x53, 0xAE, 0x06, 0xEF, 0x8B, 0x8F, 0x62, 0xB2, 0x91, 0xD5, 0x51, 0x3F, 0x58, 0xDB,
0x62, 0x5D, 0x3B, 0xB2, 0x68, 0x47, 0xD5, 0xBA, 0xF5, 0xDD, 0xBB, 0xD4, 0x1F, 0xA1, 0xB0, 0xD2,
0xC9, 0x46, 0x7C, 0x25, 0x24, 0xDD, 0xFE, 0xA4, 0x2E, 0x73, 0xB8, 0x98, 0x51, 0x4C, 0x58, 0xDE,
0xC6, 0x2E, 0xDB, 0xA4, 0xAC, 0xC3, 0x51, 0x91, 0x96, 0xD2, 0x90, 0x00, 0x9D, 0x2F, 0x1B, 0xFF,
0xFB, 0x94, 0x86, 0x23, 0x4C, 0x38, 0x60, 0xB0, 0x88, 0xD2, 0x9C, 0xD5, 0x74, 0x56, 0x20, 0xD2,
0x43, 0x82, 0xE3, 0x7B, 0x03, 0xA7, 0x58, 0xEF, 0xA2, 0xA9, 0x42, 0x9C, 0xA6, 0xED, 0xF5, 0xD4,
0x12, 0x22, 0x7E, 0x0B, 0xF8, 0x14, 0x0D, 0xE9, 0x80, 0xC1, 0x90, 0xF5, 0x4B, 0xC1, 0x94, 0x50,
0xD5, 0x0E, 0x69, 0xD6, 0xFD, 0xC4, 0x64, 0x92, 0x46, 0x7A, 0xAF, 0x9F, 0x37, 0x35, 0xAB, 0x16,
0x31, 0xF5, 0x6F, 0x8D, 0x6C, 0xE9, 0x1E, 0xC6, 0x8C, 0xDE, 0x4D, 0x9F, 0xFE, 0x62, 0x87, 0xBF,
0x3A, 0x2E, 0x39, 0x1E, 0xC8, 0x0E, 0x0E, 0x56, 0xEF, 0xD2, 0xC2, 0xB0, 0x40, 0xF0, 0xA0, 0x8F,
0x97, 0xDE, 0xEE, 0x10, 0xF8, 0xC4, 0x2F, 0xC9, 0xB5, 0x6A, 0x10, 0xE7, 0xC1, 0x01, 0x77, 0xD8,
0xC7, 0xCC, 0x9B, 0xA6, 0xA9, 0x09, 0x20, 0x89, 0xA1, 0x9F, 0xCF, 0x56, 0x31, 0x4A, 0xEE, 0xF0,
0x38, 0x53, 0xCC, 0x01, 0x82, 0xC9, 0x39, 0x98, 0xB4, 0xB0, 0x73, 0x11, 0x93, 0xBA, 0x1A, 0x53,
0xDF, 0xA7, 0xF3, 0xEC, 0x50, 0x68, 0x95, 0xCF, 0x1A, 0xEE, 0x62, 0x57, 0x7B, 0x64, 0x52, 0x8A,
0x54, 0x6A, 0x5C, 0xE3, 0x80, 0x2B, 0x23, 0x15, 0x47, 0x0F, 0xB4, 0x41, 0xFA, 0xB9, 0x5E, 0xFB,
0x52, 0xF1, 0x5A, 0x30, 0x44, 0x11, 0xBC, 0x3D, 0x0D, 0xB2, 0x74, 0x0D, 0xE3, 0x90, 0xA4, 0xF1,
0x31, 0x9A, 0x3A, 0xDD, 0x23, 0xA3, 0x01, 0xA3, 0xB3, 0x63, 0xCC, 0xA6, 0xB7, 0x71, 0x94, 0xBC,
0x24, 0x62, 0x12, 0x63, 0xB6, 0xD8, 0x8F, 0xC3, 0x53, 0xC8, 0xE2, 0x10, 0x49, 0x67, 0x2B, 0xBC,
0x48, 0x66, 0x7A, 0x1C, 0xA1, 0x01, 0x0B, 0x61, 0x52, 0xF7, 0x23, 0x9E, 0xE2, 0x62, 0x2F, 0x96,
0x5B, 0x73, 0x07, 0x7D, 0x1F, 0x7A, 0x28, 0x80, 0xE1, 0x49, 0x29, 0x6F, 0x42, 0xD4, 0xE9, 0xC8,
0x6A, 0x39, 0x46, 0xE5, 0x71, 0x45, 0x51, 0x55, 0xBD, 0xED, 0xEA, 0x36, 0xD0, 0x4C, 0xC3, 0x35,
0x00, 0xB0, 0xAF, 0x6B, 0x5A, 0xDB, 0xB4, 0x5D, 0xCB, 0xB1, 0x55, 0x5D, 0x35, 0x1D, 0xC3, 0x29,
0x7B, 0xE9, 0x48, 0xDD, 0x74, 0x3B, 0x95, 0xF9, 0xB2, 0xDE, 0xBC, 0xD0, 0xF3, 0xC5, 0xB2, 0x73,
0x0A, 0xE4, 0xFB, 0x78, 0x16, 0x51, 0x3C, 0xAA, 0xAD, 0x9A, 0xAA, 0x45, 0xBA, 0x7F, 0x94, 0xF0,
0x53, 0x29, 0x2C, 0x8E, 0xD0, 0x3D, 0x61, 0x55, 0xE6, 0xA7, 0xA5, 0x95, 0xF1, 0x75, 0xB4, 0xE5,
0x2A, 0xAF, 0xB1, 0x84, 0xC5, 0x2F, 0x99, 0xAB, 0x24, 0x28, 0xC9, 0x8C, 0xEB, 0x57, 0x5D, 0x01,
0x4A, 0x54, 0xB2, 0x86, 0xBF, 0x32, 0xD5, 0xC9, 0x82, 0x3E, 0xC0, 0x8A, 0x29, 0xD5, 0x4D, 0xA7,
0x26, 0x9C, 0x0F, 0x23, 0x25, 0xCB, 0x35, 0x5D, 0x9B, 0x7F, 0x4C, 0x23, 0x95, 0x92, 0x03, 0x5C,
0x1D, 0xE8, 0x8E, 0x69, 0x58, 0x86, 0xD1, 0x50, 0x4A, 0xEA, 0x4E, 0x4A, 0xDB, 0x25, 0x25, 0x5B,
0x77, 0x1C, 0x43, 0xB3, 0x55, 0xC7, 0x2E, 0xA4, 0x64, 0x3A, 0x9A, 0x6A, 0x58, 0x5A, 0xD3, 0x5D,
0x49, 0xDB, 0x49, 0x69, 0xCB, 0xA4, 0x64, 0x00, 0xD5, 0x05, 0xC0, 0x70, 0xF2, 0x07, 0x5C, 0xF2,
0xC4, 0xB3, 0x0C, 0x0B, 0x80, 0xA6, 0x52, 0xD2, 0x77, 0x52, 0xDA, 0x32, 0x29, 0x39, 0xB6, 0x06,
0x2C, 0x53, 0xB7, 0xAC, 0x5C, 0x4A, 0x1A, 0xD0, 0xB9, 0x8E, 0x34, 0x53, 0x6D, 0x28, 0x25, 0x63,
0x27, 0xA5, 0x2D, 0x93, 0x92, 0xED, 0x02, 0xCD, 0x76, 0xF4, 0xFC, 0xF1, 0x66, 0xAA, 0x5C, 0x4A,
0x06, 0x7F, 0x13, 0x6F, 0x28, 0x24, 0x73, 0x27, 0xA4, 0xED, 0x12, 0x92, 0xA3, 0xDB, 0x1A, 0x57,
0x8F, 0x69, 0x16, 0x4A, 0xD2, 0x1D, 0x1B, 0x38, 0xB6, 0x61, 0x37, 0x54, 0x92, 0xB5, 0x53, 0xD2,
0x96, 0x29, 0xC9, 0x50, 0x81, 0xA9, 0xB9, 0x86, 0x6E, 0x64, 0x4F, 0x37, 0x07, 0x68, 0x9A, 0x0B,
0xB8, 0xBC, 0xB4, 0x86, 0x52, 0xB2, 0x77, 0x52, 0xDA, 0x32, 0x29, 0xB9, 0x86, 0xA5, 0x03, 0x0B,
0x38, 0x6A, 0x2E, 0x25, 0xCD, 0xD6, 0x55, 0x5B, 0xD7, 0xD4, 0xA6, 0xBB, 0x92, 0xB3, 0x93, 0xD2,
0x96, 0x49, 0xC9, 0x71, 0xB8, 0x90, 0xF8, 0xF3, 0xAD, 0x68, 0x2A, 0x59, 0x2E, 0x30, 0xF8, 0x6F,
0xBA, 0xA6, 0x3D, 0x25, 0x77, 0xA7, 0xA4, 0xAB, 0xA1, 0xA4, 0x6E, 0x67, 0x75, 0x14, 0xD6, 0xED,
0xAC, 0xFE, 0x56, 0xD3, 0x4D, 0xFE, 0x9A, 0xD3, 0xBB, 0xF6, 0x3F, 0x50, 0x4B, 0x07, 0x08, 0x50,
0x7D, 0x0A, 0x8A, 0xCC, 0x05, 0x00, 0x00, 0xEA, 0x33, 0x00, 0x00, 0x50, 0x4B, 0x03, 0x04, 0x14,
0x00, 0x08, 0x08, 0x08, 0x00, 0x22, 0x6D, 0x34, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77, 0x61,
0x79, 0x6C, 0x69, 0x6E, 0x65, 0x73, 0x2E, 0x77, 0x70, 0x6D, 0x6C, 0xED, 0x9B, 0x4D, 0x6F, 0xDB,
0x36, 0x18, 0xC7, 0xEF, 0xFD, 0x14, 0x82, 0x4F, 0x1B, 0xD0, 0xD9, 0x14, 0xF5, 0x46, 0x15, 0xAE,
0x8B, 0xAC, 0x69, 0x91, 0xA0, 0xE9, 0x6A, 0xD4, 0xE9, 0x72, 0x1C, 0x18, 0x99, 0x76, 0xB8, 0xC8,
0xA4, 0x21, 0x51, 0x79, 0xD9, 0xA9, 0xC0, 0xD0, 0x61, 0x03, 0x7A, 0xDA, 0x30, 0xEC, 0x30, 0xEC,
0xD0, 0x01, 0x03, 0x76, 0xDA, 0x65, 0x3D, 0x76, 0xFB, 0x36, 0x29, 0xB2, 0x6F, 0x31, 0xCA, 0x2F,
0xB2, 0x28, 0x33, 0x2F, 0xA8, 0x0A, 0xA7, 0x35, 0x98, 0x93, 0xC5, 0xE7, 0xFF, 0x3C, 0x24, 0x9F,
0x87, 0x3F, 0x89, 0xA6, 0xE2, 0xF6, 0xBD, 0x93, 0x51, 0x6C, 0x1D, 0x91, 0x24, 0xA5, 0x9C, 0xDD,
0x6D, 0xD8, 0x4D, 0xD0, 0xB0, 0x08, 0x8B, 0x78, 0x9F, 0xB2, 0xE1, 0xDD, 0xC6, 0xB3, 0xDD, 0x87,
0x9F, 0xA1, 0xC6, 0xBD, 0xCE, 0xAD, 0xF6, 0xA1, 0x54, 0x49, 0x25, 0x4B, 0xEF, 0x36, 0x0E, 0x84,
0x18, 0xDF, 0x69, 0xB5, 0x8E, 0x8F, 0x8F, 0x9B, 0x7C, 0x4C, 0xD8, 0x90, 0xA6, 0x4D, 0x46, 0x44,
0x4B, 0x2A, 0x5A, 0xB0, 0x09, 0x1B, 0x53, 0xD9, 0x9D, 0xE3, 0xF1, 0x28, 0x56, 0xB4, 0xFD, 0xAF,
0x69, 0x33, 0xE2, 0xA3, 0x96, 0x34, 0x7C, 0xD3, 0x92, 0xFD, 0x34, 0xED, 0x46, 0xE7, 0x96, 0x65,
0xB5, 0x37, 0x79, 0x94, 0x8D, 0x08, 0x13, 0xF9, 0x85, 0xBC, 0xCC, 0xFD, 0xEE, 0x8C, 0x68, 0x9A,
0x8F, 0xE7, 0x3E, 0x67, 0x03, 0x3A, 0x9C, 0x1A, 0xE6, 0xA6, 0x41, 0x7C, 0xBA, 0xCB, 0xF7, 0xF0,
0x69, 0x4C, 0x19, 0x79, 0xCC, 0xFB, 0xA4, 0x93, 0xE2, 0x01, 0x89, 0x4F, 0xDB, 0x2D, 0xBD, 0x55,
0xF5, 0xA5, 0x8C, 0xA6, 0x07, 0x1B, 0x91, 0x90, 0xB1, 0x3B, 0x43, 0xBE, 0xC5, 0x47, 0x64, 0xEE,
0x57, 0xB6, 0x28, 0x3E, 0xE4, 0x84, 0x8A, 0x27, 0xEC, 0xE9, 0xFD, 0x1D, 0x9E, 0x8A, 0x0E, 0x39,
0x21, 0x51, 0x26, 0x48, 0xFE, 0x79, 0xAA, 0x9D, 0xB9, 0x2B, 0xA2, 0x8A, 0xFB, 0xC4, 0x63, 0x6A,
0x2A, 0x7A, 0xFE, 0x1C, 0x47, 0x87, 0x85, 0xEB, 0xB2, 0x40, 0x89, 0x20, 0xF0, 0x21, 0x79, 0x32,
0x18, 0xF4, 0xA4, 0x2C, 0xA1, 0xE2, 0x74, 0x8B, 0xD0, 0xE1, 0x81, 0xE8, 0x40, 0x30, 0xF3, 0xD7,
0x9B, 0x95, 0x08, 0xC3, 0x98, 0xEF, 0xE3, 0x78, 0x37, 0xC1, 0x2C, 0xA5, 0x79, 0x7C, 0x1C, 0xF7,
0xC6, 0x84, 0xF4, 0x3B, 0xDE, 0x2C, 0xC4, 0x45, 0x76, 0x25, 0x48, 0x3F, 0xE1, 0x8C, 0x6C, 0xB3,
0x01, 0x9F, 0x37, 0x2B, 0x86, 0x07, 0x2C, 0x1B, 0x7D, 0x89, 0xE3, 0x8C, 0x74, 0x82, 0x60, 0x16,
0xB5, 0xD2, 0xAE, 0xF3, 0xEA, 0x65, 0xFB, 0x0B, 0x01, 0x28, 0xFB, 0x29, 0x96, 0xF9, 0x38, 0x5A,
0xFA, 0x81, 0x4C, 0x03, 0x8E, 0x65, 0xD1, 0x39, 0xEE, 0xEB, 0x46, 0x38, 0x33, 0x2D, 0x02, 0xFA,
0xFE, 0x2C, 0xD6, 0x92, 0x45, 0xEF, 0xA9, 0x1D, 0xA7, 0xCE, 0xA6, 0x77, 0xEF, 0xF2, 0x69, 0x5E,
0xB7, 0x59, 0x9F, 0x9C, 0x54, 0xFD, 0x55, 0xA3, 0x3A, 0x55, 0xCD, 0x9C, 0xDE, 0x61, 0xB2, 0x9E,
0xE7, 0xB8, 0x37, 0x38, 0x5F, 0x78, 0x8D, 0xF9, 0xCE, 0x03, 0x44, 0x59, 0x2A, 0xF8, 0xA8, 0x3B,
0x55, 0x7E, 0x81, 0x47, 0xA4, 0xD3, 0xED, 0x6D, 0x3E, 0xFA, 0x6A, 0xA3, 0xDB, 0xDD, 0xD8, 0xD9,
0xDE, 0xE8, 0xCD, 0x22, 0x2D, 0xAB, 0x2A, 0x61, 0x06, 0x3C, 0xC2, 0xF1, 0x8E, 0xBC, 0x35, 0x89,
0x83, 0x62, 0xF8, 0xE5, 0xB6, 0x8A, 0x3C, 0x25, 0x2C, 0xE5, 0xC9, 0x56, 0x21, 0x9D, 0x5F, 0x6B,
0x65, 0x7B, 0x15, 0xD9, 0x5E, 0x55, 0x46, 0x47, 0x78, 0x48, 0x16, 0xC1, 0x66, 0x97, 0x3A, 0xD1,
0x9E, 0x2A, 0x5A, 0x8A, 0x34, 0xA2, 0xAC, 0x77, 0xC0, 0xB9, 0xD8, 0x66, 0x82, 0x24, 0x47, 0x38,
0x2E, 0xE4, 0x4B, 0x86, 0xCB, 0xD2, 0x38, 0xBD, 0xA7, 0xA8, 0x4B, 0x45, 0x15, 0x4E, 0x15, 0xBB,
0xA7, 0x63, 0xD2, 0xB1, 0x95, 0x14, 0x97, 0x0C, 0x97, 0xBA, 0x4E, 0x6A, 0xF0, 0xF6, 0xE5, 0x0F,
0xFF, 0xFD, 0xF8, 0x97, 0xC6, 0x5F, 0xAD, 0x90, 0xCE, 0xFF, 0x31, 0x65, 0x5D, 0x9C, 0xE0, 0xCA,
0x82, 0xBB, 0x58, 0x71, 0x79, 0x30, 0x7C, 0x72, 0x55, 0x30, 0x45, 0x71, 0x69, 0x30, 0x15, 0xD9,
0x65, 0xCB, 0x22, 0xF1, 0x9A, 0xA5, 0xA9, 0xCB, 0x7C, 0xDD, 0x02, 0xB9, 0xEF, 0x5E, 0xA0, 0xB3,
0xEF, 0x7F, 0x39, 0x7F, 0xF5, 0xE7, 0x5A, 0x16, 0x48, 0xB7, 0x6C, 0x6F, 0xA8, 0x40, 0xB0, 0x46,
0x81, 0xDE, 0x3C, 0x3F, 0x7B, 0xF1, 0xF7, 0x5A, 0x16, 0x48, 0x97, 0x95, 0x1B, 0x2A, 0x90, 0xF3,
0xEE, 0x05, 0x3A, 0x7F, 0xF9, 0xED, 0xD9, 0xAF, 0xAF, 0xDF, 0xFE, 0xF6, 0xEA, 0x3D, 0xD4, 0xC8,
0x06, 0x1F, 0x5E, 0x95, 0x74, 0xA9, 0xB9, 0xA1, 0x2A, 0xD5, 0x7E, 0x10, 0x59, 0xBA, 0x3B, 0xE5,
0xC7, 0x0F, 0x92, 0x6E, 0x56, 0x1F, 0x31, 0x48, 0x96, 0xB7, 0xA6, 0x28, 0xE9, 0xE6, 0x75, 0x43,
0x75, 0xD2, 0x0D, 0xE5, 0xBA, 0x28, 0xFD, 0xFC, 0xFA, 0xEC, 0x9F, 0xDF, 0xCF, 0x9E, 0xBF, 0x39,
0xFF, 0xF7, 0xA7, 0xB3, 0x17, 0x7F, 0xBC, 0x7D, 0xF5, 0x9D, 0xE5, 0xAF, 0x25, 0x56, 0xBA, 0x59,
0x7D, 0x7C, 0x1B, 0x88, 0x67, 0x2C, 0xE6, 0xD1, 0xA1, 0x35, 0x88, 0xF3, 0x33, 0x00, 0x2B, 0xE2,
0x4C, 0x24, 0x3C, 0xB6, 0x12, 0x92, 0x8A, 0x84, 0x4E, 0x54, 0xA9, 0xF5, 0x89, 0xFC, 0x6A, 0x1F,
0x51, 0x1C, 0x5B, 0x58, 0x08, 0xC2, 0xF2, 0xB6, 0x4F, 0xD7, 0xB2, 0xA0, 0xC1, 0x87, 0x53, 0xD0,
0x1A, 0x5B, 0xF6, 0x6E, 0x4C, 0x70, 0x4A, 0xAC, 0x1E, 0x89, 0x49, 0x24, 0xAC, 0x59, 0xE7, 0xD6,
0x64, 0x1E, 0x6B, 0x59, 0x35, 0xB4, 0x86, 0x55, 0xEB, 0xE1, 0xD1, 0x38, 0x26, 0x6B, 0x59, 0xAE,
0xF0, 0xC3, 0x29, 0x57, 0x8D, 0xFD, 0xE2, 0xD3, 0x8C, 0xAD, 0x65, 0x75, 0xEC, 0xF7, 0x76, 0x6C,
0x71, 0xD1, 0x71, 0x64, 0x71, 0x1C, 0xB5, 0x74, 0x5A, 0xDF, 0x7E, 0xC8, 0xE3, 0x3E, 0x49, 0x2A,
0x27, 0xD9, 0x44, 0x92, 0x80, 0x05, 0xD9, 0xEE, 0x17, 0x13, 0x2C, 0x35, 0xE9, 0x8E, 0xCD, 0xA7,
0xA7, 0xD9, 0x93, 0x83, 0xFC, 0x84, 0x48, 0x1D, 0x3D, 0x22, 0xBB, 0xBC, 0x27, 0x70, 0x22, 0xBA,
0x9C, 0x32, 0xA1, 0x1E, 0xA1, 0x97, 0xC4, 0x4A, 0xAC, 0xE3, 0xE9, 0xEB, 0x80, 0x52, 0xAF, 0x8B,
0x16, 0xF5, 0x88, 0x9B, 0xA6, 0x02, 0xB3, 0x88, 0x74, 0x50, 0xE0, 0x35, 0x6D, 0xD7, 0xF3, 0x61,
0x88, 0x10, 0x44, 0xF6, 0xFC, 0x89, 0x5C, 0xD8, 0x55, 0xAF, 0x2C, 0xC1, 0x79, 0xC2, 0x3A, 0x10,
0xF8, 0x4D, 0x0F, 0x86, 0x36, 0x0C, 0x01, 0x44, 0x4E, 0xE1, 0x34, 0x37, 0x2B, 0x4E, 0x38, 0x13,
0xFC, 0xE1, 0xE4, 0x31, 0xAD, 0x1E, 0xC5, 0x57, 0xDB, 0xE7, 0x4E, 0xDD, 0x18, 0x47, 0x64, 0x84,
0x93, 0xC3, 0x52, 0xE9, 0x26, 0x29, 0x50, 0x16, 0x42, 0xC4, 0x79, 0xD2, 0xA7, 0x4C, 0xE6, 0x33,
0x2D, 0xB7, 0x5B, 0x96, 0x6D, 0x3B, 0xCD, 0xD0, 0x09, 0x00, 0xF4, 0xDC, 0xD0, 0x05, 0x20, 0xB8,
0x0D, 0x61, 0xD3, 0x0B, 0x42, 0x1F, 0x05, 0xB6, 0x63, 0x7B, 0xC8, 0x45, 0xE5, 0x28, 0x2D, 0x6D,
0x98, 0x76, 0xAB, 0xD2, 0xDF, 0xEC, 0x20, 0x53, 0x39, 0x20, 0xA3, 0xBA, 0x43, 0x5D, 0xA5, 0x3C,
0xA5, 0xCD, 0xBA, 0xDA, 0x5E, 0x71, 0x92, 0x25, 0x1A, 0xE7, 0xFD, 0xA9, 0xE9, 0x51, 0x5B, 0x2F,
0x70, 0xD9, 0x22, 0x38, 0x7F, 0x7B, 0x35, 0x81, 0x65, 0x99, 0x93, 0x8A, 0x6A, 0xB2, 0x5C, 0x06,
0x3C, 0x8E, 0xF9, 0xF1, 0xEC, 0xB5, 0x51, 0xA5, 0xAB, 0xB2, 0xEE, 0xAA, 0x60, 0x1B, 0x6C, 0x18,
0x93, 0xF2, 0x2A, 0x5B, 0x36, 0x5E, 0x18, 0x42, 0x66, 0x77, 0x9A, 0x60, 0xD0, 0x04, 0x93, 0xBF,
0xDB, 0x4B, 0x1F, 0x2A, 0x71, 0x0B, 0x8F, 0x6B, 0x0D, 0xEB, 0x01, 0xC3, 0xFB, 0x57, 0x0C, 0x6E,
0x26, 0xA9, 0xDE, 0x1C, 0x2E, 0xCF, 0xAB, 0xDA, 0xE3, 0x6E, 0x96, 0xB0, 0x2B, 0x12, 0x9F, 0x4B,
0x26, 0xD9, 0x14, 0x7C, 0x32, 0xFC, 0x0D, 0xD6, 0xEF, 0x09, 0x3E, 0xDE, 0xA3, 0xE2, 0x60, 0x93,
0xA6, 0xF9, 0xA6, 0x95, 0xB2, 0x8C, 0x8A, 0xD3, 0xFB, 0x59, 0x72, 0x84, 0x45, 0x96, 0x54, 0x0B,
0x52, 0xF8, 0x5F, 0xDA, 0xC3, 0xA6, 0x7C, 0xEA, 0xCA, 0xC1, 0xCA, 0x88, 0x62, 0x69, 0xCE, 0x55,
0xFB, 0x45, 0x13, 0xD6, 0x4C, 0x66, 0xDA, 0x51, 0x96, 0x92, 0x9E, 0x48, 0x70, 0xBE, 0x6E, 0x77,
0xE4, 0x8A, 0x29, 0x1E, 0x3E, 0xD5, 0xF6, 0xE2, 0xF6, 0xB9, 0x84, 0xEF, 0xFB, 0x01, 0xDA, 0x0F,
0xBD, 0x30, 0x90, 0x7F, 0x9E, 0x3B, 0x01, 0x1A, 0x81, 0xD0, 0x01, 0x0E, 0xF2, 0x5C, 0xDF, 0x75,
0x6B, 0x02, 0x6D, 0x1B, 0xA0, 0x0D, 0xD0, 0x06, 0xE8, 0x55, 0x03, 0x1D, 0x38, 0x08, 0xB9, 0x30,
0xB0, 0x51, 0x50, 0x00, 0xED, 0x21, 0x68, 0xBB, 0x3E, 0xAC, 0xFB, 0x84, 0x86, 0x06, 0x68, 0x03,
0xB4, 0x01, 0x7A, 0xE5, 0x40, 0xBB, 0xC0, 0x0E, 0x01, 0x70, 0xD1, 0x7C, 0xCB, 0x9D, 0xEF, 0xC1,
0x7D, 0xD7, 0x07, 0xA0, 0x2E, 0xD0, 0x8E, 0x01, 0xDA, 0x00, 0x6D, 0x80, 0x5E, 0x39, 0xD0, 0x28,
0x90, 0xDF, 0xF3, 0x3D, 0xC7, 0xF7, 0xE7, 0x40, 0x43, 0xE0, 0x48, 0x9A, 0xA1, 0x67, 0xD7, 0x04,
0xDA, 0x35, 0x40, 0x1B, 0xA0, 0x0D, 0xD0, 0x2B, 0x07, 0x3A, 0x08, 0x01, 0x0C, 0x90, 0x33, 0xDF,
0x70, 0x7B, 0xB6, 0x04, 0xDA, 0xF5, 0xDC, 0xB0, 0x26, 0xCE, 0x9E, 0xC1, 0xD9, 0xE0, 0x6C, 0x70,
0x5E, 0x35, 0xCE, 0xC8, 0x09, 0xA0, 0x64, 0xD8, 0xF3, 0x0A, 0x9E, 0x1D, 0x14, 0x00, 0x14, 0xB8,
0x41, 0x4D, 0x9E, 0x7D, 0xC3, 0xB3, 0xE1, 0xD9, 0xF0, 0xBC, 0x72, 0x9E, 0x5D, 0x1B, 0x78, 0x30,
0x74, 0x1D, 0x77, 0xB6, 0xDF, 0x46, 0x00, 0xC2, 0x10, 0x48, 0xC8, 0x61, 0x4D, 0xA0, 0x03, 0x03,
0xB4, 0x01, 0xDA, 0x00, 0xBD, 0x72, 0xA0, 0x43, 0xD7, 0x77, 0x80, 0x0F, 0x90, 0x3D, 0x07, 0x1A,
0x06, 0x8E, 0x1D, 0x38, 0xD0, 0xAE, 0xFB, 0x84, 0x46, 0x06, 0x68, 0x03, 0xB4, 0x01, 0x7A, 0xE5,
0x40, 0x23, 0x24, 0x71, 0x96, 0x3B, 0xEE, 0xE2, 0x25, 0xB4, 0x1F, 0x02, 0xD7, 0x05, 0x76, 0xDD,
0x77, 0xD0, 0xA1, 0xE1, 0xD9, 0xF0, 0x6C, 0x78, 0xBE, 0x2E, 0xCF, 0xED, 0xD6, 0xE2, 0x7F, 0xEE,
0xDA, 0xAD, 0xC5, 0xAF, 0xEA, 0xDB, 0xF9, 0x2F, 0xF3, 0x3B, 0xB7, 0xFE, 0x07, 0x50, 0x4B, 0x07,
0x08, 0xDD, 0x90, 0xD9, 0xA9, 0x92, 0x05, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0x50, 0x4B, 0x01,
0x02, 0x14, 0x00, 0x14, 0x00, 0x08, 0x08, 0x08, 0x00, 0x22, 0x6D, 0x34, 0x55, 0x50, 0x7D, 0x0A,
0x8A, 0xCC, 0x05, 0x00, 0x00, 0xEA, 0x33, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F,
0x74, 0x65, 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x2E, 0x6B, 0x6D, 0x6C, 0x50, 0x4B, 0x01, 0x02,
0x14, 0x00, 0x14, 0x00, 0x08, 0x08, 0x08, 0x00, 0x22, 0x6D, 0x34, 0x55, 0xDD, 0x90, 0xD9, 0xA9,
0x92, 0x05, 0x00, 0x00, 0xE9, 0x3F, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x06, 0x00, 0x00, 0x77, 0x70, 0x6D, 0x7A, 0x2F, 0x77,
0x61, 0x79, 0x6C, 0x69, 0x6E, 0x65, 0x73, 0x2E, 0x77, 0x70, 0x6D, 0x6C, 0x50, 0x4B, 0x05, 0x06,
0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xDD, 0x0B, 0x00, 0x00,
0x00, 0x00
};
#endif /* __waypoint_v3_test_file_kmz_h_included */

View File

@ -29,6 +29,7 @@
#include "../utils/util_misc.h"
#include <dji_platform.h>
#include <stdio.h>
#include "dji_sdk_config.h"
#include "file_binary_array_list_en.h"
/* Private constants ---------------------------------------------------------*/
@ -51,18 +52,17 @@ static char s_widgetFileDirPath[DJI_FILE_PATH_SIZE_MAX] = {0};
static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
{0, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{1, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{2, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{3, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{4, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{5, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{6, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{7, DJI_WIDGET_TYPE_INT_INPUT_BOX, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{8, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{9, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{1, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{2, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{3, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{4, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{5, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{6, DJI_WIDGET_TYPE_INT_INPUT_BOX, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{7, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{8, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
};
static char *s_widgetTypeNameArray[] = {
static const char *s_widgetTypeNameArray[] = {
"Unknown",
"Button",
"Switch",
@ -200,7 +200,17 @@ static void *DjiTest_WidgetTask(void *arg)
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get system time ms error, stat = 0x%08llX", djiStat);
}
#ifndef USER_FIRMWARE_MAJOR_VERSION
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN, "System time : %u ms", sysTimeMs);
#else
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN,
"System time : %u ms\r\nVersion: v%02d.%02d.%02d.%02d\r\nBuild time: %s %s", sysTimeMs,
USER_FIRMWARE_MAJOR_VERSION, USER_FIRMWARE_MINOR_VERSION,
USER_FIRMWARE_MODIFY_VERSION, USER_FIRMWARE_DEBUG_VERSION,
__DATE__, __TIME__);
#endif
djiStat = DjiWidgetFloatingWindow_ShowMessage(message);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {

View File

@ -33,6 +33,7 @@
#include <stdio.h>
#include "utils/util_misc.h"
#include "utils/util_md5.h"
#include <dji_aircraft_info.h>
#ifdef OPUS_INSTALLED
@ -54,11 +55,13 @@
#define WIDGET_SPEAKER_TTS_FILE_MAX_SIZE (3000)
/* The frame size is hardcoded for this sample code but it doesn't have to be */
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_PACKET_SIZE (3 * 1276)
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE (6 * 960)
#define WIDGET_SPEAKER_AUDIO_OPUS_SAMPLE_RATE (16000)
#define WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS (1)
#define WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE (160)
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_PACKET_SIZE (3 * 1276)
#define WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE (6 * 960)
#define WIDGET_SPEAKER_AUDIO_OPUS_SAMPLE_RATE (16000)
#define WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS (1)
#define WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE_8KBPS (40)
#define WIDGET_SPEAKER_AUDIO_OPUS_DECODE_BITRATE_8KBPS (8000)
/* The speaker initialization parameters */
#define WIDGET_SPEAKER_DEFAULT_VOLUME (30)
@ -75,6 +78,7 @@ static T_DjiTaskHandle s_widgetSpeakerTestThread;
static FILE *s_audioFile = NULL;
static FILE *s_ttsFile = NULL;
static bool s_isDecodeFinished = true;
static uint16_t s_decodeBitrate = 0;
/* Private functions declaration ---------------------------------------------*/
static void SetSpeakerState(E_DjiWidgetSpeakerState speakerState);
@ -230,15 +234,14 @@ static T_DjiReturnCode DjiTest_DecodeAudioData(void)
return EXIT_FAILURE;
}
USER_LOG_INFO("Decode Start...");
while (1) {
int i;
unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2];
int frame_size;
/* Read a 16 bits/sample audio frame. */
nbBytes = fread(cbits, 1, WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE, fin);
nbBytes = fread(cbits, 1, s_decodeBitrate / WIDGET_SPEAKER_AUDIO_OPUS_DECODE_BITRATE_8KBPS *
WIDGET_SPEAKER_AUDIO_OPUS_DECODE_FRAME_SIZE_8KBPS, fin);
if (feof(fin))
break;
@ -293,45 +296,59 @@ static T_DjiReturnCode DjiTest_PlayTtsData(void)
uint8_t data[WIDGET_SPEAKER_TTS_FILE_MAX_SIZE] = {0};
int32_t readLen;
char cmdStr[WIDGET_SPEAKER_TTS_FILE_MAX_SIZE + 128];
T_DjiAircraftInfoBaseInfo aircraftInfoBaseInfo;
T_DjiReturnCode returnCode;
txtFile = fopen(WIDGET_SPEAKER_TTS_FILE_NAME, "r");
if (txtFile == NULL) {
fprintf(stderr, "failed to open input file: %s\n", strerror(errno));
return EXIT_FAILURE;
returnCode = DjiAircraftInfo_GetBaseInfo(&aircraftInfoBaseInfo);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get aircraft base info error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
readLen = fread(data, 1, WIDGET_SPEAKER_TTS_FILE_MAX_SIZE, txtFile);
if (readLen <= 0) {
USER_LOG_ERROR("Read tts file failed, error code: %d", readLen);
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3E ||
aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M3T) {
return DjiTest_PlayAudioData();
} else {
txtFile = fopen(WIDGET_SPEAKER_TTS_FILE_NAME, "r");
if (txtFile == NULL) {
fprintf(stderr, "failed to open input file: %s\n", strerror(errno));
return EXIT_FAILURE;
}
readLen = fread(data, 1, WIDGET_SPEAKER_TTS_FILE_MAX_SIZE, txtFile);
if (readLen <= 0) {
USER_LOG_ERROR("Read tts file failed, error code: %d", readLen);
fclose(txtFile);
return DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND;
}
fclose(txtFile);
return DJI_ERROR_SYSTEM_MODULE_CODE_NOT_FOUND;
}
fclose(txtFile);
USER_LOG_INFO("Read tts file success, len: %d", readLen);
USER_LOG_INFO("Content: %s", data);
USER_LOG_INFO("Read tts file success, len: %d", readLen);
USER_LOG_INFO("Content: %s", data);
memset(cmdStr, 0, sizeof(cmdStr));
memset(cmdStr, 0, sizeof(cmdStr));
SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_IN_TTS_CONVERSION);
SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_IN_TTS_CONVERSION);
#if EKHO_INSTALLED
/*! Attention: you can use other tts opensource function to convert txt to speech, example used ekho v7.5 */
snprintf(cmdStr, sizeof(cmdStr), " ekho %s -s 20 -p 20 -a 100 -o %s", data, WIDGET_SPEAKER_TTS_OUTPUT_FILE_NAME);
/*! Attention: you can use other tts opensource function to convert txt to speech, example used ekho v7.5 */
snprintf(cmdStr, sizeof(cmdStr), " ekho %s -s 20 -p 20 -a 100 -o %s", data,
WIDGET_SPEAKER_TTS_OUTPUT_FILE_NAME);
#else
USER_LOG_WARN(
USER_LOG_WARN(
"Ekho is not installed, please visit https://www.eguidedog.net/ekho.php to install it or use other TTS tools to convert audio");
#endif
DjiUserUtil_RunSystemCmd(cmdStr);
DjiUserUtil_RunSystemCmd(cmdStr);
SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_PLAYING);
USER_LOG_INFO("Start TTS Playing...");
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "ffplay -nodisp -autoexit -ar 16000 -ac 1 -f s16le -i %s 2>/dev/null",
WIDGET_SPEAKER_TTS_OUTPUT_FILE_NAME);
SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_PLAYING);
USER_LOG_INFO("Start TTS Playing...");
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "ffplay -nodisp -autoexit -ar 16000 -ac 1 -f s16le -i %s 2>/dev/null",
WIDGET_SPEAKER_TTS_OUTPUT_FILE_NAME);
return DjiUserUtil_RunSystemCmd(cmdStr);
return DjiUserUtil_RunSystemCmd(cmdStr);
}
}
static T_DjiReturnCode DjiTest_CheckFileMd5Sum(const char *path, uint8_t *buf, uint16_t size)
@ -533,18 +550,25 @@ static T_DjiReturnCode SetVolume(uint8_t volume)
realVolume = 1.5f * (float) volume;
s_speakerState.volume = volume;
#ifdef PLATFORM_ARCH_x86_64
USER_LOG_INFO("Set widget speaker volume: %d", volume);
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "pactl set-sink-volume %s %d%%", WIDGET_SPEAKER_USB_AUDIO_DEVICE_NAME,
(int32_t) realVolume);
returnCode = DjiUserUtil_RunSystemCmd(cmdStr);
if (returnCode < 0) {
USER_LOG_ERROR("Set widget speaker volume error: %d", ret);
#ifdef PLATFORM_ARCH_x86_64
snprintf(cmdStr, sizeof(cmdStr), "pactl list | grep %s -q", WIDGET_SPEAKER_USB_AUDIO_DEVICE_NAME);
ret = system(cmdStr);
if (ret == DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
memset(cmdStr, 0, sizeof(cmdStr));
snprintf(cmdStr, sizeof(cmdStr), "pactl set-sink-volume %s %d%%", WIDGET_SPEAKER_USB_AUDIO_DEVICE_NAME,
(int32_t) realVolume);
returnCode = DjiUserUtil_RunSystemCmd(cmdStr);
if (returnCode < 0) {
USER_LOG_ERROR("Set widget speaker volume error: %d", ret);
}
} else {
USER_LOG_WARN("No audio device found, please add audio device and init speaker volume here!!!");
}
#else
USER_LOG_WARN("Add set speaker volume function here!");
USER_LOG_WARN("No audio device found, please add audio device and init speaker volume here!!!");
#endif
returnCode = osalHandler->MutexUnlock(s_speakerMutex);
@ -606,6 +630,7 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
{
uint16_t writeLen;
T_DjiReturnCode returnCode;
T_DjiWidgetTransDataContent transDataContent = {0};
if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_START) {
s_isDecodeFinished = false;
@ -617,6 +642,11 @@ static T_DjiReturnCode ReceiveAudioData(E_DjiWidgetTransmitDataEvent event,
if (s_speakerState.state != DJI_WIDGET_SPEAKER_STATE_PLAYING) {
SetSpeakerState(DJI_WIDGET_SPEAKER_STATE_TRANSMITTING);
}
memcpy(&transDataContent, buf, size);
s_decodeBitrate = transDataContent.transDataStartContent.fileDecodeBitrate;
USER_LOG_INFO("Create voice file: %s, decoder bitrate: %d.", transDataContent.transDataStartContent.fileName,
transDataContent.transDataStartContent.fileDecodeBitrate);
} else if (event == DJI_WIDGET_TRANSMIT_DATA_EVENT_TRANSMIT) {
USER_LOG_INFO("Transmit voice file, offset: %d, size: %d", offset, size);
if (s_audioFile != NULL) {

View File

@ -15,7 +15,7 @@
{
"widget_index": 0,
"widget_type": "button",
"widget_name": "按钮_1",
"widget_name": "按钮",
"icon_file_set": {
"icon_file_name_selected": "icon_button1.png",
"icon_file_name_unselected": "icon_button1.png"
@ -27,19 +27,6 @@
},
{
"widget_index": 1,
"widget_type": "button",
"widget_name": "按钮_2",
"icon_file_set": {
"icon_file_name_selected": "icon_button2.png",
"icon_file_name_unselected": "icon_button2.png"
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 1
}
},
{
"widget_index": 2,
"widget_type": "list",
"widget_name": "列表",
"list_item": [
@ -60,11 +47,11 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 2
"mapping_config_display_order": 1
}
},
{
"widget_index": 3,
"widget_index": 2,
"widget_type": "switch",
"widget_name": "开关",
"icon_file_set": {
@ -73,11 +60,11 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 3
"mapping_config_display_order": 2
}
},
{
"widget_index": 4,
"widget_index": 3,
"widget_type": "scale",
"widget_name": "范围条",
"icon_file_set": {
@ -86,7 +73,7 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4,
"mapping_config_display_order": 3,
"button_value_step_length": 5
}
}
@ -100,43 +87,43 @@
},
"widget_list": [
{
"widget_index": 5,
"widget_index": 4,
"widget_type": "button",
"widget_name": "按钮 5",
"widget_name": "按钮 4",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 5
"mapping_config_display_order": 4
}
},
{
"widget_index": 6,
"widget_index": 5,
"widget_type": "scale",
"widget_name": "范围条 6",
"widget_name": "范围条 5",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 6,
"mapping_config_display_order": 5,
"button_value_step_length": 5
}
},
{
"widget_index": 7,
"widget_index": 6,
"widget_type": "int_input_box",
"widget_name": "整形值输入框 7",
"widget_name": "整形值输入框 6",
"int_input_box_hint": "unit:s"
},
{
"widget_index": 8,
"widget_index": 7,
"widget_type": "switch",
"widget_name": "开关 8",
"widget_name": "开关 7",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 8
"mapping_config_display_order": 7
}
},
{
"widget_index": 9,
"widget_index": 8,
"widget_type": "list",
"widget_name": "列表 9",
"widget_name": "列表 8",
"list_item": [
{
"item_name": "选项 1"
@ -153,7 +140,7 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 9
"mapping_config_display_order": 8
}
}
]

View File

@ -15,7 +15,7 @@
{
"widget_index": 0,
"widget_type": "button",
"widget_name": "Button_1",
"widget_name": "Button",
"icon_file_set": {
"icon_file_name_selected": "icon_button1.png",
"icon_file_name_unselected": "icon_button1.png"
@ -27,19 +27,6 @@
},
{
"widget_index": 1,
"widget_type": "button",
"widget_name": "Button_2",
"icon_file_set": {
"icon_file_name_selected": "icon_button2.png",
"icon_file_name_unselected": "icon_button2.png"
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 1
}
},
{
"widget_index": 2,
"widget_type": "list",
"widget_name": "List",
"list_item": [
@ -60,11 +47,11 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 2
"mapping_config_display_order": 1
}
},
{
"widget_index": 3,
"widget_index": 2,
"widget_type": "switch",
"widget_name": "Switch",
"icon_file_set": {
@ -73,11 +60,11 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 3
"mapping_config_display_order": 2
}
},
{
"widget_index": 4,
"widget_index": 3,
"widget_type": "scale",
"widget_name": "Scale",
"icon_file_set": {
@ -86,7 +73,7 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4,
"mapping_config_display_order": 3,
"button_value_step_length": 5
}
}
@ -100,43 +87,43 @@
},
"widget_list": [
{
"widget_index": 5,
"widget_index": 4,
"widget_type": "button",
"widget_name": "Button 5",
"widget_name": "Button 4",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 5
"mapping_config_display_order": 4
}
},
{
"widget_index": 6,
"widget_index": 5,
"widget_type": "scale",
"widget_name": "Scale 6",
"widget_name": "Scale 5",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 6,
"mapping_config_display_order": 5,
"button_value_step_length": 5
}
},
{
"widget_index": 7,
"widget_index": 6,
"widget_type": "int_input_box",
"widget_name": "Integer Input Box 7",
"widget_name": "Integer Input Box 6",
"int_input_box_hint": "unit:s"
},
{
"widget_index": 8,
"widget_index": 7,
"widget_type": "switch",
"widget_name": "Switch 8",
"widget_name": "Switch 7",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 8
"mapping_config_display_order": 7
}
},
{
"widget_index": 9,
"widget_index": 8,
"widget_type": "list",
"widget_name": "List 9",
"widget_name": "List 8",
"list_item": [
{
"item_name": "Item 1"
@ -153,7 +140,7 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 9
"mapping_config_display_order": 8
}
}
]

View File

@ -6,9 +6,9 @@
/* Contents of file widget_config.json */
#define widget_config_json_fileName "widget_config.json"
#define widget_config_json_fileSize 4109
#define widget_config_json_fileSize 3801
static const uint8_t widget_config_json_fileBinaryArray[4109] = {
static const uint8_t widget_config_json_fileBinaryArray[3801] = {
0x7B, 0x0A, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A,
@ -17,118 +17,28 @@ static const uint8_t widget_config_json_fileBinaryArray[4109] = {
0x66, 0x6C, 0x6F, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6C,
0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x30, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C,
0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F,
0x32, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65,
0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E,
0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x32, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F,
0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75,
0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61,
0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73,
0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22,
0x3A, 0x20, 0x32, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73,
0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74,
0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x49, 0x74, 0x65, 0x6D, 0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x70, 0x65, 0x61, 0x6B, 0x65, 0x72, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x5F, 0x74, 0x74, 0x73, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x5F, 0x76, 0x6F, 0x69, 0x63, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x30, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79,
0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69,
0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F,
0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D,
0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64,
0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74,
0x65, 0x6D, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x5F, 0x32,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E,
0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E,
0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F,
0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x32, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x33, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C,
0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22,
0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64,
0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F,
0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20,
0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62,
0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20,
@ -136,136 +46,207 @@ static const uint8_t widget_config_json_fileBinaryArray[4109] = {
0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E,
0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79,
0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x33, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x34, 0x2C,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C,
0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65,
0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D,
0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x31, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x31, 0x2E,
0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x5F, 0x32, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E,
0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65,
0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73,
0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C,
0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73,
0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E,
0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65,
0x72, 0x22, 0x3A, 0x20, 0x31, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x32, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69,
0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63,
0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x75, 0x6E, 0x73, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75,
0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F,
0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62,
0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64,
0x65, 0x72, 0x22, 0x3A, 0x20, 0x32, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x33, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F,
0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63,
0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C,
0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F,
0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22,
0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22,
0x3A, 0x20, 0x33, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x5F, 0x73, 0x74, 0x65,
0x70, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x22, 0x3A, 0x20, 0x35, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x5F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0x3A, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65, 0x78, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75,
0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x42, 0x6F, 0x78, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x68, 0x6F, 0x6C, 0x64, 0x65,
0x72, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65,
0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6C, 0x69, 0x73, 0x74,
0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64,
0x65, 0x78, 0x22, 0x3A, 0x20, 0x34, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72,
0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67,
0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70,
0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70,
0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x34, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A,
0x20, 0x35, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C,
0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C,
0x65, 0x20, 0x35, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74,
0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61,
0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63,
0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72,
0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x34, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x35, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x76, 0x61, 0x6C, 0x75, 0x65,
0x5F, 0x73, 0x74, 0x65, 0x70, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x22, 0x3A, 0x20, 0x35,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x22, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65, 0x78, 0x74, 0x5F,
0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x42, 0x6F, 0x78,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x68,
0x6F, 0x6C, 0x64, 0x65, 0x72, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C,
0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x6C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x35, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x35, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69,
0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F,
0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20,
0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F,
0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20,
0x35, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64,
0x65, 0x78, 0x22, 0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x53, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x36, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73,
0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69,
0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61,
0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x76,
0x61, 0x6C, 0x75, 0x65, 0x5F, 0x73, 0x74, 0x65, 0x70, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
0x22, 0x3A, 0x20, 0x35, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x37, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x6E, 0x74, 0x65, 0x67,
0x65, 0x72, 0x20, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x42, 0x6F, 0x78, 0x20, 0x37, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E,
0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x5F, 0x68, 0x69, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x22,
0x75, 0x6E, 0x69, 0x74, 0x3A, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A,
0x20, 0x38, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74,
0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69,
0x74, 0x63, 0x68, 0x20, 0x38, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x38, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x39, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65,
0x78, 0x22, 0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69,
0x6E, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74, 0x20, 0x39, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74,
0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65,
0x6D, 0x20, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x32, 0x22, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x33, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74,
0x65, 0x6D, 0x20, 0x34, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F,
0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75,
0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61,
0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73,
0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x39, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x49,
0x6E, 0x70, 0x75, 0x74, 0x20, 0x42, 0x6F, 0x78, 0x20, 0x36, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F,
0x62, 0x6F, 0x78, 0x5F, 0x68, 0x69, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x6E, 0x69, 0x74,
0x3A, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x37, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20,
0x37, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73,
0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E,
0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65,
0x72, 0x22, 0x3A, 0x20, 0x37, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x38, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74, 0x20, 0x38, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A,
0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x31, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x32, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49,
0x74, 0x65, 0x6D, 0x20, 0x33, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x20, 0x34,
0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62,
0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F,
0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E,
0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79,
0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x38, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A
};
#endif /* __widget_config_json_h_included */

View File

@ -44,12 +44,13 @@
#include "dji_core.h"
#include <payload_collaboration/test_payload_collaboration.h>
#include <waypoint_v3/test_waypoint_v3.h>
#include "dji_sdk_config.h"
/* Private constants ---------------------------------------------------------*/
#define WIDGET_DIR_PATH_LEN_MAX (256)
#define WIDGET_TASK_STACK_SIZE (2048)
#define WIDGET_LOG_STRING_MAX_SIZE (50)
#define WIDGET_LOG_STRING_MAX_SIZE (40)
#define WIDGET_LOG_LINE_MAX_NUM (5)
/* Private types -------------------------------------------------------------*/
@ -64,20 +65,28 @@ typedef enum {
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_ARREST_FLYING = 7,
E_DJI_SAMPLE_INDEX_FLIGHT_CONTROL_SET_GET_PARAM = 8,
E_DJI_SAMPLE_INDEX_HMS = 9,
E_DJI_SAMPLE_INDEX_CAMERA_MANAGER = 10,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_FREE_MODE = 11,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_YAW_FOLLOW_MODE = 12,
E_DJI_SAMPLE_INDEX_LIVEVIEW = 13,
E_DJI_SAMPLE_INDEX_PERCEPTION = 14,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_FREE_MODE = 10,
E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_YAW_FOLLOW_MODE = 11,
E_DJI_SAMPLE_INDEX_LIVEVIEW = 12,
E_DJI_SAMPLE_INDEX_PERCEPTION = 13,
E_DJI_SAMPLE_INDEX_SWITCH_ALIAS = 14,
E_DJI_SAMPLE_INDEX_CAMMGR_SHUTTER_SPEED = 15,
E_DJI_SAMPLE_INDEX_CAMMGR_APERTURE = 16,
E_DJI_SAMPLE_INDEX_CAMMGR_EV = 17,
E_DJI_SAMPLE_INDEX_CAMMGR_ISO = 18,
E_DJI_SAMPLE_INDEX_CAMMGR_FOCUS_POINT = 19,
E_DJI_SAMPLE_INDEX_CAMMGR_TAP_ZOOM = 20,
E_DJI_SAMPLE_INDEX_CAMMGR_OPTICAL_ZOOM = 21,
E_DJI_SAMPLE_INDEX_CAMMGR_SINGLE_PHOTO = 22,
E_DJI_SAMPLE_INDEX_CAMMGR_AEB_PHOTO = 23,
E_DJI_SAMPLE_INDEX_CAMMGR_BURST_PHOTO = 24,
E_DJI_SAMPLE_INDEX_CAMMGR_INTERVAL_PHOTO = 25,
E_DJI_SAMPLE_INDEX_CAMMGR_RECORDER_VIDEO = 26,
E_DJI_SAMPLE_INDEX_CAMMGR_MEDIA_DOWNLOAD = 27,
E_DJI_SAMPLE_INDEX_UNKNOWN = 0xFF,
} E_DjiExtensionPortSampleIndex;
typedef enum {
E_DJI_SAMPLE_INDEX_SWITCH_ALIAS = 0,
E_DJI_SAMPLE_INDEX_FC_SUB_LOG_ON_OFF = 1,
E_DJI_SAMPLE_INDEX_COLLABORATION_LOG_ON_OFF = 2,
} E_DjiPayloadPortSampleIndex;
typedef struct {
bool valid;
char content[WIDGET_LOG_STRING_MAX_SIZE];
@ -96,39 +105,28 @@ static T_DjiReturnCode DjiTestWidget_TriggerChangeAlias(void);
static T_DjiTaskHandle s_widgetTestThread;
static T_DjiTaskHandle s_widgetInteractionTestThread;
static E_DjiExtensionPortSampleIndex s_extensionPortSampleIndex = E_DJI_SAMPLE_INDEX_FC_SUBSCRIPTION;
static E_DjiPayloadPortSampleIndex s_payloadPortSampleIndex = E_DJI_SAMPLE_INDEX_SWITCH_ALIAS;
static bool s_isallowRunFlightControlSample = false;
static bool s_isSampleStart = false;
static E_DjiMountPosition s_mountPosition = DJI_MOUNT_POSITION_PAYLOAD_PORT_NO1;
static E_DjiPerceptionDirection s_perceptionDirection = DJI_PERCEPTION_RECTIFY_DOWN;
static E_DjiTestCameraManagerSampleSelect s_cameraManagerSampleSelect =
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_SHUTTER_SPEED;
static T_DjiTestWidgetLog s_djiTestWidgetLog[WIDGET_LOG_LINE_MAX_NUM] = {0};
static T_DjiAircraftInfoBaseInfo s_aircraftInfoBaseInfo = {0};
static bool s_isAliasChanged = false;
static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
{0, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{1, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{2, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{3, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{4, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{5, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{6, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{7, DJI_WIDGET_TYPE_INT_INPUT_BOX, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{8, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{9, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{10, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{11, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{12, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{13, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{14, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{15, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{16, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{17, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{1, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{2, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{3, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{4, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{5, DJI_WIDGET_TYPE_SCALE, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{6, DJI_WIDGET_TYPE_INT_INPUT_BOX, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{7, DJI_WIDGET_TYPE_SWITCH, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{8, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{9, DJI_WIDGET_TYPE_LIST, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
{10, DJI_WIDGET_TYPE_BUTTON, DjiTestWidget_SetWidgetValue, DjiTestWidget_GetWidgetValue, NULL},
};
static char *s_widgetTypeNameArray[] = {
static const char *s_widgetTypeNameArray[] = {
"Unknown",
"Button",
"Switch",
@ -139,6 +137,8 @@ static char *s_widgetTypeNameArray[] = {
static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
static int32_t s_widgetValueList[sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem)] = {0};
static bool s_isWidgetFileDirPathConfigured = false;
static char s_widgetFileDirPath[DJI_FILE_PATH_SIZE_MAX] = {0};
/* Exported functions definition ---------------------------------------------*/
void DjiTest_WidgetLogAppend(const char *fmt, ...)
@ -179,7 +179,7 @@ T_DjiReturnCode DjiTest_WidgetInteractionStartService(void)
return djiStat;
}
#ifdef SYSTEM_ARCH_LINUX
#ifdef SYSTEM_ARCH_LINUX_DISABLEED
//Step 2 : Set UI Config (Linux environment)
char curFileDirPath[WIDGET_DIR_PATH_LEN_MAX];
char tempPath[WIDGET_DIR_PATH_LEN_MAX];
@ -189,7 +189,11 @@ T_DjiReturnCode DjiTest_WidgetInteractionStartService(void)
return djiStat;
}
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", curFileDirPath);
if (s_isWidgetFileDirPathConfigured == true) {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", s_widgetFileDirPath);
} else {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/en_big_screen", curFileDirPath);
}
//set default ui config path
djiStat = DjiWidget_RegDefaultUiConfigByDirPath(tempPath);
@ -208,7 +212,11 @@ T_DjiReturnCode DjiTest_WidgetInteractionStartService(void)
}
//set ui config for Chinese language
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", curFileDirPath);
if (s_isWidgetFileDirPathConfigured == true) {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", s_widgetFileDirPath);
} else {
snprintf(tempPath, WIDGET_DIR_PATH_LEN_MAX, "%swidget_file/cn_big_screen", curFileDirPath);
}
djiStat = DjiWidget_RegUiConfigByDirPath(DJI_MOBILE_APP_LANGUAGE_CHINESE,
DJI_MOBILE_APP_SCREEN_TYPE_BIG_SCREEN,
@ -254,6 +262,15 @@ T_DjiReturnCode DjiTest_WidgetInteractionStartService(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode DjiTest_WidgetInteractionSetConfigFilePath(const char *path)
{
memset(s_widgetFileDirPath, 0, sizeof(s_widgetFileDirPath));
memcpy(s_widgetFileDirPath, path, USER_UTIL_MIN(strlen(path), sizeof(s_widgetFileDirPath) - 1));
s_isWidgetFileDirPathConfigured = true;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
#ifndef __CC_ARM
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
@ -276,6 +293,7 @@ static void *DjiTest_WidgetTask(void *arg)
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("Get system time ms error, stat = 0x%08llX", djiStat);
}
#ifndef USER_FIRMWARE_MAJOR_VERSION
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN,
"System time : %u ms \r\n%s \r\n%s \r\n%s \r\n%s \r\n%s \r\n",
sysTimeMs,
@ -284,6 +302,13 @@ static void *DjiTest_WidgetTask(void *arg)
s_djiTestWidgetLog[2].content,
s_djiTestWidgetLog[3].content,
s_djiTestWidgetLog[4].content);
#else
snprintf(message, DJI_WIDGET_FLOATING_WINDOW_MSG_MAX_LEN,
"System time : %u ms\r\nVersion: v%02d.%02d.%02d.%02d\r\nBuild time: %s %s", sysTimeMs,
USER_FIRMWARE_MAJOR_VERSION, USER_FIRMWARE_MINOR_VERSION,
USER_FIRMWARE_MODIFY_VERSION, USER_FIRMWARE_DEBUG_VERSION,
__DATE__, __TIME__);
#endif
djiStat = DjiWidgetFloatingWindow_ShowMessage(message);
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
@ -392,9 +417,6 @@ static void *DjiTest_WidgetInteractionTask(void *arg)
case E_DJI_SAMPLE_INDEX_FC_SUBSCRIPTION:
DjiTest_FcSubscriptionRunSample();
break;
case E_DJI_SAMPLE_INDEX_CAMERA_MANAGER:
DjiTest_CameraManagerRunSample(s_mountPosition, s_cameraManagerSampleSelect);
break;
case E_DJI_SAMPLE_INDEX_GIMBAL_MANAGER_FREE_MODE:
DjiTest_GimbalManagerRunSample(s_mountPosition, DJI_GIMBAL_MODE_FREE);
break;
@ -413,28 +435,72 @@ static void *DjiTest_WidgetInteractionTask(void *arg)
break;
case E_DJI_SAMPLE_INDEX_PERCEPTION:
#ifdef SYSTEM_ARCH_LINUX
DjiTest_PerceptionRunSample(s_perceptionDirection);
DjiTest_PerceptionRunSample(DJI_PERCEPTION_RECTIFY_FRONT);
#else
USER_LOG_WARN("This feature does not support RTOS platform.");
#endif
break;
case E_DJI_SAMPLE_INDEX_SWITCH_ALIAS:
DjiTestWidget_TriggerChangeAlias();
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_SHUTTER_SPEED:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_SHUTTER_SPEED);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_APERTURE:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_APERTURE);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_EV:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_EV);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_ISO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_ISO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_FOCUS_POINT:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_FOCUS_POINT);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_TAP_ZOOM:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_TAP_ZOOM_POINT);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_OPTICAL_ZOOM:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SET_CAMERA_ZOOM_PARAM);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_SINGLE_PHOTO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_SINGLE_PHOTO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_AEB_PHOTO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_AEB_PHOTO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_BURST_PHOTO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_BURST_PHOTO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_INTERVAL_PHOTO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_SHOOT_INTERVAL_PHOTO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_RECORDER_VIDEO:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_RECORD_VIDEO);
break;
case E_DJI_SAMPLE_INDEX_CAMMGR_MEDIA_DOWNLOAD:
DjiTest_CameraManagerRunSample(s_mountPosition,
E_DJI_TEST_CAMERA_MANAGER_SAMPLE_SELECT_DOWNLOAD_AND_DELETE_MEDIA_FILE);
break;
default:
break;
}
} else {
switch (s_payloadPortSampleIndex) {
case E_DJI_SAMPLE_INDEX_SWITCH_ALIAS:
DjiTestWidget_TriggerChangeAlias();
break;
case E_DJI_SAMPLE_INDEX_FC_SUB_LOG_ON_OFF:
DjiTest_FcSubscriptionDataShowTrigger();
break;
case E_DJI_SAMPLE_INDEX_COLLABORATION_LOG_ON_OFF:
DjiTest_PayloadCollaborationDataShowTrigger();
break;
default:
break;
}
USER_LOG_WARN("Can't support on payload port.");
break;
}
USER_LOG_INFO("--------------------------------------------------------------------------------------------->");
@ -457,37 +523,19 @@ static T_DjiReturnCode DjiTestWidget_SetWidgetValue(E_DjiWidgetType widgetType,
s_widgetTypeNameArray[widgetType], index, value);
s_widgetValueList[index] = value;
if (widgetType == DJI_WIDGET_TYPE_SWITCH && index == 9) {
if (widgetType == DJI_WIDGET_TYPE_SWITCH && index == 7) {
s_isallowRunFlightControlSample = value;
}
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 10) {
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 8) {
s_mountPosition = value + 1;
}
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 11) {
s_perceptionDirection = value;
}
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 12) {
s_cameraManagerSampleSelect = value;
}
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 13) {
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 9) {
s_extensionPortSampleIndex = value;
}
if (widgetType == DJI_WIDGET_TYPE_BUTTON && index == 14) {
if (value == 1) {
s_isSampleStart = true;
}
}
if (widgetType == DJI_WIDGET_TYPE_LIST && index == 16) {
s_payloadPortSampleIndex = value;
}
if (widgetType == DJI_WIDGET_TYPE_BUTTON && index == 17) {
if (widgetType == DJI_WIDGET_TYPE_BUTTON && index == 10) {
if (value == 1) {
s_isSampleStart = true;
}
@ -509,14 +557,20 @@ static T_DjiReturnCode DjiTestWidget_GetWidgetValue(E_DjiWidgetType widgetType,
static T_DjiReturnCode DjiTestWidget_TriggerChangeAlias(void)
{
USER_LOG_INFO("Payload alias sample start");
if (s_isAliasChanged == false) {
DjiCore_SetAlias("測試test!@#$%^&*()");
USER_LOG_INFO("Set payload alias to '測試test!@#$%^&*()' ");
s_isAliasChanged = true;
} else {
DjiCore_SetAlias("PSDK_APPALIAS");
USER_LOG_INFO("Set payload alias to 'PSDK_APPALIAS' ");
s_isAliasChanged = false;
}
USER_LOG_INFO("Payload alias sample end");
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

View File

@ -40,6 +40,7 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode DjiTest_WidgetInteractionStartService(void);
T_DjiReturnCode DjiTest_WidgetInteractionSetConfigFilePath(const char *path);
void DjiTest_WidgetLogAppend(const char *fmt, ...);
#ifdef __cplusplus

View File

@ -15,7 +15,7 @@
{
"widget_index": 0,
"widget_type": "button",
"widget_name": "按钮_1",
"widget_name": "按钮",
"icon_file_set": {
"icon_file_name_selected": "icon_button1.png",
"icon_file_name_unselected": "icon_button1.png"
@ -27,19 +27,6 @@
},
{
"widget_index": 1,
"widget_type": "button",
"widget_name": "按钮_2",
"icon_file_set": {
"icon_file_name_selected": "icon_button2.png",
"icon_file_name_unselected": "icon_button2.png"
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 1
}
},
{
"widget_index": 2,
"widget_type": "list",
"widget_name": "列表",
"list_item": [
@ -60,11 +47,11 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 2
"mapping_config_display_order": 1
}
},
{
"widget_index": 3,
"widget_index": 2,
"widget_type": "switch",
"widget_name": "开关",
"icon_file_set": {
@ -73,11 +60,11 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 3
"mapping_config_display_order": 2
}
},
{
"widget_index": 4,
"widget_index": 3,
"widget_type": "scale",
"widget_name": "范围条",
"icon_file_set": {
@ -86,7 +73,7 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4
"mapping_config_display_order": 3
}
}
]
@ -99,9 +86,18 @@
},
"widget_list": [
{
"widget_index": 5,
"widget_index": 4,
"widget_type": "button",
"widget_name": "按钮 5",
"widget_name": "按钮 4",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4
}
},
{
"widget_index": 5,
"widget_type": "scale",
"widget_name": "范围条 5",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 5
@ -109,39 +105,17 @@
},
{
"widget_index": 6,
"widget_type": "scale",
"widget_name": "范围条 6",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 6
}
},
{
"widget_index": 7,
"widget_type": "int_input_box",
"widget_name": "整形值输入框 7",
"widget_name": "整形值输入框 6",
"int_input_box_hint": "unit:s"
},
{
"widget_index": 8,
"widget_type": "button",
"widget_name": "=========>> [Extension Port Test] <<=========",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 7
}
},
{
"widget_index": 9,
"widget_index": 7,
"widget_type": "switch",
"widget_name": "Unlock flight control restrictions (Special attention)",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 8
}
"widget_name": "Unlock flight control restrictions (Special attention)"
},
{
"widget_index": 10,
"widget_index": 8,
"widget_type": "list",
"widget_name": "Please Select Payload Index",
"list_item": [
@ -154,190 +128,103 @@
{
"item_name": "payload_index3"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 9
}
]
},
{
"widget_index": 11,
"widget_type": "list",
"widget_name": "Please Select Perception Camera Index",
"list_item": [
{
"item_name": "Down"
},
{
"item_name": "Front"
},
{
"item_name": "Rear"
},
{
"item_name": "Up"
},
{
"item_name": "Left"
},
{
"item_name": "Right"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 10
}
},
{
"widget_index": 12,
"widget_type": "list",
"widget_name": "Please Select Camera Function",
"list_item": [
{
"item_name": "set camera shutter speed"
},
{
"item_name": "set camera aperture"
},
{
"item_name": "set camera exposure compensation"
},
{
"item_name": "set camera ISO"
},
{
"item_name": "set camera focus point"
},
{
"item_name": "camera tap zoom"
},
{
"item_name": "camera optical zoom"
},
{
"item_name": "shoot single photo"
},
{
"item_name": "shoot AEB photo"
},
{
"item_name": "shoot burst photo"
},
{
"item_name": "shoot interval photo"
},
{
"item_name": "record video"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 11
}
},
{
"widget_index": 13,
"widget_index": 9,
"widget_type": "list",
"widget_name": "Please Select Sample",
"list_item": [
{
"item_name": "fc_subscription"
"item_name": "01_test_fc_subscription"
},
{
"item_name": "waypoint_v2"
"item_name": "02_test_waypoint_v2"
},
{
"item_name": "waypoint_v3"
"item_name": "03_test_waypoint_v3"
},
{
"item_name": "flight_ctrl_takeoff_landing"
"item_name": "04_test_flight_ctrl_takeoff_landing"
},
{
"item_name": "flight_ctrl_position_ctrl"
"item_name": "05_test_flight_ctrl_position_ctrl"
},
{
"item_name": "flight_ctrl_force_landing"
"item_name": "06_test_flight_ctrl_force_landing"
},
{
"item_name": "flight_ctrl_velocity_ctrl"
"item_name": "07_test_flight_ctrl_velocity_ctrl"
},
{
"item_name": "flight_ctrl_arrest_flying"
"item_name": "08_test_flight_ctrl_arrest_flying"
},
{
"item_name": "flight_ctrl_set_get_param"
"item_name": "09_test_flight_ctrl_set_get_param"
},
{
"item_name": "hms_info"
"item_name": "10_test_hms_info"
},
{
"item_name": "camera_manager"
"item_name": "11_gimbal_manager_free_mode"
},
{
"item_name": "gimbal_manager_free_mode"
"item_name": "12_gimbal_manager_yaw_follow_mode"
},
{
"item_name": "gimbal_manager_yaw_follow_mode"
"item_name": "13_test_liveview"
},
{
"item_name": "liveview"
"item_name": "14_test_perception"
},
{
"item_name": "perception"
"item_name": "15_test_set_payload_alias"
},
{
"item_name": "16_test_cammgr-set/get_shutter_speed"
},
{
"item_name": "17_test_cammgr-set/get_aperture"
},
{
"item_name": "18_test_cammgr-set/get_ev"
},
{
"item_name": "19_test_cammgr-set/get_iso"
},
{
"item_name": "20_test_cammgr-focus_point"
},
{
"item_name": "21_test_cammgr-tap_zoom"
},
{
"item_name": "22_test_cammgr-optical_zoom"
},
{
"item_name": "23_test_cammgr-single_photo"
},
{
"item_name": "24_test_cammgr-AEB_photo"
},
{
"item_name": "25_test_cammgr-burst_photo"
},
{
"item_name": "26_test_cammgr-interval_photo"
},
{
"item_name": "27_test_cammgr-recorder_video"
},
{
"item_name": "28_test_cammgr-media_download"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 12
}
]
},
{
"widget_index": 14,
"widget_index": 10,
"widget_type": "button",
"widget_name": "Run",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 13
}
},
{
"widget_index": 15,
"widget_type": "button",
"widget_name": "=========>> [Payload Port Test] <<=========",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 14
}
},
{
"widget_index": 16,
"widget_type": "list",
"widget_name": "Please Select Sample",
"list_item": [
{
"item_name": "change_alias"
},
{
"item_name": "fc_subscription_log_on/off"
},
{
"item_name": "collaboration_log_on/off"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 15
}
},
{
"widget_index": 17,
"widget_type": "button",
"widget_name": "Run",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 16
}
"widget_name": "Run"
}
]
}

View File

@ -15,7 +15,7 @@
{
"widget_index": 0,
"widget_type": "button",
"widget_name": "Button_1",
"widget_name": "Button",
"icon_file_set": {
"icon_file_name_selected": "icon_button1.png",
"icon_file_name_unselected": "icon_button1.png"
@ -27,19 +27,6 @@
},
{
"widget_index": 1,
"widget_type": "button",
"widget_name": "Button_2",
"icon_file_set": {
"icon_file_name_selected": "icon_button2.png",
"icon_file_name_unselected": "icon_button2.png"
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 1
}
},
{
"widget_index": 2,
"widget_type": "list",
"widget_name": "List",
"list_item": [
@ -60,11 +47,11 @@
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 2
"mapping_config_display_order": 1
}
},
{
"widget_index": 3,
"widget_index": 2,
"widget_type": "switch",
"widget_name": "Switch",
"icon_file_set": {
@ -73,11 +60,11 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 3
"mapping_config_display_order": 2
}
},
{
"widget_index": 4,
"widget_index": 3,
"widget_type": "scale",
"widget_name": "Scale",
"icon_file_set": {
@ -86,8 +73,7 @@
},
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4,
"button_value_step_length": 5
"mapping_config_display_order": 3
}
}
]
@ -100,9 +86,18 @@
},
"widget_list": [
{
"widget_index": 5,
"widget_index": 4,
"widget_type": "button",
"widget_name": "Button 5",
"widget_name": "Button 4",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 4
}
},
{
"widget_index": 5,
"widget_type": "scale",
"widget_name": "Scale 5",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 5
@ -110,40 +105,17 @@
},
{
"widget_index": 6,
"widget_type": "scale",
"widget_name": "Scale 6",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 6,
"button_value_step_length": 5
}
},
{
"widget_index": 7,
"widget_type": "int_input_box",
"widget_name": "Integer Input Box 7",
"widget_name": "Integer Input Box 6",
"int_input_box_hint": "unit:s"
},
{
"widget_index": 8,
"widget_type": "button",
"widget_name": "=========>> [Extension Port Test] <<=========",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 7
}
},
{
"widget_index": 9,
"widget_index": 7,
"widget_type": "switch",
"widget_name": "Unlock flight control restrictions (Special attention)",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 8
}
"widget_name": "Unlock flight control restrictions (Special attention)"
},
{
"widget_index": 10,
"widget_index": 8,
"widget_type": "list",
"widget_name": "Please Select Payload Index",
"list_item": [
@ -156,190 +128,103 @@
{
"item_name": "payload_index3"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 9
}
]
},
{
"widget_index": 11,
"widget_type": "list",
"widget_name": "Please Select Perception Camera Index",
"list_item": [
{
"item_name": "Down"
},
{
"item_name": "Front"
},
{
"item_name": "Rear"
},
{
"item_name": "Up"
},
{
"item_name": "Left"
},
{
"item_name": "Right"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 10
}
},
{
"widget_index": 12,
"widget_type": "list",
"widget_name": "Please Select Camera Function",
"list_item": [
{
"item_name": "set camera shutter speed"
},
{
"item_name": "set camera aperture"
},
{
"item_name": "set camera exposure compensation"
},
{
"item_name": "set camera ISO"
},
{
"item_name": "set camera focus point"
},
{
"item_name": "camera tap zoom"
},
{
"item_name": "camera optical zoom"
},
{
"item_name": "shoot single photo"
},
{
"item_name": "shoot AEB photo"
},
{
"item_name": "shoot burst photo"
},
{
"item_name": "shoot interval photo"
},
{
"item_name": "record video"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 11
}
},
{
"widget_index": 13,
"widget_index": 9,
"widget_type": "list",
"widget_name": "Please Select Sample",
"list_item": [
{
"item_name": "fc_subscription"
"item_name": "01_test_fc_subscription"
},
{
"item_name": "waypoint_v2"
"item_name": "02_test_waypoint_v2"
},
{
"item_name": "waypoint_v3"
"item_name": "03_test_waypoint_v3"
},
{
"item_name": "flight_ctrl_takeoff_landing"
"item_name": "04_test_flight_ctrl_takeoff_landing"
},
{
"item_name": "flight_ctrl_position_ctrl"
"item_name": "05_test_flight_ctrl_position_ctrl"
},
{
"item_name": "flight_ctrl_force_landing"
"item_name": "06_test_flight_ctrl_force_landing"
},
{
"item_name": "flight_ctrl_velocity_ctrl"
"item_name": "07_test_flight_ctrl_velocity_ctrl"
},
{
"item_name": "flight_ctrl_arrest_flying"
"item_name": "08_test_flight_ctrl_arrest_flying"
},
{
"item_name": "flight_ctrl_set_get_param"
"item_name": "09_test_flight_ctrl_set_get_param"
},
{
"item_name": "hms_info"
"item_name": "10_test_hms_info"
},
{
"item_name": "camera_manager"
"item_name": "11_gimbal_manager_free_mode"
},
{
"item_name": "gimbal_manager_free_mode"
"item_name": "12_gimbal_manager_yaw_follow_mode"
},
{
"item_name": "gimbal_manager_yaw_follow_mode"
"item_name": "13_test_liveview"
},
{
"item_name": "liveview"
"item_name": "14_test_perception"
},
{
"item_name": "perception"
"item_name": "15_test_set_payload_alias"
},
{
"item_name": "16_test_cammgr-set/get_shutter_speed"
},
{
"item_name": "17_test_cammgr-set/get_aperture"
},
{
"item_name": "18_test_cammgr-set/get_ev"
},
{
"item_name": "19_test_cammgr-set/get_iso"
},
{
"item_name": "20_test_cammgr-focus_point"
},
{
"item_name": "21_test_cammgr-tap_zoom"
},
{
"item_name": "22_test_cammgr-optical_zoom"
},
{
"item_name": "23_test_cammgr-single_photo"
},
{
"item_name": "24_test_cammgr-AEB_photo"
},
{
"item_name": "25_test_cammgr-burst_photo"
},
{
"item_name": "26_test_cammgr-interval_photo"
},
{
"item_name": "27_test_cammgr-recorder_video"
},
{
"item_name": "28_test_cammgr-media_download"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 12
}
]
},
{
"widget_index": 14,
"widget_index": 10,
"widget_type": "button",
"widget_name": "Run",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 13
}
},
{
"widget_index": 15,
"widget_type": "button",
"widget_name": "=========>> [Payload Port Test] <<=========",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 14
}
},
{
"widget_index": 16,
"widget_type": "list",
"widget_name": "Please Select Sample",
"list_item": [
{
"item_name": "change_alias"
},
{
"item_name": "fc_subscription_log_on/off"
},
{
"item_name": "collaboration_log_on/off"
}
],
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 15
}
},
{
"widget_index": 17,
"widget_type": "button",
"widget_name": "Run",
"customize_rc_buttons_config": {
"is_enable": true,
"mapping_config_display_order": 16
}
"widget_name": "Run"
}
]
}

View File

@ -6,9 +6,9 @@
/* Contents of file widget_config.json */
#define widget_config_json_fileName "widget_config.json"
#define widget_config_json_fileSize 8744
#define widget_config_json_fileSize 6000
static const uint8_t widget_config_json_fileBinaryArray[8744] = {
static const uint8_t widget_config_json_fileBinaryArray[6000] = {
0x7B, 0x0A, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A,
@ -17,118 +17,28 @@ static const uint8_t widget_config_json_fileBinaryArray[8744] = {
0x66, 0x6C, 0x6F, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x5F, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6C,
0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x30, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C,
0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F,
0x32, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65,
0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E,
0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x32, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F,
0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75,
0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61,
0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73,
0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22,
0x3A, 0x20, 0x32, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73,
0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74,
0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x49, 0x74, 0x65, 0x6D, 0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x70, 0x65, 0x61, 0x6B, 0x65, 0x72, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x5F, 0x74, 0x74, 0x73, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x5F, 0x76, 0x6F, 0x69, 0x63, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x30, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79,
0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69,
0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F,
0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D,
0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64,
0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74,
0x65, 0x6D, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x5F, 0x32,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E,
0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E,
0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F,
0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x32, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x33, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C,
0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22,
0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64,
0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F,
0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20,
0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x31, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62,
0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20,
@ -136,426 +46,344 @@ static const uint8_t widget_config_json_fileBinaryArray[8744] = {
0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E,
0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79,
0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x33, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x30, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x34, 0x2C,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C,
0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65,
0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D,
0x5F, 0x31, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22,
0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x31, 0x2E, 0x70, 0x6E,
0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x31, 0x2E,
0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x74, 0x65, 0x6D, 0x5F, 0x32, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E,
0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65,
0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C, 0x69, 0x73,
0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F,
0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x6C,
0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x32, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73,
0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E,
0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C,
0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65,
0x72, 0x22, 0x3A, 0x20, 0x31, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A,
0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73,
0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F,
0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74,
0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61,
0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63,
0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72,
0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x34, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x76, 0x61, 0x6C, 0x75, 0x65,
0x5F, 0x73, 0x74, 0x65, 0x70, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x22, 0x3A, 0x20, 0x35,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x22, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65, 0x78, 0x74, 0x5F,
0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x42, 0x6F, 0x78,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x68,
0x6F, 0x6C, 0x64, 0x65, 0x72, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C,
0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x6D, 0x65, 0x73, 0x73, 0x61,
0x67, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x6C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x35, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x32, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x35, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69,
0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F,
0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20,
0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F,
0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20,
0x35, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64,
0x65, 0x78, 0x22, 0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x53, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x36, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73,
0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69,
0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61,
0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x5F, 0x76,
0x61, 0x6C, 0x75, 0x65, 0x5F, 0x73, 0x74, 0x65, 0x70, 0x5F, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
0x22, 0x3A, 0x20, 0x35, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65,
0x5F, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69,
0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63,
0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22,
0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5F, 0x75, 0x6E, 0x73, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75,
0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F,
0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62,
0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F,
0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64,
0x65, 0x72, 0x22, 0x3A, 0x20, 0x32, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x33, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F,
0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66, 0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x5F, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63,
0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x66,
0x69, 0x6C, 0x65, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x75, 0x6E, 0x73, 0x65, 0x6C, 0x65, 0x63,
0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x63, 0x6F, 0x6E, 0x5F, 0x73, 0x63, 0x61, 0x6C,
0x65, 0x2E, 0x70, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F,
0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22,
0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22,
0x3A, 0x20, 0x33, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x69, 0x6E, 0x74, 0x65, 0x72,
0x66, 0x61, 0x63, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x65,
0x78, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x65, 0x78, 0x74, 0x49, 0x6E, 0x70, 0x75, 0x74,
0x42, 0x6F, 0x78, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6C, 0x61,
0x63, 0x65, 0x68, 0x6F, 0x6C, 0x64, 0x65, 0x72, 0x5F, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3A, 0x20,
0x22, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x6D, 0x65,
0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x34, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74,
0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x20, 0x34,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74,
0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65,
0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66,
0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72,
0x22, 0x3A, 0x20, 0x34, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x37, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x35, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x6E, 0x74, 0x65, 0x67,
0x65, 0x72, 0x20, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x20, 0x42, 0x6F, 0x78, 0x20, 0x37, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E,
0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x5F, 0x68, 0x69, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x22,
0x75, 0x6E, 0x69, 0x74, 0x3A, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A,
0x20, 0x38, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74,
0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x3D, 0x3D, 0x3D,
0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x20, 0x5B, 0x45, 0x78, 0x74, 0x65, 0x6E, 0x73,
0x69, 0x6F, 0x6E, 0x20, 0x50, 0x6F, 0x72, 0x74, 0x20, 0x54, 0x65, 0x73, 0x74, 0x5D, 0x20, 0x3C,
0x3C, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x3A, 0x20, 0x22, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x20, 0x35, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F,
0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69,
0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75,
0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61,
0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73,
0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x37, 0x0A, 0x20,
0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x35, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22,
0x3A, 0x20, 0x39, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69,
0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x6E,
0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74,
0x72, 0x6F, 0x6C, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
0x20, 0x28, 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6C, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6E, 0x74,
0x69, 0x6F, 0x6E, 0x29, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74,
0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F,
0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x38, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x30, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20,
0x3A, 0x20, 0x36, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74,
0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F, 0x78, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x49, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x49, 0x6E, 0x70,
0x75, 0x74, 0x20, 0x42, 0x6F, 0x78, 0x20, 0x36, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x5F, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x62, 0x6F,
0x78, 0x5F, 0x68, 0x69, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x6E, 0x69, 0x74, 0x3A, 0x73,
0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67,
0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x37, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79,
0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65,
0x6C, 0x65, 0x63, 0x74, 0x20, 0x50, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x49, 0x6E, 0x64,
0x65, 0x78, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69,
0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x31,
0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D,
0x65, 0x22, 0x3A, 0x20, 0x22, 0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x69, 0x6E, 0x64,
0x65, 0x78, 0x32, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x33, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A,
0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74,
0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64,
0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x39,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65,
0x78, 0x22, 0x3A, 0x20, 0x31, 0x31, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50,
0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x50, 0x65, 0x72,
0x63, 0x65, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x43, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x20, 0x49,
0x6E, 0x64, 0x65, 0x78, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x44, 0x6F, 0x77, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F,
0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x52, 0x65, 0x61, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x55, 0x70, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x65, 0x66, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x52, 0x69, 0x67, 0x68, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65,
0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66,
0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72,
0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D,
0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69,
0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x30,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65,
0x78, 0x22, 0x3A, 0x20, 0x31, 0x32, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50,
0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x43, 0x61, 0x6D,
0x65, 0x72, 0x61, 0x20, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65,
0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x65, 0x74, 0x20,
0x63, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x20, 0x73, 0x68, 0x75, 0x74, 0x74, 0x65, 0x72, 0x20, 0x73,
0x70, 0x65, 0x65, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x65, 0x74, 0x20, 0x63, 0x61, 0x6D,
0x65, 0x72, 0x61, 0x20, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x22, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x73, 0x65, 0x74, 0x20, 0x63, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x20, 0x65, 0x78, 0x70, 0x6F,
0x73, 0x75, 0x72, 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x65, 0x6E, 0x73, 0x61, 0x74, 0x69, 0x6F,
0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x65, 0x74, 0x20, 0x63, 0x61, 0x6D, 0x65, 0x72, 0x61,
0x20, 0x49, 0x53, 0x4F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x65, 0x74, 0x20, 0x63, 0x61, 0x6D,
0x65, 0x72, 0x61, 0x20, 0x66, 0x6F, 0x63, 0x75, 0x73, 0x20, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x63, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x20, 0x74, 0x61, 0x70, 0x20, 0x7A,
0x6F, 0x6F, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x63, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x20, 0x6F,
0x70, 0x74, 0x69, 0x63, 0x61, 0x6C, 0x20, 0x7A, 0x6F, 0x6F, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x73, 0x68, 0x6F, 0x6F, 0x74, 0x20, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x70, 0x68, 0x6F,
0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x68, 0x6F, 0x6F, 0x74, 0x20, 0x41, 0x45, 0x42,
0x20, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74,
0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x68, 0x6F, 0x6F, 0x74,
0x20, 0x62, 0x75, 0x72, 0x73, 0x74, 0x20, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x73, 0x68, 0x6F, 0x6F, 0x74, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20,
0x70, 0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x72, 0x65, 0x63, 0x6F, 0x72, 0x64,
0x20, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A,
0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E,
0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74,
0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64,
0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31,
0x31, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64,
0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x33, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x53, 0x61,
0x6D, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x66, 0x63, 0x5F, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x77, 0x61, 0x79, 0x70, 0x6F, 0x69, 0x6E, 0x74,
0x5F, 0x76, 0x32, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63,
0x74, 0x72, 0x6C, 0x5F, 0x74, 0x61, 0x6B, 0x65, 0x6F, 0x66, 0x66, 0x5F, 0x6C, 0x61, 0x6E, 0x64,
0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63,
0x74, 0x72, 0x6C, 0x5F, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x5F, 0x63, 0x74, 0x72,
0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72,
0x6C, 0x5F, 0x66, 0x6F, 0x72, 0x63, 0x65, 0x5F, 0x6C, 0x61, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F,
0x76, 0x65, 0x6C, 0x6F, 0x63, 0x69, 0x74, 0x79, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F, 0x61, 0x72,
0x72, 0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C, 0x79, 0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F, 0x73, 0x65, 0x74, 0x5F,
0x67, 0x65, 0x74, 0x5F, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x68, 0x6D,
0x73, 0x5F, 0x69, 0x6E, 0x66, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74,
0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x63, 0x61, 0x6D, 0x65, 0x72,
0x61, 0x5F, 0x6D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69,
0x6D, 0x62, 0x61, 0x6C, 0x5F, 0x6D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x5F, 0x66, 0x72, 0x65,
0x65, 0x5F, 0x6D, 0x6F, 0x64, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74,
0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x6D, 0x62, 0x61,
0x6C, 0x5F, 0x6D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x5F, 0x79, 0x61, 0x77, 0x5F, 0x66, 0x6F,
0x6C, 0x6C, 0x6F, 0x77, 0x5F, 0x6D, 0x6F, 0x64, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69,
0x76, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74,
0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x70, 0x65, 0x72, 0x63, 0x65,
0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65,
0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66,
0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72,
0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D,
0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69,
0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x32,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65,
0x78, 0x22, 0x3A, 0x20, 0x31, 0x34, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x52, 0x75, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74,
0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F,
0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x33, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x35, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D,
0x3D, 0x3D, 0x3D, 0x3E, 0x3E, 0x20, 0x5B, 0x50, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x50,
0x6F, 0x72, 0x74, 0x20, 0x54, 0x65, 0x73, 0x74, 0x5D, 0x20, 0x3C, 0x3C, 0x3D, 0x3D, 0x3D, 0x3D,
0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75,
0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65,
0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67,
0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F,
0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x34, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77,
0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x36,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20,
0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x2C, 0x0A,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x6E, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x66, 0x6C,
0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x72, 0x6F, 0x6C, 0x20, 0x72, 0x65, 0x73,
0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x28, 0x53, 0x70, 0x65, 0x63, 0x69,
0x61, 0x6C, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x6F, 0x6E, 0x29, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F,
0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x38, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x50, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20,
0x50, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74, 0x5F, 0x69, 0x74,
0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x63, 0x68, 0x61,
0x6E, 0x67, 0x65, 0x5F, 0x61, 0x6C, 0x69, 0x61, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x66, 0x63,
0x5F, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x5F, 0x6C, 0x6F,
0x67, 0x5F, 0x6F, 0x6E, 0x2F, 0x6F, 0x66, 0x66, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x70, 0x61, 0x79,
0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x32, 0x22, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22,
0x3A, 0x20, 0x22, 0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78,
0x33, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22,
0x3A, 0x20, 0x39, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69,
0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6C, 0x69, 0x73,
0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64,
0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6C, 0x65, 0x61,
0x73, 0x65, 0x20, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x20, 0x53, 0x61, 0x6D, 0x70, 0x6C, 0x65,
0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x69, 0x73, 0x74,
0x5F, 0x69, 0x74, 0x65, 0x6D, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x30, 0x31, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x66, 0x63, 0x5F, 0x73, 0x75, 0x62, 0x73, 0x63,
0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x30, 0x32, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x77, 0x61, 0x79, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x5F, 0x76, 0x32, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x30, 0x33, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x77, 0x61, 0x79, 0x70,
0x6F, 0x69, 0x6E, 0x74, 0x5F, 0x76, 0x33, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x30, 0x34, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F,
0x74, 0x61, 0x6B, 0x65, 0x6F, 0x66, 0x66, 0x5F, 0x6C, 0x61, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x30, 0x35, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C, 0x69, 0x67,
0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F, 0x70, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E,
0x5F, 0x63, 0x74, 0x72, 0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x30, 0x36, 0x5F, 0x74, 0x65, 0x73,
0x74, 0x5F, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F, 0x66, 0x6F,
0x72, 0x63, 0x65, 0x5F, 0x6C, 0x61, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x30, 0x37, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63,
0x74, 0x72, 0x6C, 0x5F, 0x76, 0x65, 0x6C, 0x6F, 0x63, 0x69, 0x74, 0x79, 0x5F, 0x63, 0x74, 0x72,
0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61,
0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x30, 0x38, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C,
0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F, 0x61, 0x72, 0x72, 0x65, 0x73, 0x74,
0x5F, 0x66, 0x6C, 0x79, 0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x30, 0x39, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x66, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x5F, 0x63, 0x74, 0x72, 0x6C, 0x5F,
0x73, 0x65, 0x74, 0x5F, 0x67, 0x65, 0x74, 0x5F, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x31, 0x30, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x68, 0x6D, 0x73, 0x5F, 0x69, 0x6E,
0x66, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x31, 0x31, 0x5F, 0x67, 0x69, 0x6D, 0x62, 0x61, 0x6C,
0x5F, 0x6D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x5F, 0x66, 0x72, 0x65, 0x65, 0x5F, 0x6D, 0x6F,
0x64, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x31, 0x32, 0x5F, 0x67, 0x69, 0x6D, 0x62, 0x61, 0x6C,
0x5F, 0x6D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x5F, 0x79, 0x61, 0x77, 0x5F, 0x66, 0x6F, 0x6C,
0x6C, 0x6F, 0x77, 0x5F, 0x6D, 0x6F, 0x64, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x63, 0x6F, 0x6C,
0x6C, 0x61, 0x62, 0x6F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x5F, 0x6C, 0x6F, 0x67, 0x5F, 0x6F,
0x6E, 0x2F, 0x6F, 0x66, 0x66, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65,
0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66,
0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72,
0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D,
0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69,
0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x35,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65,
0x78, 0x22, 0x3A, 0x20, 0x31, 0x37, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x52, 0x75, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x5F, 0x72, 0x63, 0x5F, 0x62, 0x75, 0x74,
0x74, 0x6F, 0x6E, 0x73, 0x5F, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x73, 0x5F, 0x65, 0x6E,
0x61, 0x62, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2C, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x70, 0x70, 0x69, 0x6E, 0x67, 0x5F,
0x63, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x5F, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x6F,
0x72, 0x64, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x31, 0x36, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A
0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x31, 0x33, 0x5F,
0x74, 0x65, 0x73, 0x74, 0x5F, 0x6C, 0x69, 0x76, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x31, 0x34, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70,
0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x31, 0x35, 0x5F, 0x74, 0x65, 0x73, 0x74,
0x5F, 0x73, 0x65, 0x74, 0x5F, 0x70, 0x61, 0x79, 0x6C, 0x6F, 0x61, 0x64, 0x5F, 0x61, 0x6C, 0x69,
0x61, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x31, 0x36, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63,
0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x73, 0x65, 0x74, 0x2F, 0x67, 0x65, 0x74, 0x5F, 0x73, 0x68,
0x75, 0x74, 0x74, 0x65, 0x72, 0x5F, 0x73, 0x70, 0x65, 0x65, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x31, 0x37, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x73,
0x65, 0x74, 0x2F, 0x67, 0x65, 0x74, 0x5F, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x22,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65,
0x22, 0x3A, 0x20, 0x22, 0x31, 0x38, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D,
0x67, 0x72, 0x2D, 0x73, 0x65, 0x74, 0x2F, 0x67, 0x65, 0x74, 0x5F, 0x65, 0x76, 0x22, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A,
0x20, 0x22, 0x31, 0x39, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72,
0x2D, 0x73, 0x65, 0x74, 0x2F, 0x67, 0x65, 0x74, 0x5F, 0x69, 0x73, 0x6F, 0x22, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20,
0x22, 0x32, 0x30, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D,
0x66, 0x6F, 0x63, 0x75, 0x73, 0x5F, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22,
0x32, 0x31, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x74,
0x61, 0x70, 0x5F, 0x7A, 0x6F, 0x6F, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x32, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x6F, 0x70, 0x74, 0x69, 0x63,
0x61, 0x6C, 0x5F, 0x7A, 0x6F, 0x6F, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x33, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x73, 0x69, 0x6E, 0x67, 0x6C,
0x65, 0x5F, 0x70, 0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x34, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x41, 0x45, 0x42, 0x5F, 0x70,
0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D,
0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x35, 0x5F, 0x74, 0x65, 0x73, 0x74,
0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5F, 0x70, 0x68,
0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D,
0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x5F,
0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x36, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x5F,
0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x5F,
0x70, 0x68, 0x6F, 0x74, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65,
0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x37, 0x5F, 0x74, 0x65, 0x73,
0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x72, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x65,
0x72, 0x5F, 0x76, 0x69, 0x64, 0x65, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69,
0x74, 0x65, 0x6D, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x32, 0x38, 0x5F, 0x74,
0x65, 0x73, 0x74, 0x5F, 0x63, 0x61, 0x6D, 0x6D, 0x67, 0x72, 0x2D, 0x6D, 0x65, 0x64, 0x69, 0x61,
0x5F, 0x64, 0x6F, 0x77, 0x6E, 0x6C, 0x6F, 0x61, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D,
0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65,
0x74, 0x5F, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x3A, 0x20, 0x31, 0x30, 0x2C, 0x0A, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x74, 0x79,
0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x5F, 0x6E,
0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x52, 0x75, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x0A, 0x20, 0x20, 0x7D, 0x0A, 0x7D, 0x0A
};
#endif /* __widget_config_json_h_included */

View File

@ -39,6 +39,7 @@ file(GLOB_RECURSE MODULE_SAMPLE_SRC ../../../module_sample/*.c)
include_directories(../../../module_sample)
include_directories(../common)
include_directories(../manifold2/application)
include_directories(../../../../../psdk_lib/include)
link_directories(../../../../../psdk_lib/lib/${TOOLCHAIN_NAME})

View File

@ -34,18 +34,26 @@ extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
#define DJI_USE_ONLY_UART (0)
#define DJI_USE_UART_AND_USB_BULK_DEVICE (1)
#define DJI_USE_UART_AND_NETWORK_DEVICE (2)
/*!< Attention: Select your hardware connection mode here.
* */
#define CONFIG_HARDWARE_CONNECTION DJI_USE_UART_AND_NETWORK_DEVICE
/*!< Attention: Select the sample you want to run here.
* */
#define CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
#define CONFIG_MODULE_SAMPLE_CAMERA_EMU_ON
#define CONFIG_MODULE_SAMPLE_CAMERA_MEDIA_ON
#define CONFIG_MODULE_SAMPLE_GIMBAL_ON
#define CONFIG_MODULE_SAMPLE_GIMBAL_EMU_ON
#define CONFIG_MODULE_SAMPLE_XPORT_ON
#define CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
#define CONFIG_MODULE_SAMPLE_WIDGET_ON
#define CONFIG_MODULE_SAMPLE_WIDGET_SPEAKER_ON
@ -54,8 +62,6 @@ extern "C" {
#define CONFIG_MODULE_SAMPLE_UPGRADE_ON
#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
/*!< Attention: This function needs to be used together with mobile sdk mop sample.
* */
//#define CONFIG_MODULE_SAMPLE_MOP_CHANNEL_ON

View File

@ -189,7 +189,7 @@ int main(int argc, char **argv)
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_ON
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_EMU_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
if (DjiTest_GimbalStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
@ -337,6 +337,7 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
T_DjiHalNetworkHandler networkHandler = {
.NetworkInit = HalNetWork_Init,
.NetworkDeInit = HalNetWork_DeInit,
.NetworkGetDeviceInfo = HalNetWork_GetDeviceInfo,
};
T_DjiHalUsbBulkHandler usbBulkHandler = {
@ -388,30 +389,6 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiPlatform_RegHalUsbBulkHandler(&usbBulkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal usb bulk handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiPlatform_RegHalNetworkHandler(&networkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal network handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiPlatform_RegSocketHandler(&socketHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register osal socket handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
returnCode = DjiPlatform_RegFileSystemHandler(&fileSystemHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register osal filesystem handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
if (DjiUser_LocalWriteFsInit(DJI_LOG_PATH) != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("file system init error");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
@ -429,6 +406,36 @@ static T_DjiReturnCode DjiUser_PrepareSystemEnvironment(void)
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
#if (CONFIG_HARDWARE_CONNECTION == DJI_USE_UART_AND_USB_BULK_DEVICE)
returnCode = DjiPlatform_RegHalUsbBulkHandler(&usbBulkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal usb bulk handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
#elif (CONFIG_HARDWARE_CONNECTION == DJI_USE_UART_AND_NETWORK_DEVICE)
returnCode = DjiPlatform_RegHalNetworkHandler(&networkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal network handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
//Attention: if you want to use camera stream view function, please uncomment it.
returnCode = DjiPlatform_RegSocketHandler(&socketHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register osal socket handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
#elif (CONFIG_HARDWARE_CONNECTION == DJI_USE_ONLY_UART)
/*!< Attention: Only use uart hardware connection.
*/
#endif
returnCode = DjiPlatform_RegFileSystemHandler(&fileSystemHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register osal filesystem handler error");
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

View File

@ -77,6 +77,14 @@ T_DjiReturnCode HalNetWork_DeInit(T_DjiNetworkHandle halObj)
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode HalNetWork_GetDeviceInfo(T_DjiHalNetworkDeviceInfo *deviceInfo)
{
deviceInfo->usbNetAdapter.vid = USB_NET_ADAPTER_VID;
deviceInfo->usbNetAdapter.pid = USB_NET_ADAPTER_PID;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/* Private functions definition-----------------------------------------------*/
/****************** (C) COPYRIGHT DJI Innovations *****END OF FILE****/

View File

@ -40,14 +40,21 @@ extern "C" {
* NIC name micro define as #define 'LINUX_NETWORK_DEV "your NIC name"'.
*/
#ifdef PLATFORM_ARCH_x86_64
#define LINUX_NETWORK_DEV "enp0s31f6"
#define LINUX_NETWORK_DEV "enx000ec6688213"
#else
#define LINUX_NETWORK_DEV "eth0"
#define LINUX_NETWORK_DEV "l4tbr0"
#endif
/**
* @attention
*/
#ifdef PLATFORM_ARCH_x86_64
#define USB_NET_ADAPTER_VID (0x0B95)
#define USB_NET_ADAPTER_PID (0x1790)
#else
#define USB_NET_ADAPTER_VID (0x0955)
#define USB_NET_ADAPTER_PID (0x7020)
#endif
#define LINUX_CMD_STR_MAX_SIZE (128)
@ -56,6 +63,7 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode HalNetWork_Init(const char *ipAddr, const char *netMask, T_DjiNetworkHandle *halObj);
T_DjiReturnCode HalNetWork_DeInit(T_DjiNetworkHandle halObj);
T_DjiReturnCode HalNetWork_GetDeviceInfo(T_DjiHalNetworkDeviceInfo *deviceInfo);
#ifdef __cplusplus
}

View File

@ -33,7 +33,7 @@
/* Private types -------------------------------------------------------------*/
typedef struct {
int uartFd;
int32_t uartFd;
} T_UartHandleStruct;
/* Private values -------------------------------------------------------------*/
@ -43,7 +43,7 @@ typedef struct {
/* Exported functions definition ---------------------------------------------*/
T_DjiReturnCode HalUart_Init(E_DjiHalUartNum uartNum, uint32_t baudRate, T_DjiUartHandle *uartHandle)
{
T_UartHandleStruct *uartHandleStruct;
T_UartHandleStruct *uartHandleStruct = NULL;
struct termios options;
struct flock lock;
T_DjiReturnCode returnCode = DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;

View File

@ -52,13 +52,9 @@ extern "C" {
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode HalUart_Init(E_DjiHalUartNum uartNum, uint32_t baudRate, T_DjiUartHandle *uartHandle);
T_DjiReturnCode HalUart_DeInit(T_DjiUartHandle uartHandle);
T_DjiReturnCode HalUart_WriteData(T_DjiUartHandle uartHandle, const uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode HalUart_ReadData(T_DjiUartHandle uartHandle, uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode HalUart_GetStatus(E_DjiHalUartNum uartNum, T_DjiUartStatus *status);
#ifdef __cplusplus

View File

@ -30,11 +30,6 @@
#define LINUX_USB_BULK_TRANSFER_TIMEOUT_MS (50)
#define LINUX_USB_BULK_TRANSFER_WAIT_FOREVER (-1)
#define LINUX_USB_BULK_EP_OUT "/dev/usb-ffs/bulk/ep1"
#define LINUX_USB_BULK_EP_IN "/dev/usb-ffs/bulk/ep2"
#define LINUX_USB_PID (0x7020)
#define LINUX_USB_VID (0x0955)
/* Private types -------------------------------------------------------------*/
typedef struct {
#ifdef LIBUSB_INSTALLED
@ -44,6 +39,7 @@ typedef struct {
#endif
int32_t ep1;
int32_t ep2;
uint32_t interfaceNum;
T_DjiHalUsbBulkInfo usbBulkInfo;
} T_HalUsbBulkObj;
@ -87,15 +83,28 @@ T_DjiReturnCode HalUsbBulk_Init(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHan
} else {
((T_HalUsbBulkObj *) *usbBulkHandle)->handle = handle;
memcpy(&((T_HalUsbBulkObj *) *usbBulkHandle)->usbBulkInfo, &usbBulkInfo, sizeof(usbBulkInfo));
((T_HalUsbBulkObj *) *usbBulkHandle)->interfaceNum = usbBulkInfo.channelInfo.interfaceNum;
((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 = open(LINUX_USB_BULK_EP_OUT, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
if (usbBulkInfo.channelInfo.interfaceNum == LINUX_USB_BULK1_INTERFACE_NUM) {
((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 = open(LINUX_USB_BULK1_EP_OUT_FD, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 = open(LINUX_USB_BULK_EP_IN, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 = open(LINUX_USB_BULK1_EP_IN_FD, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
} else if (usbBulkInfo.channelInfo.interfaceNum == LINUX_USB_BULK2_INTERFACE_NUM) {
((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 = open(LINUX_USB_BULK2_EP_OUT_FD, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep1 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 = open(LINUX_USB_BULK2_EP_IN_FD, O_RDWR);
if (((T_HalUsbBulkObj *) *usbBulkHandle)->ep2 < 0) {
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
}
}
@ -197,6 +206,16 @@ T_DjiReturnCode HalUsbBulk_GetDeviceInfo(T_DjiHalUsbBulkDeviceInfo *deviceInfo)
deviceInfo->vid = LINUX_USB_VID;
deviceInfo->pid = LINUX_USB_PID;
// This bulk channel is used to obtain DJI camera video stream and push 3rd-party camera video stream.
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_0].interfaceNum = LINUX_USB_BULK1_INTERFACE_NUM;
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_0].endPointIn = LINUX_USB_BULK1_END_POINT_IN;
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_0].endPointOut = LINUX_USB_BULK1_END_POINT_OUT;
// This bulk channel is used to obtain DJI perception image and download camera media file.
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_1].interfaceNum = LINUX_USB_BULK2_INTERFACE_NUM;
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_1].endPointIn = LINUX_USB_BULK2_END_POINT_IN;
deviceInfo->channelInfo[DJI_HAL_USB_BULK_NUM_1].endPointOut = LINUX_USB_BULK2_END_POINT_OUT;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

View File

@ -38,31 +38,49 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "dji_platform.h"
#ifdef LIBUSB_INSTALLED
#include <libusb-1.0/libusb.h>
#endif
#include "dji_platform.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
#define LINUX_USB_BULK1_EP_OUT_FD "/dev/usb-ffs/bulk1/ep1"
#define LINUX_USB_BULK1_EP_IN_FD "/dev/usb-ffs/bulk1/ep2"
#define LINUX_USB_BULK1_INTERFACE_NUM (2)
#define LINUX_USB_BULK1_END_POINT_IN (0x83)
#define LINUX_USB_BULK1_END_POINT_OUT (2)
#define LINUX_USB_BULK2_EP_OUT_FD "/dev/usb-ffs/bulk2/ep1"
#define LINUX_USB_BULK2_EP_IN_FD "/dev/usb-ffs/bulk2/ep2"
#define LINUX_USB_BULK2_INTERFACE_NUM (3)
#define LINUX_USB_BULK2_END_POINT_IN (0x84)
#define LINUX_USB_BULK2_END_POINT_OUT (3)
#ifdef PLATFORM_ARCH_x86_64
#define LINUX_USB_VID (0x0B95)
#define LINUX_USB_PID (0x1790)
#else
#define LINUX_USB_VID (0x0955)
#define LINUX_USB_PID (0x7020)
#endif
/* Exported types ------------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/
T_DjiReturnCode HalUsbBulk_Init(T_DjiHalUsbBulkInfo usbBulkInfo, T_DjiUsbBulkHandle *usbBulkHandle);
T_DjiReturnCode HalUsbBulk_DeInit(T_DjiUsbBulkHandle usbBulkHandle);
T_DjiReturnCode HalUsbBulk_WriteData(T_DjiUsbBulkHandle usbBulkHandle, const uint8_t *buf, uint32_t len,
uint32_t *realLen);
T_DjiReturnCode HalUsbBulk_ReadData(T_DjiUsbBulkHandle usbBulkHandle, uint8_t *buf, uint32_t len, uint32_t *realLen);
T_DjiReturnCode HalUsbBulk_GetDeviceInfo(T_DjiHalUsbBulkDeviceInfo *deviceInfo);
#ifdef __cplusplus

View File

@ -64,7 +64,7 @@
#define configTICK_RATE_HZ ((TickType_t)1000)
#define configMAX_PRIORITIES ( 7 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
#define configTOTAL_HEAP_SIZE ((size_t)75000)
#define configTOTAL_HEAP_SIZE ((size_t)64000)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1

View File

@ -111,7 +111,7 @@ void DjiUser_StartTask(void const *argument)
};
UART_Init(DJI_CONSOLE_UART_NUM, DJI_CONSOLE_UART_BAUD);
Led_Init(LED1);
Led_Init(LED3);
//Attention: if you want to run payload sdk on extension port, please define the macro DJI_EXTENSION_PORT_SUPPORT.
#if DJI_EXTENSION_PORT_SUPPORT
@ -214,8 +214,9 @@ void DjiUser_StartTask(void const *argument)
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2) {
#ifdef CONFIG_MODULE_SAMPLE_GIMBAL_EMU_ON
if (aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_SKYPORT_V2 ||
aircraftInfoBaseInfo.djiAdapterType == DJI_SDK_ADAPTER_TYPE_NONE) {
if (DjiTest_GimbalStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk gimbal init error");
}
@ -256,33 +257,36 @@ void DjiUser_StartTask(void const *argument)
#endif
#ifdef CONFIG_MODULE_SAMPLE_POSITIONING_ON
if (DjiTest_PositioningStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk positioning init error");
if (aircraftInfoBaseInfo.aircraftType == DJI_AIRCRAFT_TYPE_M300_RTK
&& aircraftInfoBaseInfo.mountPosition != DJI_MOUNT_POSITION_TYPE_EXTENSION_PORT) {
if (DjiTest_PositioningStartService() != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("psdk positioning init error");
}
}
#endif
#ifdef CONFIG_MODULE_SAMPLE_UPGRADE_ON
T_DjiTestUpgradePlatformOpt stm32UpgradePlatformOpt = {
.rebootSystem = DjiUpgradePlatformStm32_RebootSystem,
.cleanUpgradeProgramFileStoreArea = DjiUpgradePlatformStm32_CleanUpgradeProgramFileStoreArea,
.createUpgradeProgramFile = DjiUpgradePlatformStm32_CreateUpgradeProgramFile,
.writeUpgradeProgramFile = DjiUpgradePlatformStm32_WriteUpgradeProgramFile,
.readUpgradeProgramFile = DjiUpgradePlatformStm32_ReadUpgradeProgramFile,
.closeUpgradeProgramFile = DjiUpgradePlatformStm32_CloseUpgradeProgramFile,
.replaceOldProgram = DjiUpgradePlatformStm32_ReplaceOldProgram,
.setUpgradeRebootState = DjiUpgradePlatformStm32_SetUpgradeRebootState,
.getUpgradeRebootState = DjiUpgradePlatformStm32_GetUpgradeRebootState,
.cleanUpgradeRebootState = DjiUpgradePlatformStm32_CleanUpgradeRebootState,
};
T_DjiTestUpgradeConfig testUpgradeConfig = {
.firmwareVersion = {1, 0, 0, 0},
.transferType = DJI_FIRMWARE_TRANSFER_TYPE_DCFTP,
.needReplaceProgramBeforeReboot = false
};
if (DjiTest_UpgradeStartService(&stm32UpgradePlatformOpt, testUpgradeConfig) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("psdk upgrade init error");
}
.rebootSystem = DjiUpgradePlatformStm32_RebootSystem,
.cleanUpgradeProgramFileStoreArea = DjiUpgradePlatformStm32_CleanUpgradeProgramFileStoreArea,
.createUpgradeProgramFile = DjiUpgradePlatformStm32_CreateUpgradeProgramFile,
.writeUpgradeProgramFile = DjiUpgradePlatformStm32_WriteUpgradeProgramFile,
.readUpgradeProgramFile = DjiUpgradePlatformStm32_ReadUpgradeProgramFile,
.closeUpgradeProgramFile = DjiUpgradePlatformStm32_CloseUpgradeProgramFile,
.replaceOldProgram = DjiUpgradePlatformStm32_ReplaceOldProgram,
.setUpgradeRebootState = DjiUpgradePlatformStm32_SetUpgradeRebootState,
.getUpgradeRebootState = DjiUpgradePlatformStm32_GetUpgradeRebootState,
.cleanUpgradeRebootState = DjiUpgradePlatformStm32_CleanUpgradeRebootState,
};
T_DjiTestUpgradeConfig testUpgradeConfig = {
.firmwareVersion = {1, 0, 0, 0},
.transferType = DJI_FIRMWARE_TRANSFER_TYPE_DCFTP,
.needReplaceProgramBeforeReboot = false
};
if (DjiTest_UpgradeStartService(&stm32UpgradePlatformOpt, testUpgradeConfig) !=
DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("psdk upgrade init error");
}
#endif
returnCode = DjiCore_ApplicationStart();
@ -291,8 +295,8 @@ if (DjiTest_UpgradeStartService(&stm32UpgradePlatformOpt, testUpgradeConfig) !=
}
while (1) {
Osal_TaskSleepMs(1000);
Led_Trigger(LED1);
Osal_TaskSleepMs(500);
Led_Trigger(LED3);
}
out:
@ -350,7 +354,8 @@ void DjiUser_MonitorTask(void const *argument)
// report system performance information.
// Attention: report system performance part is not intended for normal application runtime use but as a debug aid.
if (USER_UTIL_IS_WORK_TURN(runIndicateTaskStep++, RUN_INDICATE_TASK_FREQ_0D1HZ, RUN_INDICATE_TASK_FREQ_1HZ)) {
if (USER_UTIL_IS_WORK_TURN(runIndicateTaskStep++, RUN_INDICATE_TASK_FREQ_0D1HZ,
RUN_INDICATE_TASK_FREQ_1HZ)) {
#if (configUSE_TRACE_FACILITY == 1)
currentTaskStatusArraySize = uxTaskGetNumberOfTasks();
currentTaskStatusArray = osalHandler->Malloc(currentTaskStatusArraySize * sizeof(TaskStatus_t));
@ -379,9 +384,9 @@ void DjiUser_MonitorTask(void const *argument)
lastTaskStatusArray = currentTaskStatusArray;
lastTaskStatusArraySize = currentTaskStatusArraySize;
#endif
USER_LOG_DEBUG("used heap size: %d.\r\n", configTOTAL_HEAP_SIZE - xPortGetFreeHeapSize());
}
USER_LOG_DEBUG("used heap size: %d/%d.\r\n", configTOTAL_HEAP_SIZE - xPortGetFreeHeapSize(),
configTOTAL_HEAP_SIZE);
}
}

View File

@ -34,29 +34,24 @@ extern "C" {
#endif
/* Exported constants --------------------------------------------------------*/
//#define CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
#define CONFIG_MODULE_SAMPLE_POWER_MANAGEMENT_ON
//#define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
#define CONFIG_MODULE_SAMPLE_DATA_TRANSMISSION_ON
#define CONFIG_MODULE_SAMPLE_WIDGET_ON
//#ifdef USE_BOOTLOADER
//Attention: If you dont need to upgrade, you can uncomment it and change flash size from 0x70000 to 0xD0000 to build all functions.
#define CONFIG_MODULE_SAMPLE_GIMBAL_EMU_ON
#define CONFIG_MODULE_SAMPLE_CAMERA_ON
#define CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
#define CONFIG_MODULE_SAMPLE_XPORT_ON
//#define CONFIG_MODULE_SAMPLE_UPGRADE_ON
//#endif
//#ifndef CONFIG_MODULE_SAMPLE_UPGRADE_ON
//#define CONFIG_MODULE_SAMPLE_GIMBAL_ON
//#define CONFIG_MODULE_SAMPLE_CAMERA_ON
//#define CONFIG_MODULE_SAMPLE_FC_SUBSCRIPTION_ON
//#define CONFIG_MODULE_SAMPLE_XPORT_ON
//#define CONFIG_MODULE_SAMPLE_PAYLOAD_COLLABORATION_ON
/*!< Attention: Please uncomment it in gps environment.
* */
//#define CONFIG_MODULE_SAMPLE_TIME_SYNC_ON
//#define CONFIG_MODULE_SAMPLE_POSITIONING_ON

View File

@ -192,7 +192,6 @@ void OTG_FS_IRQHandler(void)
/* USER CODE END OTG_FS_IRQn 1 */
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@ -146,7 +146,9 @@ USBH_ClassTypeDef CDC_Class =
QueueHandle_t ACMDataRecvQueue;
QueueHandle_t ACMDataSendQueue;
#if DJI_EXTENSION_PORT_SUPPORT
static uint8_t cdcBuff[1024];
#endif
void USBH_CDC_DataQueueInit(void)
{
@ -370,7 +372,9 @@ static USBH_StatusTypeDef USBH_CDC_Process(USBH_HandleTypeDef *phost)
CDC_HandleTypeDef *CDC_Handle = (CDC_HandleTypeDef *) phost->pActiveClass->pData;
if (CDC_Handle->data_rx_state == CDC_IDLE) {
#if DJI_EXTENSION_PORT_SUPPORT
USBH_CDC_Receive(phost, cdcBuff, sizeof(cdcBuff));
#endif
}
if (CDC_Handle->data_tx_state == CDC_IDLE) {

View File

@ -358,7 +358,7 @@
<uC99>1</uC99>
<useXO>0</useXO>
<VariousControls>
<MiscControls> -DHSE_VALUE=8000000 --diag_suppress=188,177,550,940,66,546 --gnu -DUSE_BOOTLOADER=1 -DUSE_USB_HOST_UART=1</MiscControls>
<MiscControls> -DHSE_VALUE=8000000 --diag_suppress=188,177,550,940,66,546 --gnu --split_sections -DUSE_BOOTLOADER=1 -DUSE_USB_HOST_UART=1</MiscControls>
<Define>USE_HAL_DRIVER, STM32F407xx, SYSTEM_ARCH_RTOS=1</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\..\..\..\..\psdk_lib\include; ..\..\..\..\..\module_sample; ..\..\..\common\osal; ..\..\application; ..\..; ..\..\hal; ..\..\drivers\BSP; ..\..\drivers\CMSIS\Include; ..\..\drivers\Device\ST\STM32F4xx; ..\..\drivers\STM32F4xx_HAL_Driver\Inc; ..\..\drivers\USB_HOST\App; ..\..\drivers\USB_HOST\Target; ..\..\middlewares\ST\STM32_USB_Host_Library\Class\CDC\Inc; ..\..\middlewares\ST\STM32_USB_Host_Library\Core\Inc; ..\..\middlewares\Third_Party\FreeRTOS\Source\include; ..\..\middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM4F; ..\..\middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS</IncludePath>