Index: prj/MDK/YC3121_Keil.uvoptx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/prj/MDK/YC3121_Keil.uvoptx	(revision 920)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/prj/MDK/YC3121_Keil.uvoptx	(working copy)
@@ -268,15 +268,15 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\..\user\app_ble_gatt.c</PathWithFileName>
-      <FilenameWithoutPath>app_ble_gatt.c</FilenameWithoutPath>
+      <PathWithFileName>..\..\user\app_util.c</PathWithFileName>
+      <FilenameWithoutPath>app_util.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
   </Group>
 
   <Group>
-    <GroupName>sdk</GroupName>
+    <GroupName>bt_api</GroupName>
     <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
@@ -288,14 +288,110 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_bt_protocol.c</PathWithFileName>
+      <FilenameWithoutPath>app_bt_protocol.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>ble_api</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_ble_gatt.c</PathWithFileName>
+      <FilenameWithoutPath>app_ble_gatt.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>8</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_ble_protocol.c</PathWithFileName>
+      <FilenameWithoutPath>app_ble_protocol.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>eeprom</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>9</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_eeprom.c</PathWithFileName>
+      <FilenameWithoutPath>app_eeprom.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_eeprom_ble_bond_info.c</PathWithFileName>
+      <FilenameWithoutPath>app_eeprom_ble_bond_info.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>11</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\user\app_eeprom_bt_bond_info.c</PathWithFileName>
+      <FilenameWithoutPath>app_eeprom_bt_bond_info.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>driver</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>12</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
       <PathWithFileName>..\..\..\..\..\Librarier\sdk\yc_bt.c</PathWithFileName>
       <FilenameWithoutPath>yc_bt.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>7</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -306,8 +402,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -318,8 +414,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -330,8 +426,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -342,8 +438,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -354,8 +450,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -366,8 +462,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -378,8 +474,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>20</FileNumber>
       <FileType>4</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -390,8 +486,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -410,8 +506,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>22</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -422,8 +518,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <GroupNumber>7</GroupNumber>
+      <FileNumber>23</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
Index: prj/MDK/YC3121_Keil.uvprojx
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/prj/MDK/YC3121_Keil.uvprojx	(revision 920)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/prj/MDK/YC3121_Keil.uvprojx	(working copy)
@@ -408,14 +408,59 @@
               <FilePath>..\..\user\main.c</FilePath>
             </File>
             <File>
+              <FileName>app_util.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_util.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>bt_api</GroupName>
+          <Files>
+            <File>
+              <FileName>app_bt_protocol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_bt_protocol.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>ble_api</GroupName>
+          <Files>
+            <File>
               <FileName>app_ble_gatt.c</FileName>
               <FileType>1</FileType>
               <FilePath>..\..\user\app_ble_gatt.c</FilePath>
             </File>
+            <File>
+              <FileName>app_ble_protocol.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_ble_protocol.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>eeprom</GroupName>
+          <Files>
+            <File>
+              <FileName>app_eeprom.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_eeprom.c</FilePath>
+            </File>
+            <File>
+              <FileName>app_eeprom_ble_bond_info.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_eeprom_ble_bond_info.c</FilePath>
+            </File>
+            <File>
+              <FileName>app_eeprom_bt_bond_info.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\user\app_eeprom_bt_bond_info.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
-          <GroupName>sdk</GroupName>
+          <GroupName>driver</GroupName>
           <Files>
             <File>
               <FileName>yc_bt.c</FileName>
Index: user/app_ble_gatt.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt.h	(working copy)
@@ -0,0 +1,215 @@
+#ifndef __SIMPLE_GATT_SERVICE_H_
+#define __SIMPLE_GATT_SERVICE_H_
+
+#include "app_ble_gatt_sig_uuid.h"
+
+
+#define ATT_VALUE_ZERO {0}
+
+#define HI_UINT16(a) (((a) >> 8) & 0xFF)
+#define LO_UINT16(a) ((a) & 0xFF)
+
+
+// Gap Profile attributes index. 
+enum
+{
+    GAP_IDX_SERVICE,    // SERVICE
+  
+    GAP_IDX_CHAR1_DECLARATION,    // USER_IDX_CHAR1_USER_DESCRIPTION
+    GAP_IDX_CHAR1_VALUE,
+
+    GAP_IDX_NB,
+};
+
+
+
+
+// Gatt Profile attributes index. 
+enum
+{
+    GATT_IDX_SERVICE,    // SERVICE
+
+    GATT_IDX_CHAR1_DECLARATION,    // USER_IDX_CHAR1_USER_DESCRIPTION
+    GATT_IDX_CHAR1_VALUE,
+    GATT_IDX_CHAR1_CFG,
+
+    GATT_IDX_NB,
+};
+
+
+
+
+/// Keyboard Device
+#define HID_DEV_KEYBOARD    0x01
+/// Mouse Device
+#define HID_DEV_MOUSE       0x02
+/// Protocol Mode present
+#define HID_DEV_PROTO_MODE  0x04
+
+/* Current only support mouse device */
+//#define HID_DEV (HID_DEV_KEYBOARD)
+#define HID_DEV (HID_DEV_MOUSE | HID_DEV_PROTO_MODE)
+
+/* HID information flags */
+#define HID_FLAGS_REMOTE_WAKE           0x01 // RemoteWake
+#define HID_FLAGS_NORMALLY_CONNECTABLE  0x02 // NormallyConnectable
+
+/* HID protocol mode values */
+#define HID_PROTOCOL_MODE_BOOT      0x00 // Boot Protocol Mode
+#define HID_PROTOCOL_MODE_REPORT    0x01 // Report Protocol Mode
+
+/** @defgroup HID_REPORT_TYPE_GROUP */
+#define HID_REPORT_TYPE_INPUT       0x01
+#define HID_REPORT_TYPE_OUTPUT      0x02
+#define HID_REPORT_TYPE_FEATURE     0x03
+#define HID_REPORT_TYPE_WR          0x10    /// Input report with Write capabilities
+
+
+// HID Protocol mode
+#define HID_PROTOCOL_VALUE    \
+{                         \
+    0x01                  /*Protocol mode*/     \
+}
+
+// HID Report ID
+#define HID_REPORT_IDX    \
+{                         \
+    0x01,                     /*Report id*/     \
+    HID_REPORT_TYPE_INPUT     /*Input*/         \
+}
+
+// HID Information data
+#define HID_INFO_VALUE    \
+{                         \
+    LO_UINT16(0x0101), HI_UINT16(0x0101),             /*bcdHID (USB HID version)*/    \
+    0x00,                                             /*bCountryCode*/                \
+    HID_FLAGS_REMOTE_WAKE | HID_FLAGS_NORMALLY_CONNECTABLE     /*Flags*/              \
+}
+
+//HID Report Map characteristic defination
+#define HID_REPORT_MAP    \
+{                         \
+    /*---------mouse buttons+sensor+wheel-----------*/    \
+    0x05, 0x01,   /* Usage Page(Generic Desktop)    */    \
+    0x09, 0x02,   /* Usage(Mouse)                   */    \
+    0xa1, 0x01,   /* Collection(Application)        */    \
+    0x85, 0x01,   /* Report ID(1)                   */    \
+    0x09, 0x01,   /* Usage(Pointer)                 */    \
+    0xa1, 0x00,   /* Collection(Physical)           */    \
+    /*--------buttons---------*/                          \
+    0x05, 0x09,   /* Usage Page(Buttons)            */    \
+    0x19, 0x01,   /* Usage Minimum(1)               */    \
+    0x29, 0x08,   /* Usage Maximum(8)               */    \
+    0x15, 0x00,   /* Logical Minimum(0).            */    \
+    0x25, 0x01,   /* Logical Maximum(1)             */    \
+    0x75, 0x01,   /* Report Size(1)                 */    \
+    0x95, 0x08,   /* Report Count(8)                */    \
+    0x81, 0x02,   /* Input(Data Variable Absolute)  */    \
+    /*----------sensor boot--------*/                     \
+    0x05, 0x01,   /* Usage Page(Generic Desktop)    */    \
+    0x09, 0x30,   /* Usage(X)                       */    \
+    0x09, 0x31,   /* Usage(Y)                       */    \
+    0x16, 0x01, 0xf8,   /* Logical Minimum(-2047)   */    \
+    0x26, 0xff, 0x07,   /* Logical Maximum(2047)    */    \
+    0x75, 0x10,   /* Report Size(16)                */    \
+    0x95, 0x02,   /* Report Count(2)                */    \
+    0x81, 0x06,   /* Input(Data Variable Relative)  */    \
+    /*---------scroll wheel--------*/                     \
+    0x09, 0x38,   /* Usage(Wheel)                   */    \
+    0x15, 0x81,   /* Logical Minimum(-127)          */    \
+    0x25, 0x7f,   /* Logical Maximum(127)           */    \
+    0x75, 0x08,   /* Report Size(8)                 */    \
+    0x95, 0x01,   /* Report Count(1)                */    \
+    0x81, 0x06,   /* Input(Data Variable Relative)  */    \
+    0x05, 0x0c,   /* Usage Page(Consumer)           */    \
+    0x0a, 0x38, 0x02,   /* Usage(AC Pan)            */    \
+    0x95, 0x01,   /* Report Count(1)                */    \
+    0x81, 0x06,   /* Input(Data Variable Relative)  */    \
+    0xc0,         /* End Collection                 */    \
+    0xc0          /* End Collection                 */    \
+}
+
+// HID service attributes index.
+enum
+{
+    HID_IDX_SERVICE,                // HID Service
+
+#if ((HID_DEV & HID_DEV_PROTO_MODE) == HID_DEV_PROTO_MODE)
+    HID_PROTOCOL_MODE_DECL_IDX,     // HID Protocol Mode characteristic declaration
+    HID_PROTOCOL_MODE_IDX,          // HID Protocol Mode characteristic
+#endif
+
+    HID_FEATURE_DECL_IDX,           // Feature Report declaration
+    HID_FEATURE_IDX,                // Feature Report
+    HID_FEATURE_CCCD_IDX,           // Feature Report characteristic client characteristic configuration
+    HID_REPORT_REF_FEATURE_IDX,     // HID Report Reference characteristic descriptor, feature
+
+    HID_REPORT_MAP_DECL_IDX,        // HID Report Map characteristic declaration
+    HID_REPORT_MAP_IDX,             // HID Report Map characteristic
+
+#if ((HID_DEV & HID_DEV_MOUSE) == HID_DEV_MOUSE)
+    HID_BOOT_MOUSE_IN_DECL_IDX,     // HID Boot Mouse Input Report declaration
+    HID_BOOT_MOUSE_IN_IDX,          // HID Boot Mouse Input Report
+    HID_BOOT_MOUSE_IN_CCCD_IDX,     // HID Boot Mouse Input Report characteristic client characteristic configuration
+#endif
+
+    HID_INFO_DECL_IDX,              // HID Information characteristic declaration
+    HID_INFO_IDX,                   // HID Information characteristic
+
+    HID_CONTROL_POINT_DECL_IDX,     // HID Control Point characteristic declaration
+    HID_CONTROL_POINT_IDX,          // HID Control Point characteristic
+
+    HID_IDX_NB,
+};
+
+
+
+
+// User GATT Profile Service UUID
+#define USER_SVC_UUID             0xFFF0
+#define USER_CHAR1_NOTIFY_UUID    0xFFF1
+#define USER_CHAR2_WRITE_UUID     0xFFF2
+#define USER_CHAR3_NOTIFY_UUID    0xFFF3
+#define USER_CHAR4_WRITE_UUID     0xFFF4
+
+// User Profile attributes index. 
+enum
+{
+    // SERVICE
+    USER_IDX_SERVICE,
+    // USER_IDX_CHAR1_USER_DESCRIPTION,
+    USER_IDX_CHAR1_DECLARATION,
+    USER_IDX_CHAR1_VALUE,
+    USER_IDX_CHAR1_CFG,
+    // USER_IDX_CHAR2_USER_DESCRIPTION,
+    USER_IDX_CHAR2_DECLARATION,
+    USER_IDX_CHAR2_VALUE,
+    #if 0
+    // USER_IDX_CHAR3_USER_DESCRIPTION,
+    USER_IDX_CHAR3_DECLARATION,
+    USER_IDX_CHAR3_VALUE,
+    USER_IDX_CHAR3_CFG,
+    // USER_IDX_CHAR4_USER_DESCRIPTION,
+    USER_IDX_CHAR4_DECLARATION,
+    USER_IDX_CHAR4_VALUE,
+    #endif
+    //-------- add service ----------//
+
+    //-------- add service ----------//
+    USER_IDX_NB,
+};
+
+
+
+extern uint16_t user_ble_notify_handle;
+extern uint16_t user_ble_notify_char_handle;
+extern uint16_t user_ble_receive_handle;
+
+extern uint16_t hid_ble_notify_handle;
+extern uint16_t hid_ble_notify_char_handle;
+extern uint16_t hid_ble_receive_handle;
+extern uint16_t hid_ble_pair_handle;
+
+void bleGattServiceInit(void);
+
+#endif
Index: user/app_ble_gatt.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt.c	(working copy)
@@ -0,0 +1,329 @@
+#include "app_ble_gatt.h"
+#include "app_util.h"
+#include "yc_ipc.h"
+#include "yc_bt.h"
+#include "bt_config.h"
+
+#define mem_le_pairing_handle 0xc44cc
+
+uint16_t user_ble_notify_handle;
+uint16_t user_ble_notify_char_handle;
+uint16_t user_ble_receive_handle;
+
+uint16_t hid_ble_notify_handle;
+uint16_t hid_ble_notify_char_handle;
+uint16_t hid_ble_receive_handle;
+uint16_t hid_ble_pair_handle;
+
+
+const GATT_Attribute service_gap[GAP_IDX_NB] =
+{
+    // Gap Service Declaration
+    [GAP_IDX_SERVICE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_PRIMARY_SERVICE_UUID)},
+        {SIZE_2, UUID16_ARR(GAP_SERVICE_UUID)},
+    },
+
+    // Characteristic 1 Declaration   TX
+    [GAP_IDX_CHAR1_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ},
+    },
+    // Characteristic 1 Value
+    [GAP_IDX_CHAR1_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_DEVICE_NAME_UUID)},
+        {(sizeof(ble_device_name_const)-1), BLE_DEVICE_NAME},
+    },
+
+};
+
+
+const GATT_Attribute service_gatt[GATT_IDX_NB] =
+{
+    // Gatt Service Declaration
+    [GATT_IDX_SERVICE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_PRIMARY_SERVICE_UUID)},
+        {SIZE_2, UUID16_ARR(GATT_SERVICE_UUID)},
+    },
+
+    // Characteristic 1 Declaration   TX
+    [GATT_IDX_CHAR1_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_INDI},
+    },
+    // Characteristic 1 Value
+    [GATT_IDX_CHAR1_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_SERVICE_CHANGED_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+
+    // Characteristic 1 client characteristic configuration
+    [GATT_IDX_CHAR1_CFG] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CLIENT_CHAR_CFG_UUID)},
+        {SIZE_2, ATT_VALUE_ZERO},
+    },
+
+};
+
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+
+const GATT_Attribute service_hid[HID_IDX_NB] =
+{
+    [HID_IDX_SERVICE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_PRIMARY_SERVICE_UUID)},
+        {SIZE_2, UUID16_ARR(HID_SERV_UUID)},
+    },
+
+#if ((HID_DEV & HID_DEV_PROTO_MODE) == HID_DEV_PROTO_MODE)
+
+    // HID Protocol Mode characteristic declaration
+    [HID_PROTOCOL_MODE_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ | GATT_PROP_WRITE_CMD}
+    },
+
+    // HID Protocol Mode characteristic
+    [HID_PROTOCOL_MODE_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(PROTOCOL_MODE_UUID)},
+        {SIZE_1, HID_PROTOCOL_VALUE},
+    },
+#endif
+
+    // HID Feature Report ID 0
+    [HID_FEATURE_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ | GATT_PROP_WRITE_REQ | GATT_PROP_NOTI}
+    },
+
+    [HID_FEATURE_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(REPORT_UUID)},
+        {SIZE_7, ATT_VALUE_ZERO},
+    },
+
+    [HID_FEATURE_CCCD_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CLIENT_CHAR_CFG_UUID)},
+        {SIZE_2, ATT_VALUE_ZERO},
+    },
+
+    [HID_REPORT_REF_FEATURE_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_REPORT_REF_UUID)},
+        {SIZE_2, HID_REPORT_IDX},
+    },
+
+    // HID Report Map characteristic declaration
+    [HID_REPORT_MAP_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ},
+    },
+
+    // HID Report Map characteristic
+    [HID_REPORT_MAP_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(REPORT_MAP_UUID)},
+        {SIZE_69, HID_REPORT_MAP},
+    },
+
+#if ((HID_DEV & HID_DEV_MOUSE) == HID_DEV_MOUSE)
+    // HID Boot Mouse Input Report declaration
+    [HID_BOOT_MOUSE_IN_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ | GATT_PROP_WRITE_REQ | GATT_PROP_NOTI}
+    },
+    
+    // HID Boot Mouse Input Report
+    [HID_BOOT_MOUSE_IN_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(BOOT_MOUSE_INPUT_UUID)},
+        {SIZE_8, ATT_VALUE_ZERO},
+    },
+    
+    // HID Report characteristic, key input client characteristic configuration
+    [HID_BOOT_MOUSE_IN_CCCD_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CLIENT_CHAR_CFG_UUID)},
+        {SIZE_2, ATT_VALUE_ZERO},
+    },
+#endif
+
+    // Hid information
+    [HID_INFO_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_READ},
+    },
+    // Hid information
+    [HID_INFO_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(HID_INFORMATION_UUID)},
+        {SIZE_4, HID_INFO_VALUE},
+    },
+
+    // HID Control Point characteristic declaration
+    [HID_CONTROL_POINT_DECL_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_WRITE_CMD},
+    },
+
+    // HID Control Point characteristic value
+    [HID_CONTROL_POINT_IDX] = {
+        {UUID_SIZE_2, UUID16_ARR(HID_CTRL_PT_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+};
+
+#endif
+
+
+#if ((FUNC_DEVICE_BT & BLE_USER_SERVICE_ENABLE) == BLE_USER_SERVICE_ENABLE)
+
+//用户私有服务，结构体数组初始化
+const GATT_Attribute service_user_transceive[USER_IDX_NB] =
+{
+    // User Service Declaration
+    [USER_IDX_SERVICE] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_PRIMARY_SERVICE_UUID)},
+        {SIZE_2, UUID16_ARR(USER_SVC_UUID)},
+    },
+
+    // Characteristic 1 Declaration   TX
+    [USER_IDX_CHAR1_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_NOTI},
+    },
+    // Characteristic 1 Value
+    [USER_IDX_CHAR1_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(USER_CHAR1_NOTIFY_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+    // Characteristic 1 client characteristic configuration
+    [USER_IDX_CHAR1_CFG] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CLIENT_CHAR_CFG_UUID)},
+        {SIZE_2, GATT_CCCD_VALUE},
+    },
+
+    // Characteristic 2 Declaration  RX
+    [USER_IDX_CHAR2_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_WRITE_REQ},
+    },
+    // Characteristic 2 Value
+    [USER_IDX_CHAR2_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(USER_CHAR2_WRITE_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+#if 0
+    // Characteristic 3 Declaration   TX
+    [USER_IDX_CHAR3_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_NOTI},
+    },
+    // Characteristic 3 Value
+    [USER_IDX_CHAR3_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(USER_CHAR3_NOTIFY_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+    // Characteristic 3 client characteristic configuration
+    [USER_IDX_CHAR3_CFG] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CLIENT_CHAR_CFG_UUID)},
+        {SIZE_2, GATT_CCCD_VALUE},
+    },
+
+    // Characteristic 4 Declaration  RX
+    [USER_IDX_CHAR4_DECLARATION] = {
+        {UUID_SIZE_2, UUID16_ARR(GATT_CHARACTER_UUID)},
+        {SIZE_1, GATT_PROP_WRITE_REQ},
+    },
+    // Characteristic 4 Value
+    [USER_IDX_CHAR4_VALUE] = {
+        {UUID_SIZE_2, UUID16_ARR(USER_CHAR4_WRITE_UUID)},
+        {SIZE_1, ATT_VALUE_ZERO},
+    },
+#endif
+
+};
+
+#endif
+
+
+void genBleGattService(const GATT_Attribute *service_table, uint8_t service_index_max, uint16_t *service_handle, uint8_t *out_service_table, uint8_t *out_service_length)
+{
+    uint8_t loop_assist_idx = 0;
+    uint8_t uuid_inner_idx = 0;
+    uint8_t temp_index = 0;
+    uint8_t ble_inf_idx = 0;
+    uint8_t ble_inf_table[MAX_TCP_DATA_LEN] = {0};
+
+    for (loop_assist_idx = 0; loop_assist_idx < service_index_max; loop_assist_idx++)
+    {
+        temp_index = ble_inf_idx;
+
+        ble_inf_table[ble_inf_idx++] = *service_handle & 0xff;
+        ble_inf_table[ble_inf_idx++] = *service_handle >> 8;
+        (*service_handle)++;
+
+        ble_inf_table[ble_inf_idx++] = service_table[loop_assist_idx].uuid.size;
+        for (uuid_inner_idx = 0; uuid_inner_idx < service_table[loop_assist_idx].uuid.size; uuid_inner_idx++)
+        {
+            ble_inf_table[ble_inf_idx++] = service_table[loop_assist_idx].uuid.uuid[uuid_inner_idx];
+        }
+
+        ble_inf_table[ble_inf_idx++] = service_table[loop_assist_idx].attribute_data.size;
+        for (uuid_inner_idx = 0; uuid_inner_idx < service_table[loop_assist_idx].attribute_data.size; uuid_inner_idx++)
+        {
+            ble_inf_table[ble_inf_idx++] = service_table[loop_assist_idx].attribute_data.attribute[uuid_inner_idx];
+        }
+
+        for (int i = temp_index; i < ble_inf_idx; i++)
+            MyPrintf("%02x ", ble_inf_table[i]);
+        MyPrintf("\r\n");
+    }
+    
+    out_service_length[0] = ble_inf_idx;
+    uartPrintArray("Size",out_service_length,1,TYPE_DEC);
+    memcpy(out_service_table,ble_inf_table,ble_inf_idx);
+}
+
+
+void bleGattServiceInit(void)
+{
+    uint16_t handle_num[1] = {0x0001};  //start handle
+    uint8_t service_table_gen[MAX_TCP_DATA_LEN] = {0};
+    uint8_t service_len_gen[1] = {0};
+    
+    uartPrintStr("[Primary service yichip config]:handle(2bytes)+len(1byte)+uuid(N bytes)+len(1byte)+attribute(N bytes)");
+
+    //service GAP
+    genBleGattService(service_gap,GAP_IDX_NB,handle_num,service_table_gen,service_len_gen);
+    if(BT_AddBleBlockService(service_table_gen,*service_len_gen)==TRUE)
+        uartPrintStr("SetGapService_suc");
+    else
+        uartPrintStr("SetGapService_failed");
+    
+    //service GATT
+    genBleGattService(service_gatt,GATT_IDX_NB,handle_num,service_table_gen,service_len_gen);
+    if(BT_AddBleBlockService(service_table_gen,*service_len_gen)==TRUE)
+        uartPrintStr("SetGattService_suc");
+    else
+        uartPrintStr("SetGattService_failed");
+
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+    //service HID
+    hid_ble_notify_handle = *handle_num + HID_FEATURE_IDX;
+    hid_ble_notify_char_handle = *handle_num + HID_FEATURE_CCCD_IDX;
+    hid_ble_pair_handle = *handle_num + HID_REPORT_MAP_IDX;
+    HW_REG_16BIT(mem_le_pairing_handle,hid_ble_pair_handle);
+    genBleGattService(service_hid,HID_IDX_NB,handle_num,service_table_gen,service_len_gen);
+    if(BT_AddBleBlockService(service_table_gen,*service_len_gen)==TRUE)
+        uartPrintStr("SetHidService_suc");
+    else
+        uartPrintStr("SetHidService_failed");
+#endif
+
+#if ((FUNC_DEVICE_BT & BLE_USER_SERVICE_ENABLE) == BLE_USER_SERVICE_ENABLE)
+    //service USER
+    user_ble_notify_handle = *handle_num + USER_IDX_CHAR1_VALUE;
+    user_ble_notify_char_handle = *handle_num + USER_IDX_CHAR1_CFG;
+    user_ble_receive_handle = *handle_num + USER_IDX_CHAR2_VALUE;
+    genBleGattService(service_user_transceive,USER_IDX_NB,handle_num,service_table_gen,service_len_gen);
+    if(BT_AddBleBlockService(service_table_gen,*service_len_gen)==TRUE)
+        uartPrintStr("SetUserService_suc");
+    else
+        uartPrintStr("SetUserService_failed");
+#endif
+}
+
Index: user/app_ble_gatt_sig_uuid.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt_sig_uuid.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_gatt_sig_uuid.h	(working copy)
@@ -0,0 +1,298 @@
+#ifndef __GATT_SIG_UUID_H_
+#define __GATT_SIG_UUID_H_
+
+#include "type.h"
+ 
+//uuid字节数
+#define UUID_SIZE_2         2 
+#define UUID_SIZE_16        16
+
+
+#define SIZE_1         1
+#define SIZE_2         2
+#define SIZE_3         3
+#define SIZE_4         4
+#define SIZE_5         5
+#define SIZE_6         6
+#define SIZE_7         7
+#define SIZE_8         8
+#define SIZE_16        16
+#define SIZE_69        69
+#define SIZE_255       255
+
+//字节顺序交换
+#define UUID16_ARR(uuid16)        {uuid16&0xff,(uuid16&0xff00)>>8}
+#define UUID128_ARR(uuid16)       {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, \
+                                   0x00, 0x10, 0x00, 0x00, (uuid16 & 0xff),(uuid16&0xff00)>>8, 0x00, 0x00}
+
+
+// GATT_PROP_BITMAPS_DEFINES GATT Attribute Access Permissions Bit Fields
+#define GATT_PROP_BROADCAST             (1<<0)  //!< Attribute is able to broadcast
+#define GATT_PROP_READ                  (1<<1)  //!< Attribute is Readable
+#define GATT_PROP_WRITE_CMD             (1<<2)  //!< Attribute supports write with no response
+#define GATT_PROP_WRITE_REQ             (1<<3)  //!< Attribute supports write request
+#define GATT_PROP_NOTI                  (1<<4)  //!< Attribute is able to send notification
+#define GATT_PROP_INDI                  (1<<5)  //!< Attribute is able to send indication
+#define GATT_PROP_AUTH_SIG_WRTIE        (1<<6)  //!< Attribute supports authenticated signed write
+#define GATT_PROP_EXTEND_PROP           (1<<7)  //!< Attribute supports extended properities
+#define GATT_PROP_WRITE                 (1<<8)  //!< Attribute is Writable (support both write_req and write_cmd)
+
+#define GATT_CCCD_VALUE 0x0001
+
+
+
+
+
+/*
+ * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published
+ *          in the Bluetooth Assigned Numbers page. Do not change these values.
+ *          Changing them will cause Bluetooth interoperability issues.
+ */
+
+/**
+ * GATT Services
+ */
+#define GAP_SERVICE_UUID                           0x1800 // Generic Access Profile
+#define GATT_SERVICE_UUID                          0x1801 // Generic Attribute Profile
+
+/**
+ * GATT Declarations
+ */
+#define GATT_PRIMARY_SERVICE_UUID                  0x2800 // Primary Service
+#define GATT_SECONDARY_SERVICE_UUID                0x2801 // Secondary Service
+#define GATT_INCLUDE_UUID                          0x2802 // Include
+#define GATT_CHARACTER_UUID                        0x2803 // Characteristic
+
+/**
+ * GATT Descriptors
+ */
+#define GATT_CHAR_EXT_PROPS_UUID                   0x2900 // Characteristic Extended Properties
+#define GATT_CHAR_USER_DESC_UUID                   0x2901 // Characteristic User Description
+#define GATT_CLIENT_CHAR_CFG_UUID                  0x2902 // Client Characteristic Configuration
+#define GATT_SERV_CHAR_CFG_UUID                    0x2903 // Server Characteristic Configuration
+#define GATT_CHAR_FORMAT_UUID                      0x2904 // Characteristic Presentation Format
+#define GATT_CHAR_AGG_FORMAT_UUID                  0x2905 // Characteristic Aggregate Format
+#define GATT_VALID_RANGE_UUID                      0x2906 // Valid Range
+#define GATT_EXT_REPORT_REF_UUID                   0x2907 // External Report Reference Descriptor
+#define GATT_REPORT_REF_UUID                       0x2908 // Report Reference Descriptor
+
+/**
+ * GATT Characteristics
+ */
+#define GATT_DEVICE_NAME_UUID                           0x2A00 // Device Name
+#define GATT_APPEARANCE_UUID                            0x2A01 // Appearance
+#define GATT_PERI_PRIVACY_FLAG_UUID                     0x2A02 // Peripheral Privacy Flag
+#define GATT_RECONNECT_ADDR_UUID                        0x2A03 // Reconnection Address
+#define GATT_PERI_CONN_PARAM_UUID                       0x2A04 // Peripheral Preferred Connection Parameters
+#define GATT_SERVICE_CHANGED_UUID                       0x2A05 // Service Changed
+#define GATT_ADDR_RESOL_SUPP                            0x2AA6 // Central Address Resolution supported
+#define GATT_RSLV_PRIV_ADDR_ONLY                        0x2AC9 // Resolvable Private Address only
+
+/*
+ * WARNING: The 16-bit UUIDs are assigned by the Bluetooth SIG and published
+ *          in the Bluetooth Assigned Numbers page. Do not change these values.
+ *          Changing them will cause Bluetooth interoperability issues.
+ */
+
+/**
+ * GATT Service UUIDs
+ */
+#define IMMEDIATE_ALERT_SERV_UUID       0x1802  // Immediate Alert
+#define LINK_LOSS_SERV_UUID             0x1803  // Link Loss
+#define TX_PWR_LEVEL_SERV_UUID          0x1804  // Tx Power
+#define CURRENT_TIME_SERV_UUID          0x1805  // Current Time Service
+#define REF_TIME_UPDATE_SERV_UUID       0x1806  // Reference Time Update Service
+#define NEXT_DST_CHANGE_SERV_UUID       0x1807  // Next DST Change Service
+#define GLUCOSE_SERV_UUID               0x1808  // Glucose
+#define THERMOMETER_SERV_UUID           0x1809  // Health Thermometer
+#define DEVINFO_SERV_UUID               0x180A  // Device Information
+#define NWA_SERV_UUID                   0x180B  // Network Availability
+#define HEARTRATE_SERV_UUID             0x180D  // Heart Rate
+#define PHONE_ALERT_STS_SERV_UUID       0x180E  // Phone Alert Status Service
+#define BATT_SERV_UUID                  0x180F  // Battery Service
+#define BLOODPRESSURE_SERV_UUID         0x1810  // Blood Pressure
+#define ALERT_NOTIF_SERV_UUID           0x1811  // Alert Notification Service
+#define HID_SERV_UUID                   0x1812  // Human Interface Device
+#define SCAN_PARAM_SERV_UUID            0x1813  // Scan Parameters
+#define RSC_SERV_UUID                   0x1814  // Running Speed and Cadence
+#define CSC_SERV_UUID                   0x1816  // Cycling Speed and Cadence
+#define CYCPWR_SERV_UUID                0x1818  // Cycling Power
+#define LOC_NAV_SERV_UUID               0x1819  // Location and Navigation
+#define FITMACHINE_SERV_UUID            0x1826  // Fitmachine
+
+/**
+ * GATT Characteristic UUIDs
+ */
+#define ALERT_LEVEL_UUID                0x2A06  // Alert Level
+#define TX_PWR_LEVEL_UUID               0x2A07  // Tx Power Level
+#define DATE_TIME_UUID                  0x2A08  // Date Time
+#define DAY_OF_WEEK_UUID                0x2A09  // Day of Week
+#define DAY_DATE_TIME_UUID              0x2A0A  // Day Date Time
+#define EXACT_TIME_256_UUID             0x2A0C  // Exact Time 256
+#define DST_OFFSET_UUID                 0x2A0D  // DST Offset
+#define TIME_ZONE_UUID                  0x2A0E  // Time Zone
+#define LOCAL_TIME_INFO_UUID            0x2A0F  // Local Time Information
+#define TIME_WITH_DST_UUID              0x2A11  // Time with DST
+#define TIME_ACCURACY_UUID              0x2A12  // Time Accuracy
+#define TIME_SOURCE_UUID                0x2A13  // Time Source
+#define REF_TIME_INFO_UUID              0x2A14  // Reference Time Information
+#define TIME_UPDATE_CTRL_PT_UUID        0x2A16  // Time Update Control Point
+#define TIME_UPDATE_STATE_UUID          0x2A17  // Time Update State
+#define GLUCOSE_MEAS_UUID               0x2A18  // Glucose Measurement
+#define BATT_LEVEL_UUID                 0x2A19  // Battery Level
+#define TEMP_MEAS_UUID                  0x2A1C  // Temperature Measurement
+#define TEMP_TYPE_UUID                  0x2A1D  // Temperature Type
+#define IMEDIATE_TEMP_UUID              0x2A1E  // Intermediate Temperature
+#define MEAS_INTERVAL_UUID              0x2A21  // Measurement Interval
+#define BOOT_KEY_INPUT_UUID             0x2A22  // Boot Keyboard Input Report
+#define SYSTEM_ID_UUID                  0x2A23  // System ID
+#define MODEL_NUMBER_UUID               0x2A24  // Model Number String
+#define SERIAL_NUMBER_UUID              0x2A25  // Serial Number String
+#define FIRMWARE_REV_UUID               0x2A26  // Firmware Revision String
+#define HARDWARE_REV_UUID               0x2A27  // Hardware Revision String
+#define SOFTWARE_REV_UUID               0x2A28  // Software Revision String
+#define MANUFACTURER_NAME_UUID          0x2A29  // Manufacturer Name String
+#define IEEE_11073_CERT_DATA_UUID       0x2A2A  // IEEE 11073-20601 Regulatory Certification Data List
+#define CURRENT_TIME_UUID               0x2A2B  // Current Time
+#define SCAN_REFRESH_UUID               0x2A31  // Scan Refresh
+#define BOOT_KEY_OUTPUT_UUID            0x2A32  // Boot Keyboard Output Report
+#define BOOT_MOUSE_INPUT_UUID           0x2A33  // Boot Mouse Input Report
+#define GLUCOSE_CONTEXT_UUID            0x2A34  // Glucose Measurement Context
+#define BLOODPRESSURE_MEAS_UUID         0x2A35  // Blood Pressure Measurement
+#define IMEDIATE_CUFF_PRESSURE_UUID     0x2A36  // Intermediate Cuff Pressure
+#define HEARTRATE_MEAS_UUID             0x2A37  // Heart Rate Measurement
+#define BODY_SENSOR_LOC_UUID            0x2A38  // Body Sensor Location
+#define HEARTRATE_CTRL_PT_UUID          0x2A39  // Heart Rate Control Point
+#define NETWORK_AVAIL_UUID              0x2A3E  // Network Availability
+#define ALERT_STATUS_UUID               0x2A3F  // Alert Status
+#define RINGER_CTRL_PT_UUID             0x2A40  // Ringer Control Point
+#define RINGER_SETTING_UUID             0x2A41  // Ringer Setting
+#define ALERT_CAT_ID_BMASK_UUID         0x2A42  // Alert Category ID Bit Mask
+#define ALERT_CAT_ID_UUID               0x2A43  // Alert Category ID
+#define ALERT_NOTIF_CTRL_PT_UUID        0x2A44  // Alert Notification Control Point
+#define UNREAD_ALERT_STATUS_UUID        0x2A45  // Unread Alert Status
+#define NEW_ALERT_UUID                  0x2A46  // New Alert
+#define SUP_NEW_ALERT_CAT_UUID          0x2A47  // Supported New Alert Category
+#define SUP_UNREAD_ALERT_CAT_UUID       0x2A48  // Supported Unread Alert Category
+#define BLOODPRESSURE_FEATURE_UUID      0x2A49  // Blood Pressure Feature
+#define HID_INFORMATION_UUID            0x2A4A  // HID Information
+#define REPORT_MAP_UUID                 0x2A4B  // Report Map
+#define HID_CTRL_PT_UUID                0x2A4C  // HID Control Point
+#define REPORT_UUID                     0x2A4D  // Report
+#define PROTOCOL_MODE_UUID              0x2A4E  // Protocol Mode
+#define SCAN_INTERVAL_WINDOW_UUID       0x2A4F  // Scan Interval Window
+#define PNP_ID_UUID                     0x2A50  // PnP ID
+#define GLUCOSE_FEATURE_UUID            0x2A51  // Glucose Feature
+#define RECORD_CTRL_PT_UUID             0x2A52  // Record Access Control Point
+#define RSC_MEAS_UUID                   0x2A53  // RSC Measurement
+#define RSC_FEATURE_UUID                0x2A54  // RSC Feature
+#define SC_CTRL_PT_UUID                 0x2A55  // SC Control Point
+#define CSC_MEAS_UUID                   0x2A5B  // CSC Measurement
+#define CSC_FEATURE_UUID                0x2A5C  // CSC Feature
+#define SENSOR_LOC_UUID                 0x2A5D  // Sensor Location
+#define CYCPWR_MEAS_UUID                0x2A63  // Cycling Power Measurement
+#define CYCPWR_VECTOR_UUID              0x2A64  // Cycling Power Vector
+#define CYCPWR_FEATURE_UUID             0x2A65  // Cycling Power Feature
+#define CYCPWR_CTRL_PT_UUID             0x2A66  // Cycling Power Control Point
+#define LOC_SPEED_UUID                  0x2A67  // Location and Speed
+#define NAV_UUID                        0x2A68  // Navigation
+#define POS_QUALITY_UUID                0x2A69  // Position Quality
+#define LN_FEATURE_UUID                 0x2A6A  // LN Feature
+#define LN_CTRL_PT_UUID                 0x2A6B  // LN Control Point  
+
+#define GATT_UUID_FITNESS_MACHINE_FEATURE           0x2ACC
+#define GATT_UUID_TREADMILL_DATA                    0x2ACD //跑步机数据
+#define GATT_UUID_CROSS_TRAINER_DATA                0x2ACE //椭圆机数据
+#define GATT_UUID_ROWER_DATA                        0x2AD1 //划船机数据
+#define GATT_UUID_INDOOR_BIKE_DATA                  0x2AD2 //单车数据
+#define GATT_UUID_STEP_CLIMBER_DATA                 0x2ACF //攀岩机
+#define GATT_UUID_STAIR_CLIMBER_DATA                0x2AD0  //爬楼梯机
+
+#define GATT_UUID_TRAINING_STATUS                   0x2AD3
+#define GATT_UUID_SUPPORT_SPEED_RANGE               0x2AD4
+#define GATT_UUID_SUPPORT_INCLINATION_RANGE         0x2AD5
+#define GATT_UUID_SUPPORT_RESISTANCE_LEVEL_RANGE    0x2AD6
+#define GATT_UUID_SUPPORT_HEART_RATE_RANGE          0x2AD7
+#define GATT_UUID_SUPPORT_POWER_RANGE               0x2AD8
+#define GATT_UUID_FITNESS_MACHINE_CONTROL_POINT     0x2AD9
+#define GATT_UUID_FITNESS_MACHINE_STATUS            0x2ADA
+
+/**
+ * GATT Unit UUIDs
+ */
+#define GATT_UNITLESS_UUID                    0x2700  // <Symbol>, <Expressed in terms of SI base units>
+#define GATT_UNIT_LENGTH_METER_UUID           0x2701  // m, m
+#define GATT_UNIT_MASS_KGRAM_UUID             0x2702  // kg, kg
+#define GATT_UNIT_TIME_SECOND_UUID            0x2703  // s, s
+#define GATT_UNIT_ELECTRIC_CURRENT_A_UUID     0x2704  // A, A
+#define GATT_UNIT_THERMODYN_TEMP_K_UUID       0x2705  // K, K
+#define GATT_UNIT_AMOUNT_SUBSTANCE_M_UUID     0x2706  // mol, mol
+#define GATT_UNIT_LUMINOUS_INTENSITY_C_UUID   0x2707  // cd, cd
+
+#define GATT_UNIT_AREA_SQ_MTR_UUID            0x2710  // m^2, m^2
+#define GATT_UNIT_VOLUME_CUBIC_MTR_UUID       0x2711  // m^3, m^3
+#define GATT_UNIT_VELOCITY_MPS_UUID           0x2712  // m/s, m s^-1
+#define GATT_UNIT_ACCELERATION_MPS_SQ_UUID    0x2713  // m/s^2, m s^-2
+#define GATT_UNIT_WAVENUMBER_RM_UUID          0x2714  // ? m^-1
+#define GATT_UNIT_DENSITY_KGPCM_UUID          0x2715  // p, kg m^-3
+#define GATT_UNIT_SURFACE_DENSITY_KGPSM_UUID  0x2716  // pA, kg m^-2
+#define GATT_UNIT_SPECIFIC_VOLUME_CMPKG_UUID  0x2717  // v, m^3 kg^-1
+#define GATT_UNIT_CURRENT_DENSITY_APSM_UUID   0x2718  // j, A m^-2
+#define GATT_UNIT_MAG_FIELD_STRENGTH_UUID     0x2719  // H, A m
+#define GATT_UNIT_AMOUNT_CONC_MPCM_UUID       0x271A  // c, mol m^-3
+#define GATT_UNIT_MASS_CONC_KGPCM_UUID        0x271B  // c, kg m^-3
+#define GATT_UNIT_LUMINANCE_CPSM_UUID         0x271C  // Lv, cd m^-2
+#define GATT_UNIT_REFRACTIVE_INDEX_UUID       0x271D  // n, 1
+#define GATT_UNIT_RELATIVE_PERMEABLILTY_UUID  0x271E  // u, 1
+#define GATT_UNIT_PLANE_ANGLE_RAD_UUID        0x2720  // rad, m m-1
+#define GATT_UNIT_SOLID_ANGLE_STERAD_UUID     0x2721  // sr, m2 m-2
+#define GATT_UNIT_FREQUENCY_HTZ_UUID          0x2722  // Hz, s-1
+#define GATT_UNIT_FORCE_NEWTON_UUID           0x2723  // N, m kg s-2
+#define GATT_UNIT_PRESSURE_PASCAL_UUID        0x2724  // Pa, N/m2 = m2 kg s-2
+#define GATT_UNIT_ENERGY_JOULE_UUID           0x2725  // J, N m = m2 kg s-2
+#define GATT_UNIT_POWER_WATT_UUID             0x2726  // W, J/s = m2 kg s-3
+#define GATT_UNIT_E_CHARGE_C_UUID             0x2727  // C, sA
+#define GATT_UNIT_E_POTENTIAL_DIF_V_UUID      0x2728  // V, W/A = m2 kg s-3 A-1
+
+#define GATT_UNIT_CELSIUS_TEMP_DC_UUID        0x272F  // oC, t/oC = T/K - 273.15
+
+#define GATT_UNIT_TIME_MINUTE_UUID            0x2760  // min, 60 s
+#define GATT_UNIT_TIME_HOUR_UUID              0x2761  // h, 3600 s
+#define GATT_UNIT_TIME_DAY_UUID               0x2762  // d, 86400 s
+#define GATT_UNIT_PLANE_ANGLE_DEGREE_UUID     0x2763  // o, (pi/180) rad
+#define GATT_UNIT_PLANE_ANGLE_MINUTE_UUID     0x2764  // ', (pi/10800) rad
+#define GATT_UNIT_PLANE_ANGLE_SECOND_UUID     0x2765  // '', (pi/648000) rad
+#define GATT_UNIT_AREA_HECTARE_UUID           0x2766  // ha, 10^4 m^2
+#define GATT_UNIT_VOLUME_LITRE_UUID           0x2767  // l, 10^-3 m^3
+#define GATT_UNIT_MASS_TONNE_UUID             0x2768  // t, 10^3 kg
+
+#define GATT_UINT_LENGTH_YARD_UUID            0x27A0  // yd, 0.9144 m
+#define GATT_UNIT_LENGTH_PARSEC_UUID          0x27A1  // pc, 3.085678 ?1016 m
+#define GATT_UNIT_LENGTH_INCH_UUID            0x27A2  // in, 0.0254 m
+#define GATT_UNIT_LENGTH_FOOT_UUID            0x27A3  // ft, 0.3048 m
+#define GATT_UNIT_LENGTH_MILE_UUID            0x27A4  // mi, 1609.347 m
+#define GATT_UNIT_PRESSURE_PFPSI_UUID         0x27A5  // psi, 6.894757 ?103 Pa
+#define GATT_UNIT_VELOCITY_KMPH_UUID          0x27A6  // km/h, 0.2777778 m^s-1
+#define GATT_UNIT_VELOCITY_MPH_UUID           0x27A7  // mi/h, 0.44704 m^ s-1
+#define GATT_UNIT_ANGULAR_VELOCITY_RPM_UUID   0x27A8  // r/min, 0.1047198 rad s-1
+#define GATT_UNIT_ENERGY_GCAL_UUID            0x27A9  //
+#define GATT_UNIT_ENERGY_KCAL_UUID            0x27AA  // kcal, 4190.02 J
+#define GATT_UNIT_ENERGY_KWH_UUID             0x27AB  // kWh, 3600000 J
+#define GATT_UNIT_THERMODYN_TEMP_DF_UUID      0x27AC  // oF, t/oF = T/K ?1.8 - 459.67
+#define GATT_UNIT_PERCENTAGE_UUID             0x27AD  // %
+#define GATT_UNIT_PER_MILE_UUID               0x27AE  //
+#define GATT_UNIT_PERIOD_BPM_UUID             0x27AF  //
+#define GATT_UNIT_E_CHARGE_AH_UUID            0x27B0  //
+#define GATT_UNIT_MASS_DENSITY_MGPD_UUID      0x27B1  //
+#define GATT_UNIT_MASS_DENSITY_MMPL_UUID      0x27B2  //
+#define GATT_UNIT_TIME_YEAR_UUID              0x27B3  //
+#define GATT_UNIT_TIME_MONTH_UUID             0x27B4  //
+
+
+
+
+
+
+
+
+#endif
Index: user/app_ble_protocol.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_protocol.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_protocol.h	(working copy)
@@ -0,0 +1,47 @@
+  /**
+ * @file app_ble_protocol.h
+ * @brief 
+ * @date 2021-10-22
+ */
+
+#ifndef __APP_BLE_PROTOCOL_H__
+#define __APP_BLE_PROTOCOL_H__
+
+#include "yc3121.h"
+#include "yc_bt.h"
+#include "type.h"
+
+#define BLE_CMD_NOTIFY_HANDLE       user_ble_notify_handle
+#define BLE_CMD_WRITE_REQ_HANDLE    user_ble_receive_handle
+#define BLE_CMD_NOTIFY_CHAR_HANDLE  user_ble_notify_char_handle
+
+#define BLE_HID_NOTIFY_HANDLE       hid_ble_notify_handle
+#define BLE_HID_WRITE_REQ_HANDLE    hid_ble_receive_handle
+#define BLE_HID_NOTIFY_CHAR_HANDLE  hid_ble_notify_char_handle
+#define BLE_HID_PAIR_HANDLE         hid_ble_pair_handle
+
+
+extern uint8_t ble_status;
+
+
+
+
+void bleSetGattService(void);
+
+void bleSetName(void);
+
+void bleSetAddr(void);
+
+void bleSetLEPairing(BLE_PARING_MODE_Def mode);
+
+void bleSetPasskeyPincode(uint8_t *pincode);
+
+void bleSetAdvScanData(uint8_t *adv_data,uint8_t *scan_rsp);
+
+void bleSetVisibility(Boolean ble_discoverable);
+
+void bleSendLLEncRsp(void);
+
+
+
+#endif
Index: user/app_ble_protocol.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_protocol.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_ble_protocol.c	(working copy)
@@ -0,0 +1,168 @@
+#include "app_ble_protocol.h"
+#include "app_ble_gatt.h"
+#include "app_util.h"
+#include "bt_config.h"
+
+uint8_t ble_status;
+
+/**
+ * @brief ÿɷ
+ *
+ * @param
+ */
+void bleSetVisibility(Boolean ble_discoverable)
+{
+    if(BT_BleSetVisibility(ble_discoverable) == TRUE)  //ÿɷ
+        uartPrintStr("BT_BleSetVisibility set discoverable success");
+    else
+        uartPrintStr("BT_BleSetVisibility set discoverable failed");
+}
+
+/**
+ * @brief ÷
+ *
+ * @param
+ */
+void bleSetGattService(void)
+{
+    bleGattServiceInit();
+
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+    MyPrintf("BLE_Service_Hid: notify handle = %04x\n",BLE_HID_NOTIFY_HANDLE);
+    MyPrintf("BLE_Service_Hid: notify character handle = %04x\n",BLE_HID_NOTIFY_CHAR_HANDLE);
+    MyPrintf("BLE_Service_Hid: pair handle = %04x\n",BLE_HID_PAIR_HANDLE);
+#endif
+
+#if ((FUNC_DEVICE_BT & BLE_USER_SERVICE_ENABLE) == BLE_USER_SERVICE_ENABLE)
+    MyPrintf("BLE_Service_User: notify handle = %04x\n",BLE_CMD_NOTIFY_HANDLE);
+    MyPrintf("BLE_Service_User: notify character handle = %04x\n",BLE_CMD_NOTIFY_CHAR_HANDLE);
+    MyPrintf("BLE_Service_User: write handle = %04x\n",BLE_CMD_WRITE_REQ_HANDLE);
+#endif
+}
+
+/**
+ * @brief 豸
+ *
+ * @param
+ */
+void bleSetName(void)
+{
+    if(BT_SetBleName((uint8_t *)ble_device_name_const,sizeof(ble_device_name_const)-1)==TRUE)
+        MyPrintf("BT_SetBleName set name:%s\n",ble_device_name_const);
+    else
+        uartPrintStr("BT_SetBleName set name fail");
+}
+
+/**
+ * @brief 豸ַ
+ *
+ * @param
+ */
+void bleSetAddr(void)
+{
+    if(BT_SetBleAddr((uint8_t *)ble_device_mac_const) == TRUE)
+        uartPrintArray("BT_SetBleAddr set mac",(uint8_t *)ble_device_mac_const,sizeof(ble_device_mac_const),TYPE_HEX);
+    else
+        uartPrintStr("BT_SetBleAddr set mac fail");
+}
+
+
+/**
+ * @brief ģʽ
+ *
+ * @param
+ */
+void bleSetLEPairing(BLE_PARING_MODE_Def mode)
+{
+    uint8_t pair_mode = mode;
+    if(BT_SetLEParing(mode) == TRUE)
+        uartPrintArray("BT_SetLEParing set pairing mode",&pair_mode,1,TYPE_HEX);
+    else
+        uartPrintStr("BT_SetLEParing set pairing mode");
+}
+
+/**
+ * @brief PASSKEY ENTRY PINCODE
+ *
+ * @param
+ */
+void bleSetPasskeyPincode(uint8_t *pincode)
+{
+    utilDec2HexArray(ble_pincode_const,&pincode[1]);
+    if(BT_Set_FixedPasskey(pincode) == TRUE)//fixed pincode
+        MyPrintf("BT_SetFixedPasskey set pincode :%d\n",ble_pincode_const);
+    else
+        uartPrintStr("BT_SetFixedPasskey set pincode failed");
+}
+
+void genBleAdvScanData(uint8_t *adv_data,uint8_t *scan_rsp)
+{
+    uint8_t index;
+
+    memcpy(adv_data,ble_adv_data_const,BLE_ADV_DATA_LEN_MAX);
+    memcpy(scan_rsp,ble_scan_rsp_const,BLE_SCAN_RSP_LEN_MAX);
+    index = BLE_ADV_DATA_INDEX;
+
+    //name
+    adv_data[index++] = (sizeof(ble_device_name_const)+1);
+    adv_data[index++] = 0x09;//name flag
+    for(int i=0; i<sizeof(ble_device_name_const); i++)
+    {
+        adv_data[index++] = ble_device_name_const[i];
+    }
+    
+    //manufacturer info
+    adv_data[index++] = 0x09;
+    adv_data[index++] = 0xff;//manufacturer info flag
+    adv_data[index++] = 0x00;
+    adv_data[index++] = 0x00;
+    for(int i=0; i<6; i++)
+    {
+        adv_data[index++] = ble_device_mac_const[5-i];
+    }
+    
+    if(index > 31)
+      uartPrintArray("BT_SetLEAdvData set adv data overflow",&index,1,TYPE_HEX);
+    
+        //test scan rsp set equal to adv data
+    memcpy(scan_rsp,adv_data,BLE_SCAN_RSP_LEN_MAX);
+    
+    uartPrintArray("adv data",adv_data,BLE_ADV_DATA_LEN_MAX,TYPE_HEX);
+    uartPrintArray("scan rsp",scan_rsp,BLE_SCAN_RSP_LEN_MAX,TYPE_HEX);
+}
+
+/**
+ * @brief ù㲥ݺɨ
+ *
+ * @param
+ */
+void bleSetAdvScanData(uint8_t *adv_data,uint8_t *scan_rsp)
+{
+    genBleAdvScanData(adv_data,scan_rsp);
+
+    if(BT_SetLEAdvData(adv_data,BLE_ADV_DATA_LEN_MAX) == TRUE)
+        uartPrintStr("BT_SetLEAdvData set adv data success");
+    else
+        uartPrintStr("BT_SetLEAdvData set adv data failed");
+
+    if(BT_SetLEScanData(scan_rsp,BLE_SCAN_RSP_LEN_MAX) == TRUE)
+        uartPrintStr("BT_SetLEScanData set scan rsp success");
+    else
+        uartPrintStr("BT_SetLEScanData set scan rsp failed");
+}
+
+
+
+/**
+* @brief LL_ENC_RSP
+ *
+ * @param
+ */
+void bleSendLLEncRsp(void)
+{    
+    if(BT_SendBleLLEncRsp() == TRUE)
+        uartPrintStr("BT_SendBleLLEncRsp set success");
+    else
+        uartPrintStr("BT_SendBleLLEncRsp set failed");
+}
+
Index: user/app_bt_protocol.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_bt_protocol.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_bt_protocol.h	(working copy)
@@ -0,0 +1,33 @@
+  /**
+ * @file app_bt_protocol.h
+ * @brief 
+ * @date 2021-10-22
+ */
+
+#ifndef __APP_BT_PROTOCOL_H__
+#define __APP_BT_PROTOCOL_H__
+
+#include "yc3121.h"
+#include "yc_bt.h"
+#include "type.h"
+
+
+void btSetName(void);
+
+void btSetAddr(void);
+
+void btSetParingMode(BT_PARING_MODE_Def mode);
+
+void btSetCOD(uint8_t * bt_cod);
+
+void btSetVisibility(Boolean bt_discoverable, Boolean bt_connectability);
+
+void btCreatReconnect(uint8_t btindex);
+
+void btCancelReconnect(void);
+
+void btStartWork(uint8_t btindex);
+
+void btBondInfoRead(void);
+
+#endif
Index: user/app_bt_protocol.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_bt_protocol.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_bt_protocol.c	(working copy)
@@ -0,0 +1,134 @@
+#include "app_bt_protocol.h"
+#include "app_eeprom_bt_bond_info.h"
+#include "app_util.h"
+#include "bt_config.h"
+
+/**
+ * @brief 豸
+ *
+ * @param
+ */
+void btSetName(void)
+{
+    if(BT_SetBtName((uint8_t *)bt_device_name_const,sizeof(bt_device_name_const)-1) == TRUE)
+        MyPrintf("BT_SetBtName set name:%s\n",bt_device_name_const);
+    else
+        uartPrintStr("BT_SetBtName set name fail");
+}
+
+/**
+ * @brief 豸ַ
+ *
+ * @param
+ */
+void btSetAddr(void)
+{
+    if(BT_SetBtAddr((uint8_t *)bt_device_mac_const) == TRUE)
+        uartPrintArray("BT_SetBtAddr set mac",(uint8_t *)bt_device_mac_const,sizeof(bt_device_mac_const),TYPE_HEX);
+    else
+        uartPrintStr("BT_SetBtAddr set mac fail");
+}
+
+
+/**
+ * @brief ģʽ
+ *
+ * @param
+ */
+void btSetParingMode(BT_PARING_MODE_Def mode)
+{
+    uint8_t pair_mode = mode;
+    if(BT_SetParingMode(mode) == TRUE)
+        uartPrintArray("BT_SetParingMode set pairing mode",&pair_mode,1,TYPE_HEX);
+    else
+        uartPrintStr("BT_SetParingMode set justwork mode failed\n");
+}
+
+/**
+ * @brief 豸
+ *
+ * @param
+ */
+void btSetCOD(uint8_t * bt_cod)
+{
+    if(BT_SetCOD(bt_cod) == TRUE) //COD
+        uartPrintStr("BT_SetCOD set COD success");
+    else
+        uartPrintStr("BT_SetCOD set COD failed");
+}
+
+
+/**
+ * @brief ÿɷֿ
+ *
+ * @param
+ */
+void btSetVisibility(Boolean bt_discoverable, Boolean bt_connectability)
+{
+    if(BT_BtSetVisibility(bt_discoverable,bt_connectability) == TRUE)  //ÿɷ
+        uartPrintStr("BT_BtSetVisibility success");
+    else
+        uartPrintStr("BT_BtSetVisibility failed");
+}
+
+/**
+ * @brief ʼ
+ *
+ * @param btindex
+ */
+void btCreatReconnect(uint8_t btindex)
+{
+    if (BT_Creat_Reconnect((uint8_t *)&nvram_data.bt_bond_info[btindex], sizeof(bt_bond_info_t)) == TRUE)
+        uartPrintStr("BT_Creat_Reconnect pass");
+    else
+        uartPrintStr("BT_Creat_Reconnect failed");
+}
+
+/**
+ * @brief ȡ
+ *
+ * @param null
+ */
+void btCancelReconnect(void)
+{
+    if (BT_Cancel_Reconnect() == TRUE)
+        uartPrintStr("BT_Cancel_Reconnect pass");
+    else
+        uartPrintStr("BT_Cancel_Reconnect failed");
+}
+
+/**
+ * @brief ʼ߿ɷ
+ *
+ * @param null
+ */
+void btStartWork(uint8_t btindex)
+{
+    if (isBtBondInfoValid(btindex))
+        btCreatReconnect(btindex);
+    else
+        btSetVisibility(TRUE,TRUE);
+}
+
+/**
+ * @brief ȡ
+ *
+ * @param null
+ */
+void btBondInfoRead(void)
+{
+    uint8_t LinkKeyData[16]= {0};
+    btReadNvramData(&nvram_data);
+    for(uint8_t i=0; i<BT_MAX_PEER_BOND_NUM; i++)
+    {
+        uartPrintArray("[ index ]",&i,1,TYPE_DEC);
+        uartPrintArray("nvram_data.bt_bond_info.btaddr",&nvram_data.bt_bond_info[i].btaddr[0],6,TYPE_HEX);
+        uartPrintArray("nvram_data.bt_bond_info.hostbtaddr",&nvram_data.bt_bond_info[i].hostbtaddr[0],6,TYPE_HEX);
+        for(int j=0; j<16; j++)
+        {
+            LinkKeyData[j] = nvram_data.bt_bond_info[i].link_key[15-j];
+        }
+        uartPrintArray("nvram_data.bt_bond_info.link_key",LinkKeyData,16,TYPE_HEX);
+    }
+}
+
Index: user/app_eeprom.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom.h	(working copy)
@@ -0,0 +1,18 @@
+/**
+ * @file app_eeprom.h
+ * @brief flashģeeprom
+ * @date 2021-11-19
+ */
+
+#ifndef _APP_EEPROM_H_
+#define _APP_EEPROM_H_
+
+#include "type.h"
+
+
+void writeE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff);
+
+
+void readE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff);
+
+#endif
\ No newline at end of file
Index: user/app_eeprom.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom.c	(working copy)
@@ -0,0 +1,125 @@
+#include "app_eeprom.h"
+#include "eeprom_config.h"
+#include "yc_qspi.h"
+
+/*******************************************************************************************************
+ļ:	app_eeprom.c
+ :  YC3121оƬڲSPI_flashģ4KB EEPROM
+				YC3121ڲԪװspi flash 512k ַ0x10000ʼûʹá
+					洢nֽʵռ2*(n+1)ֽڣ洢n+1ֽڡݴ洢n+1ֽڣһֽΪУλ
+					洢ͱݴ洢λ
+					豸ַ0x10000-0x3ffff
+					ݵַ0x40000-0x6ffff
+*********************************************************************************************************/
+
+
+/************************************************************************************************
+ :	 	void writeE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff)
+ :	flashдݣ洢дݺһֽڵУ飨ΪֹԼУλ
+						flashֵȫغϣУλΪff´flashеУλΪ00ͬʱҲд
+						ݣд֮͵ĵַƫData_Len+1λ
+	uint8_t *Databuff buffַ
+						uint16_t Data_Len ݳ
+						uint8_t Data_Type 
+ȫֱ	
+أ			
+************************************************************************************************/
+void writeE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff)
+{
+    uint8_t tbuff[data_len+1];
+    tbuff[data_len] = 0;
+    for(int i=0; i<data_len; i++)
+    {
+        tbuff[i] = data_buff[i];
+        tbuff[data_len] ^= tbuff[i];
+    }
+    if(tbuff[data_len]==0xff)
+    {
+        tbuff[data_len]=0x00;
+    }
+    if(write_address[data_type]+(data_len+1)>end_address[data_type])
+    {
+        uint32_t erase_addr = init_address[data_type];
+        while(erase_addr < end_address[data_type])
+        {
+            qspi_flash_sectorerase(erase_addr);
+            qspi_flash_sectorerase(erase_addr+EEPROM_INFO_BACK_OFFSET);
+            erase_addr +=0x1000;
+        }
+        write_address[data_type] = init_address[data_type];
+    }
+    qspi_flash_write(write_address[data_type], tbuff, data_len+1);
+    qspi_flash_write(write_address[data_type]+EEPROM_INFO_BACK_OFFSET, tbuff, data_len+1);
+    write_address[data_type] +=(data_len+1);
+}
+
+/****************************************************************************************************
+ :	 	void readE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff)
+ :	flashд洢ݣʼַͽַѱ͵һ
+						У飬ÿһ֡ݻḲһεdatabuffȡе洢ݴʱȡݴ洢
+						ݣݴ洢Ҳ򶪵һݣݲҰݴ
+						ʼַСںʼãҶȡǶ̬µݣᱣ
+						һδ洢ݡ
+	uint16_t Data_Len ݳ
+						uint8_t Data_Type 
+						uint8_t *databuff ݴ洢ַ
+ȫֱ	
+أ			
+****************************************************************************************************/
+void readE2prom(uint8_t data_type,uint16_t data_len,uint8_t *data_buff)
+{
+    uint8_t rbuf[data_len+1];
+    uint32_t read_addr = init_address[data_type];
+    uint32_t erase_addr = init_address[data_type];
+    while((read_addr+data_len+1)<end_address[data_type])
+    {
+        qspi_flash_read(read_addr, rbuf, data_len+1);
+        uint8_t check_sum = 0;
+        for(int i=0; i<data_len; i++)
+        {
+            check_sum ^= rbuf[i];
+        }
+        if(check_sum==0xff)
+        {
+            check_sum = 0x00;
+        }
+        if(check_sum == rbuf[data_len])
+        {   
+            for(int i=0; i<data_len; i++)
+            {
+                data_buff[i] = rbuf[i];
+            }
+        }
+        else
+        {
+            qspi_flash_read(read_addr+EEPROM_INFO_BACK_OFFSET, rbuf, data_len+1);
+            uint8_t check_sum = 0;
+            for(int i=0; i<data_len; i++)
+            {
+                check_sum ^= rbuf[i];
+            }
+            if(check_sum==0xff)
+            {
+                check_sum = 0x00;
+            }
+            if(check_sum == rbuf[data_len])
+            {
+                for(int i=0; i<data_len; i++)
+                {
+                    data_buff[i] = rbuf[i];
+                }
+            }
+        }
+        read_addr +=(data_len+1);
+    }
+    while(erase_addr < end_address[data_type])
+    {
+        qspi_flash_sectorerase(erase_addr);
+        qspi_flash_sectorerase(erase_addr+EEPROM_INFO_BACK_OFFSET);
+        erase_addr +=0x1000;
+    }
+    writeE2prom(data_type,data_len,data_buff);
+}
+
+
+
Index: user/app_eeprom_ble_bond_info.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_ble_bond_info.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_ble_bond_info.h	(working copy)
@@ -0,0 +1,138 @@
+  /**
+ * @file app_ble_bond_info.h
+ * @brief 
+ * @date 2021-10-22
+ */
+
+#ifndef __APP_EEPROM_BLE_BOND_INFO_H__
+#define __APP_EEPROM_BLE_BOND_INFO_H__
+
+#include "yc3121.h"
+#include "type.h"
+
+
+#define mem_le_lap     0xc4472
+#define mem_le_tk      0xc4499
+#define mem_le_ediv    0xc449d
+#define mem_le_irk     0xc44a7
+#define mem_le_ltk     0xc43eb
+#define mem_ltk_exists 0xc43fb
+#define mem_le_peer_addr 0xc4bfa
+
+
+#define BLE_STATUS_UNCONNECTED  0
+#define BLE_STATUS_CONNECTED    1
+#define BLE_STATUS_BONDED       3
+
+
+//. 
+#define BLE_MAX_PEER_BOND_NUM  5
+
+
+typedef struct{
+    uint8_t peer_addr[6];
+    uint8_t peer_ediv[2];
+    uint8_t peer_irk[16];
+    uint8_t peer_ltk[16];
+    uint8_t be_putted;
+}BleHidBondInfo;
+
+//ǰֻϢ
+extern BleHidBondInfo ble_hid_bond_info_now;
+
+//ѰֻϢ
+extern BleHidBondInfo ble_bond_info[BLE_MAX_PEER_BOND_NUM] ;
+
+/*********************************************
+ * FunctionName : bleReadNowBondInfo
+ * Description  : ȡ豸ǰϢ
+ * Parameters   : none
+ * Returns      : none
+**********************************************/
+void bleReadNowBondInfo(void);
+
+/*********************************************
+ * FunctionName : bleBondInfoSave
+ * Description  : 豸Ϣflash
+ * Parameters   : ltkǰ󶨵ltk
+ * Returns      : none
+**********************************************/
+void bleBondInfoSave(uint8_t *ltk);
+
+
+/*********************************************
+ * FunctionName : bleBondInfoSaveByMac
+ * Description  : 豸Ϣflash
+ * Parameters   : peer_macǰ󶨵peer_mac
+ * Returns      : none
+**********************************************/
+void bleBondInfoSaveByMac(uint8_t *peer_mac);
+
+/*********************************************
+ * FunctionName : bleBondInfoRead
+ * Description  : flashȡ豸б
+ * Parameters   : restore_ltk_to_dsp
+ * Returns      : ǰ豸ֻ
+**********************************************/
+uint8_t bleBondInfoRead(Boolean is_restore_ltk_to_dsp);
+
+/*********************************************
+ * FunctionName : bleBondInfoGetLTK
+ * Description  : M0ltkȫֱݸƵdsp mem_le_ltk
+ * Parameters   : index
+ * Returns      : none
+**********************************************/
+void bleBondInfoGetLTK(uint8_t index);
+
+/*********************************************
+ * FunctionName : bleBondInfoCheckLTK
+ * Description  : ѯǰltkӦбindex
+ * Parameters   : ǰ豸ltk
+ * Returns      : index
+**********************************************/
+int8_t bleBondInfoCheckLTK(uint8_t *ltk);
+
+/*********************************************
+ * FunctionName : bleBondInfoCheckEDIV
+ * Description  : ѯǰedivӦбindex
+ * Parameters   : ǰ豸ediv
+ * Returns      : index
+**********************************************/
+int8_t bleBondInfoCheckEDIV(uint8_t *ediv);
+
+/*********************************************
+ * FunctionName : bleBondInfoRefresh
+ * Description  : ݴltkˢ´洢İϢ
+ * Parameters   : ǰltk
+ * Returns      : index
+**********************************************/
+int8_t bleBondInfoRefresh(uint8_t *ltk);
+
+
+
+/*********************************************
+ * FunctionName : bleBondInfoRefreshByMac
+ * Description  : ݴmacˢ´洢İϢ
+ * Parameters   : ǰmac
+ * Returns      : index
+**********************************************/
+int8_t bleBondInfoRefreshByMac(uint8_t *peer_mac);
+
+/*********************************************
+ * FunctionName : bleBondInfoReset
+ * Description  : 豸б
+ * Parameters   : none
+ * Returns      : SUCCESS/FAILED
+**********************************************/
+uint8_t bleBondInfoReset(void);
+
+
+/*********************************************
+ * FunctionName : bleBondInfoSwitchLTK
+ * Description  : ʱedivѡӦltk
+ * Parameters   : none
+ * Returns      : none
+**********************************************/
+void bleBondInfoSwitchLTK(void);
+
+#endif
Index: user/app_eeprom_ble_bond_info.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_ble_bond_info.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_ble_bond_info.c	(working copy)
@@ -0,0 +1,301 @@
+#include "app_eeprom_ble_bond_info.h"
+#include "app_eeprom.h"
+#include "app_ble_protocol.h"
+#include "app_util.h"
+#include "eeprom_config.h"
+#include "yc_ipc.h"
+#include "yc_qspi.h"
+
+//ǰֻϢ
+BleHidBondInfo ble_hid_bond_info_now;
+
+
+//ѰֻϢ
+BleHidBondInfo ble_bond_info[BLE_MAX_PEER_BOND_NUM] = {0};
+
+
+//ȡǰ豸Ϣ
+void bleReadNowBondInfo(void)
+{
+    for (uint8_t i = 0; i < 6; i++)
+        ble_hid_bond_info_now.peer_addr[i] = HR_REG_8BIT(mem_le_peer_addr + i);
+    for (uint8_t i = 0; i < 2; i++)
+        ble_hid_bond_info_now.peer_ediv[i] = HR_REG_8BIT(mem_le_ediv + i);
+    for (uint8_t i = 0; i < 16; i++)
+        ble_hid_bond_info_now.peer_irk[i] = HR_REG_8BIT(mem_le_irk + i);
+    for (uint8_t i = 0; i < 16; i++)
+        ble_hid_bond_info_now.peer_ltk[i] = HR_REG_8BIT(mem_le_ltk + i);
+    
+    uartPrintArray("ble_now_peer_addr",&ble_hid_bond_info_now.peer_addr[0],6,TYPE_HEX);
+    uartPrintArray("ble_now_peer_ediv",&ble_hid_bond_info_now.peer_ediv[0],2,TYPE_HEX);
+    uartPrintArray("ble_now_peer_irk",&ble_hid_bond_info_now.peer_irk[0],16,TYPE_HEX);
+    uartPrintArray("ble_now_peer_ltk",&ble_hid_bond_info_now.peer_ltk[0],16,TYPE_HEX);
+}
+
+
+void bleBondInfoSave(uint8_t *ltk)
+{
+    int i;
+    uint8_t fill_flag = 0;
+    for(i = 0; i < BLE_MAX_PEER_BOND_NUM; i ++)
+    {
+        //֮ǰйԵ豸 or Դ洢δ
+        if(memcmp(ble_bond_info[i].peer_ltk, ltk, 16) == 0 || ble_bond_info[i].be_putted == 0)
+        {
+            for(int k=0; k<6; k++)
+            {
+                ble_bond_info[i].peer_addr[k] =  ble_hid_bond_info_now.peer_addr[k];
+            }
+            for(int k=0; k<2; k++)
+                ble_bond_info[i].peer_ediv[k] =  ble_hid_bond_info_now.peer_ediv[k];
+            for(int k=0; k<16; k++)
+                ble_bond_info[i].peer_irk[k] =  ble_hid_bond_info_now.peer_irk[k];
+            memcpy(ble_bond_info[i].peer_ltk, ltk, 16);
+            ble_bond_info[i].be_putted = 1;
+            fill_flag = 1;
+            break;
+        }
+    }
+    //Դ洢Ѵ
+    if(i == BLE_MAX_PEER_BOND_NUM && fill_flag == 0)
+    {
+        uartPrintStr("The number of bindings reached the upper limit!");
+        memcpy(ble_bond_info[i-1].peer_ltk, ltk, 16);
+        for(int k=0; k<6; k++)
+        {
+            ble_bond_info[i-1].peer_addr[k] =  ble_hid_bond_info_now.peer_addr[k];
+            // MyPrintf(" %02x-------%02x\r\n", ble_bond_info[i].peer_addr[k],ble_hid_bond_info_now.peer_addr[k]);
+        }
+        for(int k=0; k<2; k++)
+            ble_bond_info[i-1].peer_ediv[k] =  ble_hid_bond_info_now.peer_ediv[k];
+        for(int k=0; k<16; k++)
+            ble_bond_info[i-1].peer_irk[k] =  ble_hid_bond_info_now.peer_irk[k];
+
+        ble_bond_info[i-1].be_putted = 1;
+    }
+    uartPrintStr("Begin to Write Ble Bond Information to flash !");
+    //дϢflash
+    writeE2prom(s_ble_bond_info,BLE_MAX_PEER_BOND_NUM*sizeof(BleHidBondInfo),(uint8_t *)&ble_bond_info);
+}
+
+void bleBondInfoSaveByMac(uint8_t *peer_mac)
+{
+    int i;
+    uint8_t fill_flag = 0;
+    for(i = 0; i < BLE_MAX_PEER_BOND_NUM; i ++)
+    {
+        //֮ǰйԵ豸 or Դ洢δ
+        if(memcmp(ble_bond_info[i].peer_addr, peer_mac, 6) == 0 || ble_bond_info[i].be_putted == 0)
+        {
+            uartPrintStr("The number of bindings do not reached the upper limit!");
+            for(int k=0; k<16; k++)
+            {
+                ble_bond_info[i].peer_ltk[k] =  ble_hid_bond_info_now.peer_ltk[k];
+            }
+            for(int k=0; k<2; k++)
+                ble_bond_info[i].peer_ediv[k] =  ble_hid_bond_info_now.peer_ediv[k];
+            for(int k=0; k<16; k++)
+                ble_bond_info[i].peer_irk[k] =  ble_hid_bond_info_now.peer_irk[k];
+            
+            memcpy(ble_bond_info[i].peer_addr, peer_mac, 6);
+            ble_bond_info[i].be_putted = 1;
+            fill_flag = 1;
+            break;
+        }
+    }
+    //Դ洢Ѵ
+    if(i == BLE_MAX_PEER_BOND_NUM && fill_flag == 0)
+    {
+        uartPrintStr("The number of bindings reached the upper limit!");
+        memcpy(ble_bond_info[i-1].peer_addr, peer_mac, 6);
+        for(int k=0; k<16; k++)
+        {
+            ble_bond_info[i-1].peer_ltk[k] =  ble_hid_bond_info_now.peer_ltk[k];
+        }
+        for(int k=0; k<2; k++)
+            ble_bond_info[i-1].peer_ediv[k] = ble_hid_bond_info_now.peer_ediv[k];
+        for(int k=0; k<16; k++)
+            ble_bond_info[i-1].peer_irk[k] = ble_hid_bond_info_now.peer_irk[k];
+
+        ble_bond_info[i-1].be_putted = 1;
+    }
+    uartPrintStr("Begin to Write Ble Bond Information to flash !");
+    //дϢflash
+    writeE2prom(s_ble_bond_info,BLE_MAX_PEER_BOND_NUM*sizeof(BleHidBondInfo),(uint8_t *)&ble_bond_info);
+}
+
+
+//index:0-BLE_MAX_PEER_BOND_NUM
+void bleBondInfoGetLTK(uint8_t index)
+{
+    uint8_t ltk_exists_flag = 0;
+    for (uint8_t i = 0; i < 16; i++)
+    {
+        HW_REG_8BIT(mem_le_ltk + i, ble_bond_info[index].peer_ltk[i]);
+        //жltkǷ
+        if (ble_bond_info[index].peer_ltk[i] != 0 && ltk_exists_flag != 1)
+            ltk_exists_flag = 1;
+    }
+    //дdsp ltk_exists־
+    HW_REG_8BIT(mem_ltk_exists,ltk_exists_flag);
+}
+
+
+uint8_t bleBondInfoRead(Boolean is_restore_ltk_to_dsp)
+{
+    uint8_t ble_bonded_num =0;
+    //ȡ԰Ϣ
+    readE2prom(s_ble_bond_info,BLE_MAX_PEER_BOND_NUM*sizeof(BleHidBondInfo),(uint8_t *)&ble_bond_info);
+    
+    if(is_restore_ltk_to_dsp)
+    {
+        //ָltkdsp
+        bleBondInfoGetLTK(0);
+    }
+    uartPrintStr("----------------START bleBondInfoRead");
+    uartPrintStr("Ble_bond_info list:");
+    for(uint8_t i=0; i<BLE_MAX_PEER_BOND_NUM; i++)
+    {
+        uartPrintArray("[ index ]",&i,1,TYPE_DEC);
+        uartPrintArray("peer_addr",&ble_bond_info[i].peer_addr[0],6,TYPE_HEX);
+        uartPrintArray("peer_ediv",&ble_bond_info[i].peer_ediv[0],2,TYPE_HEX);
+        uartPrintArray("peer_irk",&ble_bond_info[i].peer_irk[0],16,TYPE_HEX);
+        uartPrintArray("peer_ltk",&ble_bond_info[i].peer_ltk[0],16,TYPE_HEX);
+        uartPrintArray("be_putted",&ble_bond_info[i].be_putted,1,TYPE_HEX);
+    }
+
+    for(uint8_t i = 0; i < BLE_MAX_PEER_BOND_NUM; i++)
+    {
+        if( ble_bond_info[i].be_putted == 1)
+            ble_bonded_num += 1;
+    }
+    return  ble_bonded_num;
+}
+
+//0-BLE_MAX_PEER_BOND_NUM  ʾб±
+//-1 δҵ
+int8_t bleBondInfoCheckLTK(uint8_t *ltk)
+{
+    uint8_t i = 0;
+    uartPrintStr("----------------START bleBondInfoCheckLTK");
+    for(i = 0; i < BLE_MAX_PEER_BOND_NUM; i++)
+    {
+        if(ble_bond_info[i].be_putted && memcmp(ble_bond_info[i].peer_ltk, ltk, 16) == 0)
+        {
+            uartPrintArray("Get the bond info, index =",&i,1,TYPE_DEC);
+            return i;
+        }
+        else if(ble_bond_info[i].be_putted)
+        {
+            uartPrintArray("ble_peer_ltk",&ble_bond_info[i].peer_ltk[0],16,TYPE_HEX);
+        }
+    }
+    return -1;
+}
+
+
+//0-BLE_MAX_PEER_BOND_NUM  ʾб±
+//-1 δҵ
+int8_t bleBondInfoCheckEDIV(uint8_t *ediv)
+{
+    uint8_t i = 0;
+    uartPrintStr("----------------START bleBondInfoCheckEDIV");
+    for(i = 0; i < BLE_MAX_PEER_BOND_NUM; i++)
+    {
+        if(ble_bond_info[i].be_putted && memcmp(ble_bond_info[i].peer_ediv, ediv, 2) == 0)
+        {
+            uartPrintArray("Get the ediv info, index =",&i,1,TYPE_DEC);
+            return i;
+        }
+        else if(ble_bond_info[i].be_putted)
+        {
+            uartPrintArray("ble_peer_ediv",&ble_bond_info[i].peer_ediv[0],2,TYPE_HEX);
+        }
+    }
+    return -1;
+}
+
+
+int8_t bleBondInfoRefresh(uint8_t *ltk)
+{
+    int index = -1;
+    uartPrintArray("Get Ltk",ltk,16,TYPE_HEX);
+    if(ltk == NULL)
+        return -1;
+    //flash洢İϢ
+    bleBondInfoRead(FALSE);
+
+    //ǰ豸ǰ״̬
+    if(ble_status == BLE_STATUS_BONDED)
+    {
+        //洢Ϣ
+        bleBondInfoSave(ltk);
+    }
+
+    //ݵǰ豸ltkڰϢбвҶӦindex
+    index = bleBondInfoCheckLTK(ltk);
+
+    //Ըindexָĳ豸ĳЩ
+    //......
+    return index;
+}
+
+int8_t bleBondInfoRefreshByMac(uint8_t *peer_mac)
+{
+    int index = -1;
+    uartPrintArray("Get Mac",peer_mac,6,TYPE_HEX);
+    if(peer_mac == NULL)
+        return -1;
+    //flash洢İϢ
+    bleBondInfoRead(FALSE);
+
+    //ǰ豸ǰ״̬
+    if(ble_status == BLE_STATUS_BONDED)
+    {
+        //洢Ϣ
+        bleBondInfoSaveByMac(peer_mac);
+    }
+
+    //ݵǰ豸ltkڰϢбвҶӦindex
+    //index = Ble_BondInfoCheckLTK(peer_mac);
+
+    //Ըindexָĳ豸ĳЩ
+    //......
+    return index;
+}
+
+uint8_t bleBondInfoReset(void)
+{
+    //洢ͱݴ洢
+    if(qspi_flash_sectorerase(init_address[s_ble_bond_info])&& qspi_flash_sectorerase(init_address[s_ble_bond_info]+0x30000))
+    {
+        uartPrintStr("qspi_flash_sectorerase(EEPROM_BLE_BOND_INFO_ADDR) Success ");
+        return TRUE;
+    }
+    else
+    {
+        uartPrintStr("qspi_flash_sectorerase(EEPROM_BLE_BOND_INFO_ADDR) Failed ");
+        return FALSE;
+    }
+}
+
+
+void bleBondInfoSwitchLTK(void)
+{
+    int8_t bond_index = 0;
+    uint8_t ble_ediv[2] = {0};
+    ble_ediv[0] = HR_REG_16BIT(mem_le_ediv) & 0xff;
+    ble_ediv[1] = HR_REG_16BIT(mem_le_ediv) >> 8;
+
+    if(HR_REG_16BIT(mem_le_ediv) == 0x0000)    //0x0000 means first bond; others mean reconnect after bond.
+        return;
+
+    bond_index = bleBondInfoCheckEDIV((uint8_t *)(&ble_ediv));
+    if(bond_index == -1)
+    {
+        HW_REG_8BIT(mem_ltk_exists,0);
+        return;
+    }
+    bleBondInfoGetLTK(bond_index);
+}
+
Index: user/app_eeprom_bt_bond_info.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_bt_bond_info.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_bt_bond_info.h	(working copy)
@@ -0,0 +1,53 @@
+/**
+ * @file app_eeprom.h
+ * @brief flashģeeprom
+ * @date 2021-11-19
+ */
+
+#ifndef __APP_EEPROM_BT_BOND_INFO_H__
+#define __APP_EEPROM_BT_BOND_INFO_H__
+
+#include "yc3121.h"
+#include "type.h"
+#include "eeprom_config.h"
+
+
+#define BTADDR_LEN 6
+#define LINK_KEY_LEN 16
+
+//.
+#define BT_MAX_PEER_BOND_NUM  5
+
+/**
+ * @brief Ϣ
+ * 
+ */
+typedef struct
+{
+  uint8_t btaddr[BTADDR_LEN];
+  uint8_t hostbtaddr[BTADDR_LEN];
+  uint8_t link_key[LINK_KEY_LEN];
+} bt_bond_info_t;
+
+/**
+ * @brief BT nvram data typedef
+ * 
+ */
+typedef struct
+{
+  bt_bond_info_t bt_bond_info[BT_MAX_PEER_BOND_NUM];
+  uint32_t nvflag;
+  uint32_t nvid;
+  uint32_t inv_flag;
+} nvram_t;
+
+
+extern nvram_t nvram_data;
+uint8_t btReadNvramData(nvram_t* nvram_data);
+uint8_t btWriteNvramData(nvram_t* nvram_data, uint8_t* nvram, uint8_t btindex);
+uint8_t isBtBondInfoValid(uint8_t indx);
+uint8_t btClearBondInfo(nvram_t* nvram_data, uint8_t btindex);
+
+
+#endif
+
Index: user/app_eeprom_bt_bond_info.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_bt_bond_info.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_bt_bond_info.c	(working copy)
@@ -0,0 +1,83 @@
+#include "app_eeprom_bt_bond_info.h"
+#include "app_util.h"
+#include "yc_qspi.h"
+
+nvram_t nvram_data;
+
+/**
+ * @brief ȡϢ
+ *
+ * @param nvramdat Ϣ
+ * @return ִн
+ */
+uint8_t btReadNvramData(nvram_t* nvram_data)
+{
+    return qspi_flash_read(EEPROM_BT_BOND_INFO_ADDR, (uint8_t*)nvram_data, sizeof(nvram_t));
+}
+
+/**
+ * @brief Ϣ
+ *
+ * @param nvram_dataϢ
+ * @param nvram Ϣ
+ * @param btindex ͨ
+ * @return ִн
+ */
+uint8_t btWriteNvramData(nvram_t* nvram_data, uint8_t* nvram, uint8_t btindex)
+{
+    nvram_data->nvflag = 0xDADADADA;
+    nvram_data->nvid = btindex;
+    memcpy(&nvram_data->bt_bond_info[btindex], nvram, sizeof(bt_bond_info_t));
+    uartPrintStr("new nvram data,updata to flash");
+    qspi_flash_sectorerase(EEPROM_BT_BOND_INFO_ADDR);
+    return qspi_flash_write(EEPROM_BT_BOND_INFO_ADDR, (uint8_t*)nvram_data, sizeof(nvram_t));
+}
+
+
+/**
+ * @brief 鵱ǰͨϢǷЧ
+ *
+ */
+uint8_t isBtBondInfoValid(uint8_t btindex)
+{
+    uint8_t btaddr[BTADDR_LEN];
+    uint8_t hostbtaddr[BTADDR_LEN];
+    uint8_t linkkey[LINK_KEY_LEN];
+    memset(btaddr, 0xFF, BTADDR_LEN);
+    memset(hostbtaddr, 0xFF, BTADDR_LEN);
+    memset(linkkey, 0xFF, LINK_KEY_LEN);
+
+    if ((memcmp(btaddr, nvram_data.bt_bond_info[btindex].btaddr, BTADDR_LEN) == 0)            ||
+        (memcmp(hostbtaddr, nvram_data.bt_bond_info[btindex].hostbtaddr, BTADDR_LEN) == 0)    ||
+        (memcmp(linkkey, nvram_data.bt_bond_info[btindex].link_key, LINK_KEY_LEN) == 0))
+    {
+        uartPrintStr("bond info is null");
+        return 0;
+    }
+    return 1;
+}
+
+/**
+* @brief ǰͨϢֻȡ
+ *
+ */
+uint8_t btClearBondInfo(nvram_t* nvram_data, uint8_t btindex)
+{
+    uint8_t flashnull[BTADDR_LEN+BTADDR_LEN+LINK_KEY_LEN];
+    memset(flashnull, 0xFF, BTADDR_LEN+BTADDR_LEN+LINK_KEY_LEN);
+    btReadNvramData(nvram_data);
+    btWriteNvramData(nvram_data,flashnull,btindex);
+
+    if(isBtBondInfoValid(btindex))
+    {
+        uartPrintStr("clear bond info succ");
+        return 1;
+    }
+    else
+    {
+        uartPrintStr("clear bond info fail");
+        return 0;
+    }
+}
+
+
Index: user/app_eeprom_user_info.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_user_info.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_user_info.h	(working copy)
@@ -0,0 +1,16 @@
+/**
+ * @file app_eeprom_user_info.h
+ * @brief flashģeeprom
+ * @date 2021-11-19
+ */
+
+#ifndef __APP_EEPROM_USER_INFO_H__
+#define __APP_EEPROM_USER_INFO_H__
+
+#include "yc3121.h"
+#include "type.h"
+#include "eeprom_config.h"
+
+
+#endif
+
Index: user/app_eeprom_user_info.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_user_info.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_eeprom_user_info.c	(working copy)
@@ -0,0 +1,6 @@
+#include "app_eeprom_user_info.h"
+#include "yc_qspi.h"
+
+
+
+
Index: user/app_util.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_util.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_util.h	(working copy)
@@ -0,0 +1,54 @@
+/**
+ * @file app_util.h
+ * @brief 
+ * @date 2021-11-19
+ */
+
+#ifndef __APP_UTIL_H_
+#define __APP_UTIL_H_
+
+#include "yc3121.h"
+
+
+/**************************LOG CONFIG***************************/
+#define UART_LOG_ENABLE  1
+#define TYPE_DEC  0
+#define TYPE_HEX  1
+#define TYPE_STR  2
+
+
+/*********************************************
+ * FunctionName : uartPrintArray
+ * Description  : ڴӡַ
+ * Parameters   : ַ
+ * Returns      : null
+**********************************************/
+void uartPrintStr(const char *str);
+
+
+/*********************************************
+ * FunctionName : uartPrintArray
+ * Description  : ڴӡ
+ * Parameters   : ַ,ַ,
+ * Returns      : null
+**********************************************/
+void uartPrintArray(const char *str,uint8_t *dataBuf,uint8_t dataLen, uint8_t type);
+
+
+/*********************************************
+ * FunctionName : CRC16_2
+ * Description  : Уֵ
+ * Parameters   : ַ,
+ * Returns      : crc
+**********************************************/
+unsigned int CRC16_2(unsigned char *buf, int len);
+
+
+uint8_t *util_byte2ascii (uint8_t value, uint8_t buff[2]);
+
+
+void utilArray2Hex(uint8_t* in, int inlen, uint8_t* out);
+
+void utilDec2HexArray(int in, uint8_t* out);
+
+#endif
\ No newline at end of file
Index: user/app_util.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_util.c	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/app_util.c	(working copy)
@@ -0,0 +1,123 @@
+#include "app_util.h"
+
+
+void uartPrintStr(const char *str)
+{
+#if (UART_LOG_ENABLE)
+    for (uint8_t i = 0; i < strlen(str); i++)
+        MyPrintf("%c", (uint8_t)str[i]);
+    MyPrintf("\r\n");
+#endif
+}
+
+
+void uartPrintArray(const char *str,uint8_t *dataBuf,uint8_t dataLen, uint8_t type)
+{
+#if (UART_LOG_ENABLE)
+    for (uint8_t i = 0; i < strlen(str); i++)
+        MyPrintf("%c", (uint8_t)str[i]);
+    MyPrintf(":");
+    for (uint8_t i = 0; i < dataLen; i++)
+    {
+        switch (type)
+        {
+        case TYPE_DEC:
+            MyPrintf(" %d", dataBuf[i]);
+            break;
+        case TYPE_HEX:
+            MyPrintf(" %02x", dataBuf[i]);
+            break;
+        case TYPE_STR:
+            MyPrintf(" %s", dataBuf[i]);
+            break;
+        default:
+            break;
+        }
+    }
+    MyPrintf("\r\n");
+#endif
+}
+
+
+unsigned int CRC16_2(unsigned char *buf, int len)
+{
+    unsigned int crc = 0xFFFF;
+    for (int pos = 0; pos < len; pos++)
+    {
+        crc ^= (unsigned int)buf[pos]; // XOR byte into least sig. byte of crc
+        for (int i = 8; i != 0; i--)   // Loop over each bit
+        {
+            if ((crc & 0x0001) != 0)   // If the LSB is set
+            {
+                crc >>= 1; // Shift right and XOR 0xA001
+                crc ^= 0xA001;
+            }
+            else // Else LSB is not set
+            {
+                crc >>= 1;    // Just shift right
+            }
+        }
+    }
+
+    crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
+
+    MyPrintf(" %02x", crc & 0xff);
+    MyPrintf(" %02x", (crc & 0xff00) >> 8);
+    MyPrintf("\r\n");
+
+    return crc;
+}
+
+
+uint8_t *utilByte2Ascii (uint8_t value, uint8_t buff[2])
+{
+    uint8_t  nibble = (value >> 4) & 0x0F;
+
+    if (nibble <= 9) {
+        *buff++ = (uint8_t)(nibble + '0');
+    } else {
+        *buff++ = (uint8_t)(nibble - 10 + 'A');
+    }
+
+    nibble = value & 0x0F;
+
+    if (nibble <= 9) {
+        *buff++ = (uint8_t)(nibble + '0');
+    } else {
+        *buff++ = (uint8_t)(nibble - 10 + 'A');
+    }
+
+    return (buff);
+}
+
+
+static const uint8_t hex_lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7','8','9', 'a', 'b', 'c', 'd', 'e', 'f' };
+void utilArray2Hex(uint8_t* in, int inlen, uint8_t* out)
+{
+    int i;
+    for (i = 0; i < inlen; ++i)
+    {
+        out[2 * i] = hex_lookup[in[inlen-1-i] >> 4];
+        out[2 * i + 1] = hex_lookup[in[inlen-1-i] & 0x0f];
+    }
+}
+
+void utilDec2HexArray(int in, uint8_t* out)
+{
+    int i=0;
+    int a[32]= {0};
+
+    while (in/16 != 0)
+    {
+        a[i] = in%16;
+        in = in/16;
+        i++;
+    }
+    a[i] = in;
+
+    for(int j=0,k=0; k<i+1; j++,k+=2)
+    {
+        out[j] = a[k] | (a[k+1] << 4);
+    }
+}
+
Index: user/bt_code.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/bt_code.c	(revision 920)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/bt_code.c	(working copy)
@@ -1,481 +1,496 @@
 const unsigned char bt_code[] = {
-0x00,0x02,0xaa,0x55,0x1a,0x1f,0xc2,0x84,0x00,0x20,0xc0,0x00,0x00,0x40,0xc0,0x03,
-0x87,0x93,0xc0,0x09,0x87,0x96,0xc0,0x0b,0x87,0x99,0xc0,0x08,0x87,0xa1,0xc0,0x6c,
-0x87,0xb9,0xc0,0x00,0x80,0x79,0xc0,0x42,0x80,0x80,0xc0,0x44,0x80,0xa1,0xc0,0x1a,
-0x00,0x63,0xc0,0x4a,0x00,0x67,0xc0,0x51,0x00,0xaa,0xc0,0x51,0x80,0x72,0xc0,0x56,
-0x00,0xb1,0xc0,0x5c,0x00,0xb2,0xc0,0x5d,0x81,0x3e,0xc0,0x5e,0x01,0xb0,0xc0,0x75,
-0x81,0xd4,0xc0,0x02,0x83,0xb8,0xc0,0x16,0x03,0xd2,0xc0,0x17,0x03,0xd7,0xc0,0x37,
-0x83,0xe5,0xc0,0x53,0x03,0xf6,0xc0,0x53,0x84,0x17,0xc0,0x55,0x84,0x3e,0xc0,0x5a,
-0x04,0x40,0xc0,0x1d,0x83,0xda,0xc0,0x5f,0x84,0x8e,0xc0,0x13,0x04,0x74,0xc0,0x14,
-0x04,0x81,0x20,0x20,0x4a,0x8b,0xc0,0x01,0x81,0xde,0xc0,0x02,0x81,0xea,0xc0,0x03,
-0x01,0xf3,0xc0,0x03,0x81,0xf8,0xc0,0x04,0x01,0xff,0xc0,0x05,0x82,0x0d,0xc0,0x09,
-0x82,0x19,0xc0,0x0a,0x02,0x9d,0xc0,0x0e,0x02,0xad,0xc0,0x0f,0x02,0xd1,0xc0,0x0f,
-0x82,0xf9,0xc0,0x10,0x83,0x2d,0xc0,0x18,0x03,0x3c,0xc0,0x19,0x03,0x40,0xc0,0x1d,
-0x03,0x4f,0xc0,0x1d,0x84,0x6a,0xc0,0x1e,0x83,0x5a,0xc0,0x1f,0x03,0x6c,0xc0,0x20,
-0x83,0x7e,0xc0,0x24,0x83,0x84,0xc0,0x29,0x03,0x8d,0xc0,0x2a,0x83,0x9a,0xc0,0x46,
-0x82,0xe3,0xc0,0x4c,0x83,0xb4,0xc0,0x35,0x07,0x3c,0xc0,0x3d,0x07,0x21,0xc0,0x28,
-0x84,0xa5,0xc0,0x2a,0x04,0xb3,0xc0,0x2c,0x04,0x93,0xc0,0x31,0x84,0x91,0xc0,0x22,
-0x07,0xa6,0x20,0x20,0x4a,0x8b,0x6f,0xec,0x4b,0xf4,0x67,0xec,0x00,0xa1,0x1c,0xe2,
-0x7e,0x00,0x20,0x3a,0x00,0x4d,0x20,0x40,0x00,0x46,0x20,0x20,0x40,0x02,0x70,0x40,
-0x91,0x00,0x20,0x40,0x00,0x49,0x20,0x20,0x67,0xbc,0x6f,0xe2,0x89,0x73,0x79,0x20,
+0x00,0x02,0xaa,0x55,0xea,0x1f,0xc2,0x84,0x00,0x1c,0xc0,0x00,0x00,0x3c,0xc0,0x03,
+0x87,0xcf,0xc0,0x09,0x87,0xd2,0xc0,0x0b,0x87,0xd5,0xc0,0x6c,0x87,0xf0,0xc0,0x00,
+0x80,0x75,0xc0,0x42,0x80,0x7c,0xc0,0x44,0x80,0x9d,0xc0,0x1a,0x00,0x5f,0xc0,0x4a,
+0x00,0x63,0xc0,0x51,0x00,0xa6,0xc0,0x51,0x80,0x6e,0xc0,0x56,0x00,0xad,0xc0,0x5c,
+0x00,0xae,0xc0,0x5d,0x81,0x57,0xc0,0x5e,0x01,0xe1,0xc0,0x75,0x82,0x05,0xc0,0x02,
+0x84,0x0c,0xc0,0x17,0x04,0x26,0xc0,0x37,0x84,0x29,0xc0,0x53,0x04,0x3a,0xc0,0x53,
+0x84,0x5b,0xc0,0x55,0x84,0x82,0xc0,0x5f,0x84,0xca,0xc0,0x13,0x04,0xb0,0xc0,0x14,
+0x04,0xbd,0x20,0x20,0x4a,0x8b,0xc0,0x01,0x82,0x0f,0xc0,0x02,0x82,0x1b,0xc0,0x03,
+0x02,0x24,0xc0,0x03,0x82,0x29,0xc0,0x04,0x02,0x30,0xc0,0x05,0x82,0x3e,0xc0,0x09,
+0x82,0x4a,0xc0,0x0a,0x02,0xce,0xc0,0x0e,0x02,0xde,0xc0,0x0f,0x03,0x02,0xc0,0x0f,
+0x83,0x2c,0xc0,0x11,0x03,0x6b,0xc0,0x18,0x03,0x8a,0xc0,0x19,0x03,0x8e,0xc0,0x1d,
+0x03,0x9d,0xc0,0x1d,0x84,0xa6,0xc0,0x1e,0x83,0xa8,0xc0,0x1f,0x03,0xba,0xc0,0x20,
+0x83,0xcc,0xc0,0x24,0x83,0xd2,0xc0,0x29,0x03,0xdb,0xc0,0x2a,0x83,0xec,0xc0,0x46,
+0x83,0x14,0xc0,0x4c,0x84,0x08,0xc0,0x35,0x07,0x78,0xc0,0x3d,0x07,0x5d,0xc0,0x28,
+0x84,0xe1,0xc0,0x2a,0x04,0xef,0xc0,0x2c,0x04,0xcf,0xc0,0x31,0x84,0xcd,0xc0,0x22,
+0x07,0xdd,0x20,0x20,0x4a,0x8b,0x6f,0xec,0x4b,0xf4,0x67,0xec,0x00,0xa1,0x1c,0xe2,
+0x7e,0x00,0x20,0x3a,0x00,0x49,0x20,0x40,0x00,0x42,0x20,0x20,0x40,0x02,0x70,0x40,
+0x91,0x00,0x20,0x40,0x00,0x45,0x20,0x20,0x67,0xbc,0x6f,0xe2,0x89,0x73,0x79,0x20,
 0x7e,0x06,0x67,0xe2,0x89,0x73,0x20,0x60,0x00,0x00,0x6f,0xe2,0x81,0x26,0xc2,0x80,
-0x00,0x54,0x6f,0xec,0x00,0xa1,0x68,0x4c,0x81,0x0e,0x98,0x41,0x7e,0x00,0x24,0x5a,
-0x00,0x46,0x20,0x20,0x40,0x02,0x20,0x40,0x00,0x56,0x20,0x20,0x40,0x02,0x58,0xff,
+0x00,0x50,0x6f,0xec,0x00,0xa1,0x68,0x4c,0x81,0x0e,0x98,0x41,0x7e,0x00,0x24,0x5a,
+0x00,0x42,0x20,0x20,0x40,0x02,0x20,0x40,0x00,0x52,0x20,0x20,0x40,0x02,0x58,0xff,
 0xff,0xff,0x68,0x46,0x81,0x0e,0x98,0x42,0xfe,0x00,0x68,0x46,0x00,0xa1,0x98,0x41,
-0x7e,0x00,0x24,0x3a,0x00,0x46,0x58,0xff,0xff,0xff,0x68,0x46,0x81,0x11,0x98,0x42,
-0xfe,0x00,0x68,0x46,0x00,0xa4,0x98,0x41,0x7e,0x00,0x24,0x3a,0x00,0x46,0x20,0x60,
+0x7e,0x00,0x24,0x3a,0x00,0x42,0x58,0xff,0xff,0xff,0x68,0x46,0x81,0x11,0x98,0x42,
+0xfe,0x00,0x68,0x46,0x00,0xa4,0x98,0x41,0x7e,0x00,0x24,0x3a,0x00,0x42,0x20,0x60,
 0x00,0x00,0x6f,0xe2,0x00,0x4c,0x79,0x3f,0xfe,0x02,0x67,0xe2,0x00,0x4c,0x20,0x20,
 0x43,0x2f,0x18,0x42,0x7e,0x00,0x20,0x40,0x7d,0x2b,0x1c,0x30,0x7e,0x00,0x79,0x20,
 0x7e,0x2c,0x20,0x40,0x7d,0x14,0x79,0x3f,0xfe,0x2c,0x20,0x40,0x4a,0x76,0x20,0x40,
-0x7d,0x14,0x20,0x74,0x00,0x00,0x20,0x40,0x00,0x76,0x20,0x20,0x4a,0x2f,0x1b,0x42,
-0x7e,0x00,0x20,0x40,0x00,0x75,0x20,0x20,0x4a,0xe9,0x20,0x40,0x7d,0x14,0x98,0x00,
+0x7d,0x14,0x20,0x74,0x00,0x00,0x20,0x40,0x00,0x72,0x20,0x20,0x4a,0x2f,0x1b,0x42,
+0x7e,0x00,0x20,0x40,0x00,0x71,0x20,0x20,0x4a,0xe9,0x20,0x40,0x7d,0x14,0x98,0x00,
 0x0c,0x00,0x79,0x3f,0x8c,0x10,0x20,0x20,0x7d,0x1f,0x70,0x45,0x3d,0x00,0x20,0x40,
-0x68,0xc4,0x20,0x40,0x60,0xd7,0x20,0x40,0x00,0x7e,0x20,0x20,0x40,0x0a,0x20,0x75,
-0x80,0x00,0x20,0x20,0x7b,0x9a,0x20,0x30,0x80,0x90,0x70,0x89,0x55,0xd4,0x20,0x00,
+0x68,0xc4,0x20,0x40,0x60,0xd7,0x20,0x40,0x00,0x7a,0x20,0x20,0x40,0x0a,0x20,0x75,
+0x80,0x00,0x20,0x20,0x7b,0x9a,0x20,0x30,0x80,0x8c,0x70,0x89,0x55,0xd4,0x20,0x00,
 0x00,0x04,0x70,0x89,0x55,0xd2,0x20,0x00,0x00,0x04,0x70,0x89,0x55,0xd1,0x20,0x00,
-0x00,0x04,0x6f,0xe2,0x41,0xdf,0xc0,0x00,0x00,0x8e,0xc0,0x00,0x80,0x9e,0xc0,0x01,
-0x00,0x8e,0xc0,0x01,0x80,0x9e,0xc0,0x02,0x00,0x9e,0xc0,0x10,0x00,0x9e,0x70,0x89,
+0x00,0x04,0x6f,0xe2,0x41,0xdf,0xc0,0x00,0x00,0x8a,0xc0,0x00,0x80,0x9a,0xc0,0x01,
+0x00,0x8a,0xc0,0x01,0x80,0x9a,0xc0,0x02,0x00,0x9a,0xc0,0x10,0x00,0x9a,0x70,0x89,
 0x55,0xd0,0x70,0x89,0x56,0xe0,0x18,0x00,0x2a,0x08,0x18,0x00,0x2a,0x00,0x78,0x50,
 0xfc,0x00,0x78,0x50,0x7c,0x00,0x78,0x2f,0x7c,0x00,0x70,0x89,0x02,0x00,0x70,0x89,
 0x01,0x00,0x70,0x89,0x00,0x00,0x70,0x89,0x03,0x00,0x70,0x89,0x04,0x70,0x6f,0xe2,
 0x89,0x06,0x79,0x20,0x7e,0x00,0x67,0xe2,0x89,0x06,0x20,0x60,0x00,0x00,0x70,0x89,
-0x55,0xd0,0x70,0x89,0x56,0xc0,0x20,0x20,0x00,0x90,0x60,0x42,0x00,0x17,0x20,0x40,
+0x55,0xd0,0x70,0x89,0x56,0xc0,0x20,0x20,0x00,0x8c,0x60,0x42,0x00,0x17,0x20,0x40,
 0x49,0x2a,0x20,0x40,0x49,0x80,0x58,0x00,0x05,0x00,0x20,0x40,0x4a,0x8e,0x6f,0xe2,
 0x89,0x06,0x79,0x20,0x7e,0x00,0x67,0xe2,0x89,0x06,0x20,0x20,0x49,0x37,0x70,0x89,
 0x06,0x7c,0x20,0x75,0x80,0x00,0x58,0x00,0x00,0x00,0x67,0xe4,0x41,0xdd,0x1c,0x43,
 0x7e,0x00,0x67,0xe8,0x40,0x94,0x20,0x60,0x00,0x00,0x20,0x20,0x4b,0x7f,0x58,0x00,
-0x00,0xc1,0x67,0xe4,0x41,0xf6,0x58,0x00,0x01,0x0a,0x67,0xe4,0x41,0xfe,0x58,0x00,
-0x01,0x1c,0x67,0xe4,0x41,0xfa,0x58,0x00,0x01,0x2f,0x67,0xe4,0x41,0xea,0x58,0x00,
-0x01,0x3b,0x67,0xe4,0x41,0xf2,0x20,0x40,0x4d,0xaf,0x20,0x40,0x4d,0xbc,0x20,0x40,
-0x4c,0x2a,0x20,0x40,0x50,0x4d,0x20,0x20,0x04,0xde,0x1a,0x62,0x7e,0x00,0xc0,0x00,
-0x80,0xd0,0xc0,0x04,0x80,0xe0,0xc0,0x01,0x00,0xd4,0xc0,0x02,0x80,0xe4,0xc0,0x02,
-0x00,0xe6,0xc0,0x09,0x80,0xe6,0xc0,0x0c,0x00,0xff,0xc0,0x30,0x00,0xec,0xc0,0x2c,
-0x80,0xee,0xc0,0x2c,0x00,0xf5,0xc0,0x0a,0x00,0xf7,0xc0,0x0a,0x80,0xfc,0xc1,0x1e,
-0x80,0x00,0x20,0x20,0x4d,0xdf,0x70,0x4c,0xef,0x00,0x20,0x40,0x4d,0x6b,0x20,0x40,
-0x4d,0x62,0x20,0x20,0x4e,0x2c,0x70,0x4c,0xf1,0x00,0x70,0x4c,0xf2,0x00,0x20,0x40,
-0x04,0xde,0x20,0x40,0x4d,0xd7,0x6f,0xe2,0x46,0x37,0x24,0x5a,0x50,0x8c,0x58,0x00,
-0x00,0x00,0x67,0xe4,0x4c,0xfe,0x6f,0xe4,0x42,0x09,0x67,0xe4,0x4c,0xfe,0x20,0x40,
+0x00,0xbd,0x67,0xe4,0x41,0xf6,0x58,0x00,0x01,0x18,0x67,0xe4,0x41,0xfe,0x58,0x00,
+0x01,0x35,0x67,0xe4,0x41,0xfa,0x58,0x00,0x01,0x48,0x67,0xe4,0x41,0xea,0x58,0x00,
+0x01,0x54,0x67,0xe4,0x41,0xf2,0x20,0x40,0x05,0x1a,0x20,0x40,0x4d,0xaf,0x20,0x40,
+0x4d,0xbc,0x20,0x40,0x4c,0x2a,0x20,0x20,0x50,0x4d,0x1a,0x62,0x7e,0x00,0xc1,0x1e,
+0x80,0x00,0xc0,0x00,0x80,0xd0,0xc0,0x04,0x80,0xdc,0xc0,0x01,0x00,0xd4,0xc0,0x02,
+0x80,0xe0,0xc0,0x02,0x00,0xe2,0xc0,0x09,0x80,0xe2,0xc0,0x15,0x4d,0x64,0xc0,0x0c,
+0x01,0x0d,0xc0,0x30,0x00,0xe6,0xc0,0x2c,0x80,0xe8,0xc0,0x2c,0x00,0xef,0xc0,0x0a,
+0x00,0xf1,0xc0,0x0a,0x80,0xf6,0xc0,0x21,0x00,0xfd,0xc0,0x19,0x00,0xf9,0xc0,0x17,
+0x80,0xfb,0x20,0x20,0x4d,0xdf,0x70,0x4c,0xf5,0x00,0x20,0x40,0x4d,0x6b,0x20,0x40,
+0x4d,0x62,0x20,0x20,0x4e,0x2c,0x20,0x40,0x05,0x1a,0x70,0x4c,0xf7,0x00,0x70,0x4c,
+0xf8,0x00,0x20,0x40,0x4d,0xd7,0x6f,0xe2,0x46,0x37,0x24,0x5a,0x50,0x8c,0x20,0x40,
 0x4d,0x69,0x20,0x20,0x50,0x26,0x6f,0xe4,0x46,0x52,0x79,0x3f,0xfe,0x04,0x67,0xe4,
-0x46,0x52,0x20,0x60,0x00,0x00,0x20,0x40,0x4d,0xd7,0x20,0x20,0x4d,0x6b,0x20,0x40,
-0x4d,0x69,0x20,0x20,0x00,0xe8,0x70,0x0a,0xff,0xb1,0x20,0x20,0x50,0x4e,0x70,0x0a,
-0xff,0xb5,0x20,0x20,0x50,0x4e,0x70,0x0a,0xff,0xb2,0x20,0x20,0x50,0x4e,0x70,0x0a,
-0xff,0xb3,0x6f,0xe2,0x4c,0xd5,0x20,0x40,0x50,0xa5,0x6f,0x22,0x4c,0xd5,0xd8,0x60,
-0x4c,0xd6,0x20,0x40,0x50,0x16,0x20,0x20,0x67,0xb9,0x70,0x0a,0xff,0xb4,0x20,0x20,
-0x50,0x4e,0x20,0x40,0x03,0x35,0x20,0x40,0x4d,0x73,0x6f,0xe2,0x46,0x6e,0x67,0xe2,
-0x41,0x73,0x20,0x20,0x50,0x24,0x20,0x40,0x5b,0xf6,0x20,0x40,0x4e,0x95,0x20,0x20,
-0x50,0x28,0x70,0x0a,0xff,0xb0,0x58,0x00,0x00,0x1c,0x20,0x40,0x50,0xa5,0x6f,0xec,
-0x40,0xa0,0xe7,0xec,0x00,0x0a,0x6f,0xec,0x00,0x40,0xe7,0xec,0x00,0x0a,0xd8,0xc0,
-0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,0x67,0xd4,0x20,0x20,0x67,0xb9,0x20,0x40,
-0x01,0x16,0x20,0x40,0x01,0x0d,0x20,0x20,0x50,0xc3,0xda,0x60,0x4c,0xf1,0xda,0x40,
-0x01,0x10,0x20,0x20,0x4d,0x04,0x6f,0xe2,0x4c,0xf2,0x24,0x7a,0x00,0x00,0x6f,0xe4,
-0x46,0x52,0xc3,0x82,0x00,0x00,0xc2,0x80,0x4d,0x64,0x20,0x60,0x00,0x00,0x6f,0xe8,
-0x4b,0xf0,0x20,0x7a,0x00,0x00,0x1f,0xe0,0xff,0xff,0x67,0xe8,0x4b,0xf0,0x24,0x7a,
-0x00,0x00,0x20,0x20,0x00,0x46,0x20,0x40,0x04,0x4e,0x20,0x74,0x00,0x00,0x1a,0x22,
-0x7e,0x00,0x67,0xe4,0x46,0x71,0x20,0x40,0x01,0x29,0x67,0xe2,0x46,0x70,0x68,0x44,
-0x04,0x74,0x60,0x44,0x46,0x73,0x20,0x40,0x5b,0x6c,0x24,0x3a,0x4a,0x8b,0x6f,0xe2,
-0x04,0x9e,0xc0,0x81,0x50,0x42,0x20,0x20,0x50,0x42,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
-0x01,0x2d,0x1f,0x22,0x7e,0x00,0x20,0x60,0x00,0x00,0x1a,0x42,0x7e,0x00,0x20,0x60,
-0x00,0x00,0x20,0x40,0x02,0x6b,0x24,0x34,0x01,0x38,0x6f,0xe2,0x4f,0xef,0xc0,0x00,
-0x81,0x38,0x6f,0xe2,0x44,0x96,0xc0,0x80,0x01,0x36,0x20,0x20,0x4d,0x4d,0xc0,0x7f,
-0xcd,0x4d,0x20,0x20,0x01,0x38,0x20,0x40,0x00,0x49,0x20,0x40,0x67,0xbc,0x20,0x20,
-0x4d,0x4b,0x20,0x40,0x01,0x3d,0x20,0x20,0x50,0xd3,0x20,0x20,0x4d,0xc7,0x6f,0xe2,
-0x0a,0xff,0xc0,0x13,0x81,0x88,0xc0,0x06,0x01,0x7f,0xc0,0x3a,0x81,0x4b,0xc0,0x0a,
-0x81,0x85,0xc0,0x20,0x01,0x89,0xc0,0x7f,0x81,0x7c,0xc0,0x3c,0x81,0x96,0xc0,0x58,
-0x81,0x99,0xc0,0x59,0x01,0xa9,0xc0,0x59,0x81,0x6d,0xc0,0x5a,0x01,0x5e,0x20,0x20,
-0x4e,0x5c,0x20,0x40,0x01,0x53,0x18,0xc0,0x8d,0xfe,0x18,0xc2,0x0a,0x00,0x6f,0x22,
-0x0b,0x00,0x20,0x40,0x67,0xed,0x58,0x00,0x00,0x00,0xe7,0xe4,0x00,0x05,0x20,0x20,
-0x50,0x1f,0x6f,0xe4,0x44,0x8e,0x98,0x00,0x0c,0x00,0xef,0xe4,0x00,0x06,0x20,0x7a,
-0x00,0x00,0x1f,0xe0,0x84,0x01,0xef,0xe2,0x00,0x06,0x98,0xc0,0x8c,0x00,0xef,0xe2,
-0x00,0x06,0x98,0xc0,0x8c,0x00,0x18,0xc2,0x0a,0x00,0x20,0x20,0x01,0x55,0x6f,0xe2,
-0x0b,0x00,0xc0,0x80,0xd0,0x1c,0x1a,0x22,0x06,0x00,0x20,0x40,0x50,0x1f,0xe8,0x42,
-0x00,0x03,0x60,0x42,0x46,0x6f,0x6f,0xe2,0x46,0x6c,0x2f,0xef,0xfe,0x00,0x24,0x60,
-0x80,0x00,0x6f,0xe4,0x46,0x52,0xc3,0x80,0x00,0x00,0x68,0x42,0x46,0x6f,0x18,0x41,
-0x7e,0x03,0x67,0xe2,0x40,0x93,0x20,0x60,0x00,0x00,0x6f,0xe2,0x0b,0x00,0xc0,0x80,
-0xd0,0x1c,0x1a,0x22,0x06,0x00,0x20,0x40,0x50,0x1f,0xe8,0x42,0x00,0x03,0x60,0x42,
-0x46,0x6f,0x6f,0xe2,0x46,0x6c,0x2f,0xef,0xfe,0x01,0x24,0x60,0x80,0x00,0x6f,0xe4,
-0x46,0x52,0xc3,0x84,0x80,0x00,0x68,0x42,0x46,0x6f,0x28,0x4f,0xfe,0x02,0x20,0x20,
-0xcd,0x75,0x20,0x20,0x4d,0x73,0xef,0xe2,0x00,0x03,0x67,0xe2,0x40,0x91,0x20,0x60,
-0x00,0x00,0x1a,0x22,0x06,0x00,0xef,0xe2,0x00,0x03,0xc0,0x01,0x81,0x83,0x20,0x20,
+0x46,0x52,0x20,0x60,0x00,0x00,0x20,0x40,0x4d,0xd7,0x20,0x20,0x4d,0x6b,0x70,0x4c,
+0xf5,0x0a,0x20,0x60,0x00,0x00,0x70,0x0a,0xff,0xb5,0x20,0x20,0x50,0x4e,0x70,0x0a,
+0xff,0xb2,0x20,0x20,0x50,0x4e,0x70,0x0a,0xff,0xb3,0x6f,0xe2,0x4c,0xdb,0x20,0x40,
+0x50,0xa5,0x6f,0x22,0x4c,0xdb,0xd8,0x60,0x4c,0xdc,0x20,0x40,0x50,0x16,0x20,0x20,
+0x67,0xb9,0x70,0x0a,0xff,0xb4,0x20,0x20,0x50,0x4e,0x20,0x40,0x03,0x74,0x20,0x40,
+0x4d,0x73,0x6f,0xe2,0x46,0x6e,0x67,0xe2,0x41,0x73,0x20,0x20,0x50,0x24,0x20,0x40,
+0x5b,0xf6,0x20,0x40,0x4e,0x95,0x20,0x20,0x50,0x28,0x70,0x0a,0xff,0xc1,0x20,0x20,
+0x50,0x4e,0x70,0x0a,0xff,0xc2,0x20,0x20,0x50,0x4e,0x70,0x0a,0xff,0xc0,0x58,0x00,
+0x00,0x2e,0x20,0x40,0x50,0xa5,0x6f,0xec,0x44,0x72,0xe7,0xec,0x00,0x0a,0x6f,0xec,
+0x4b,0xfa,0xe7,0xec,0x00,0x0a,0x6f,0xe4,0x44,0x9d,0xe7,0xe4,0x00,0x0a,0xd8,0xc0,
+0x44,0xa7,0xdf,0x20,0x00,0x10,0x20,0x40,0x67,0xd4,0xd8,0xc0,0x43,0xeb,0xdf,0x20,
+0x00,0x10,0x20,0x40,0x67,0xd4,0x20,0x20,0x67,0xb9,0x70,0x0a,0xff,0xb0,0x58,0x00,
+0x00,0x1c,0x20,0x40,0x50,0xa5,0x6f,0xec,0x40,0xa0,0xe7,0xec,0x00,0x0a,0x6f,0xec,
+0x00,0x40,0xe7,0xec,0x00,0x0a,0xd8,0xc0,0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,
+0x67,0xd4,0x20,0x20,0x67,0xb9,0x20,0x40,0x01,0x26,0x20,0x40,0x01,0x1b,0x20,0x20,
+0x01,0x2f,0xda,0x60,0x4c,0xf5,0xda,0x40,0x01,0x1e,0x20,0x20,0x4d,0x04,0x6f,0xec,
+0x4a,0x25,0x67,0xec,0x41,0xd1,0xd8,0xc0,0x4a,0x2b,0xd8,0xa0,0x41,0xbf,0x20,0x40,
+0x7c,0x9a,0x20,0x40,0x68,0xbe,0x20,0x40,0x4d,0x6b,0x20,0x20,0x4d,0x5c,0xda,0x60,
+0x4c,0xf7,0xda,0x40,0x01,0x29,0x20,0x20,0x4d,0x04,0x6f,0xe2,0x4c,0xf8,0x24,0x7a,
+0x00,0x00,0x6f,0xe4,0x46,0x52,0xc3,0x82,0x00,0x00,0xc2,0x80,0x4d,0x64,0x20,0x60,
+0x00,0x00,0x6f,0xe8,0x4b,0xf0,0x20,0x7a,0x00,0x00,0x1f,0xe0,0xff,0xff,0x67,0xe8,
+0x4b,0xf0,0x24,0x7a,0x00,0x00,0x20,0x20,0x00,0x42,0x20,0x40,0x04,0x8a,0x20,0x74,
+0x00,0x00,0x1a,0x22,0x7e,0x00,0x67,0xe4,0x46,0x71,0x20,0x40,0x01,0x42,0x67,0xe2,
+0x46,0x70,0x68,0x44,0x04,0x74,0x60,0x44,0x46,0x73,0x20,0x40,0x5b,0x6c,0x24,0x3a,
+0x4a,0x8b,0x6f,0xe2,0x04,0x9e,0xc0,0x81,0x50,0x42,0x20,0x20,0x50,0x42,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x01,0x46,0x1f,0x22,0x7e,0x00,0x20,0x60,0x00,0x00,0x1a,0x42,
+0x7e,0x00,0x20,0x60,0x00,0x00,0x20,0x40,0x02,0x9c,0x24,0x34,0x01,0x51,0x6f,0xe2,
+0x4f,0xef,0xc0,0x00,0x81,0x51,0x6f,0xe2,0x44,0x96,0xc0,0x80,0x01,0x4f,0x20,0x20,
+0x4d,0x4d,0xc0,0x7f,0xcd,0x4d,0x20,0x20,0x01,0x51,0x20,0x40,0x00,0x45,0x20,0x40,
+0x67,0xbc,0x20,0x20,0x4d,0x4b,0x20,0x40,0x01,0x56,0x20,0x20,0x50,0xd3,0x20,0x20,
+0x4d,0xc7,0x6f,0xe2,0x0a,0xff,0xc0,0x13,0x81,0xb4,0xc0,0x06,0x01,0xab,0xc0,0x3a,
+0x81,0x65,0xc0,0x0a,0x81,0xb1,0xc0,0x20,0x01,0xb5,0xc0,0x7f,0x81,0xa8,0xc0,0x3c,
+0x81,0xc2,0xc0,0x58,0x81,0xc5,0xc0,0x59,0x01,0xda,0xc0,0x59,0x81,0x87,0xc0,0x5a,
+0x01,0x78,0xc0,0x31,0x01,0x96,0x20,0x20,0x4e,0x5c,0x20,0x40,0x01,0x6d,0x18,0xc0,
+0x8d,0xfe,0x18,0xc2,0x0a,0x00,0x6f,0x22,0x0b,0x00,0x20,0x40,0x67,0xed,0x58,0x00,
+0x00,0x00,0xe7,0xe4,0x00,0x05,0x20,0x20,0x50,0x1f,0x6f,0xe4,0x44,0x8e,0x98,0x00,
+0x0c,0x00,0xef,0xe4,0x00,0x06,0x20,0x7a,0x00,0x00,0x1f,0xe0,0x84,0x01,0xef,0xe2,
+0x00,0x06,0x98,0xc0,0x8c,0x00,0xef,0xe2,0x00,0x06,0x98,0xc0,0x8c,0x00,0x18,0xc2,
+0x0a,0x00,0x20,0x20,0x01,0x6f,0x6f,0xe2,0x0b,0x00,0xc0,0x80,0xd0,0x1c,0x1a,0x22,
+0x06,0x00,0x20,0x40,0x50,0x1f,0xe8,0x42,0x00,0x03,0x60,0x42,0x46,0x6f,0x6f,0xe2,
+0x46,0x6c,0x2f,0xef,0xfe,0x00,0x24,0x60,0x80,0x00,0x6f,0xe4,0x46,0x52,0xc3,0x80,
+0x00,0x00,0x68,0x42,0x46,0x6f,0x18,0x41,0x7e,0x03,0x67,0xe2,0x40,0x93,0x20,0x60,
+0x00,0x00,0x6f,0xe2,0x0b,0x00,0xc0,0x80,0xd0,0x1c,0x1a,0x22,0x06,0x00,0x20,0x40,
+0x50,0x1f,0xe8,0x42,0x00,0x03,0x60,0x42,0x46,0x6f,0x6f,0xe2,0x46,0x6c,0x2f,0xef,
+0xfe,0x01,0x24,0x60,0x80,0x00,0x6f,0xe4,0x46,0x52,0xc3,0x84,0x80,0x00,0x68,0x42,
+0x46,0x6f,0x28,0x4f,0xfe,0x02,0x20,0x20,0xcd,0x75,0x20,0x20,0x4d,0x73,0x20,0x40,
+0x50,0x1f,0x6f,0xe2,0x44,0x96,0xc0,0x02,0x81,0x9f,0x6f,0xe2,0x44,0xbb,0xc2,0x80,
+0xe0,0xa0,0x6f,0xe2,0x42,0x16,0x24,0x5a,0x68,0xb0,0x6f,0xe2,0x43,0xfb,0xc0,0x00,
+0x60,0xa5,0x70,0x44,0x97,0x01,0x20,0x40,0x60,0xb0,0x20,0x40,0x60,0xbe,0x20,0x40,
+0x72,0x58,0x6f,0xe4,0x00,0x1e,0x98,0x00,0x0a,0x00,0x18,0x00,0x72,0x50,0xd8,0xc0,
+0x04,0x3b,0x20,0x20,0x7c,0xcf,0xef,0xe2,0x00,0x03,0x67,0xe2,0x40,0x91,0x20,0x60,
+0x00,0x00,0x1a,0x22,0x06,0x00,0xef,0xe2,0x00,0x03,0xc0,0x01,0x81,0xaf,0x20,0x20,
 0x4f,0x17,0x58,0x00,0x00,0x01,0x20,0x20,0x4f,0x20,0xef,0xe6,0x00,0x03,0x67,0xe6,
 0x40,0xaa,0x20,0x20,0x50,0x1f,0x20,0x20,0x4d,0x85,0xef,0xe2,0x00,0x03,0x68,0x48,
 0x41,0x79,0x79,0x3a,0x04,0x10,0x79,0x3a,0x04,0x18,0x60,0x48,0x41,0x79,0x68,0x42,
 0x41,0x57,0x79,0x3a,0x04,0x00,0x60,0x42,0x41,0x57,0xef,0xec,0x00,0x03,0x67,0xec,
 0x00,0xa1,0x67,0xec,0x4b,0xf4,0x20,0x40,0x4b,0xe3,0x20,0x20,0x50,0x1f,0xef,0xe8,
 0x00,0x03,0x67,0xe8,0x4b,0xf0,0x20,0x20,0x50,0x1f,0x6f,0xe2,0x40,0x40,0xc2,0x80,
-0x50,0x1c,0xc2,0x81,0xd0,0x1c,0x6f,0xe4,0x46,0x52,0xc2,0x80,0x50,0x1c,0xef,0xec,
-0x00,0x03,0x67,0xec,0x40,0xa0,0xef,0xec,0x00,0x03,0x67,0xec,0x41,0xd1,0xd8,0xa0,
-0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,0x67,0xed,0x20,0x40,0x68,0xbe,0x20,0x40,
-0x4d,0x6b,0x20,0x40,0x4d,0x5c,0x20,0x20,0x50,0x1f,0x6f,0xe2,0x40,0x40,0xc2,0x80,
-0x50,0x1c,0xc2,0x81,0xd0,0x1c,0x6f,0xe4,0x46,0x52,0xc2,0x80,0x50,0x1c,0x20,0x40,
-0x4d,0x62,0x20,0x20,0x50,0x1f,0x6f,0xe2,0x46,0x79,0xc2,0x81,0x82,0x7d,0x6f,0xe2,
-0x46,0x79,0xc3,0x83,0x80,0x00,0x6f,0xe4,0x44,0x78,0x20,0x40,0x7d,0xb5,0x1f,0xe2,
-0x04,0x00,0x18,0x40,0xff,0xfd,0xd8,0x40,0x00,0xc8,0x20,0x40,0x7d,0xb5,0x68,0x42,
-0x46,0x7a,0x20,0x40,0x7d,0xb5,0x1f,0xe2,0x22,0x00,0x18,0x42,0x7e,0x00,0x9a,0x26,
-0x7e,0x00,0x67,0xe2,0x46,0x7a,0x68,0x44,0x46,0x7b,0x18,0x40,0x85,0xff,0x20,0x40,
-0x5b,0x4d,0x20,0x3a,0x01,0xd0,0xe8,0x48,0x00,0x06,0x59,0x28,0x03,0x02,0x98,0x46,
-0x7c,0x00,0x24,0x22,0x81,0xd0,0xef,0xe2,0x00,0x06,0xc2,0x82,0x81,0xcc,0xc2,0x82,
-0x4f,0x01,0x20,0x20,0x01,0xd0,0x20,0x40,0x03,0x37,0x68,0x44,0x46,0x7b,0x20,0x40,
-0x5e,0x4d,0x20,0x20,0x4f,0x03,0x70,0x46,0x7a,0x00,0x70,0x0b,0x01,0x01,0x20,0x40,
-0x50,0xe0,0x20,0x20,0x50,0x1c,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x57,0x09,0x20,0x40,
-0x57,0x09,0x70,0x4a,0xdb,0x01,0x70,0x4a,0xdc,0x00,0x58,0x00,0x00,0x00,0x67,0xf0,
-0x4a,0xd1,0x58,0x00,0x00,0x1b,0x67,0xe4,0x4a,0xd9,0x20,0x60,0x00,0x00,0x20,0x40,
-0x49,0xba,0x78,0x23,0xfc,0x00,0x78,0x24,0xfc,0x00,0x09,0x80,0x00,0x08,0x19,0x89,
-0x7e,0x00,0x67,0xe2,0x02,0xd5,0x09,0x80,0x00,0x08,0x19,0x89,0x7e,0x00,0xe7,0xe2,
-0x00,0x05,0x1f,0xe2,0x72,0x00,0x20,0x3a,0x58,0x8b,0x20,0x20,0x58,0x87,0x20,0x40,
-0x58,0xa3,0x20,0x40,0x49,0x15,0x68,0x42,0x00,0x17,0x20,0x40,0x49,0x1c,0x20,0x00,
-0x05,0xdc,0x20,0x40,0x49,0x21,0x78,0x28,0x7c,0x00,0xd9,0x60,0x15,0x7c,0x20,0x20,
-0x58,0x69,0x20,0x40,0x57,0xaf,0x20,0x40,0x01,0xf6,0x20,0x20,0x58,0xa7,0x20,0x36,
-0x80,0xa6,0x20,0x20,0x57,0xbe,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x58,0xb3,0x6f,0xe2,
-0x4a,0xdb,0x08,0x00,0x86,0x08,0xef,0xe2,0x00,0x06,0x1f,0xe2,0x72,0x00,0x20,0x20,
-0x58,0xb7,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x58,0xc4,0x6f,0xe2,0x44,0x56,0xc0,0x00,
-0xd8,0xd3,0x6f,0xe2,0x44,0x57,0x1f,0xf2,0x7e,0x00,0x1f,0xeb,0xfe,0x00,0x67,0xe2,
-0x4a,0xdb,0x68,0x42,0x43,0x41,0x18,0x40,0xfe,0x06,0x67,0xe2,0x4a,0xdc,0x6f,0xec,
-0x44,0x72,0x67,0xec,0x4a,0xdd,0x20,0x20,0x58,0xcf,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
-0x58,0xf7,0xd8,0x40,0x00,0x04,0x6f,0xe2,0x44,0x57,0x7d,0x3a,0x04,0x06,0x60,0x42,
-0x4a,0xdb,0x68,0x42,0x43,0x61,0x18,0x40,0xfe,0x06,0x67,0xe2,0x4a,0xdc,0x6f,0xec,
-0x44,0x72,0x67,0xec,0x4a,0xdd,0x20,0x20,0x59,0x00,0x20,0x40,0x5a,0xc9,0x20,0x40,
-0x59,0x9a,0x6f,0xe2,0x02,0xd5,0x2f,0xef,0xfe,0x04,0x79,0x20,0x80,0x2a,0x1f,0xe3,
-0x7e,0x00,0x98,0x42,0xfe,0x00,0x2f,0xef,0xfe,0x02,0x79,0x20,0x80,0x0f,0xc6,0x07,
-0x80,0x00,0x6f,0xe2,0x02,0xd6,0x20,0x3a,0x02,0x2b,0x6f,0xe2,0x04,0x3b,0xc3,0x02,
-0x02,0x2b,0x20,0x40,0x73,0x42,0x20,0x40,0x72,0xb2,0x7d,0x3a,0x00,0x0f,0x24,0x7a,
-0x00,0x00,0x68,0x42,0x04,0x52,0x79,0x40,0x04,0x02,0x60,0x42,0x04,0x52,0x6f,0xe2,
-0x4b,0xed,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x02,0xd6,0x20,0x7a,0x00,0x00,0x6f,0xe2,
-0x02,0xd5,0x2f,0xe0,0x06,0x01,0x20,0x20,0x82,0x58,0x2f,0xe0,0x06,0x02,0x20,0x20,
-0x82,0x38,0x20,0x60,0x00,0x00,0x6f,0xe4,0x02,0xd9,0xc1,0x82,0x00,0x00,0xef,0xe6,
-0x00,0x06,0x67,0xe6,0x04,0x73,0x79,0x20,0x00,0x0f,0xc0,0x09,0x02,0x4c,0xc0,0x29,
-0x02,0x4e,0xc0,0x0b,0x02,0x45,0xc0,0x0c,0x5e,0x3b,0xc0,0x01,0x03,0x39,0xc0,0x0f,
-0x03,0x35,0x79,0x3f,0x80,0x0f,0x20,0x60,0x00,0x00,0x58,0x00,0x0b,0x1e,0x67,0xe4,
-0x4a,0xd5,0x20,0x40,0x02,0x51,0x1f,0x20,0xf3,0xfe,0xda,0x20,0x02,0xe0,0x20,0x40,
-0x5a,0xbe,0x20,0x20,0x02,0x71,0x20,0x40,0x02,0x4e,0x20,0x20,0x02,0x68,0x20,0x40,
-0x02,0x51,0xda,0x20,0x02,0xde,0x20,0x20,0x5a,0xbe,0x6f,0xe2,0x02,0xd6,0x1f,0xe0,
-0xf3,0xf9,0x1f,0xe0,0xff,0xfc,0x67,0xe4,0x4a,0xd1,0xe8,0x44,0x00,0x06,0x60,0x44,
-0x4a,0xd3,0x20,0x60,0x00,0x00,0x79,0x20,0x00,0x0f,0x20,0x40,0x02,0x60,0x6f,0xe2,
-0x04,0x73,0xc0,0x09,0x02,0x68,0xc0,0x0b,0x02,0x67,0xc1,0x29,0x00,0x00,0x79,0x3f,
-0x80,0x0f,0x20,0x60,0x00,0x00,0x6f,0xe2,0x02,0xd6,0x68,0x44,0x4a,0xd1,0x98,0x40,
-0x84,0x00,0x60,0x44,0x4a,0xd1,0x1f,0xe2,0x72,0x00,0xda,0x20,0x02,0xd7,0x20,0x20,
-0x5a,0xbe,0x20,0x20,0x02,0x71,0x20,0x40,0x02,0x6b,0x24,0x74,0x00,0x00,0x20,0x20,
-0x04,0x60,0x20,0x40,0x7d,0xc1,0x6f,0xe4,0x4a,0xd3,0x68,0x44,0x4a,0xd1,0x98,0x46,
-0x7c,0x00,0x24,0x62,0x80,0x00,0x20,0x20,0x7d,0xbf,0x6f,0xe4,0x4a,0xd5,0x1f,0xe2,
-0x0a,0x00,0x6f,0xe2,0x02,0xd6,0x1f,0xe2,0x72,0x00,0x20,0x40,0x7c,0xdc,0x18,0xa2,
-0x7e,0x00,0x67,0xe4,0x4a,0xd5,0x20,0x40,0x02,0x6b,0x24,0x74,0x00,0x00,0xd8,0xe0,
-0x00,0x03,0x20,0x40,0x50,0xe6,0x20,0x20,0x02,0x7d,0x20,0x40,0x5c,0x74,0x24,0x7a,
-0x00,0x00,0x70,0x0b,0x22,0x17,0x58,0x00,0x0b,0x1e,0x67,0xe4,0x4a,0xd7,0x68,0x44,
-0x0b,0x1e,0x18,0x40,0x84,0x04,0x58,0x00,0x00,0xf9,0x20,0x40,0x7d,0xb5,0x1f,0xe0,
-0xa5,0xfc,0x18,0x00,0x02,0x02,0x1f,0xe2,0x22,0x00,0x20,0x40,0x5c,0x32,0x6f,0xe4,
-0x4a,0xd7,0x1f,0xe2,0x0c,0x00,0x1a,0x22,0x72,0x00,0x20,0x40,0x7c,0xcf,0x18,0xc2,
-0x7e,0x00,0x67,0xe4,0x4a,0xd7,0x6f,0xe4,0x0b,0x1e,0x9a,0x46,0x7e,0x00,0x67,0xe4,
-0x0b,0x1e,0x20,0x3a,0x02,0x99,0xd8,0x40,0x00,0xf9,0x20,0x40,0x7d,0xb5,0x1f,0xe2,
-0x24,0x00,0x18,0x00,0x02,0x01,0x20,0x20,0x02,0x88,0x58,0x00,0x00,0x00,0x67,0xe4,
-0x4a,0xd5,0xd8,0xe0,0x00,0x03,0x20,0x20,0x50,0xe2,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
-0x59,0x9b,0x68,0x42,0x04,0x52,0x28,0x4c,0x00,0x05,0x20,0x60,0x80,0x00,0x6f,0xe2,
-0x02,0xd5,0x1f,0xe3,0xfe,0x00,0x98,0x42,0xfe,0x00,0xc4,0x01,0x80,0x00,0x79,0x3f,
-0x84,0x05,0x79,0x40,0x04,0x03,0x60,0x42,0x04,0x52,0x28,0x40,0x06,0x03,0x24,0x60,
-0x80,0x00,0x6f,0xe2,0x4a,0xdd,0x20,0x20,0x59,0xa8,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
-0x59,0xf9,0x6f,0xe2,0x04,0x52,0xc3,0x82,0x80,0x00,0x20,0x40,0x5a,0x1c,0x20,0x40,
-0x5c,0x53,0x20,0x3a,0x5a,0x3e,0xef,0xe2,0x00,0x06,0xe8,0x42,0x00,0x06,0x18,0x42,
-0x22,0x00,0x9a,0x26,0x7e,0x00,0x20,0x40,0x02,0xcd,0x20,0x40,0x7d,0xb5,0x1f,0xe2,
-0x04,0x00,0xef,0xe2,0x00,0x06,0x1f,0xe2,0x02,0x00,0x1a,0x22,0x7e,0x00,0x98,0xc0,
-0x8c,0x00,0xd8,0xa0,0x4a,0xdd,0x18,0x42,0x72,0x00,0x20,0x40,0x7c,0xcf,0x20,0x40,
-0x5a,0x2e,0x20,0x40,0x5a,0x40,0x20,0x40,0x5c,0x53,0xef,0xe2,0x00,0x06,0x1f,0xe2,
-0x22,0x00,0x18,0xc2,0x26,0x00,0xe8,0x42,0x00,0x06,0x18,0x42,0x24,0x00,0x9a,0x46,
-0x7e,0x00,0x20,0x40,0x02,0xcd,0x20,0x20,0x5a,0x16,0x18,0xc2,0x0a,0x00,0x68,0x44,
-0x4a,0xd9,0x18,0xa2,0x0c,0x00,0x20,0x60,0x00,0x00,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
-0x5a,0x41,0x60,0x42,0x4a,0xdc,0x68,0x42,0x04,0x52,0x79,0x20,0x04,0x05,0x18,0x41,
-0x7e,0xfc,0x98,0x21,0xfe,0x00,0x67,0xe2,0x04,0x52,0x1f,0xe1,0x7e,0x1f,0x28,0x0f,
-0xfe,0x29,0x79,0x20,0xfe,0x04,0x67,0xe2,0x4a,0xdb,0x6f,0xe2,0x4a,0xdb,0x28,0x20,
-0x06,0x01,0x24,0x20,0xda,0x50,0x6f,0xe2,0x4a,0xdc,0x20,0x7a,0x00,0x00,0x20,0x20,
-0x5a,0x50,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x72,0x9a,0xda,0x60,0x4a,0xdb,0x68,0x4a,
-0x43,0xd5,0x20,0x40,0x72,0x77,0x18,0x00,0x70,0x08,0x98,0x00,0x5e,0x00,0x18,0x00,
-0x22,0x00,0x20,0x40,0x72,0x63,0x20,0x40,0x72,0xe8,0xda,0x60,0x4a,0xdd,0x6f,0xe2,
-0x4a,0xdc,0x1f,0xe0,0xa5,0xff,0x9a,0x60,0x8a,0x00,0x18,0x00,0x70,0x0c,0x1d,0xe2,
-0x7e,0x00,0xe7,0xe8,0x00,0x05,0x20,0x40,0x72,0x8e,0x6f,0xe2,0x4a,0xdc,0x1f,0xe0,
-0xfe,0x04,0x67,0xe2,0x4a,0xdc,0x20,0x20,0x72,0xba,0xc6,0x07,0x80,0x00,0x20,0x40,
-0x5c,0x70,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x02,0xd5,0x1f,0xe1,0x7e,0x03,0x67,0xe2,
-0x44,0xde,0xef,0xe2,0x00,0x06,0x67,0xe2,0x44,0xdd,0x20,0x7a,0x00,0x00,0x18,0xc2,
-0x7e,0x00,0x67,0xe4,0x44,0xdf,0x6f,0xe2,0x44,0xde,0xc0,0x01,0x83,0x0b,0x20,0x40,
-0x5a,0x76,0xd8,0xe0,0x00,0x03,0x24,0x34,0x4b,0xec,0x20,0x40,0x4b,0xf0,0x20,0x20,
-0x5a,0x6b,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x60,0x44,0x6f,0xe2,0x02,0xd7,0xc0,0x04,
-0x03,0x11,0xc0,0x0a,0x03,0x1e,0x20,0x20,0x60,0x45,0xda,0x20,0x00,0x09,0xda,0x40,
+0x50,0x1c,0xc2,0x81,0xd0,0x1c,0x6f,0xe4,0x46,0x52,0xc2,0x80,0x50,0x1c,0x70,0x4c,
+0xf5,0x00,0xef,0xec,0x00,0x03,0x67,0xec,0x40,0xa0,0xef,0xec,0x00,0x03,0x67,0xec,
+0x41,0xd1,0x67,0xec,0x4a,0x25,0xd8,0xa0,0x41,0xbf,0xdf,0x20,0x00,0x10,0x20,0x40,
+0x67,0xed,0xd8,0xc0,0x41,0xbf,0xd8,0xa0,0x4a,0x2b,0x20,0x40,0x7c,0x9a,0x20,0x40,
+0x68,0xbe,0x20,0x40,0x4d,0x6b,0x20,0x40,0x4d,0x5c,0x20,0x20,0x50,0x1f,0x6f,0xe2,
+0x40,0x40,0xc2,0x80,0x50,0x1c,0x6f,0xe4,0x46,0x52,0xc2,0x80,0x50,0x1c,0x70,0x4c,
+0xf5,0x00,0x20,0x40,0x4d,0x62,0x20,0x20,0x50,0x1f,0x6f,0xe2,0x46,0x79,0xc2,0x81,
+0x82,0xae,0x6f,0xe2,0x46,0x79,0xc3,0x83,0x80,0x00,0x6f,0xe4,0x44,0x78,0x20,0x40,
+0x7d,0xb5,0x1f,0xe2,0x04,0x00,0x18,0x40,0xff,0xfd,0xd8,0x40,0x00,0xc8,0x20,0x40,
+0x7d,0xb5,0x68,0x42,0x46,0x7a,0x20,0x40,0x7d,0xb5,0x1f,0xe2,0x22,0x00,0x18,0x42,
+0x7e,0x00,0x9a,0x26,0x7e,0x00,0x67,0xe2,0x46,0x7a,0x68,0x44,0x46,0x7b,0x18,0x40,
+0x85,0xff,0x20,0x40,0x5b,0x4d,0x20,0x3a,0x02,0x01,0xe8,0x48,0x00,0x06,0x59,0x28,
+0x03,0x02,0x98,0x46,0x7c,0x00,0x24,0x22,0x82,0x01,0xef,0xe2,0x00,0x06,0xc2,0x82,
+0x81,0xfd,0xc2,0x82,0x4f,0x01,0x20,0x20,0x02,0x01,0x20,0x40,0x03,0x76,0x68,0x44,
+0x46,0x7b,0x20,0x40,0x5e,0x4d,0x20,0x20,0x4f,0x03,0x70,0x46,0x7a,0x00,0x70,0x0b,
+0x01,0x01,0x20,0x40,0x50,0xe0,0x20,0x20,0x50,0x1c,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
+0x57,0x09,0x20,0x40,0x57,0x09,0x70,0x4a,0xdb,0x01,0x70,0x4a,0xdc,0x00,0x58,0x00,
+0x00,0x00,0x67,0xf0,0x4a,0xd1,0x58,0x00,0x00,0x1b,0x67,0xe4,0x4a,0xd9,0x20,0x60,
+0x00,0x00,0x20,0x40,0x49,0xba,0x78,0x23,0xfc,0x00,0x78,0x24,0xfc,0x00,0x09,0x80,
+0x00,0x08,0x19,0x89,0x7e,0x00,0x67,0xe2,0x02,0xd5,0x09,0x80,0x00,0x08,0x19,0x89,
+0x7e,0x00,0xe7,0xe2,0x00,0x05,0x1f,0xe2,0x72,0x00,0x20,0x3a,0x58,0x8b,0x20,0x20,
+0x58,0x87,0x20,0x40,0x58,0xa3,0x20,0x40,0x49,0x15,0x68,0x42,0x00,0x17,0x20,0x40,
+0x49,0x1c,0x20,0x00,0x05,0xdc,0x20,0x40,0x49,0x21,0x78,0x28,0x7c,0x00,0xd9,0x60,
+0x15,0x7c,0x20,0x20,0x58,0x69,0x20,0x40,0x57,0xaf,0x20,0x40,0x02,0x27,0x20,0x20,
+0x58,0xa7,0x20,0x36,0x80,0xa2,0x20,0x20,0x57,0xbe,0x6f,0xe2,0x4b,0xed,0x24,0x3a,
+0x58,0xb3,0x6f,0xe2,0x4a,0xdb,0x08,0x00,0x86,0x08,0xef,0xe2,0x00,0x06,0x1f,0xe2,
+0x72,0x00,0x20,0x20,0x58,0xb7,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x58,0xc4,0x6f,0xe2,
+0x44,0x56,0xc0,0x00,0xd8,0xd3,0x6f,0xe2,0x44,0x57,0x1f,0xf2,0x7e,0x00,0x1f,0xeb,
+0xfe,0x00,0x67,0xe2,0x4a,0xdb,0x68,0x42,0x43,0x41,0x18,0x40,0xfe,0x06,0x67,0xe2,
+0x4a,0xdc,0x6f,0xec,0x44,0x72,0x67,0xec,0x4a,0xdd,0x20,0x20,0x58,0xcf,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x58,0xf7,0xd8,0x40,0x00,0x04,0x6f,0xe2,0x44,0x57,0x7d,0x3a,
+0x04,0x06,0x60,0x42,0x4a,0xdb,0x68,0x42,0x43,0x61,0x18,0x40,0xfe,0x06,0x67,0xe2,
+0x4a,0xdc,0x6f,0xec,0x44,0x72,0x67,0xec,0x4a,0xdd,0x20,0x20,0x59,0x00,0x20,0x40,
+0x5a,0xc9,0x20,0x40,0x59,0x9a,0x6f,0xe2,0x02,0xd5,0x2f,0xef,0xfe,0x04,0x79,0x20,
+0x80,0x2a,0x1f,0xe3,0x7e,0x00,0x98,0x42,0xfe,0x00,0x2f,0xef,0xfe,0x02,0x79,0x20,
+0x80,0x0f,0xc6,0x07,0x80,0x00,0x6f,0xe2,0x02,0xd6,0x20,0x3a,0x02,0x5c,0x6f,0xe2,
+0x04,0x3b,0xc3,0x02,0x02,0x5c,0x20,0x40,0x73,0x42,0x20,0x40,0x72,0xb2,0x7d,0x3a,
+0x00,0x0f,0x24,0x7a,0x00,0x00,0x68,0x42,0x04,0x52,0x79,0x40,0x04,0x02,0x60,0x42,
+0x04,0x52,0x6f,0xe2,0x4b,0xed,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x02,0xd6,0x20,0x7a,
+0x00,0x00,0x6f,0xe2,0x02,0xd5,0x2f,0xe0,0x06,0x01,0x20,0x20,0x82,0x89,0x2f,0xe0,
+0x06,0x02,0x20,0x20,0x82,0x69,0x20,0x60,0x00,0x00,0x6f,0xe4,0x02,0xd9,0xc1,0x82,
+0x00,0x00,0xef,0xe6,0x00,0x06,0x67,0xe6,0x04,0x73,0x79,0x20,0x00,0x0f,0xc0,0x09,
+0x02,0x7d,0xc0,0x29,0x02,0x7f,0xc0,0x0b,0x02,0x76,0xc0,0x0c,0x5e,0x3b,0xc0,0x01,
+0x03,0x78,0xc0,0x0f,0x03,0x74,0x79,0x3f,0x80,0x0f,0x20,0x60,0x00,0x00,0x58,0x00,
+0x0b,0x1e,0x67,0xe4,0x4a,0xd5,0x20,0x40,0x02,0x82,0x1f,0x20,0xf3,0xfe,0xda,0x20,
+0x02,0xe0,0x20,0x40,0x5a,0xbe,0x20,0x20,0x02,0xa2,0x20,0x40,0x02,0x7f,0x20,0x20,
+0x02,0x99,0x20,0x40,0x02,0x82,0xda,0x20,0x02,0xde,0x20,0x20,0x5a,0xbe,0x6f,0xe2,
+0x02,0xd6,0x1f,0xe0,0xf3,0xf9,0x1f,0xe0,0xff,0xfc,0x67,0xe4,0x4a,0xd1,0xe8,0x44,
+0x00,0x06,0x60,0x44,0x4a,0xd3,0x20,0x60,0x00,0x00,0x79,0x20,0x00,0x0f,0x20,0x40,
+0x02,0x91,0x6f,0xe2,0x04,0x73,0xc0,0x09,0x02,0x99,0xc0,0x0b,0x02,0x98,0xc1,0x29,
+0x00,0x00,0x79,0x3f,0x80,0x0f,0x20,0x60,0x00,0x00,0x6f,0xe2,0x02,0xd6,0x68,0x44,
+0x4a,0xd1,0x98,0x40,0x84,0x00,0x60,0x44,0x4a,0xd1,0x1f,0xe2,0x72,0x00,0xda,0x20,
+0x02,0xd7,0x20,0x20,0x5a,0xbe,0x20,0x20,0x02,0xa2,0x20,0x40,0x02,0x9c,0x24,0x74,
+0x00,0x00,0x20,0x20,0x04,0x9c,0x20,0x40,0x7d,0xc1,0x6f,0xe4,0x4a,0xd3,0x68,0x44,
+0x4a,0xd1,0x98,0x46,0x7c,0x00,0x24,0x62,0x80,0x00,0x20,0x20,0x7d,0xbf,0x6f,0xe4,
+0x4a,0xd5,0x1f,0xe2,0x0a,0x00,0x6f,0xe2,0x02,0xd6,0x1f,0xe2,0x72,0x00,0x20,0x40,
+0x7c,0xdc,0x18,0xa2,0x7e,0x00,0x67,0xe4,0x4a,0xd5,0x20,0x40,0x02,0x9c,0x24,0x74,
+0x00,0x00,0xd8,0xe0,0x00,0x03,0x20,0x40,0x50,0xe6,0x20,0x20,0x02,0xae,0x20,0x40,
+0x5c,0x74,0x24,0x7a,0x00,0x00,0x70,0x0b,0x22,0x17,0x58,0x00,0x0b,0x1e,0x67,0xe4,
+0x4a,0xd7,0x68,0x44,0x0b,0x1e,0x18,0x40,0x84,0x04,0x58,0x00,0x00,0xf9,0x20,0x40,
+0x7d,0xb5,0x1f,0xe0,0xa5,0xfc,0x18,0x00,0x02,0x02,0x1f,0xe2,0x22,0x00,0x20,0x40,
+0x5c,0x32,0x6f,0xe4,0x4a,0xd7,0x1f,0xe2,0x0c,0x00,0x1a,0x22,0x72,0x00,0x20,0x40,
+0x7c,0xcf,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x4a,0xd7,0x6f,0xe4,0x0b,0x1e,0x9a,0x46,
+0x7e,0x00,0x67,0xe4,0x0b,0x1e,0x20,0x3a,0x02,0xca,0xd8,0x40,0x00,0xf9,0x20,0x40,
+0x7d,0xb5,0x1f,0xe2,0x24,0x00,0x18,0x00,0x02,0x01,0x20,0x20,0x02,0xb9,0x58,0x00,
+0x00,0x00,0x67,0xe4,0x4a,0xd5,0xd8,0xe0,0x00,0x03,0x20,0x20,0x50,0xe2,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x59,0x9b,0x68,0x42,0x04,0x52,0x28,0x4c,0x00,0x05,0x20,0x60,
+0x80,0x00,0x6f,0xe2,0x02,0xd5,0x1f,0xe3,0xfe,0x00,0x98,0x42,0xfe,0x00,0xc4,0x01,
+0x80,0x00,0x79,0x3f,0x84,0x05,0x79,0x40,0x04,0x03,0x60,0x42,0x04,0x52,0x28,0x40,
+0x06,0x03,0x24,0x60,0x80,0x00,0x6f,0xe2,0x4a,0xdd,0x20,0x20,0x59,0xa8,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x59,0xf9,0x6f,0xe2,0x04,0x52,0xc3,0x82,0x80,0x00,0x20,0x40,
+0x5a,0x1c,0x20,0x40,0x5c,0x53,0x20,0x3a,0x5a,0x3e,0xef,0xe2,0x00,0x06,0xe8,0x42,
+0x00,0x06,0x18,0x42,0x22,0x00,0x9a,0x26,0x7e,0x00,0x20,0x40,0x02,0xfe,0x20,0x40,
+0x7d,0xb5,0x1f,0xe2,0x04,0x00,0xef,0xe2,0x00,0x06,0x1f,0xe2,0x02,0x00,0x1a,0x22,
+0x7e,0x00,0x98,0xc0,0x8c,0x00,0xd8,0xa0,0x4a,0xdd,0x18,0x42,0x72,0x00,0x20,0x40,
+0x7c,0xcf,0x20,0x40,0x5a,0x2e,0x20,0x40,0x5a,0x40,0x20,0x40,0x5c,0x53,0xef,0xe2,
+0x00,0x06,0x1f,0xe2,0x22,0x00,0x18,0xc2,0x26,0x00,0xe8,0x42,0x00,0x06,0x18,0x42,
+0x24,0x00,0x9a,0x46,0x7e,0x00,0x20,0x40,0x02,0xfe,0x20,0x20,0x5a,0x16,0x18,0xc2,
+0x0a,0x00,0x68,0x44,0x4a,0xd9,0x18,0xa2,0x0c,0x00,0x20,0x60,0x00,0x00,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x5a,0x41,0x60,0x42,0x4a,0xdc,0x68,0x42,0x04,0x52,0x79,0x20,
+0x04,0x05,0x18,0x41,0x7e,0xfc,0x98,0x21,0xfe,0x00,0x67,0xe2,0x04,0x52,0x1f,0xe1,
+0x7e,0x1f,0x28,0x0f,0xfe,0x29,0x79,0x20,0xfe,0x04,0x67,0xe2,0x4a,0xdb,0x6f,0xe2,
+0x4a,0xdb,0x28,0x20,0x06,0x01,0x24,0x20,0xda,0x50,0x6f,0xe2,0x4a,0xdc,0x20,0x7a,
+0x00,0x00,0x20,0x20,0x5a,0x50,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x72,0x9a,0xda,0x60,
+0x4a,0xdb,0x68,0x4a,0x43,0xd5,0x20,0x40,0x72,0x77,0x18,0x00,0x22,0x00,0x20,0x40,
+0x72,0x63,0x20,0x40,0x72,0xe8,0x18,0x00,0x70,0x00,0x1a,0x42,0x5e,0x00,0x20,0x40,
+0x72,0xdf,0xda,0x60,0x4a,0xdd,0x6f,0xe2,0x4a,0xdc,0x1f,0xe0,0xa5,0xff,0x9a,0x60,
+0x8a,0x00,0x18,0x00,0x70,0x0c,0x1d,0xe2,0x7e,0x00,0xe7,0xe8,0x00,0x05,0x18,0x00,
+0x22,0x00,0x20,0x40,0x72,0x8e,0x6f,0xe2,0x4a,0xdc,0x1f,0xe0,0xfe,0x04,0x67,0xe2,
+0x4a,0xdc,0x20,0x20,0x72,0xae,0xc6,0x07,0x80,0x00,0x20,0x40,0x5c,0x70,0x24,0x7a,
+0x00,0x00,0x6f,0xe2,0x02,0xd5,0x1f,0xe1,0x7e,0x03,0x67,0xe2,0x44,0xde,0xef,0xe2,
+0x00,0x06,0x67,0xe2,0x44,0xdd,0x20,0x7a,0x00,0x00,0x18,0xc2,0x7e,0x00,0x67,0xe4,
+0x44,0xdf,0x6f,0xe2,0x44,0xde,0xc0,0x01,0x83,0x3e,0x20,0x40,0x5a,0x76,0xd8,0xe0,
+0x00,0x03,0x24,0x34,0x4b,0xec,0x20,0x40,0x4b,0xf0,0x20,0x20,0x5a,0x6b,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x60,0x44,0x6f,0xe2,0x02,0xd7,0xc0,0x04,0x03,0x45,0xc0,0x0a,
+0x03,0x52,0xc0,0x01,0x83,0x61,0x20,0x20,0x60,0x45,0xda,0x20,0x00,0x09,0xda,0x40,
 0x00,0x09,0x20,0x40,0x5c,0x22,0x58,0x00,0x00,0x21,0xe7,0xf0,0x00,0x05,0x20,0x40,
-0x03,0x18,0x20,0x60,0x00,0x00,0x6f,0xe2,0x02,0xd8,0x1f,0xe1,0x7e,0x20,0x20,0x3a,
-0x03,0x1c,0x20,0x60,0x00,0x00,0x70,0x4b,0xed,0x01,0x20,0x60,0x00,0x00,0xef,0xe4,
-0x00,0x06,0x67,0xe4,0x4a,0xd9,0x20,0x20,0x03,0x21,0xda,0x20,0x00,0x09,0xda,0x40,
+0x03,0x4c,0x20,0x60,0x00,0x00,0x6f,0xe2,0x02,0xd8,0x1f,0xe1,0x7e,0x20,0x20,0x3a,
+0x03,0x50,0x20,0x60,0x00,0x00,0x70,0x4b,0xed,0x01,0x20,0x60,0x00,0x00,0xef,0xe4,
+0x00,0x06,0x67,0xe4,0x4a,0xd9,0x20,0x20,0x03,0x55,0xda,0x20,0x00,0x09,0xda,0x40,
 0x00,0x15,0x20,0x40,0x5c,0x22,0x58,0x00,0x00,0xfb,0xe7,0xe4,0x00,0x05,0x58,0x00,
 0x08,0x48,0xe7,0xe4,0x00,0x05,0x58,0x00,0x00,0xfb,0xe7,0xe4,0x00,0x05,0x58,0x00,
-0x08,0x48,0xe7,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0xef,0xe4,0x00,0x06,0xc0,0x02,
-0x03,0x30,0x20,0x20,0x5a,0x72,0xef,0xe6,0x00,0x06,0x67,0xe6,0x04,0x73,0xc0,0x05,
-0x04,0x51,0xc0,0x09,0x04,0x5c,0x20,0x20,0x5c,0x8d,0xd8,0xe0,0x00,0x07,0x20,0x20,
-0x50,0xe2,0xd8,0xe0,0x00,0x07,0x20,0x20,0x50,0xe6,0x20,0x40,0x5c,0xa9,0x67,0xe4,
-0x44,0x78,0x20,0x20,0x5c,0xa2,0x20,0x40,0x5b,0x86,0xda,0x60,0x43,0x81,0xda,0x20,
-0x43,0x62,0x20,0x20,0x5b,0xa5,0x6f,0xe2,0x4b,0xed,0x24,0x3a,0x5b,0xd5,0x78,0x55,
-0xfc,0x00,0x20,0x37,0x03,0x45,0x24,0x36,0xdb,0xe6,0x20,0x40,0x4b,0xa0,0x6f,0xe4,
-0x40,0xc1,0x67,0xe4,0x04,0x49,0x24,0x36,0xcb,0xb3,0xc5,0x07,0xcb,0xb3,0x6f,0xe2,
-0x44,0xdd,0x24,0x3a,0x4b,0xb3,0x6f,0xe2,0x4a,0xdc,0x24,0x3a,0x4b,0xb3,0x20,0x20,
-0x5b,0xe1,0x6f,0xe2,0x00,0x7d,0xc0,0x08,0x03,0x53,0xc0,0x0b,0x83,0x59,0x20,0x20,
-0x60,0xfe,0x68,0x42,0x05,0x4e,0x18,0x46,0x7c,0x06,0x20,0x21,0x03,0x57,0x20,0x20,
-0x62,0x06,0x70,0x00,0x7e,0x24,0x20,0x20,0x61,0x34,0x20,0x20,0x62,0xb8,0x6f,0xe2,
-0x05,0x4e,0x67,0xe2,0x04,0xc5,0xc0,0x05,0x83,0x5e,0x20,0x20,0x61,0xa6,0x20,0x40,
-0x03,0x63,0x70,0x4c,0xf1,0x14,0x6f,0xe2,0x05,0x4f,0xc0,0x03,0x03,0x6a,0x20,0x60,
-0x00,0x00,0x70,0x00,0x55,0x00,0x70,0x09,0xaa,0x00,0x70,0x01,0x6b,0x00,0x70,0x46,
-0x51,0x00,0x58,0x00,0x00,0x00,0x67,0xec,0x41,0xd1,0x20,0x60,0x00,0x00,0x20,0x40,
-0x61,0xe8,0x20,0x20,0x00,0xea,0x78,0x54,0x7c,0x00,0x20,0x40,0x66,0xa3,0x6f,0xe2,
-0x00,0x48,0x20,0x7a,0x00,0x00,0xc2,0x83,0x83,0x72,0x20,0x20,0x63,0xf2,0xc0,0x42,
-0x03,0x75,0xc0,0x41,0x83,0x78,0x20,0x20,0x64,0x21,0x20,0x40,0x03,0x7b,0x6f,0xe2,
-0x00,0x48,0x20,0x20,0x64,0x7b,0x20,0x40,0x03,0x7b,0x6f,0xe2,0x00,0x48,0x20,0x20,
-0x64,0xef,0x6f,0xe2,0x46,0x2c,0x20,0x3a,0x65,0x0d,0x20,0x20,0x65,0x06,0x6f,0xe2,
-0x40,0x9e,0x79,0x3f,0xfe,0x03,0x67,0xe2,0x40,0x9e,0x58,0x00,0x00,0x01,0x67,0xe4,
-0x04,0xca,0x20,0x60,0x00,0x00,0x19,0x42,0x7e,0x00,0x67,0xe4,0x4f,0xf6,0x70,0x40,
-0x91,0x00,0x20,0x40,0x00,0x49,0x6f,0xe2,0x80,0x43,0xc3,0x83,0x80,0x00,0x79,0x20,
-0x7e,0x07,0x67,0xe2,0x80,0x43,0x20,0x60,0x00,0x00,0x6f,0xe2,0x04,0xf9,0xc0,0x77,
-0x83,0x90,0x20,0x20,0x69,0x57,0x6f,0xe4,0x04,0xfd,0x1f,0xe2,0x0c,0x00,0x20,0x40,
-0x69,0x84,0x6f,0xe2,0x04,0xff,0xc0,0x38,0x03,0x96,0x20,0x20,0x69,0x60,0x70,0x0a,
-0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,0x69,0x72,0x20,0x20,0x69,0xba,0x6f,0xe2,
-0x04,0xf9,0xc0,0x77,0x83,0x9d,0x20,0x20,0x6a,0x15,0x6f,0xe4,0x04,0xfd,0x1f,0xe2,
-0x0c,0x00,0x20,0x40,0x69,0x84,0x6f,0xe2,0x04,0xff,0xc0,0x20,0x83,0xa5,0xc0,0x20,
-0x03,0xa5,0xc0,0x38,0x03,0xac,0x20,0x20,0x6a,0x1d,0x20,0x40,0x69,0x70,0x6f,0xe2,
-0x45,0x2f,0x1f,0xe3,0x7e,0x00,0x68,0x42,0x45,0x36,0x98,0x46,0x7c,0x00,0x20,0x22,
-0xea,0x29,0x20,0x20,0x6a,0x58,0x70,0x0a,0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,
-0x69,0x72,0x6f,0xe2,0x45,0x3c,0x68,0x42,0x45,0x36,0x98,0x46,0x7c,0x00,0x20,0x22,
-0xea,0x43,0x20,0x20,0x6a,0x58,0x6f,0xe2,0x44,0x90,0x20,0x3a,0x5e,0xd0,0x20,0x40,
-0x74,0x38,0x20,0x20,0x79,0x32,0x20,0x40,0x42,0x5a,0x24,0x22,0x83,0xc0,0x20,0x40,
+0x08,0x48,0xe7,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0xef,0xf0,0x00,0x06,0x67,0xf0,
+0x44,0x9f,0xef,0xe4,0x00,0x06,0x67,0xe4,0x44,0x9d,0xef,0xf0,0x00,0x06,0x67,0xf0,
+0x44,0x7c,0xef,0xe8,0x00,0x06,0x67,0xe8,0x43,0xe3,0x70,0x0a,0x95,0x2f,0x20,0x20,
+0x7b,0xab,0xef,0xe4,0x00,0x06,0xc0,0x02,0x03,0x6f,0xc0,0x03,0x03,0x7b,0x20,0x20,
+0x5a,0x72,0xef,0xe6,0x00,0x06,0x67,0xe6,0x04,0x73,0xc0,0x05,0x04,0x8d,0xc0,0x09,
+0x04,0x98,0x20,0x20,0x5c,0x8d,0xd8,0xe0,0x00,0x07,0x20,0x20,0x50,0xe2,0xd8,0xe0,
+0x00,0x07,0x20,0x20,0x50,0xe6,0x20,0x40,0x5c,0xa9,0x67,0xe4,0x44,0x78,0x20,0x20,
+0x5c,0xa2,0xef,0xe2,0x00,0x06,0xc0,0x04,0x83,0x7e,0x20,0x20,0x5e,0xd5,0x20,0x40,
+0x7c,0x80,0x20,0x40,0x5f,0x8b,0x2f,0xec,0x00,0x01,0x20,0x20,0xdf,0x89,0x20,0x40,
+0x7c,0x7a,0xef,0xe2,0x00,0x06,0xef,0xec,0x00,0x06,0x67,0xec,0x4b,0xfa,0x20,0x40,
+0x5f,0x99,0x24,0x74,0x00,0x00,0x70,0x0a,0x95,0x42,0x20,0x20,0x7b,0xab,0x20,0x40,
+0x5b,0x86,0xda,0x60,0x43,0x81,0xda,0x20,0x43,0x62,0x20,0x20,0x5b,0xa5,0x6f,0xe2,
+0x4b,0xed,0x24,0x3a,0x5b,0xd5,0x78,0x55,0xfc,0x00,0x20,0x37,0x03,0x93,0x24,0x36,
+0xdb,0xe6,0x20,0x40,0x4b,0xa0,0x6f,0xe4,0x40,0xc1,0x67,0xe4,0x04,0x49,0x24,0x36,
+0xcb,0xb3,0xc5,0x07,0xcb,0xb3,0x6f,0xe2,0x44,0xdd,0x24,0x3a,0x4b,0xb3,0x6f,0xe2,
+0x4a,0xdc,0x24,0x3a,0x4b,0xb3,0x20,0x20,0x5b,0xe1,0x6f,0xe2,0x00,0x7d,0xc0,0x08,
+0x03,0xa1,0xc0,0x0b,0x83,0xa7,0x20,0x20,0x60,0xfe,0x68,0x42,0x05,0x4e,0x18,0x46,
+0x7c,0x06,0x20,0x21,0x03,0xa5,0x20,0x20,0x62,0x06,0x70,0x00,0x7e,0x24,0x20,0x20,
+0x61,0x34,0x20,0x20,0x62,0xb8,0x6f,0xe2,0x05,0x4e,0x67,0xe2,0x04,0xc5,0xc0,0x05,
+0x83,0xac,0x20,0x20,0x61,0xa6,0x20,0x40,0x03,0xb1,0x70,0x4c,0xf7,0x14,0x6f,0xe2,
+0x05,0x4f,0xc0,0x03,0x03,0xb8,0x20,0x60,0x00,0x00,0x70,0x00,0x55,0x00,0x70,0x09,
+0xaa,0x00,0x70,0x01,0x6b,0x00,0x70,0x46,0x51,0x00,0x58,0x00,0x00,0x00,0x67,0xec,
+0x41,0xd1,0x20,0x60,0x00,0x00,0x20,0x40,0x61,0xe8,0x20,0x20,0x00,0xe4,0x78,0x54,
+0x7c,0x00,0x20,0x40,0x66,0xa3,0x6f,0xe2,0x00,0x48,0x20,0x7a,0x00,0x00,0xc2,0x83,
+0x83,0xc0,0x20,0x20,0x63,0xf2,0xc0,0x42,0x03,0xc3,0xc0,0x41,0x83,0xc6,0x20,0x20,
+0x64,0x21,0x20,0x40,0x03,0xc9,0x6f,0xe2,0x00,0x48,0x20,0x20,0x64,0x7b,0x20,0x40,
+0x03,0xc9,0x6f,0xe2,0x00,0x48,0x20,0x20,0x64,0xef,0x6f,0xe2,0x46,0x2c,0x20,0x3a,
+0x65,0x0d,0x20,0x20,0x65,0x06,0x6f,0xe2,0x40,0x9e,0x79,0x3f,0xfe,0x03,0x67,0xe2,
+0x40,0x9e,0x58,0x00,0x00,0x01,0x67,0xe4,0x04,0xca,0x20,0x60,0x00,0x00,0x19,0x42,
+0x7e,0x00,0x67,0xe4,0x4f,0xf6,0x70,0x40,0x91,0x00,0x20,0x40,0x00,0x45,0x6f,0xe2,
+0x80,0x43,0xc3,0x83,0x80,0x00,0x79,0x20,0x7e,0x07,0x67,0xe2,0x80,0x43,0x20,0x60,
+0x00,0x00,0x6f,0xe2,0x04,0xf9,0xc0,0x77,0x83,0xde,0x20,0x20,0x69,0x57,0x6f,0xe4,
+0x04,0xfd,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x69,0x84,0x6f,0xe2,0x04,0xff,0xc0,0x38,
+0x03,0xe4,0x20,0x20,0x69,0x60,0x70,0x0a,0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,
+0x69,0x72,0x6f,0xe2,0x45,0x3c,0x1f,0xe6,0x7c,0x01,0x20,0x22,0xe9,0xba,0x20,0x20,
+0x4d,0x64,0x20,0x20,0x4a,0x8b,0x6f,0xe2,0x04,0xf9,0xc0,0x77,0x83,0xef,0x20,0x20,
+0x6a,0x15,0x6f,0xe4,0x04,0xfd,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x69,0x84,0x6f,0xe2,
+0x04,0xff,0xc0,0x20,0x83,0xf7,0xc0,0x20,0x03,0xf7,0xc0,0x38,0x03,0xff,0x20,0x20,
+0x6a,0x1d,0x20,0x40,0x69,0x70,0x6f,0xe2,0x45,0x2f,0x1f,0xe3,0x7e,0x00,0x68,0x42,
+0x45,0x36,0x98,0x46,0x7c,0x00,0x20,0x22,0xea,0x29,0x20,0x20,0x4d,0x64,0x20,0x20,
+0x4a,0x8b,0x70,0x0a,0x95,0x08,0x20,0x40,0x7b,0xab,0x20,0x40,0x69,0x72,0x6f,0xe2,
+0x45,0x3c,0x68,0x42,0x45,0x36,0x98,0x46,0x7c,0x00,0x20,0x22,0xea,0x43,0x20,0x20,
+0x4d,0x64,0x20,0x20,0x4a,0x8b,0x6f,0xe2,0x44,0x90,0x20,0x3a,0x5e,0xd0,0x20,0x40,
+0x74,0x38,0x20,0x20,0x79,0x32,0x20,0x40,0x42,0x5a,0x24,0x22,0x84,0x14,0x20,0x40,
 0x42,0x06,0x1a,0x20,0x8c,0x01,0xef,0xe2,0x00,0x06,0xc2,0x80,0x57,0x3a,0xc2,0x80,
-0xc1,0x62,0x20,0x20,0x43,0xcb,0x20,0x40,0x03,0xc2,0x20,0x20,0x40,0x2c,0xdf,0x20,
+0xc1,0x62,0x20,0x20,0x43,0xcb,0x20,0x40,0x04,0x16,0x20,0x20,0x40,0x2c,0xdf,0x20,
 0x00,0x02,0x68,0x42,0x00,0x15,0x18,0x40,0x84,0x01,0x28,0x41,0xfe,0x02,0x24,0x20,
-0x83,0xc8,0xd8,0x40,0x00,0x00,0x60,0x42,0x00,0x15,0x18,0x4f,0xfe,0x50,0xda,0x20,
-0x4b,0xfa,0x9a,0x20,0xa2,0x00,0xef,0xe2,0x00,0x11,0xc2,0x80,0x83,0xd0,0xc3,0x80,
-0x00,0x00,0xc3,0x81,0x80,0x00,0xc2,0x00,0x03,0xc4,0x20,0x60,0x00,0x00,0xda,0x60,
-0x03,0xd4,0x20,0x20,0x42,0x39,0xc2,0x80,0x42,0x62,0x18,0x00,0x7c,0x00,0x20,0x60,
-0x00,0x00,0xda,0x20,0x4b,0xfa,0xdf,0x20,0x00,0x02,0x20,0x20,0x42,0x60,0x6f,0xe2,
-0x4c,0xfb,0x1f,0xe0,0xfe,0x01,0x67,0xe2,0x4c,0xfb,0x6f,0xe2,0x00,0x30,0x79,0x3f,
-0xfe,0x03,0x67,0xe2,0x00,0x30,0x20,0x40,0x60,0xd8,0x70,0x46,0x51,0x00,0x70,0x00,
-0x55,0x00,0x20,0x40,0x41,0x10,0x20,0x20,0x43,0xc5,0x78,0x48,0x7c,0x00,0x18,0x42,
-0x36,0x00,0x20,0x40,0x03,0xed,0x78,0x54,0x7c,0x00,0x24,0x62,0x80,0x00,0x18,0x00,
-0x36,0x00,0x78,0x34,0x7c,0x00,0x20,0x60,0x00,0x00,0xda,0x60,0x03,0xef,0x20,0x20,
+0x84,0x1c,0xd8,0x40,0x00,0x00,0x60,0x42,0x00,0x15,0x18,0x4f,0xfe,0x50,0xda,0x20,
+0x4c,0x00,0x9a,0x20,0xa2,0x00,0xef,0xe2,0x00,0x11,0xc2,0x80,0x84,0x24,0xc3,0x80,
+0x00,0x00,0xc3,0x81,0x80,0x00,0xc2,0x00,0x04,0x18,0x20,0x60,0x00,0x00,0xda,0x20,
+0x4c,0x00,0xdf,0x20,0x00,0x02,0x20,0x20,0x42,0x60,0x78,0x48,0x7c,0x00,0x18,0x42,
+0x36,0x00,0x20,0x40,0x04,0x31,0x78,0x54,0x7c,0x00,0x24,0x62,0x80,0x00,0x18,0x00,
+0x36,0x00,0x78,0x34,0x7c,0x00,0x20,0x60,0x00,0x00,0xda,0x60,0x04,0x33,0x20,0x20,
 0x42,0x5d,0x1f,0xe2,0x04,0x00,0x1a,0x20,0x8c,0x01,0xef,0xe2,0x00,0x06,0x1a,0x22,
 0x0c,0x00,0xc2,0x80,0x42,0x62,0x18,0x42,0x7e,0x00,0x20,0x20,0x42,0xc2,0x58,0x00,
-0x00,0x00,0x1c,0xe2,0x7c,0x00,0x20,0x22,0x84,0x00,0x6f,0xe2,0x81,0x24,0x68,0x42,
-0x81,0x25,0x98,0x46,0x7c,0x00,0x20,0x21,0x03,0xfe,0x18,0x42,0x7e,0x00,0x9c,0xe6,
+0x00,0x00,0x1c,0xe2,0x7c,0x00,0x20,0x22,0x84,0x44,0x6f,0xe2,0x81,0x24,0x68,0x42,
+0x81,0x25,0x98,0x46,0x7c,0x00,0x20,0x21,0x04,0x42,0x18,0x42,0x7e,0x00,0x9c,0xe6,
 0x7e,0x00,0x1f,0xe0,0xfe,0x01,0x1f,0xe0,0xfe,0x08,0x37,0xd9,0x82,0x00,0x9e,0x20,
 0xfe,0x00,0x68,0x48,0x41,0x5c,0x98,0x40,0xfe,0x00,0x68,0x46,0x41,0x70,0x98,0x4f,
 0xfe,0x00,0x1f,0xec,0xfe,0x00,0x1f,0xf1,0xfe,0x00,0x1f,0xe0,0xfe,0x6e,0xd8,0x40,
 0x0e,0xa6,0x98,0x46,0xfc,0x00,0x20,0x40,0x7d,0x61,0x18,0x07,0xfe,0x00,0x1f,0xf0,
 0x7e,0x00,0x18,0x07,0x04,0x00,0x98,0x41,0xfe,0x00,0x68,0x4c,0x41,0x64,0x20,0x40,
-0x7d,0x07,0x18,0x42,0x32,0x00,0x6f,0xec,0x4c,0x02,0x20,0x40,0x48,0x50,0x20,0x60,
+0x7d,0x07,0x18,0x42,0x32,0x00,0x6f,0xec,0x4c,0x08,0x20,0x40,0x48,0x50,0x20,0x60,
 0x00,0x00,0x20,0x40,0x4a,0xd8,0x6f,0xe6,0x41,0x70,0x20,0x7a,0x00,0x00,0x6f,0xe2,
-0x40,0x91,0x20,0x7a,0x00,0x00,0x6f,0xe2,0x46,0x2c,0x20,0x3a,0x04,0x20,0x6f,0xe2,
+0x40,0x91,0x20,0x7a,0x00,0x00,0x6f,0xe2,0x46,0x2c,0x20,0x3a,0x04,0x64,0x6f,0xe2,
 0x45,0x83,0x20,0x7a,0x00,0x00,0x6f,0xe2,0x44,0x92,0x24,0x7a,0x00,0x00,0x20,0x40,
-0x4b,0xf4,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x4b,0xfa,0x2f,0xe0,0x0e,0x03,0x24,0x20,
-0xcb,0x72,0x6f,0xe4,0x4b,0xfc,0x20,0x7a,0x00,0x00,0x20,0x75,0x80,0x00,0x68,0x42,
-0x00,0xa0,0x6f,0xe4,0x4b,0xfc,0x98,0x4f,0xfe,0x00,0x18,0x51,0x84,0x00,0x18,0x4b,
-0x04,0x00,0x98,0x46,0x7e,0x00,0x68,0x48,0x4b,0xfe,0x98,0x40,0xfe,0x00,0x68,0x42,
-0x41,0x56,0x98,0x46,0x7e,0x00,0x1f,0xf0,0x60,0x00,0x6f,0xe4,0x4c,0x08,0x1f,0xe3,
+0x4b,0xf4,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x4c,0x00,0x2f,0xe0,0x0e,0x03,0x24,0x20,
+0xcb,0x72,0x6f,0xe4,0x4c,0x02,0x20,0x7a,0x00,0x00,0x20,0x75,0x80,0x00,0x68,0x42,
+0x00,0xa0,0x6f,0xe4,0x4c,0x02,0x98,0x4f,0xfe,0x00,0x18,0x51,0x84,0x00,0x18,0x4b,
+0x04,0x00,0x98,0x46,0x7e,0x00,0x68,0x48,0x4c,0x04,0x98,0x40,0xfe,0x00,0x68,0x42,
+0x41,0x56,0x98,0x46,0x7e,0x00,0x1f,0xf0,0x60,0x00,0x6f,0xe4,0x4c,0x0e,0x1f,0xe3,
 0x7e,0x00,0x20,0x40,0x7d,0x2b,0x1e,0x02,0x7e,0x00,0x20,0x40,0x7d,0x14,0x1b,0x42,
-0x04,0x00,0x20,0x40,0x00,0x75,0x20,0x74,0x00,0x00,0x20,0x20,0x4b,0x68,0x6f,0xe2,
-0x4b,0xfa,0x20,0x20,0x4b,0x74,0xda,0x20,0x46,0x3a,0x20,0x40,0x7d,0x9c,0x20,0x7a,
-0x00,0x00,0x1f,0xe2,0x26,0x00,0x20,0x40,0x04,0x46,0x20,0x20,0x4c,0xbd,0xc0,0x15,
-0x4d,0x64,0x20,0x20,0x4c,0x98,0x20,0x40,0x7d,0xc1,0x6f,0xe2,0x44,0x98,0xc1,0x00,
-0x00,0x00,0x6f,0xe2,0x4b,0xfa,0xc3,0x82,0x00,0x00,0x20,0x20,0x7d,0xbf,0x6f,0xe2,
-0x46,0x79,0xc2,0x81,0x04,0x48,0x20,0x20,0x7d,0xc1,0x68,0x44,0x04,0x74,0x6f,0xe2,
-0x44,0xbb,0xc2,0x81,0x84,0x55,0x20,0x20,0x5d,0x9f,0x6f,0xe4,0x44,0xcc,0x98,0x46,
-0x7c,0x00,0x24,0x22,0xdd,0x9f,0x20,0x40,0x04,0x48,0x24,0x34,0x5d,0x9f,0x70,0x04,
+0x04,0x00,0x20,0x40,0x00,0x71,0x20,0x74,0x00,0x00,0x20,0x20,0x4b,0x68,0x6f,0xe2,
+0x4c,0x00,0x20,0x20,0x4b,0x74,0x20,0x40,0x7d,0xc1,0x6f,0xe2,0x44,0x98,0xc1,0x00,
+0x00,0x00,0x6f,0xe2,0x4c,0x00,0xc3,0x82,0x00,0x00,0x20,0x20,0x7d,0xbf,0x6f,0xe2,
+0x46,0x79,0xc2,0x81,0x04,0x84,0x20,0x20,0x7d,0xc1,0x68,0x44,0x04,0x74,0x6f,0xe2,
+0x44,0xbb,0xc2,0x81,0x84,0x91,0x20,0x20,0x5d,0x9f,0x6f,0xe4,0x44,0xcc,0x98,0x46,
+0x7c,0x00,0x24,0x22,0xdd,0x9f,0x20,0x40,0x04,0x84,0x24,0x34,0x5d,0x9f,0x70,0x04,
 0x76,0x05,0x20,0x20,0x5e,0x57,0x18,0xc2,0x22,0x00,0x6f,0xe4,0x44,0xce,0x1f,0xe0,
 0xa5,0xfd,0x20,0x40,0x5a,0xbe,0x6f,0xe2,0x44,0xbb,0xc3,0x02,0x5e,0x1d,0x68,0x44,
 0x04,0x74,0x6f,0xe4,0x44,0xcc,0x98,0x46,0x7c,0x00,0x24,0x22,0xde,0x1d,0x20,0x40,
-0x04,0x48,0x24,0x34,0x5e,0x1d,0x70,0x04,0x76,0x05,0x20,0x20,0x5e,0x57,0x6f,0xe2,
+0x04,0x84,0x24,0x34,0x5e,0x1d,0x70,0x04,0x76,0x05,0x20,0x20,0x5e,0x57,0x6f,0xe2,
 0x05,0x4e,0x79,0x20,0x7e,0x07,0x67,0xe2,0x00,0x7d,0xc0,0x4d,0xfc,0x0c,0xc0,0x4c,
-0x84,0x70,0x20,0x20,0x61,0x4b,0x6f,0xe2,0x46,0x51,0x24,0x5a,0x03,0x63,0x70,0x4c,
-0xf2,0x01,0x20,0x20,0x61,0x5e,0x20,0x40,0x41,0xc5,0x24,0x74,0x00,0x00,0x78,0x54,
+0x84,0xac,0x20,0x20,0x61,0x4b,0x6f,0xe2,0x46,0x51,0x24,0x5a,0x03,0xb1,0x70,0x4c,
+0xf8,0x01,0x20,0x20,0x61,0x5e,0x20,0x40,0x41,0xc5,0x24,0x74,0x00,0x00,0x78,0x54,
 0x7c,0x00,0x70,0x00,0x11,0x20,0x79,0x3f,0x80,0x0b,0x79,0x3f,0x80,0x2c,0x20,0x40,
-0x4a,0x4e,0x20,0x40,0x42,0xe2,0xc5,0x05,0x84,0x81,0x20,0x40,0x44,0x51,0x24,0x3a,
-0x04,0x7a,0xc5,0x16,0x04,0x8a,0x20,0x20,0x41,0xe8,0x20,0x40,0x4a,0x4c,0xd8,0x20,
+0x4a,0x4e,0x20,0x40,0x42,0xe2,0xc5,0x05,0x84,0xbd,0x20,0x40,0x44,0x51,0x24,0x3a,
+0x04,0xb6,0xc5,0x16,0x04,0xc6,0x20,0x20,0x41,0xe8,0x20,0x40,0x4a,0x4c,0xd8,0x20,
 0x00,0x10,0x20,0x40,0x42,0xd8,0x79,0x20,0x00,0x2c,0x79,0x3f,0x80,0x0b,0x6f,0xe2,
-0x00,0x77,0x98,0x00,0x08,0x00,0x70,0x00,0x11,0x02,0x20,0x20,0x04,0x7a,0x6f,0xe8,
+0x00,0x77,0x98,0x00,0x08,0x00,0x70,0x00,0x11,0x02,0x20,0x20,0x04,0xb6,0x6f,0xe8,
 0x01,0x63,0x1f,0xe0,0xfe,0x08,0x67,0xe8,0x01,0x63,0x20,0x20,0x41,0xf4,0x20,0x40,
-0x51,0x4a,0x70,0x02,0x81,0x17,0x20,0x60,0x00,0x00,0x20,0x40,0x04,0xe6,0x20,0x20,
+0x51,0x4a,0x70,0x02,0x81,0x17,0x20,0x60,0x00,0x00,0x20,0x40,0x05,0x22,0x20,0x20,
 0x6b,0x6e,0x58,0x00,0x15,0xef,0xe7,0xe4,0x00,0x05,0x58,0x00,0x11,0x83,0xe7,0xe4,
 0x00,0x05,0x18,0x42,0x7e,0x00,0xe7,0xe2,0x00,0x05,0x58,0x00,0x00,0xf0,0xe7,0xe6,
 0x00,0x05,0x6f,0xe4,0x45,0x3e,0xe7,0xe4,0x00,0x05,0x58,0x00,0x00,0x00,0xe7,0xe2,
 0x00,0x05,0x6f,0xe2,0x45,0x40,0xe7,0xe2,0x00,0x05,0x20,0x40,0x68,0xf0,0xe7,0xe2,
 0x00,0x05,0x70,0x45,0x3b,0x10,0x20,0x60,0x00,0x00,0x6f,0xe2,0x46,0x51,0xc0,0x00,
 0x69,0x4f,0x6f,0xe4,0x02,0x60,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x69,0x79,0x6f,0xe2,
-0x04,0xf8,0xc0,0x00,0x6a,0x13,0x20,0x20,0x04,0xad,0x6f,0xe2,0x04,0xf9,0xc0,0x77,
-0x84,0xbf,0xc0,0x7f,0x84,0xb7,0xc0,0x29,0x84,0xb2,0x20,0x20,0x6a,0x4e,0x20,0x20,
-0x6a,0x05,0x6f,0xe2,0x04,0xf9,0xc0,0x77,0x84,0xbf,0xc0,0x7f,0x84,0xb7,0x20,0x20,
+0x04,0xf8,0xc0,0x00,0x6a,0x13,0x20,0x20,0x04,0xe9,0x6f,0xe2,0x04,0xf9,0xc0,0x77,
+0x84,0xfb,0xc0,0x7f,0x84,0xf3,0xc0,0x29,0x84,0xee,0x20,0x20,0x6a,0x4e,0x20,0x20,
+0x6a,0x05,0x6f,0xe2,0x04,0xf9,0xc0,0x77,0x84,0xfb,0xc0,0x7f,0x84,0xf3,0x20,0x20,
 0x69,0xdc,0x6f,0xe4,0x04,0xfd,0x1f,0xe2,0x0c,0x00,0x1f,0xe0,0xfe,0x01,0x67,0xe4,
 0x04,0xfd,0xef,0xe2,0x00,0x06,0x68,0x42,0x45,0x3a,0x98,0x40,0xfe,0x00,0x67,0xe2,
-0x45,0x3a,0x20,0x40,0x6b,0x01,0x6f,0xe4,0x04,0xfd,0x67,0xe4,0x4c,0xad,0x68,0xe2,
-0x04,0xfb,0x20,0x20,0x04,0xc4,0x18,0xe2,0x7e,0x00,0x20,0x62,0x80,0x00,0x68,0x44,
-0x4c,0xad,0x18,0x42,0x0c,0x00,0x20,0x40,0x04,0xd2,0x24,0x74,0x00,0x00,0x18,0xc2,
-0x7e,0x00,0x67,0xe4,0x4c,0xaf,0x20,0x40,0x04,0xd2,0x24,0x74,0x00,0x00,0x18,0xc2,
-0x7e,0x00,0x67,0xe4,0x4c,0xad,0x20,0x40,0x05,0x62,0x20,0x20,0x04,0xc4,0x78,0x54,
+0x45,0x3a,0x20,0x40,0x6b,0x01,0x6f,0xe4,0x04,0xfd,0x67,0xe4,0x4c,0xb3,0x68,0xe2,
+0x04,0xfb,0x20,0x20,0x05,0x00,0x18,0xe2,0x7e,0x00,0x20,0x62,0x80,0x00,0x68,0x44,
+0x4c,0xb3,0x18,0x42,0x0c,0x00,0x20,0x40,0x05,0x0e,0x24,0x74,0x00,0x00,0x18,0xc2,
+0x7e,0x00,0x67,0xe4,0x4c,0xb5,0x20,0x40,0x05,0x0e,0x24,0x74,0x00,0x00,0x18,0xc2,
+0x7e,0x00,0x67,0xe4,0x4c,0xb3,0x20,0x40,0x05,0x9e,0x20,0x20,0x05,0x00,0x78,0x54,
 0x7c,0x00,0x18,0xe2,0x7e,0x00,0x1f,0xe0,0xff,0xfe,0x24,0x61,0x00,0x00,0x18,0xe0,
-0x8f,0xff,0xef,0xe2,0x00,0x06,0xc0,0x86,0x84,0xd3,0x18,0xe0,0x8f,0xff,0xef,0xe2,
-0x00,0x06,0xc0,0x85,0x04,0xd3,0x78,0x34,0x7c,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,
-0x9a,0x00,0x70,0x4c,0x9b,0x00,0x70,0x4c,0x9c,0x00,0x70,0x4c,0xd4,0x00,0x58,0x00,
-0x4c,0xad,0xd8,0xa0,0x4c,0x9a,0x98,0xa6,0x72,0x00,0x20,0x20,0x7c,0xaf,0x20,0x40,
-0x56,0x4e,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x4c,0x9a,0xc0,0x05,0x05,0x17,0xc1,0x05,
-0x80,0x00,0xc0,0x06,0x05,0x22,0xc1,0x06,0x80,0x00,0xc0,0x07,0x05,0x2d,0xc1,0x07,
-0x80,0x00,0xc0,0x00,0x04,0xfb,0xc0,0x00,0x85,0x08,0xc1,0x01,0x00,0x00,0xc0,0x01,
-0x85,0x38,0xc1,0x02,0x00,0x00,0xc0,0x02,0x85,0x43,0xc1,0x03,0x00,0x00,0xc0,0x03,
-0x85,0x4c,0xc1,0x04,0x00,0x00,0xc0,0x04,0x84,0xfa,0x20,0x60,0x00,0x00,0x20,0x60,
-0x00,0x00,0x6f,0xe2,0x42,0x26,0xc0,0x77,0x84,0xff,0xc0,0x7f,0x84,0xff,0x20,0x60,
-0x00,0x00,0x70,0x4c,0x9a,0x01,0x20,0x60,0x00,0x00,0x67,0xe4,0x46,0x6a,0x58,0x00,
-0x4c,0xb3,0x67,0xe4,0x4c,0xb1,0x1f,0xe2,0x0a,0x00,0x58,0x2b,0x54,0x41,0xe7,0xe6,
+0x8f,0xff,0xef,0xe2,0x00,0x06,0xc0,0x86,0x85,0x0f,0x18,0xe0,0x8f,0xff,0xef,0xe2,
+0x00,0x06,0xc0,0x85,0x05,0x0f,0x78,0x34,0x7c,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,
+0xa0,0x00,0x70,0x4c,0xa1,0x00,0x70,0x4c,0xa2,0x00,0x70,0x4c,0xda,0x00,0x58,0x00,
+0x4c,0xb3,0xd8,0xa0,0x4c,0xa0,0x98,0xa6,0x72,0x00,0x20,0x20,0x7c,0xaf,0x20,0x40,
+0x56,0x4e,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x4c,0xa0,0xc0,0x05,0x05,0x53,0xc1,0x05,
+0x80,0x00,0xc0,0x06,0x05,0x5e,0xc1,0x06,0x80,0x00,0xc0,0x07,0x05,0x69,0xc1,0x07,
+0x80,0x00,0xc0,0x00,0x05,0x37,0xc0,0x00,0x85,0x44,0xc1,0x01,0x00,0x00,0xc0,0x01,
+0x85,0x74,0xc1,0x02,0x00,0x00,0xc0,0x02,0x85,0x7f,0xc1,0x03,0x00,0x00,0xc0,0x03,
+0x85,0x88,0xc1,0x04,0x00,0x00,0xc0,0x04,0x85,0x36,0x20,0x60,0x00,0x00,0x20,0x60,
+0x00,0x00,0x6f,0xe2,0x42,0x26,0xc0,0x77,0x85,0x3b,0xc0,0x7f,0x85,0x3b,0x20,0x60,
+0x00,0x00,0x70,0x4c,0xa0,0x01,0x20,0x60,0x00,0x00,0x67,0xe4,0x46,0x6a,0x58,0x00,
+0x4c,0xb9,0x67,0xe4,0x4c,0xb7,0x1f,0xe2,0x0a,0x00,0x58,0x2b,0x54,0x41,0xe7,0xe6,
 0x00,0x05,0x20,0x60,0x00,0x00,0x6f,0xe2,0x45,0x3a,0x20,0x7a,0x00,0x00,0x20,0x40,
-0x06,0xf7,0x70,0x4c,0x9a,0x02,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x01,0x58,0x53,
+0x07,0x33,0x70,0x4c,0xa0,0x02,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x3d,0x58,0x53,
 0x52,0x42,0xe7,0xe6,0x00,0x05,0x58,0x00,0x3d,0x46,0xe7,0xe4,0x00,0x05,0x6f,0xe2,
-0x4c,0xd1,0xe7,0xe2,0x00,0x05,0x58,0x00,0x00,0x0d,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x06,0xf9,0x20,0x40,0x06,0xf7,0x70,0x4c,0x9a,0x0b,0x58,0x00,0x00,0x0a,0x20,0x40,
-0x05,0x01,0x58,0x00,0x48,0x43,0xe7,0xe4,0x00,0x05,0x58,0x3d,0x44,0x4c,0xe7,0xe6,
-0x00,0x05,0x58,0x00,0x0d,0x3f,0xe7,0xe4,0x00,0x05,0x20,0x20,0x06,0xf9,0x20,0x40,
-0x06,0xf7,0x70,0x4c,0x9a,0x0d,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x01,0x58,0x00,
+0x4c,0xd7,0xe7,0xe2,0x00,0x05,0x58,0x00,0x00,0x0d,0xe7,0xe2,0x00,0x05,0x20,0x20,
+0x07,0x35,0x20,0x40,0x07,0x33,0x70,0x4c,0xa0,0x0b,0x58,0x00,0x00,0x0a,0x20,0x40,
+0x05,0x3d,0x58,0x00,0x48,0x43,0xe7,0xe4,0x00,0x05,0x58,0x3d,0x44,0x4c,0xe7,0xe6,
+0x00,0x05,0x58,0x00,0x0d,0x3f,0xe7,0xe4,0x00,0x05,0x20,0x20,0x07,0x35,0x20,0x40,
+0x07,0x33,0x70,0x4c,0xa0,0x0d,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x3d,0x58,0x00,
 0x4c,0x43,0xe7,0xe4,0x00,0x05,0x58,0x3d,0x50,0x49,0xe7,0xe6,0x00,0x05,0x58,0x00,
-0x0d,0x31,0xe7,0xe4,0x00,0x05,0x20,0x20,0x06,0xf9,0x20,0x40,0x06,0xf7,0x70,0x4c,
-0x9a,0x0f,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x01,0x58,0x00,0x43,0x43,0xe7,0xe4,
+0x0d,0x31,0xe7,0xe4,0x00,0x05,0x20,0x20,0x07,0x35,0x20,0x40,0x07,0x33,0x70,0x4c,
+0xa0,0x0f,0x58,0x00,0x00,0x0a,0x20,0x40,0x05,0x3d,0x58,0x00,0x43,0x43,0xe7,0xe4,
 0x00,0x05,0x58,0x3d,0x41,0x57,0xe7,0xe6,0x00,0x05,0x58,0x00,0x0d,0x31,0xe7,0xe4,
-0x00,0x05,0x20,0x20,0x06,0xf9,0x20,0x40,0x06,0xf7,0x70,0x4c,0x9a,0x04,0x58,0x00,
-0x00,0x0a,0x20,0x40,0x05,0x01,0x58,0x4e,0x49,0x43,0xe7,0xe6,0x00,0x05,0x58,0x3f,
+0x00,0x05,0x20,0x20,0x07,0x35,0x20,0x40,0x07,0x33,0x70,0x4c,0xa0,0x04,0x58,0x00,
+0x00,0x0a,0x20,0x40,0x05,0x3d,0x58,0x4e,0x49,0x43,0xe7,0xe6,0x00,0x05,0x58,0x3f,
 0x3d,0x44,0xe7,0xe6,0x00,0x05,0x58,0x00,0x00,0x0d,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x06,0xf9,0x20,0x40,0x06,0xf7,0x70,0x4c,0x9a,0x06,0x58,0x00,0x00,0x09,0x20,0x40,
-0x05,0x01,0x58,0x4e,0x49,0x43,0xe7,0xe6,0x00,0x05,0x58,0x0d,0x3f,0x44,0xe7,0xe6,
-0x00,0x05,0x20,0x20,0x06,0xf9,0x20,0x40,0x06,0xf7,0x70,0x4c,0x9a,0x08,0x58,0x00,
-0x00,0x10,0x20,0x40,0x05,0x01,0x58,0x45,0x4d,0x43,0xe7,0xe6,0x00,0x05,0x58,0x33,
+0x07,0x35,0x20,0x40,0x07,0x33,0x70,0x4c,0xa0,0x06,0x58,0x00,0x00,0x09,0x20,0x40,
+0x05,0x3d,0x58,0x4e,0x49,0x43,0xe7,0xe6,0x00,0x05,0x58,0x0d,0x3f,0x44,0xe7,0xe6,
+0x00,0x05,0x20,0x20,0x07,0x35,0x20,0x40,0x07,0x33,0x70,0x4c,0xa0,0x08,0x58,0x00,
+0x00,0x10,0x20,0x40,0x05,0x3d,0x58,0x45,0x4d,0x43,0xe7,0xe6,0x00,0x05,0x58,0x33,
 0x3d,0x52,0xe7,0xe6,0x00,0x05,0x58,0x2c,0x30,0x2c,0xe7,0xe6,0x00,0x05,0x58,0x31,
 0x2c,0x30,0xe7,0xe6,0x00,0x05,0x58,0x00,0x00,0x0d,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x06,0xf9,0x58,0x00,0x00,0x08,0x20,0x40,0x05,0x01,0x58,0x43,0x4c,0x43,0xe7,0xe6,
-0x00,0x05,0x58,0x00,0x0d,0x43,0xe7,0xe4,0x00,0x05,0x20,0x20,0x06,0xf9,0x78,0x54,
-0x7c,0x00,0x20,0x40,0x05,0x75,0x20,0x74,0x00,0x00,0x20,0x40,0x05,0x9f,0x20,0x74,
-0x00,0x00,0x60,0xe4,0x0a,0x9e,0x20,0x40,0x06,0xf7,0x68,0xe4,0x0a,0x9e,0x20,0x40,
-0x06,0xa6,0x20,0x74,0x00,0x00,0x20,0x40,0x05,0xad,0x20,0x74,0x00,0x00,0x20,0x40,
-0x06,0x13,0x20,0x74,0x00,0x00,0x20,0x40,0x06,0xb6,0x20,0x74,0x00,0x00,0x20,0x40,
-0x06,0xd2,0x20,0x74,0x00,0x00,0x20,0x60,0x00,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,
+0x07,0x35,0x58,0x00,0x00,0x08,0x20,0x40,0x05,0x3d,0x58,0x43,0x4c,0x43,0xe7,0xe6,
+0x00,0x05,0x58,0x00,0x0d,0x43,0xe7,0xe4,0x00,0x05,0x20,0x20,0x07,0x35,0x78,0x54,
+0x7c,0x00,0x20,0x40,0x05,0xb1,0x20,0x74,0x00,0x00,0x20,0x40,0x05,0xdb,0x20,0x74,
+0x00,0x00,0x60,0xe4,0x0a,0x9e,0x20,0x40,0x07,0x33,0x68,0xe4,0x0a,0x9e,0x20,0x40,
+0x06,0xe2,0x20,0x74,0x00,0x00,0x20,0x40,0x05,0xe9,0x20,0x74,0x00,0x00,0x20,0x40,
+0x06,0x4f,0x20,0x74,0x00,0x00,0x20,0x40,0x06,0xf2,0x20,0x74,0x00,0x00,0x20,0x40,
+0x07,0x0e,0x20,0x74,0x00,0x00,0x20,0x60,0x00,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,
 0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa7,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa5,
-0x80,0x00,0x78,0x34,0x7c,0x00,0x20,0x40,0x05,0x86,0x6f,0xe2,0x4c,0x9a,0xc0,0x04,
-0x05,0x96,0xc0,0x05,0x85,0x98,0xc0,0x06,0x85,0x9a,0xc0,0x07,0x85,0x9c,0xc0,0x01,
-0x05,0x90,0xc0,0x02,0x05,0x92,0xc0,0x03,0x05,0x94,0x20,0x60,0x00,0x00,0x6f,0xe2,
-0x4c,0x9c,0xc0,0x00,0x85,0x8c,0xc0,0x01,0x05,0x8c,0xc0,0x01,0x85,0x8e,0xc0,0x02,
-0x05,0x8c,0x20,0x60,0x00,0x00,0x70,0x4c,0x9c,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,
-0x9c,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,0x9a,0x03,0x20,0x60,0x00,0x00,0x70,0x4c,
-0x9a,0x05,0x20,0x60,0x00,0x00,0x70,0x4c,0x9a,0x07,0x20,0x60,0x00,0x00,0x70,0x4c,
-0x9a,0x0a,0x20,0x60,0x00,0x00,0x70,0x4c,0x9a,0x0c,0x20,0x60,0x00,0x00,0x70,0x4c,
-0x9a,0x0e,0x20,0x60,0x00,0x00,0x70,0x4c,0x9a,0x09,0x70,0x0a,0x95,0x60,0x20,0x20,
-0x7b,0xab,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa2,
+0x80,0x00,0x78,0x34,0x7c,0x00,0x20,0x40,0x05,0xc2,0x6f,0xe2,0x4c,0xa0,0xc0,0x04,
+0x05,0xd2,0xc0,0x05,0x85,0xd4,0xc0,0x06,0x85,0xd6,0xc0,0x07,0x85,0xd8,0xc0,0x01,
+0x05,0xcc,0xc0,0x02,0x05,0xce,0xc0,0x03,0x05,0xd0,0x20,0x60,0x00,0x00,0x6f,0xe2,
+0x4c,0xa2,0xc0,0x00,0x85,0xc8,0xc0,0x01,0x05,0xc8,0xc0,0x01,0x85,0xca,0xc0,0x02,
+0x05,0xc8,0x20,0x60,0x00,0x00,0x70,0x4c,0xa2,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,
+0xa2,0x00,0x20,0x60,0x00,0x00,0x70,0x4c,0xa0,0x03,0x20,0x60,0x00,0x00,0x70,0x4c,
+0xa0,0x05,0x20,0x60,0x00,0x00,0x70,0x4c,0xa0,0x07,0x20,0x60,0x00,0x00,0x70,0x4c,
+0xa0,0x0a,0x20,0x60,0x00,0x00,0x70,0x4c,0xa0,0x0c,0x20,0x60,0x00,0x00,0x70,0x4c,
+0xa0,0x0e,0x20,0x60,0x00,0x00,0x70,0x4c,0xa0,0x09,0x70,0x0a,0x95,0x60,0x20,0x20,
+0x7b,0xab,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa2,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa9,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa9,
 0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa7,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa9,
-0x00,0x00,0x78,0x34,0x7c,0x00,0x20,0x20,0x05,0x86,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,
+0x00,0x00,0x78,0x34,0x7c,0x00,0x20,0x20,0x05,0xc2,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,
 0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa1,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa4,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa2,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xab,0x00,0x00,0x78,0x34,0x7c,0x00,0x20,0x40,
-0x06,0xe3,0x1a,0x20,0xa2,0x02,0x58,0x00,0x4c,0x9f,0x98,0x40,0x84,0x00,0x18,0x40,
-0x85,0xff,0xef,0xe2,0x00,0x02,0xd8,0x40,0x4c,0xa6,0x98,0x40,0xfe,0x00,0x67,0xe4,
-0x4c,0xaf,0x1a,0x22,0x0c,0x00,0x20,0x40,0x06,0xf3,0x20,0x40,0x06,0xe3,0x6f,0xe4,
-0x4c,0xaf,0xe0,0x42,0x00,0x3f,0x58,0x00,0x00,0x01,0x20,0x40,0x05,0xcd,0xc0,0x00,
-0x05,0xd1,0xc0,0x00,0x85,0xf3,0x20,0x60,0x00,0x00,0xd8,0xc0,0x4c,0xa6,0x98,0xc0,
+0x07,0x1f,0x1a,0x20,0xa2,0x02,0x58,0x00,0x4c,0xa5,0x98,0x40,0x84,0x00,0x18,0x40,
+0x85,0xff,0xef,0xe2,0x00,0x02,0xd8,0x40,0x4c,0xac,0x98,0x40,0xfe,0x00,0x67,0xe4,
+0x4c,0xb5,0x1a,0x22,0x0c,0x00,0x20,0x40,0x07,0x2f,0x20,0x40,0x07,0x1f,0x6f,0xe4,
+0x4c,0xb5,0xe0,0x42,0x00,0x3f,0x58,0x00,0x00,0x01,0x20,0x40,0x06,0x09,0xc0,0x00,
+0x06,0x0d,0xc0,0x00,0x86,0x2f,0x20,0x60,0x00,0x00,0xd8,0xc0,0x4c,0xac,0x98,0xc0,
 0x8c,0x00,0xef,0xe2,0x00,0x06,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x02,0x20,0x40,
-0x05,0xcd,0xc0,0x00,0x85,0xdf,0xc0,0x01,0x05,0xef,0xc0,0x01,0x85,0xef,0x6f,0xe2,
-0x4c,0x9b,0xc1,0x00,0x00,0x00,0x70,0x4c,0x9b,0x00,0x6f,0xe2,0x4c,0xd4,0x1f,0xe6,
-0x7c,0x01,0x20,0x42,0x85,0xdd,0x20,0x20,0x06,0x0d,0x70,0x0a,0x95,0x58,0x20,0x20,
-0x7b,0xab,0x20,0x40,0x05,0x5b,0x6f,0xe2,0x4c,0x9b,0xc1,0x00,0x80,0x00,0x70,0x4c,
-0x9b,0x01,0x70,0x0a,0x95,0x5a,0x20,0x20,0x7b,0xab,0x70,0x0a,0x95,0x5b,0x20,0x20,
+0x06,0x09,0xc0,0x00,0x86,0x1b,0xc0,0x01,0x06,0x2b,0xc0,0x01,0x86,0x2b,0x6f,0xe2,
+0x4c,0xa1,0xc1,0x00,0x00,0x00,0x70,0x4c,0xa1,0x00,0x6f,0xe2,0x4c,0xda,0x1f,0xe6,
+0x7c,0x01,0x20,0x42,0x86,0x19,0x20,0x20,0x06,0x49,0x70,0x0a,0x95,0x58,0x20,0x20,
+0x7b,0xab,0x20,0x40,0x05,0x97,0x6f,0xe2,0x4c,0xa1,0xc1,0x00,0x80,0x00,0x70,0x4c,
+0xa1,0x01,0x70,0x0a,0x95,0x5a,0x20,0x20,0x7b,0xab,0x70,0x0a,0x95,0x5b,0x20,0x20,
 0x7b,0xab,0x70,0x0a,0x95,0x5c,0x20,0x20,0x7b,0xab,0x70,0x0a,0x95,0x5d,0x20,0x20,
 0x7b,0xab,0x70,0x0a,0x95,0x5e,0x20,0x20,0x7b,0xab,0x70,0x0a,0x95,0x5f,0x20,0x20,
-0x7b,0xab,0x6f,0xe2,0x4c,0x9b,0xc1,0x01,0x00,0x00,0x70,0x4c,0x9b,0x02,0x20,0x20,
-0x05,0xe5,0x58,0x00,0x00,0x03,0x20,0x40,0x05,0xcd,0xc0,0x00,0x06,0x02,0x6f,0xe2,
-0x4c,0x9b,0xc1,0x03,0x00,0x00,0x70,0x4c,0x9b,0x06,0x20,0x20,0x05,0xed,0x6f,0xe2,
-0x4c,0x9b,0xc1,0x02,0x00,0x00,0x70,0x4c,0x9b,0x04,0x20,0x20,0x05,0xe9,0x6f,0xe2,
-0x4c,0x9b,0xc1,0x02,0x80,0x00,0x70,0x4c,0x9b,0x05,0x20,0x20,0x05,0xeb,0x58,0x00,
-0x00,0x02,0x20,0x40,0x05,0xcd,0xc0,0x00,0x85,0xfa,0xc0,0x01,0x05,0xfe,0xc0,0x01,
-0x85,0xfe,0x6f,0xe2,0x4c,0x9b,0xc1,0x01,0x80,0x00,0x70,0x4c,0x9b,0x03,0x20,0x40,
-0x05,0xe7,0x70,0x4c,0xd4,0x02,0x20,0x60,0x00,0x00,0x70,0x4c,0xd4,0x00,0x20,0x60,
-0x00,0x00,0x70,0x0a,0x95,0x59,0x20,0x40,0x7b,0xab,0x70,0x4c,0xd4,0x01,0x20,0x60,
-0x00,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,
+0x7b,0xab,0x6f,0xe2,0x4c,0xa1,0xc1,0x01,0x00,0x00,0x70,0x4c,0xa1,0x02,0x20,0x20,
+0x06,0x21,0x58,0x00,0x00,0x03,0x20,0x40,0x06,0x09,0xc0,0x00,0x06,0x3e,0x6f,0xe2,
+0x4c,0xa1,0xc1,0x03,0x00,0x00,0x70,0x4c,0xa1,0x06,0x20,0x20,0x06,0x29,0x6f,0xe2,
+0x4c,0xa1,0xc1,0x02,0x00,0x00,0x70,0x4c,0xa1,0x04,0x20,0x20,0x06,0x25,0x6f,0xe2,
+0x4c,0xa1,0xc1,0x02,0x80,0x00,0x70,0x4c,0xa1,0x05,0x20,0x20,0x06,0x27,0x58,0x00,
+0x00,0x02,0x20,0x40,0x06,0x09,0xc0,0x00,0x86,0x36,0xc0,0x01,0x06,0x3a,0xc0,0x01,
+0x86,0x3a,0x6f,0xe2,0x4c,0xa1,0xc1,0x01,0x80,0x00,0x70,0x4c,0xa1,0x03,0x20,0x40,
+0x06,0x23,0x70,0x4c,0xda,0x02,0x20,0x60,0x00,0x00,0x70,0x4c,0xda,0x00,0x20,0x60,
+0x00,0x00,0x70,0x0a,0x95,0x59,0x20,0x40,0x7b,0xab,0x70,0x4c,0xda,0x01,0x20,0x60,
+0x00,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa1,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa4,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa7,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa2,
 0x00,0x00,0x78,0x34,0x7c,0x00,0x18,0xc0,0x8c,0x02,0xef,0xe2,0x00,0x06,0xc0,0x14,
-0x06,0x3f,0x20,0x20,0x06,0x24,0x18,0x00,0x72,0x07,0x60,0xc4,0x4c,0xaf,0x6f,0xe4,
-0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x06,0xe3,0x1a,0x20,0xa2,0x02,0x1a,0x22,
-0x0c,0x00,0x20,0x40,0x06,0xf3,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x4c,0xaf,0x18,0x42,
-0x22,0x00,0x1f,0x22,0x04,0x00,0x18,0x46,0x04,0x07,0x20,0x40,0x06,0x38,0xd8,0x40,
-0x4c,0xa6,0x98,0x40,0x84,0x00,0x1a,0x22,0x7e,0x00,0xe7,0xe2,0x00,0x02,0xc2,0x00,
-0x06,0x26,0x20,0x20,0x05,0xc8,0x58,0x00,0x4c,0x9f,0x98,0x40,0x84,0x00,0xef,0xe2,
+0x06,0x7b,0x20,0x20,0x06,0x60,0x18,0x00,0x72,0x07,0x60,0xc4,0x4c,0xb5,0x6f,0xe4,
+0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0x20,0x40,0x07,0x1f,0x1a,0x20,0xa2,0x02,0x1a,0x22,
+0x0c,0x00,0x20,0x40,0x07,0x2f,0x18,0xc2,0x7e,0x00,0x67,0xe4,0x4c,0xb5,0x18,0x42,
+0x22,0x00,0x1f,0x22,0x04,0x00,0x18,0x46,0x04,0x07,0x20,0x40,0x06,0x74,0xd8,0x40,
+0x4c,0xac,0x98,0x40,0x84,0x00,0x1a,0x22,0x7e,0x00,0xe7,0xe2,0x00,0x02,0xc2,0x00,
+0x06,0x62,0x20,0x20,0x06,0x04,0x58,0x00,0x4c,0xa5,0x98,0x40,0x84,0x00,0xef,0xe2,
 0x00,0x02,0x20,0x60,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0x11,0x00,0x00,0x20,0x20,
-0x06,0x3c,0x18,0x00,0x72,0x07,0x20,0x40,0x06,0x3c,0x60,0xc4,0x4c,0xaf,0x20,0x40,
-0x06,0x4e,0x20,0x36,0x06,0x4b,0x20,0x40,0x06,0x6c,0x20,0x36,0x06,0x4b,0x20,0x40,
-0x06,0x98,0x20,0x36,0x06,0x4b,0x20,0x40,0x06,0x8a,0x20,0x36,0x06,0x4b,0x20,0x40,
-0x06,0x5c,0x20,0x40,0x06,0x3c,0xc2,0x00,0x06,0x40,0x20,0x60,0x00,0x00,0x78,0x56,
-0x7c,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,
+0x06,0x78,0x18,0x00,0x72,0x07,0x20,0x40,0x06,0x78,0x60,0xc4,0x4c,0xb5,0x20,0x40,
+0x06,0x8a,0x20,0x36,0x06,0x87,0x20,0x40,0x06,0xa8,0x20,0x36,0x06,0x87,0x20,0x40,
+0x06,0xd4,0x20,0x36,0x06,0x87,0x20,0x40,0x06,0xc6,0x20,0x36,0x06,0x87,0x20,0x40,
+0x06,0x98,0x20,0x40,0x06,0x78,0xc2,0x00,0x06,0x7c,0x20,0x60,0x00,0x00,0x78,0x56,
+0x7c,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb2,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,
 0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xbb,0x00,0x00,0x78,0x36,0x7c,0x00,0x18,0x00,
-0x22,0x00,0x20,0x20,0x06,0x83,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,
+0x22,0x00,0x20,0x20,0x06,0xbf,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,
 0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb1,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb0,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xba,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xba,
 0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb1,0x80,0x00,0x78,0x36,0x7c,0x00,0x18,0x00,
-0x22,0x06,0x20,0x20,0x06,0x83,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,
+0x22,0x06,0x20,0x20,0x06,0xbf,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,
 0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb1,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb0,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb6,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb6,
-0x00,0x00,0xef,0xe2,0x00,0x06,0x78,0x36,0x7c,0x00,0xc0,0x34,0x06,0x82,0xc0,0x11,
-0x06,0x7f,0xc0,0x39,0x86,0x7d,0x20,0x60,0x00,0x00,0x18,0x00,0x22,0x02,0x20,0x20,
-0x06,0x83,0x18,0xc0,0x8d,0xff,0x18,0x00,0x22,0x01,0x20,0x20,0x06,0x83,0x18,0x00,
-0x22,0x03,0x1f,0x22,0x7e,0x00,0x1f,0xe6,0x7e,0x07,0xd8,0x40,0x4c,0x9f,0x98,0x40,
+0x00,0x00,0xef,0xe2,0x00,0x06,0x78,0x36,0x7c,0x00,0xc0,0x34,0x06,0xbe,0xc0,0x11,
+0x06,0xbb,0xc0,0x39,0x86,0xb9,0x20,0x60,0x00,0x00,0x18,0x00,0x22,0x02,0x20,0x20,
+0x06,0xbf,0x18,0xc0,0x8d,0xff,0x18,0x00,0x22,0x01,0x20,0x20,0x06,0xbf,0x18,0x00,
+0x22,0x03,0x1f,0x22,0x7e,0x00,0x1f,0xe6,0x7e,0x07,0xd8,0x40,0x4c,0xa5,0x98,0x40,
 0x84,0x00,0x1a,0x22,0x7e,0x00,0xe7,0xe2,0x00,0x02,0x20,0x60,0x00,0x00,0x78,0x56,
-0x7c,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,
+0x7c,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,
 0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb7,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb0,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb6,0x80,0x00,0x78,0x36,0x7c,0x00,0x18,0x00,
-0x22,0x05,0x20,0x20,0x06,0x83,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xaf,0x1f,0xe2,
+0x22,0x05,0x20,0x20,0x06,0xbf,0x78,0x56,0x7c,0x00,0x6f,0xe4,0x4c,0xb5,0x1f,0xe2,
 0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb9,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb4,
 0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb3,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xb7,
-0x00,0x00,0x78,0x36,0x7c,0x00,0x18,0x00,0x22,0x04,0x20,0x20,0x06,0x83,0x6f,0xe4,
-0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
+0x00,0x00,0x78,0x36,0x7c,0x00,0x18,0x00,0x22,0x04,0x20,0x20,0x06,0xbf,0x6f,0xe4,
+0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa1,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa9,0x00,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa9,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa3,0x00,0x00,0x78,0x34,
-0x7c,0x00,0x20,0x40,0x06,0xe3,0x60,0x44,0x4c,0x9d,0x20,0x60,0x00,0x00,0x6f,0xe4,
-0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
+0x7c,0x00,0x20,0x40,0x07,0x1f,0x60,0x44,0x4c,0xa3,0x20,0x60,0x00,0x00,0x6f,0xe4,
+0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa1,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa4,0x00,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa6,0x00,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa2,0x00,0x00,0x78,0x34,
-0x7c,0x00,0x20,0x60,0x00,0x00,0xef,0xe2,0x00,0x06,0xc0,0x91,0x06,0xc4,0x18,0x00,
-0x22,0x00,0x18,0x00,0x24,0x30,0xd8,0xa0,0x4c,0xd6,0xef,0xe2,0x00,0x06,0xc0,0x11,
-0x06,0xcf,0x1a,0x20,0xa2,0x01,0x9a,0x46,0x7e,0x00,0xe7,0xe2,0x00,0x05,0x20,0x20,
-0x06,0xc9,0x1a,0x22,0x7e,0x00,0x67,0xe2,0x4c,0xd5,0x20,0x60,0x00,0x00,0x6f,0xe4,
-0x4c,0xaf,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
+0x7c,0x00,0x20,0x60,0x00,0x00,0xef,0xe2,0x00,0x06,0xc0,0x91,0x07,0x00,0x18,0x00,
+0x22,0x00,0x18,0x00,0x24,0x30,0xd8,0xa0,0x4c,0xdc,0xef,0xe2,0x00,0x06,0xc0,0x11,
+0x07,0x0b,0x1a,0x20,0xa2,0x01,0x9a,0x46,0x7e,0x00,0xe7,0xe2,0x00,0x05,0x20,0x20,
+0x07,0x05,0x1a,0x22,0x7e,0x00,0x67,0xe2,0x4c,0xdb,0x20,0x60,0x00,0x00,0x6f,0xe4,
+0x4c,0xb5,0x1f,0xe2,0x0c,0x00,0xef,0xe2,0x00,0x06,0xc1,0x95,0x80,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa1,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa6,0x00,0x00,0xef,0xe2,
 0x00,0x06,0xc1,0xa1,0x80,0x00,0xef,0xe2,0x00,0x06,0xc1,0xa1,0x80,0x00,0x78,0x34,
-0x7c,0x00,0x20,0x40,0x06,0xc4,0x6f,0xe2,0x4c,0xd4,0xc1,0x80,0x00,0x00,0x20,0x20,
-0x06,0x0f,0x20,0x40,0x06,0xf3,0x18,0xc0,0x8d,0xfe,0x18,0xc2,0x22,0x00,0x18,0x00,
+0x7c,0x00,0x20,0x40,0x07,0x00,0x6f,0xe2,0x4c,0xda,0xc1,0x80,0x00,0x00,0x20,0x20,
+0x06,0x4b,0x20,0x40,0x07,0x2f,0x18,0xc0,0x8d,0xfe,0x18,0xc2,0x22,0x00,0x18,0x00,
 0x24,0x01,0x18,0x00,0x04,0x00,0xef,0xe2,0x00,0x11,0x1a,0x20,0xa3,0xff,0xc1,0x1e,
-0x80,0x00,0xc1,0x1d,0x00,0x00,0xc1,0x16,0x00,0x00,0xc0,0x10,0x06,0xe8,0x1f,0xe0,
+0x80,0x00,0xc1,0x1d,0x00,0x00,0xc1,0x16,0x00,0x00,0xc0,0x10,0x07,0x24,0x1f,0xe0,
 0xff,0xd0,0x9a,0x4f,0xfe,0x00,0x98,0x40,0x84,0x00,0x1a,0x4f,0xa4,0x0a,0x20,0x20,
-0x06,0xe8,0xef,0xe2,0x00,0x06,0xc1,0x06,0x80,0x00,0xc1,0x16,0x00,0x00,0x20,0x20,
-0x06,0xf3,0x20,0x40,0x69,0x33,0x20,0x20,0x6a,0xe9,0x6f,0xe2,0x45,0x3a,0x20,0x7a,
+0x07,0x24,0xef,0xe2,0x00,0x06,0xc1,0x06,0x80,0x00,0xc1,0x16,0x00,0x00,0x20,0x20,
+0x07,0x2f,0x20,0x40,0x69,0x33,0x20,0x20,0x6a,0xe9,0x6f,0xe2,0x45,0x3a,0x20,0x7a,
 0x00,0x00,0x1f,0xe0,0xff,0xff,0x67,0xe2,0x45,0x3a,0x6f,0xe2,0x45,0x37,0x67,0xe2,
 0x05,0x0b,0x58,0x00,0x00,0xef,0x67,0xe2,0x05,0x0a,0x20,0x40,0x69,0x33,0x6f,0xe4,
-0x46,0x6a,0x1f,0xe0,0xfe,0x04,0x1f,0xe2,0x22,0x00,0x20,0x40,0x07,0x1a,0x6f,0xe2,
+0x46,0x6a,0x1f,0xe0,0xfe,0x04,0x1f,0xe2,0x22,0x00,0x20,0x40,0x07,0x56,0x6f,0xe2,
 0x05,0x09,0xe7,0xe2,0x00,0x05,0x6f,0xe2,0x05,0x0a,0xe7,0xe2,0x00,0x05,0x20,0x40,
-0x07,0x15,0x6f,0xe4,0x46,0x6a,0x1f,0xe2,0x72,0x00,0x6f,0xe4,0x4c,0xb1,0x1f,0xe2,
+0x07,0x51,0x6f,0xe4,0x46,0x6a,0x1f,0xe2,0x72,0x00,0x6f,0xe4,0x4c,0xb7,0x1f,0xe2,
 0x0c,0x00,0x20,0x40,0x7c,0xdc,0x6f,0xe2,0x05,0x0b,0xe7,0xe2,0x00,0x05,0x58,0x00,
 0x00,0x00,0x67,0xe4,0x46,0x6a,0x20,0x60,0x00,0x00,0x6f,0xe4,0x46,0x6a,0x1f,0xe3,
 0xfe,0x00,0x79,0x20,0x7e,0x00,0xe7,0xe2,0x00,0x05,0x20,0x60,0x00,0x00,0x20,0x40,
 0x56,0xac,0x20,0x40,0x56,0xba,0x1a,0x22,0x7e,0x00,0xe7,0xe4,0x00,0x05,0x6f,0xe4,
 0x42,0x1c,0xe7,0xe4,0x00,0x05,0x20,0x60,0x00,0x00,0x18,0xc2,0x04,0x00,0xdf,0x20,
 0x00,0x04,0xd8,0xa0,0x05,0x26,0x20,0x40,0x7c,0xa1,0x18,0x42,0x0c,0x00,0x1a,0x42,
-0x7e,0x00,0xc0,0x01,0x87,0x2a,0xc0,0x02,0x87,0x34,0x20,0x20,0x6c,0xe3,0xef,0xe4,
-0x00,0x06,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0xc0,0x80,0xca,0x8b,0xef,0xe8,
+0x7e,0x00,0xc0,0x01,0x87,0x66,0xc0,0x02,0x87,0x70,0x20,0x20,0x6c,0xe3,0xef,0xe4,
+0x00,0x06,0xef,0xe4,0x00,0x06,0x1f,0xf0,0xfe,0x00,0xc0,0x80,0xcd,0x64,0xef,0xe8,
 0x00,0x06,0x67,0xe8,0x05,0x20,0x6f,0xe2,0x42,0x22,0x79,0x20,0x7e,0x06,0x67,0xe2,
 0x42,0x22,0x20,0x60,0x00,0x00,0x6f,0xe2,0x42,0x22,0x79,0x20,0x7e,0x07,0x67,0xe2,
 0x42,0x22,0x18,0x42,0x0c,0x00,0xef,0xe4,0x00,0x06,0x20,0x40,0x6f,0xc1,0x67,0xe2,
 0x45,0x36,0x20,0x60,0x00,0x00,0x6f,0xe2,0x02,0x83,0x20,0x7a,0x00,0x00,0xc0,0x02,
-0x07,0x44,0xc0,0x1e,0x87,0x48,0xc0,0x1f,0x07,0x4d,0xc0,0x1f,0x87,0x53,0xc0,0x20,
-0x07,0x56,0x20,0x20,0x6b,0xbd,0x6f,0xe2,0x42,0x22,0xc1,0x9f,0x80,0x00,0x70,0x02,
+0x07,0x80,0xc0,0x1e,0x87,0x84,0xc0,0x1f,0x07,0x89,0xc0,0x1f,0x87,0x8f,0xc0,0x20,
+0x07,0x92,0x20,0x20,0x6b,0xbd,0x6f,0xe2,0x42,0x22,0xc1,0x9f,0x80,0x00,0x70,0x02,
 0x83,0x3d,0x20,0x20,0x6b,0xba,0x70,0x02,0x83,0x3e,0xda,0x20,0x00,0x0d,0x58,0x00,
-0x1f,0x11,0x67,0xe4,0x05,0x4b,0x20,0x20,0x07,0x5a,0x6f,0xe2,0x42,0x22,0xc4,0x03,
+0x1f,0x11,0x67,0xe4,0x05,0x4b,0x20,0x20,0x07,0x96,0x6f,0xe2,0x42,0x22,0xc4,0x03,
 0x00,0x00,0x6f,0xe8,0x05,0x20,0x20,0x3a,0x4d,0x64,0x70,0x02,0x83,0x3f,0x20,0x20,
-0x6b,0xba,0x70,0x02,0x83,0x40,0xda,0x20,0x00,0x13,0x20,0x20,0x07,0x6f,0x6f,0xe2,
+0x6b,0xba,0x70,0x02,0x83,0x40,0xda,0x20,0x00,0x13,0x20,0x20,0x07,0xab,0x6f,0xe2,
 0x42,0x22,0xc4,0x03,0x80,0x00,0x70,0x02,0x83,0x3b,0x20,0x20,0x6c,0x3a,0x20,0x40,
-0x07,0x88,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x6f,0xe4,0x05,0x1a,0x1f,0xf0,
+0x07,0xc4,0x58,0x00,0x00,0x02,0xe7,0xe2,0x00,0x05,0x6f,0xe4,0x05,0x1a,0x1f,0xf0,
 0xfe,0x00,0xe7,0xe4,0x00,0x05,0x1a,0x20,0xa3,0xfb,0x1a,0x30,0xa2,0x00,0x1a,0x22,
 0x7e,0x00,0xe7,0xe4,0x00,0x05,0x58,0x00,0x03,0x35,0xe7,0xe4,0x00,0x05,0x58,0x00,
 0x00,0x19,0xe7,0xe2,0x00,0x05,0x6f,0xe4,0x05,0x4b,0xe7,0xe4,0x00,0x05,0x58,0x00,
 0x00,0x08,0xe7,0xe4,0x00,0x05,0x58,0x00,0x00,0x00,0xe7,0xe2,0x00,0x05,0x20,0x60,
-0x00,0x00,0x20,0x40,0x07,0x88,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xe4,
+0x00,0x00,0x20,0x40,0x07,0xc4,0x58,0x00,0x00,0x04,0xe7,0xe2,0x00,0x05,0x6f,0xe4,
 0x05,0x1a,0x1f,0xf0,0xfe,0x00,0xe7,0xe4,0x00,0x05,0x1a,0x20,0xa3,0xfb,0x1a,0x30,
 0xa2,0x00,0x1a,0x22,0x7e,0x00,0xe7,0xe4,0x00,0x05,0x6f,0xe8,0x05,0x20,0xe7,0xe8,
 0x00,0x05,0x58,0x00,0x2c,0x01,0xe7,0xe4,0x00,0x05,0x58,0x00,0x05,0x35,0xe7,0xe4,
@@ -487,19 +502,17 @@
 0x00,0x00,0x20,0x40,0x40,0x59,0x70,0x00,0x8e,0x07,0x20,0x60,0x00,0x00,0x58,0x00,
 0x00,0x00,0x67,0xe8,0x00,0xf0,0x20,0x20,0x40,0xed,0x2c,0x20,0x06,0x03,0x24,0x60,
 0x80,0x00,0x6f,0xe2,0x00,0x8e,0x1f,0xe0,0xff,0xff,0x67,0xe2,0x00,0x8e,0x20,0x61,
-0x00,0x00,0x70,0x00,0x8e,0x07,0x20,0x20,0x41,0x1c,0x68,0x44,0x40,0xb7,0x18,0x00,
-0x0e,0x28,0x20,0x40,0x47,0x18,0x20,0x34,0x41,0x10,0x20,0x20,0x40,0xec,0x20,0x40,
-0x66,0x9e,0x24,0x7a,0x00,0x00,0x6f,0xe2,0x00,0x55,0x20,0x7a,0x00,0x00,0xc0,0x0d,
-0x07,0xac,0x20,0x20,0x67,0x02,0x6f,0xe2,0x04,0xcd,0xc4,0x01,0x00,0x00,0xc4,0x01,
-0x80,0x00,0x70,0x00,0x55,0x00,0x20,0x40,0x67,0x22,0x6f,0xe2,0x42,0x22,0xc2,0x80,
-0x07,0xb7,0xc2,0x80,0x87,0xb7,0x6f,0xe2,0x43,0x36,0xc0,0x28,0x07,0xb7,0x20,0x20,
-0x6b,0xae,0x70,0x4c,0xf0,0x01,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x50,0x1a,0x22,
-0x04,0x00,0x98,0x46,0x7c,0x00,0x20,0x22,0x87,0xbe,0x20,0x20,0x55,0xcb,0x20,0x40,
-0x55,0xd4,0x6f,0xe2,0x4c,0xf0,0x20,0x7a,0x00,0x00,0x70,0x4c,0xf0,0x00,0x6f,0xe2,
-0x4c,0xfa,0x1f,0xe0,0xfe,0x01,0x67,0xe2,0x4c,0xfa,0x20,0x20,0x6b,0xae,0xe2,0x3a,
-0xaa,0x55,0x40,0x00,0x00,0x40,0xa3,0x00,0x8a,0x00,0x40,0x51,0x10,0x08,0x00,0x00,
-0x00,0x00,0x00,0x80,0x00,0x00,0x20,0x02,0x10,0x00,0xcc,0x18,0x10,0x99,0x00,0x00,
-0x00,0x02,0x00,0x08,0x00,0x00,0xe8,0x09,0x18,0xd0,0x02,0x00,0x05,0x6c,0x12,0x02,
+0x00,0x00,0x70,0x00,0x8e,0x07,0x20,0x20,0x41,0x1c,0x20,0x40,0x66,0x9e,0x24,0x7a,
+0x00,0x00,0x6f,0xe2,0x00,0x55,0x20,0x7a,0x00,0x00,0xc0,0x0d,0x07,0xe3,0x20,0x20,
+0x67,0x02,0x6f,0xe2,0x04,0xcd,0xc4,0x01,0x00,0x00,0xc4,0x01,0x80,0x00,0x70,0x00,
+0x55,0x00,0x20,0x40,0x67,0x22,0x6f,0xe2,0x42,0x22,0xc2,0x80,0x07,0xee,0xc2,0x80,
+0x87,0xee,0x6f,0xe2,0x43,0x36,0xc0,0x28,0x07,0xee,0x20,0x20,0x6b,0xae,0x70,0x4c,
+0xf6,0x01,0x20,0x60,0x00,0x00,0x58,0x00,0x00,0x50,0x1a,0x22,0x04,0x00,0x98,0x46,
+0x7c,0x00,0x20,0x22,0x87,0xf5,0x20,0x20,0x55,0xcb,0x20,0x40,0x55,0xd4,0x6f,0xe2,
+0x4c,0xf6,0x20,0x7a,0x00,0x00,0x70,0x4c,0xf6,0x00,0x20,0x20,0x6b,0xae,0xc8,0x99,
+0xaa,0x55,0x40,0x00,0x00,0x40,0xa3,0x00,0x88,0x00,0x40,0x41,0x10,0x00,0x00,0x00,
+0x00,0x00,0x00,0x80,0x00,0x00,0x20,0x02,0x10,0x00,0xcc,0x18,0x00,0x99,0x00,0x00,
+0x00,0x02,0x00,0x08,0x00,0x00,0xe8,0x09,0x18,0xd0,0x04,0x00,0x05,0x6c,0x12,0x02,
 0x36,0x01,0x08,0x04,0x00,0x04,0x00,0x20,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
 0x00,0x00,0x00,0x00,0x00,0x00,0xaa,0x55,0x01,0x00,0x06,0x42,0x17,0xaa,0x55,0x01,
 0x00,0x93,0x40,0x00,0xaa,0x55,0x01,0x00,0x6d,0x46,0x28,0xaa,0x55,0x04,0x00,0x3d,
@@ -522,13 +535,13 @@
 0x01,0x00,0x02,0x09,0x00,0x01,0x35,0x03,0x19,0x12,0x00,0x09,0x02,0x00,0x09,0x01,
 0x03,0x09,0x02,0x01,0x09,0x0e,0x05,0x09,0x02,0x02,0x09,0x12,0x34,0x09,0x02,0x03,
 0x09,0x01,0x01,0x09,0x02,0x04,0x28,0x01,0x09,0x02,0x05,0x09,0x00,0x01,0xaa,0x55,
-0x01,0x00,0xd1,0x4c,0x34,0xaa,0x55,0x01,0x00,0x6e,0x46,0x05,0xaa,0x55,0x04,0x00,
-0x75,0x46,0x2d,0x00,0x2f,0x00,0xaa,0x55,0x07,0x00,0x25,0x44,0x02,0x03,0x00,0x05,
-0x10,0x02,0x03,0xaa,0x55,0x08,0x00,0x68,0x44,0x08,0x00,0x10,0x00,0x00,0x00,0x2c,
-0x01,0xaa,0x55,0x02,0x00,0xcc,0x44,0x31,0x00,0xaa,0x55,0x01,0x00,0x78,0x44,0xf0,
-0xaa,0x55,0x01,0x00,0x7a,0x44,0x17,0xaa,0x55,0x01,0x00,0x90,0x44,0x00,0xaa,0x55,
-0x01,0x00,0x5f,0x44,0x07,0xaa,0x55,0x01,0x00,0x98,0x44,0x00,0xaa,0x55,0x01,0x00,
-0x40,0x43,0x00,0xaa,0x55,0x02,0x00,0x54,0x44,0x40,0x00,0xaa,0x55,0x06,0x00,0x72,
+0x01,0x00,0xd7,0x4c,0x34,0xaa,0x55,0x01,0x00,0x6e,0x46,0x05,0xaa,0x55,0x04,0x00,
+0x75,0x46,0x2d,0x00,0x2f,0x00,0xaa,0x55,0x08,0x00,0x68,0x44,0x08,0x00,0x10,0x00,
+0x00,0x00,0x2c,0x01,0xaa,0x55,0x01,0x00,0x78,0x44,0xf0,0xaa,0x55,0x01,0x00,0x7a,
+0x44,0x17,0xaa,0x55,0x01,0x00,0x98,0x44,0x00,0xaa,0x55,0x07,0x00,0x25,0x44,0x02,
+0x03,0x00,0x05,0x10,0x02,0x03,0xaa,0x55,0x01,0x00,0x90,0x44,0x00,0xaa,0x55,0x02,
+0x00,0xcc,0x44,0x00,0x00,0xaa,0x55,0x01,0x00,0x40,0x43,0x00,0xaa,0x55,0x02,0x00,
+0x54,0x44,0x40,0x00,0xaa,0x55,0x01,0x00,0x5f,0x44,0x07,0xaa,0x55,0x06,0x00,0x72,
 0x44,0x21,0x22,0x01,0x33,0x02,0x3a,0xaa,0x55,0x0e,0x00,0x81,0x43,0x0d,0x33,0x31,
 0x32,0x31,0x20,0x62,0x6c,0x65,0x20,0x64,0x65,0x6d,0x6f,0xaa,0x55,0x04,0x00,0x41,
 0x43,0x1f,0x02,0x01,0x02,0xaa,0x55,0x10,0x00,0x61,0x43,0x1f,0x0e,0x09,0x33,0x31,
@@ -545,10 +558,10 @@
 0x55,0x02,0x00,0xbd,0x40,0x02,0x24,0xaa,0x55,0x08,0x00,0xad,0x40,0x40,0x00,0x00,
 0x02,0x32,0x00,0x00,0x02,0xaa,0x55,0x02,0x00,0xbb,0x40,0x20,0x00,0xaa,0x55,0x02,
 0x00,0xb7,0x40,0x20,0x00,0xaa,0x55,0x02,0x00,0xb5,0x40,0x00,0x00,0xaa,0x55,0x02,
-0x00,0xb9,0x40,0x00,0x20,0xaa,0x55,0x04,0x00,0xbf,0x40,0x80,0x04,0x00,0x10,0xaa,
+0x00,0xb9,0x40,0x80,0x0c,0xaa,0x55,0x04,0x00,0xbf,0x40,0x80,0x04,0x00,0x10,0xaa,
 0x55,0x01,0x00,0xef,0x00,0x01,0xaa,0x55,0x05,0x00,0xe2,0x44,0x08,0x0e,0x05,0x04,
 0x00,0xaa,0x55,0x02,0x00,0x02,0x42,0x30,0x1f,0xaa,0x55,0x01,0x00,0x10,0x42,0x20,
 0xaa,0x55,0x01,0x00,0xe0,0x41,0x01,0xaa,0x55,0x0f,0x00,0xde,0x4b,0x4b,0xba,0x55,
 0xd0,0x56,0xe0,0x57,0x88,0x58,0x6c,0x59,0x10,0x07,0xff,0xff,0xaa,0x55,0x02,0x00,
-0xc3,0x40,0xde,0x4b,0x55,0xaa,0xaa,0x55,0x86,0xb3,0xff,0xb2
+0xc3,0x40,0xde,0x4b,0x55,0xaa,0xaa,0x55,0x9f,0xb3,0x8f,0x86
 };
Index: user/bt_config.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/bt_config.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/bt_config.h	(working copy)
@@ -0,0 +1,111 @@
+/*
+File Name    : yc3121.h
+Author       : Yichip
+Version      : V1.0
+Date         : 2022/05/23
+Description  : BT information.
+*/
+
+#ifndef __BT_CONFIG_H_
+#define __BT_CONFIG_H_
+#include "type.h"
+
+/**************************蓝牙使能***************************/
+#define DEVICE_BLE_ENABLE         0x01
+#define DEVICE_BT_ENABLE          0x02
+#define BLE_HID_SERVICE_ENABLE    0x04
+#define BLE_USER_SERVICE_ENABLE   0x08
+#define FUNC_DEVICE_BT            (DEVICE_BLE_ENABLE | BLE_USER_SERVICE_ENABLE | BLE_HID_SERVICE_ENABLE)
+
+
+/**************************蓝牙设备类型***************************/
+static const uint8_t bt_cod_const[3] = {0x24,0x04,0x04};
+
+/**************************蓝牙MTU***************************/
+#define BLE_LOCAL_MTU 185
+
+/**************************蓝牙设备名***************************/
+#define BLE_DEVICE_NAME    "3xble"
+#define BT_DEVICE_NAME     "3xbt"
+static const uint8_t ble_device_name_const[6] = BLE_DEVICE_NAME;
+static const uint8_t bt_device_name_const[5] =  BT_DEVICE_NAME;
+
+/**************************蓝牙Mac地址***************************/
+static const uint8_t ble_device_mac_const[6] = {0x11,0x11,0x11,0x44,0x22,0x10};   //0x102244000000
+static const uint8_t bt_device_mac_const[6] =  {0x22,0x22,0x22,0x33,0x22,0x10};   //0x102233000000
+
+/**************************蓝牙PINCODE***************************/
+#define BLE_RANDOM_PINCODE_VALUE     0x00
+#define BLE_FIXED_PINCODE_VALUE      0x01
+static const int ble_pincode_const = {123456};
+
+/**************************蓝牙连接参数***************************/
+static const uint8_t ble_conn_param_const[8] = 
+{
+    0x06, 0x00,         //minimum connection interval. unit: 1.25ms
+    0x0c, 0x00,         //maximum connection interval, in normal case can be set same as min_intv. unit: 1.25ms
+    0x00, 0x00,         //slave latency, number of connection events that slave would like to skip.
+    0x2c, 0x01          //timeout before connection is dropped. unit: 10ms
+};
+
+static const uint8_t ble_ota_conn_param_const[8] = 
+{
+    0x06, 0x00,         //minimum connection interval. unit: 1.25ms
+    0x06, 0x00,         //maximum connection interval, in normal case can be set same as min_intv. unit: 1.25ms
+    0x2b, 0x01,         //slave latency, number of connection events that slave would like to skip.
+    0xb0, 0x04          //timeout before connection is dropped. unit: 10ms
+};
+
+/**************************ADV数据包***************************/
+#define BLE_ADV_DATA_LEN_MAX    31
+#define BLE_SCAN_RSP_LEN_MAX    31
+
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+
+#define BLE_ADV_DATA_INDEX    13
+#define BLE_SCAN_RSP_INDEX    13
+
+#else
+
+#define BLE_ADV_DATA_INDEX    3
+#define BLE_SCAN_RSP_INDEX    3
+
+#endif
+
+static const uint8_t ble_adv_data_const[BLE_ADV_DATA_LEN_MAX] =
+{
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+    0x02, 0x01, 0x06,       //flag
+    0x03, 0x19, 0xc2, 0x03,   //appearance
+    0x05, 0x02, 0x12, 0x18, 0xF0, 0xFF,  //service uuid
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#else
+    0x02, 0x01, 0x06,       //flag
+    0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+};
+
+/**************************扫描响应包***************************/
+static const uint8_t ble_scan_rsp_const[BLE_SCAN_RSP_LEN_MAX] =
+{
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+    0x02, 0x01, 0x06,       //flag
+    0x03, 0x19, 0xc2, 0x03,   //appearance
+    0x05, 0x02, 0x12, 0x18, 0xF0, 0xFF,  //service uuid
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#else
+    0x02, 0x01, 0x06,       //flag
+    0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+#endif
+};
+
+
+#endif
Index: user/eeprom_config.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/eeprom_config.h	(nonexistent)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/eeprom_config.h	(working copy)
@@ -0,0 +1,56 @@
+/*
+File Name    : yc3121.h
+Author       : Yichip
+Version      : V1.0
+Date         : 2022/05/23
+Description  : BT information.
+*/
+
+#ifndef __EEPROM_CONFIG_H__
+#define __EEPROM_CONFIG_H__
+
+#include "type.h"
+
+/**************************配置eeprom存储地址***************************/
+
+#define EEPROM_INFO_BACK_OFFSET             0x30000
+
+#define EEPROM_BLE_BOND_INFO_ADDR           (0x1000000 + ((512 - 4) * 1024) - EEPROM_INFO_BACK_OFFSET)
+#define EEPROM_BLE_BOND_INFO_BACK_ADDR      (0x1000000 + ((512 - 4) * 1024))  //4k
+#define EEPROM_BLE_BOND_INFO_END_ADDR       (EEPROM_BLE_BOND_INFO_ADDR + 255)  //4k
+
+#define EEPROM_BT_BOND_INFO_ADDR            (0x1000000 + ((512 - 8) * 1024) - EEPROM_INFO_BACK_OFFSET)
+#define EEPROM_BT_BOND_INFO_BACK_ADDR       (0x1000000 + ((512 - 8) * 1024))
+#define EEPROM_BT_BOND_INFO_END_ADDR        (EEPROM_BT_BOND_INFO_ADDR + 255)  //4k
+
+#define EEPROM_USER_CONFIG_X2_ADDR          (0x1000000 + ((512 - 12) * 1024) - EEPROM_INFO_BACK_OFFSET)
+#define EEPROM_USER_CONFIG_X2_BACK_ADDR     (0x1000000 + ((512 - 12) * 1024))
+#define EEPROM_USER_CONFIG_X2_END_ADDR      (0x1000000 + ((512 - 8) * 1024) - 1)  //4k
+
+#define EEPROM_USER_CONFIG_X1_ADDR          (0x1000000 + ((512 - 16) * 1024) - EEPROM_INFO_BACK_OFFSET)
+#define EEPROM_USER_CONFIG_X1_BACK_ADDR     (0x1000000 + ((512 - 16) * 1024))
+#define EEPROM_USER_CONFIG_X1_END_ADDR      (0x1000000 + ((512 - 12) * 1024) - 1)  //4k
+
+#define EEPROM_USER_CONFIG_X0_ADDR          (0x1000000 + ((512 - 20) * 1024) - EEPROM_INFO_BACK_OFFSET)
+#define EEPROM_USER_CONFIG_X0_BACK_ADDR     (0x1000000 + ((512 - 20) * 1024))
+#define EEPROM_USER_CONFIG_X0_END_ADDR      (0x1000000 + ((512 - 16) * 1024) - 1)  //4k
+
+
+#define STORE_DATA_NUM 5 //需要存储的数据种类个数
+
+typedef enum
+{
+    Configure_x0 = 0,
+    Configure_x1,
+    Configure_x2,
+    s_bt_bond_info,
+    s_ble_bond_info,
+}STORE_TYPE_e; //存储数据类型枚举
+
+
+static const uint32_t init_address[STORE_DATA_NUM] = {EEPROM_USER_CONFIG_X0_ADDR, EEPROM_USER_CONFIG_X1_ADDR, EEPROM_USER_CONFIG_X2_ADDR,EEPROM_BT_BOND_INFO_ADDR,EEPROM_BLE_BOND_INFO_ADDR}; //各信息存储初始地址
+static uint32_t write_address[STORE_DATA_NUM] = {EEPROM_USER_CONFIG_X0_ADDR, EEPROM_USER_CONFIG_X1_ADDR, EEPROM_USER_CONFIG_X2_ADDR,EEPROM_BT_BOND_INFO_ADDR,EEPROM_BLE_BOND_INFO_ADDR};         //当前写地址，初始与各信息存储初始地址相同
+static const uint32_t end_address[STORE_DATA_NUM] = {EEPROM_USER_CONFIG_X0_END_ADDR, EEPROM_USER_CONFIG_X1_END_ADDR, EEPROM_USER_CONFIG_X2_END_ADDR,EEPROM_BT_BOND_INFO_END_ADDR,EEPROM_BLE_BOND_INFO_END_ADDR};     //各信息存储结束地址
+
+
+#endif
Index: user/main.h
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/main.h	(revision 920)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/main.h	(working copy)
@@ -1,55 +1,4 @@
 #ifndef __YC_MAIN_H__
 #define __YC_MAIN_H__
 
-#include "type.h"
-
-#define BT_NUM 5 // ͨ
-#define BTADDR_LEN 6
-#define LINK_KEY_LEN 16
-
-#define NVRAM_INV 0xFF
-#define NVRAM_DNO 0xDADADADA
-
-#define IFLASH_NVRAM_ADDR           (0x1000000 + ((512 - 4) * 1024))
-#define IFLASH_USER_INFO_ADDR       (0x1000000 + ((512 - 8) * 1024))
-#define USER_INFO_PAGA              (4*1024) //4k
-
-/**
- * @brief Ϣ
- * 
- */
-typedef struct
-{
-  uint8_t btaddr[BTADDR_LEN];
-  uint8_t hostbtaddr[BTADDR_LEN];
-  uint8_t link_key[LINK_KEY_LEN];
-} bt_bond_info_t;
-
-/**
- * @brief BT nvram data typedef
- * 
- */
-typedef struct
-{
-  bt_bond_info_t bt_bond_info[BT_NUM];
-  uint32_t nvflag;
-  uint32_t nvid;
-  uint32_t inv_flag;
-} nvram_t;
-
-
-typedef struct
-{
-    uint8_t bt_index;
-} user_info_t;
-
-
-
-
-
-
-
-
-
-
 #endif
Index: user/main.c
===================================================================
--- /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/main.c	(revision 920)
+++ /YC3121_demo/ModuleDemo/BlueTooth/BT_HFP_BLE_DEMO/user/main.c	(working copy)
@@ -30,55 +30,26 @@
 #include "yc_qspi.h"
 #include "yc_ipc.h"
 #include "board_config.h"
-#include "main.h"
+#include "app_util.h"
+#include "bt_config.h"
+#include "app_bt_protocol.h"
+#include "app_ble_protocol.h"
 #include "app_ble_gatt.h"
 
+#include "eeprom_config.h"
+#include "app_eeprom_user_info.h"
+#include "app_eeprom_bt_bond_info.h"
+#include "app_eeprom_ble_bond_info.h"
+
 
 /* Private typedef -----------------------------------------------------------*/
 /* Private define ------------------------------------------------------------*/
 #define IPC_UART UART0
 #define UART_TO_IPC_BAUDRATE	921600
 //#define UART_TO_IPC
-
 /* Private macro -------------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
-/* Private function prototypes -----------------------------------------------*/
-void UART_Configuration(void);
-
-
-nvram_t nvram_data;
-
-user_info_t user_info;
-
-#define BLE_CMD_NOTIFY_HANDLE       user_ble_notify_handle
-#define BLE_CMD_WRITE_REQ_HANDLE    user_ble_receive_handle
-#define BLE_CMD_NOTIFY_CHAR_HANDLE  user_ble_notify_char_handle
-
-
-//#define NVRAM_LEN 170//Nvram 长度170bytes,每组Nvram长度为34bytes,最多可存储5组配对信息
-
-uint16_t ble_send_handle=0x2a;
-uint8_t bt_cod[3] = {0x24,0x04,0x04};
-//uint8_t NvramData[NVRAM_LEN]={0};
-uint8_t LinkKeyData[16]={0};
-
-void ble_start_set_visibilty(Boolean ble_discoverable);
-void bt_start_set_visibilty(Boolean bt_discoverable, Boolean bt_connectability);
-void bt_start_reconnect(uint8_t btindex);
-void bt_cancel_reconnect(void);
-void bt_start_work(void);
-
-uint8_t app_get_nvram_data(nvram_t* nvram_data);
-uint8_t app_save_nvram(nvram_t* nvram_data, uint8_t* nvram, uint8_t btindex);
-uint8_t app_check_bond_info_valid(uint8_t indx);
-uint8_t app_clear_bond_info(nvram_t* nvram_data, uint8_t btindex);
-
-
-void Uart_PrintArray(const char *str,uint8_t *dataBuf,uint8_t dataLen);
-uint8_t BT_Get_Rssi(void);
-
-//write flash
-uint8_t   ReserveNV(uint8_t* nvram);
+uint8_t bt_index = 0;
 extern tick SystickCount;
 #ifdef UART_TO_IPC
 HCI_TypeDef HCI_Tx;
@@ -86,72 +57,35 @@
 uint8_t ipc_tx_buf[256];
 uint8_t ipc_rx_buf[256];
 #endif
+/* Private function prototypes -----------------------------------------------*/
+void UART_Configuration(void);
+void btSetLpmMode(uint8_t mode);
+uint8_t btGetRssi(void);
 
-void BT_IRQHandler()
-{
-	while(IPC_have_data())
-	{
-		#ifdef UART_TO_IPC
-		if(TRUE==IPC_ReadBtData(&HCI_Rx))
-		{
-			UART_SendBuf(IPC_UART,(uint8_t*)&HCI_Rx,3);
-			UART_SendBuf(IPC_UART,HCI_Rx.p_data,HCI_Rx.DataLen);
-		}
-		#else
-		BT_ParseBTData();
-		#endif
-	}
 
-	BT_CONFIG &= (~(1<<BT_INIT_FLAG));
-}
 
-void SYSTICK_IRQHandler()
+void BT_IRQHandler()
 {
-	SystickCount++;
-	if(SystickCount>=TICK_MAX_VALUE)	SystickCount=0;
-}
-
-
+    while(IPC_have_data())
+    {
+#ifdef UART_TO_IPC
+        if(TRUE==IPC_ReadBtData(&HCI_Rx))
+        {
+            UART_SendBuf(IPC_UART,(uint8_t*)&HCI_Rx,3);
+            UART_SendBuf(IPC_UART,HCI_Rx.p_data,HCI_Rx.DataLen);
+        }
+#else
+        BT_ParseBTData();
+#endif
+    }
 
-static uint8_t hex_lookup[16] = { '0', '1', '2', '3', '4', '5', '6', '7','8','9', 'a', 'b', 'c', 'd', 'e', 'f' };
-static void array2hex(uint8_t* in, int inlen, uint8_t* out)
-{
-	int i;
-	for (i = 0; i < inlen; ++i)
-	{
-		out[2 * i] = hex_lookup[in[inlen-1-i] >> 4];
-		out[2 * i + 1] = hex_lookup[in[inlen-1-i] & 0x0f];
-	}
+    BT_CONFIG &= (~(1<<BT_INIT_FLAG));
 }
 
-void genBleAdvData(uint8_t *ble_name,int ble_name_len,uint8_t *ble_mac,uint8_t *ble_adv_data)
+void SYSTICK_IRQHandler()
 {
-    int index=0;
-    //property
-    ble_adv_data[index++]=0x02;
-    ble_adv_data[index++]=0x01;
-    ble_adv_data[index++]=0x02;
-    //name
-    ble_adv_data[index++]=(ble_name_len+1);
-    ble_adv_data[index++]=0x09;//name flag
-    for(int i=0;i<ble_name_len;i++)
-    {
-        ble_adv_data[index++]=ble_name[i];
-    }
-    //manufacturer info
-    ble_adv_data[index++]=0x09;
-    ble_adv_data[index++]=0xff;//manufacturer info flag
-    ble_adv_data[index++]=0x00;
-    ble_adv_data[index++]=0x00;
-    for(int i=0;i<6;i++)
-    {
-        ble_adv_data[index++]=ble_mac[5-i];
-    }
-    //fill
-    while(index<31)
-    {
-        ble_adv_data[index++]=0x00;
-    }
+    SystickCount++;
+    if(SystickCount>=TICK_MAX_VALUE)	SystickCount=0;
 }
 
 
@@ -162,144 +96,60 @@
   */
 int main(void)
 {
-	uint8_t bt_name[15] = "YC3121bt";
-    uint8_t ble_name[16] = "YC3121ble";
-	uint8_t bt_addr[6] =  {0x00,0x00,0x00,0x33,0x22,0x10};
-    uint8_t ble_addr[6] =  {0x00,0x00,0x00,0x44,0x22,0x10};
-	uint8_t chip_id[6]={0};
-    uint8_t ble_adv_data[31]={0x02,0x01,0x02,0x00};
-	uint16_t temp_handle;
-
-	int UARTCMD = 0;
-	uint8_t getbtstatus = 0;
-	int i = 0;
-	#ifdef UART_TO_IPC
-	HCI_Tx.p_data=ipc_tx_buf;
-	HCI_Rx.p_data=ipc_rx_buf;
-	#endif
-	UART_Configuration();
-	MyPrintf("bt ble demo\n");
-	SysTick_Config(CPU_MHZ/100);
-
-	BT_Init();
-	enable_intr(INTR_BT);
-
-	read_chipid(chip_id);
-	array2hex(chip_id,3,bt_name+8);
-	bt_name[14]='\0';
-	memcpy(bt_addr,chip_id,3);
-    
-    array2hex(chip_id,3,ble_name+9);
-	ble_name[15]='\0';
-	memcpy(ble_addr,chip_id,3);
-
-    //设置BLE服务, do this before config ble name!!!
-    BT_BleGattServiceInit();
-    MyPrintf("primary service user: notify handle = %04x\n",BLE_CMD_NOTIFY_HANDLE);
-    MyPrintf("primary service user: notify character handle = %04x\n",BLE_CMD_NOTIFY_CHAR_HANDLE);
-    MyPrintf("primary service user: write handle = %04x\n",BLE_CMD_WRITE_REQ_HANDLE);
-
-	if(BT_SetBleName(ble_name,sizeof(ble_name)-1)==TRUE)
-		MyPrintf("SetBleName_suc ble name:%s\n",ble_name);
-	else
-		MyPrintf("SetBleName_failed\n");
-
-	if(BT_SetBtName(bt_name,sizeof(bt_name)-1) == TRUE)//bt与ble名字地址可以设置成一样
-		MyPrintf("SetbtName_suc\n");
-	else
-		MyPrintf("SetbtName_fail\n");
-
-	if(BT_SetBleAddr(ble_addr) == TRUE)
-		MyPrintf("SetBleAddr_suc\n");
-	else
-		MyPrintf("SetBleAddr_fail\n");
-
-	if(BT_SetParingMode(BT_PARING_MODE_JUSTWORK) == TRUE)//设置配对模式为justwork
-		MyPrintf("set justwork mode success\n");
-	else
-		MyPrintf("set justwork mode failed\n");
-
-	if(BT_SetCOD(bt_cod) == TRUE) //设置COD
-		MyPrintf("set COD sucess\n");
-	else
-		MyPrintf("set COD failed\n");
-
-	if(BT_SetLpmMode(0x00) == TRUE) //设置低功耗模式
-		MyPrintf("set lpm mode sucess\n");
-	else
-		MyPrintf("set lpm mode failed\n");
-
-    genBleAdvData(ble_name,sizeof(ble_name)-1,ble_addr,ble_adv_data);
-    if(BT_SetLEAdvData(ble_adv_data,sizeof(ble_adv_data)) == TRUE)
-		MyPrintf("BT_SetLEAdvData sucess\n");
-	else
-		MyPrintf("BT_SetLEAdvData failed\n");
-
-    if(BT_SetLEScanData(ble_adv_data,sizeof(ble_adv_data)) == TRUE)
-		MyPrintf("BT_SetLEScanData sucess\n");
-	else
-		MyPrintf("BT_SetLEScanData failed\n");
+    uint8_t ble_adv_data[BLE_ADV_DATA_LEN_MAX];
+    uint8_t ble_scan_rsp[BLE_SCAN_RSP_LEN_MAX];
+    uint8_t ble_fixed_pincode[5] = {BLE_FIXED_PINCODE_VALUE,0x00,0x00,0x00,0x00};
 
-    
-	MyPrintf("bt version=%x\n",BT_GetVersion());
+    int UARTCMD = 0;
+    uint8_t getbtstatus = 0;
 
-    app_get_nvram_data(&nvram_data);
-    
-    for(int i=0;i<BT_NUM;i++)
-    {
-        MyPrintf("[index %d]:\r\n", i);
-        Uart_PrintArray("nvram_data.bt_bond_info.btaddr",&nvram_data.bt_bond_info[i].btaddr[0],6);
-        Uart_PrintArray("nvram_data.bt_bond_info.hostbtaddr",&nvram_data.bt_bond_info[i].hostbtaddr[0],6);
-        for(int j=0;j<16;j++)
-        {
-            LinkKeyData[j] = nvram_data.bt_bond_info[i].link_key[15-j];
-        }
-        Uart_PrintArray("nvram_data.bt_bond_info.link_key",LinkKeyData,16);
-    }
-    MyPrintf("\r\n");
-    
-    if (user_info.bt_index > BT_NUM)
+#ifdef UART_TO_IPC
+    HCI_Tx.p_data=ipc_tx_buf;
+    HCI_Rx.p_data=ipc_rx_buf;
+#endif
+    UART_Configuration();
+    uartPrintStr("bt ble demo");
+    SysTick_Config(CPU_MHZ/100);
+
+    BT_Init();
+    enable_intr(INTR_BT);
+
+    getbtstatus = BT_GetVersion();
+    uartPrintArray("bt version",&getbtstatus,1,TYPE_HEX);
+
+#if ((FUNC_DEVICE_BT & DEVICE_BLE_ENABLE) == DEVICE_BLE_ENABLE)
+    uartPrintStr("\nBLE_CONFIG");
+    bleSetGattService();
+    bleSetName();
+    bleSetAddr();
+    bleSetAdvScanData(ble_adv_data,ble_scan_rsp);
+    bleSetVisibility(TRUE);
+#if ((FUNC_DEVICE_BT & BLE_HID_SERVICE_ENABLE) == BLE_HID_SERVICE_ENABLE)
+    bleSetLEPairing(BLE_PARING_MODE_PASSKEY);
+    bleSetPasskeyPincode(ble_fixed_pincode);
+    bleBondInfoRead(TRUE); //读取保存的配对信息
+#else
+    bleSetLEPairing(BLE_PARING_MODE_NONE);
+#endif
+#endif
+
+
+#if ((FUNC_DEVICE_BT & DEVICE_BT_ENABLE) == DEVICE_BT_ENABLE)
+    uartPrintStr("\nBT_CONFIG");
+    btSetName();
+    btSetAddr();
+    btSetParingMode(BT_PARING_MODE_JUSTWORK);
+    btSetCOD((uint8_t *)bt_cod_const);
+    btBondInfoRead();
+    btStartWork(bt_index);
+#endif
+
+    btSetLpmMode(0x00);
+
+    while (1)
     {
-        user_info.bt_index = 0;
+        BT_Progress();
     }
-    user_info.bt_index = 0;
-    memcpy(nvram_data.bt_bond_info[user_info.bt_index].btaddr, bt_addr, BT_ADDR_LEN);
-    
-    if(BT_SetBtAddr(bt_addr) == TRUE)
-        MyPrintf("SetBtAddr_suc\n");
-	else
-		MyPrintf("SetBtAddr_fail\n");
-    
-    bt_start_work();
-    
-    ble_start_set_visibilty(0x01);
-    
-	while (1)
-	{
-		//uart cmd to ipc
-		#ifdef UART_TO_IPC
-		if(UART_IsRXFIFONotEmpty(IPC_UART))
-		{
-			HCI_Tx.type = UART_ReceiveData(IPC_UART);
-			while(!UART_IsRXFIFONotEmpty(IPC_UART));
-			HCI_Tx.opcode = UART_ReceiveData(IPC_UART);
-			while(!UART_IsRXFIFONotEmpty(IPC_UART));
-			HCI_Tx.DataLen = UART_ReceiveData(IPC_UART);
-			i=0;
-			while(i<HCI_Tx.DataLen)
-			{
-				while(!UART_IsRXFIFONotEmpty(IPC_UART));
-				HCI_Tx.p_data[i++] = UART_ReceiveData(IPC_UART);
-			}
-			IPC_TxData(&HCI_Tx);
-		}
-		#else
-		BT_Progress();
-        
-//        BT_Get_Rssi();
-        
-		#endif
-	}
 }
 
 /**
@@ -309,32 +159,32 @@
   */
 void UART_Configuration(void)
 {
-	UART_InitTypeDef UART_InitStruct;
+    UART_InitTypeDef UART_InitStruct;
 
-	/* Configure serial ports 0 RX and TX for IO. */
-	GPIO_Config(UART0_TX_PORT, UART0_TX_PIN, UART0_TXD);
-	GPIO_Config(UART0_RX_PORT, UART0_RX_PIN, UART0_RXD);
-
-	/* USARTx configured as follow:
-  - BaudRate = 115200 baud
-  - Word Length = 8 Bits
-  - Stop Bit = 1 Stop Bit
-  - Parity = No Parity
-  - Hardware flow control disabled (RTS and CTS signals)
-  - Receive and transmit enabled
-  */
-	#ifdef UART_TO_IPC
-	UART_InitStruct.BaudRate = UART_TO_IPC_BAUDRATE;			//Configure serial port baud rate, the baud rate defaults to 128000.
-	#else
-	UART_InitStruct.BaudRate = UARTBAUD;
-	#endif
-	UART_InitStruct.DataBits = Databits_8b;
-	UART_InitStruct.StopBits = StopBits_1;
-	UART_InitStruct.Parity = Parity_None;
-	UART_InitStruct.FlowCtrl = FlowCtrl_None;
-	UART_InitStruct.Mode = Mode_duplex;
+    /* Configure serial ports 0 RX and TX for IO. */
+    GPIO_Config(UART0_TX_PORT, UART0_TX_PIN, UART0_TXD);
+    GPIO_Config(UART0_RX_PORT, UART0_RX_PIN, UART0_RXD);
+
+    /* USARTx configured as follow:
+    - BaudRate = 115200 baud
+    - Word Length = 8 Bits
+    - Stop Bit = 1 Stop Bit
+    - Parity = No Parity
+    - Hardware flow control disabled (RTS and CTS signals)
+    - Receive and transmit enabled
+    */
+#ifdef UART_TO_IPC
+    UART_InitStruct.BaudRate = UART_TO_IPC_BAUDRATE;			//Configure serial port baud rate, the baud rate defaults to 128000.
+#else
+    UART_InitStruct.BaudRate = UARTBAUD;
+#endif
+    UART_InitStruct.DataBits = Databits_8b;
+    UART_InitStruct.StopBits = StopBits_1;
+    UART_InitStruct.Parity = Parity_None;
+    UART_InitStruct.FlowCtrl = FlowCtrl_None;
+    UART_InitStruct.Mode = Mode_duplex;
 
-	UART_Init(UART0, &UART_InitStruct);
+    UART_Init(UART0, &UART_InitStruct);
 }
 
 
@@ -347,489 +197,338 @@
 
 void BT_Progress()
 {
-	int eventCmd= BT_GetEventOpcode();
-	switch(eventCmd)
-	{
-		case BT_DATA:
-			{
-				uint8_t i = 0;
-				uint8_t btData[MAX_BLUETOOTH_DATA_LEN];
-				int BtDataLen=0;
-				BtDataLen=BT_ReadBTData(btData);
-				if(BtDataLen>0)
-				{
-					MyPrintf("received %d bytes bt data:\n",BtDataLen);
-					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
-					MyPrintf("\n");
-
-					BT_SendSppData(btData,BtDataLen);
-					MyPrintf("send %d bytes bt data:\n",BtDataLen);
-					for(int i=0;i<BtDataLen;i++)	MyPrintf("%02x ",btData[i]);
-					MyPrintf("\n");
-					#if (MEM_SPP_FLOWCTRL_FLAG_VALUE==0x01)
-					if(BT_SetSppFlowcontrol(1) != TRUE)	MyPrintf("set Flowcontrol failed\n");
-					#endif
-				}
-				else	MyPrintf("read bt data error\r\n");
-			}
-		break;
-
-		case BLE_DATA:
-			{
-				uint8_t bleData[MAX_BLUETOOTH_DATA_LEN]={0};
-				int BleDataLen=0;
-				BleDataLen=BT_ReadBTData(bleData);
-				if(BleDataLen>0)
-				{
-					MyPrintf("received %d bytes ble data[handle:%02x %02x]:\n",BleDataLen-2,bleData[0],bleData[1]);
-					for(int i=0;i<(BleDataLen-2);i++)	MyPrintf("%02x ",bleData[2+i]);
-					MyPrintf("\n");
-                    
-                    if(bleData[2] == 0x55 && bleData[3] == 0xaa)
-                    {
-                        bt_cancel_reconnect();
-                        bt_start_set_visibilty(0x01,0x01);
-                    }    
-                    
-//					//add handle
-//					bleData[0]=(ble_send_handle&0xff);
-//					bleData[1]=((ble_send_handle>>8)&0xff);
-//					BT_SendBleData(bleData,BleDataLen);
-//					MyPrintf("send %d bytes ble data[%02x %02x]:\n",BleDataLen-2,bleData[0],bleData[1]);
-//					for(int i=0;i<(BleDataLen-2);i++)	MyPrintf("%02x ",bleData[2+i]);
-//					MyPrintf("\n");
-				}
-				else	MyPrintf("read ble data error\r\n");
-			}
-		break;
-
-		case BT_CONNECTED:
-			MyPrintf("bt connected\n");
-		break;
-
-        case BT_DISCONNECTED:
-			MyPrintf("bt disconnected\n");
-            bt_start_work();
+    int eventCmd= BT_GetEventOpcode();
+    switch(eventCmd)
+    {
+
+#if ((FUNC_DEVICE_BT & DEVICE_BT_ENABLE) == DEVICE_BT_ENABLE)
+    case BT_DATA:
+    {
+        uint8_t i = 0;
+        uint8_t btData[MAX_BLUETOOTH_DATA_LEN];
+        int BtDataLen=0;
+        BtDataLen=BT_ReadBTData(btData);
+        if(BtDataLen>0)
+        {
+            MyPrintf("received %d bytes bt data:\n",BtDataLen);
+            for(int i=0; i<BtDataLen; i++)	MyPrintf("%02x ",btData[i]);
+            MyPrintf("\n");
+
+            BT_SendSppData(btData,BtDataLen);
+            MyPrintf("send %d bytes bt data:\n",BtDataLen);
+            for(int i=0; i<BtDataLen; i++)	MyPrintf("%02x ",btData[i]);
+            MyPrintf("\n");
+#if (MEM_SPP_FLOWCTRL_FLAG_VALUE==0x01)
+            if(BT_SetSppFlowcontrol(1) != TRUE)	uartPrintStr("set Flowcontrol failed");
+#endif
+        }
+        else	uartPrintStr("read bt data error");
+    }
+    break;
+
+    case BT_CONNECTED:
+        uartPrintStr("bt connected");
         break;
-        
-        case BT_PIN_OR_KEY_MISSING:
-			MyPrintf("bt pin or key missing\n");
-            app_clear_bond_info(&nvram_data,user_info.bt_index);
-		break;
-            
-        case BT_RECONNECT_FAIL:
-			MyPrintf("bt reconnect fail\n");
-		break;
-        
-        case HFP_CONNECT:
-			MyPrintf("hfp connected\n");
-		break;
-        
-        case HFP_STOP_DIALING:
-			MyPrintf("hfp stop dialing\n");
-		break;
-        
-        case HFP_START_DIALING:
-            {
-                MyPrintf("hfp start dialing\n");
-                uint8_t PhoneNum[11];
-                uint8_t PhoneNumLen=0;
-                PhoneNumLen=BT_ReadBTData(PhoneNum);
-
-                MyPrintf("hfp receive %dbytes phone num:",PhoneNumLen);
-                for(uint8_t i=0; i < PhoneNumLen; i++)
-                {   
-                    if(PhoneNum[i] > 9)
-                    {
-                        MyPrintf("hfp phone error handle\r\n");
-                    }
-                    MyPrintf("%d",PhoneNum[i]);
-                }
-                MyPrintf("\n");
-            }
-		break;
-        
-		case BLE_CONNECTED:
-			MyPrintf("ble connected\n");
-		break;
-
-		case BLE_DISCONNECTED:
-			MyPrintf("ble disconnected\n");
-            ble_start_set_visibilty(0x01);
-		break;
 
-        case BT_ENC_INFO:
-            {
-                MyPrintf("ble enc info:\n");
-                uint8_t BtEncInfo[MAX_BLUETOOTH_DATA_LEN];
-                int BtEncInfoLen = 0;
-                BtEncInfoLen = BT_ReadBTData(BtEncInfo);
-            
-                if (BtEncInfoLen > 0)
-                {
-                    MyPrintf("btaddr:\n");
-                    for(int i=0;i<6;i++)
-                    {
-                        MyPrintf("%02X ",BtEncInfo[5-i]);
-                    }
-                    MyPrintf("\n");
-                    MyPrintf("host_btaddr:\n");
-                    for(int i=0;i<6;i++)
-                    {
-                        MyPrintf("%02X ",BtEncInfo[11-i]);
-                    }
-                    MyPrintf("\n");
-                    MyPrintf("link_key:\n");
-                    for(int i=0;i<16;i++)
-                    {
-                        MyPrintf("%02X ",BtEncInfo[27-i]);
-                    }
-                    MyPrintf("\n");
-                    app_save_nvram(&nvram_data, BtEncInfo, user_info.bt_index); //保存配对信息
-                }
-                else
-                    MyPrintf("read bt enc info error\r\n");
-            }
+    case BT_DISCONNECTED:
+        uartPrintStr("bt disconnected");
+        btStartWork(bt_index);
         break;
-        
-		case NVRAM_DATA:
-			{
-				uint8_t NvramData[MAX_BLUETOOTH_DATA_LEN];
-				int NvramDataLen=0;
-				NvramDataLen=BT_ReadBTData(NvramData);
-				if(NvramDataLen>0)
-				{
-					MyPrintf("receive %dbytes Nvramdata:",NvramDataLen);
-					for(int i=0;i<NvramDataLen;i++)
-					{
-						MyPrintf("%02X ",NvramData[i]);
-					}
-					MyPrintf("\n");
-				}
-				else
-					MyPrintf("read Nvram data error\r\n");
-			}
-		break;
-
-		case CONFIRM_GKEY:
-			{
-				uint8_t GkeyData[MAX_BLUETOOTH_DATA_LEN];
-				int GkeyDataLen=0;
-				GkeyDataLen=BT_ReadBTData(GkeyData);
-				if(GkeyDataLen>0)
-				{
-					MyPrintf("receive %dbytes CONFIRM_GKEY:",GkeyDataLen);
-					for(int i=0;i<GkeyDataLen;i++)
-					{
-						MyPrintf("%02X ",GkeyData[i]);
-					}
-					MyPrintf("\n");
-				}
-				else	MyPrintf("read CONFIRM_GKEY data error\r\n");
-
-				if(BT_ConfirmGkey(0) == TRUE)//BT_ConfirmGkey参数为0则继续配对，1则取消配对。
-					MyPrintf("set confirmkey  success");
-				else
-					MyPrintf("set confirmkey  failed\n");
-		}
-		break;
-
-		case PASSKEY:
-			MyPrintf("request Passkey");
-		break;
-
-		case PAIRING_COMPLETED:
-			{
-				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
-				int PairingDataLen=0;
-				PairingDataLen=BT_ReadBTData(PairingData);
-				if(PairingDataLen>0)
-				{
-					MyPrintf("receive %dbytes paring data:",PairingDataLen);
-					for(int i=0;i<PairingDataLen;i++)
-					{
-						MyPrintf("%02X ",PairingData[i]);
-					}
-					MyPrintf("\n");
-				}
-				else	MyPrintf("read PAIRING_COMPLETED data error\r\n");
-			}
-		break;
-
-		case PAIRING_STATE:
-			{
-				uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
-				int PairingDataLen=0;
-				uint16_t pairing_status=0;
-				PairingDataLen=BT_ReadBTData(PairingData);
-				if(PairingDataLen==2)
-				{
-					pairing_status |=PairingData[0];
-					pairing_status |=(PairingData[1]<<8);
-					switch(pairing_status)
-					{
-						case 0x0001:
-							MyPrintf("BT Pairing Success\r\n");
-						break;
-
-						case 0x0101:
-							MyPrintf("BT Pairing fail\r\n");
-						break;
-
-						case 0x0080:
-							MyPrintf("BLE Pairing Success\r\n");
-						break;
-
-						case 0x0180:
-							MyPrintf("BLE Pairing fail\r\n");
-						break;
-
-						default:
-							MyPrintf("unknown pairing_status[%04x]\r\n",pairing_status);
-						break;
-					}
-				}
-				else	MyPrintf("read PAIRING_STATE data error\r\n");
-			}
-		break;
-
-		case -1:
-			//no event
-		break;
-
-		default:
-		{
-			MyPrintf("unknown event:%02x\r\n",eventCmd);
-			uint8_t unknownData[MAX_BLUETOOTH_DATA_LEN];
-			int unknownDataLen=0;
-			unknownDataLen=BT_ReadBTData(unknownData);
-			if(unknownDataLen>0)
-			{
-				MyPrintf("datalen:%d\r\n",unknownDataLen);
-				for(int i=0;i<unknownDataLen;i++)
-				{
-					MyPrintf("%02X ",unknownData[i]);
-				}
-				MyPrintf("\n");
-			}
-		}
-		break;
-	}
-}
 
+    case BT_PIN_OR_KEY_MISSING:
+        uartPrintStr("bt pin or key missing");
+        btClearBondInfo(&nvram_data,bt_index);
+        break;
 
+    case BT_RECONNECT_FAIL:
+        uartPrintStr("bt reconnect fail");
+        break;
 
-/**
- * @brief 蓝牙设置可发现可连接
- *
- * @param
- */
-void bt_start_set_visibilty(Boolean bt_discoverable, Boolean bt_connectability)
-{
-    if(BT_BtSetVisibility(bt_discoverable,bt_connectability) == TRUE)  //设置可发现
-        MyPrintf("BT_BtSetVisibility success\n");
-    else
-        MyPrintf("BT_BtSetVisibility failed\n");
-}
+    case HFP_CONNECT:
+        uartPrintStr("hfp connected");
+        break;
 
-/**
- * @brief 蓝牙开始回连
- *
- * @param btindex
- */
-void bt_start_reconnect(uint8_t btindex)
-{
-    if (BT_Creat_Reconnect((uint8_t *)&nvram_data.bt_bond_info[btindex], sizeof(bt_bond_info_t)) == TRUE)
-        MyPrintf("BT_Creat_Reconnect pass\n");
-    else
-        MyPrintf("BT_Creat_Reconnect failed\n");
-}
+    case HFP_STOP_DIALING:
+        uartPrintStr("hfp stop dialing");
+        break;
 
-/**
- * @brief 蓝牙取消回连
- *
- * @param null
- */
-void bt_cancel_reconnect(void)
-{
-    if (BT_Cancel_Reconnect() == TRUE)
-        MyPrintf("BT_Cancel_Reconnect pass\n");
-    else
-        MyPrintf("BT_Cancel_Reconnect failed\n");
-}
+    case HFP_START_DIALING:
+    {
+        uartPrintStr("hfp start dialing");
+        uint8_t PhoneNum[11];
+        uint8_t PhoneNumLen=0;
+        PhoneNumLen=BT_ReadBTData(PhoneNum);
 
-/**
- * @brief 蓝牙取消回连
- *
- * @param null
- */
-void bt_start_work(void)
-{
-    if (app_check_bond_info_valid(user_info.bt_index))
-        bt_start_reconnect(user_info.bt_index);
-    else
-        bt_start_set_visibilty(0x01,0x01);
-}
+        MyPrintf("hfp receive %dbytes phone num:",PhoneNumLen);
+        for(uint8_t i=0; i < PhoneNumLen; i++)
+        {
+            if(PhoneNum[i] > 9)
+            {
+                MyPrintf("hfp phone error handle\r\n");
+            }
+            MyPrintf("%d",PhoneNum[i]);
+        }
+        MyPrintf("\n");
+    }
+    break;
 
+    case BT_ENC_INFO:
+    {
+        uartPrintStr("bt enc info:");
+        uint8_t BtEncInfo[MAX_BLUETOOTH_DATA_LEN];
+        int BtEncInfoLen = 0;
+        BtEncInfoLen = BT_ReadBTData(BtEncInfo);
 
-/**
- * @brief 蓝牙设置可发现可连接
- *
- * @param
- */
-void ble_start_set_visibilty(Boolean ble_discoverable)
-{
-    if(BT_BleSetVisibility(ble_discoverable) == TRUE)  //设置可发现
-        MyPrintf("BT_BleSetVisibility success\n");
-    else
-        MyPrintf("BT_BleSetVisibility failed\n");
-}
+        if (BtEncInfoLen > 0)
+        {
+            MyPrintf("btaddr:");
+            for(int i=0; i<6; i++)
+            {
+                MyPrintf("%02X ",BtEncInfo[5-i]);
+            }
+            MyPrintf("\n");
+            MyPrintf("host_btaddr:");
+            for(int i=0; i<6; i++)
+            {
+                MyPrintf("%02X ",BtEncInfo[11-i]);
+            }
+            MyPrintf("\n");
+            MyPrintf("link_key:");
+            for(int i=0; i<16; i++)
+            {
+                MyPrintf("%02X ",BtEncInfo[27-i]);
+            }
+            MyPrintf("\n");
+            btWriteNvramData(&nvram_data, BtEncInfo, bt_index); //保存配对信息
+        }
+        else
+            MyPrintf("read bt enc info error\r\n");
+    }
+    break;
+#endif
 
+#if ((FUNC_DEVICE_BT & DEVICE_BLE_ENABLE) == DEVICE_BLE_ENABLE)
+    case BLE_DATA:
+    {
+        uint8_t bleData[MAX_BLUETOOTH_DATA_LEN]= {0};
+        int BleDataLen=0;
+        BleDataLen=BT_ReadBTData(bleData);
+        if(BleDataLen>0)
+        {
+            uartPrintArray("Ble_RX_Handle",bleData,2,TYPE_HEX);
+            MyPrintf("Ble_RX_Length:%02x\r\n", BleDataLen - 2);
+            uartPrintArray("Ble_RX_Data",bleData+2,BleDataLen-2,TYPE_HEX);
 
-/**
- * @brief 读取绑定信息
- *
- * @param nvramdat 绑定信息
- * @return 执行结果
- */
-uint8_t app_get_nvram_data(nvram_t* nvram_data)
-{
-  return qspi_flash_read(IFLASH_NVRAM_ADDR, (uint8_t*)nvram_data, sizeof(nvram_t));
-}
+#if ((FUNC_DEVICE_BT & DEVICE_BT_ENABLE) == DEVICE_BT_ENABLE)
+            if(bleData[2] == 0x55 && bleData[3] == 0xaa)
+            {
+                btCancelReconnect();
+                btSetVisibility(TRUE,TRUE);
+            }
+#endif
 
-/**
- * @brief 保存绑定信息
- *
- * @param nvram_data绑定信息集
- * @param nvram 绑定信息
- * @param btindex 通道索引
- * @return 执行结果
- */
-uint8_t app_save_nvram(nvram_t* nvram_data, uint8_t* nvram, uint8_t btindex)
-{
-  nvram_data->nvflag = NVRAM_DNO;
-  nvram_data->nvid = btindex;
-  memcpy(&nvram_data->bt_bond_info[btindex], nvram, sizeof(bt_bond_info_t));
-  MyPrintf("new nvram data,updata to flash\r\n");
-  qspi_flash_sectorerase(IFLASH_NVRAM_ADDR);
-  return qspi_flash_write(IFLASH_NVRAM_ADDR, (uint8_t*)nvram_data, sizeof(nvram_t));
-}
+#if 0
+            //transmit func
+            bleData[0]=(BLE_CMD_NOTIFY_HANDLE&0xff);
+            bleData[1]=((BLE_CMD_NOTIFY_HANDLE>>8)&0xff);
+            BT_SendBleData(bleData,BleDataLen);
+            uartPrintArray("Ble_TX_Handle",bleData,2,TYPE_HEX);
+            MyPrintf("Ble_TX_Length:%02x\r\n", BleDataLen - 2);
+            uartPrintArray("Ble_TX_Data",bleData+2,BleDataLen-2,TYPE_HEX);
+#endif
+        }
+        else	uartPrintStr("read ble data error");
+    }
+    break;
 
+    case BLE_CONNECTED:
+        uartPrintStr("ble connected");
+        ble_status = BLE_STATUS_CONNECTED;
+        break;
 
-/**
- * @brief 检查当前通道绑定信息是否有效
- *
- */
-uint8_t app_check_bond_info_valid(uint8_t btindex)
-{
-    uint8_t btaddr[BT_ADDR_LEN];
-    uint8_t hostbtaddr[BT_ADDR_LEN];
-    uint8_t linkkey[LINK_KEY_LEN];
-    memset(btaddr, 0xFF, BT_ADDR_LEN);
-    memset(hostbtaddr, 0xFF, BT_ADDR_LEN);
-    memset(linkkey, 0xFF, LINK_KEY_LEN);
-
-    if ((memcmp(btaddr, nvram_data.bt_bond_info[btindex].btaddr, BT_ADDR_LEN) == 0)            ||
-        (memcmp(hostbtaddr, nvram_data.bt_bond_info[btindex].hostbtaddr, BT_ADDR_LEN) == 0)    || 
-        (memcmp(linkkey, nvram_data.bt_bond_info[btindex].link_key, LINK_KEY_LEN) == 0))
-    {
-        MyPrintf("bond info is null \r\n");
-        return 0;
-    }
-    return 1;
-}
+    case BLE_DISCONNECTED:
+        uartPrintStr("ble disconnected");
+        ble_status = BLE_STATUS_UNCONNECTED;
+        bleSetVisibility(TRUE);
+        break;
+    
+    case BLE_ENC_INFO:
+        uartPrintStr("ble enc info");
+        ble_status = BLE_STATUS_BONDED;
+        
+        uint8_t BleEncInfo[MAX_BLUETOOTH_DATA_LEN];
+        int BleEncInfoLen = 0;
+        BleEncInfoLen = BT_ReadBTData(BleEncInfo);
 
-/**
-* @brief 清除当前通道绑定信息，手机端取消配对
- *
- */
-uint8_t app_clear_bond_info(nvram_t* nvram_data, uint8_t btindex)
-{
-    uint8_t flashnull[BT_ADDR_LEN+BT_ADDR_LEN+LINK_KEY_LEN];
-    memset(flashnull, 0xFF, BT_ADDR_LEN+BT_ADDR_LEN+LINK_KEY_LEN);
-    app_get_nvram_data(nvram_data);
-    app_save_nvram(nvram_data,flashnull,btindex);
+        if (BleEncInfoLen > 0)
+        {
+            bleReadNowBondInfo();
+            bleBondInfoRefreshByMac((uint8_t *)&ble_hid_bond_info_now.peer_addr[0]);//保存配对信息
+        }
+        else
+            uartPrintStr("read ble enc info error");
+        break;
     
-    if(app_check_bond_info_valid(btindex))
-    {
-        MyPrintf("clear bond info succ \r\n");
-        return 1;
-    }
-    else
-    {
-        MyPrintf("clear bond info fail \r\n");
-        return 0;
-    }
-}
+    case BLE_START_ENC:
+        uartPrintStr("ble receive start enc");
+        ble_status = BLE_STATUS_BONDED;
+        break;
 
+    case BLE_ENC_REQ:
+        uartPrintStr("ble receive enc req");
+        bleBondInfoSwitchLTK();
+        bleSendLLEncRsp();
+        break;
+#endif
 
 
+    case CONFIRM_GKEY:
+    {
+        uint8_t GkeyData[MAX_BLUETOOTH_DATA_LEN];
+        int GkeyDataLen=0;
+        GkeyDataLen=BT_ReadBTData(GkeyData);
+        if(GkeyDataLen>0)
+        {
+            MyPrintf("receive %dbytes CONFIRM_GKEY:",GkeyDataLen);
+            for(int i=0; i<GkeyDataLen; i++)
+            {
+                MyPrintf("%02X ",GkeyData[i]);
+            }
+            MyPrintf("\n");
+        }
+        else	uartPrintStr("read CONFIRM_GKEY data error");
 
-#define USER_PAGA (100)
-/**
- * @brief 保存用户信息
- *
- * @return 执行结果
- */
-uint8_t app_save_user_info(void)
-{
-    
-  qspi_flash_sectorerase(IFLASH_USER_INFO_ADDR);
-    
-  return qspi_flash_write(IFLASH_USER_INFO_ADDR, (uint8_t*)&user_info, sizeof(user_info_t));
-}
+        if(BT_ConfirmGkey(0) == TRUE)//BT_ConfirmGkey参数为0则继续配对，1则取消配对。
+            uartPrintStr("set confirmkey  success");
+        else
+            uartPrintStr("set confirmkey  failed");
+    }
+    break;
 
-/**
- * @brief 读取用户信息
- *
- * @param useinfo 用户信息
- * @return
- */
-uint8_t app_read_user_info(user_info_t* useinfo)
-{
-  return qspi_flash_read(IFLASH_USER_INFO_ADDR, (uint8_t*)useinfo, sizeof(user_info_t));
-}
+    case PASSKEY:
+        uartPrintStr("request Passkey");
+        break;
 
+    case PAIRING_COMPLETED:
+    {
+        uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+        int PairingDataLen=0;
+        PairingDataLen=BT_ReadBTData(PairingData);
+        if(PairingDataLen>0)
+        {
+            MyPrintf("receive %dbytes paring data:",PairingDataLen);
+            for(int i=0; i<PairingDataLen; i++)
+            {
+                MyPrintf("%02X ",PairingData[i]);
+            }
+            MyPrintf("\n");
+        }
+        else	uartPrintStr("read PAIRING_COMPLETED data error");
+    }
+    break;
 
-void Uart_PrintArray(const char *str,uint8_t *dataBuf,uint8_t dataLen)
-{
-    for (uint8_t i = 0; i < strlen(str); i++)
-        MyPrintf("%c", (uint8_t)str[i]);
-    MyPrintf(":");
-    for (uint8_t i = 0; i < dataLen; i++)
-        MyPrintf(" %02x", dataBuf[i]);
-    MyPrintf("\r\n");
+    case PAIRING_STATE:
+    {
+        uint8_t PairingData[MAX_BLUETOOTH_DATA_LEN];
+        int PairingDataLen=0;
+        uint16_t pairing_status=0;
+        PairingDataLen=BT_ReadBTData(PairingData);
+        if(PairingDataLen==2)
+        {
+            pairing_status |=PairingData[0];
+            pairing_status |=(PairingData[1]<<8);
+            switch(pairing_status)
+            {
+            case 0x0001:
+                uartPrintStr("BT Pairing Success");
+                break;
+
+            case 0x0101:
+                uartPrintStr("BT Pairing fail");
+                break;
+
+            case 0x0080:
+                uartPrintStr("BLE Pairing Success");
+                break;
+
+            case 0x0180:
+                uartPrintStr("BLE Pairing fail");
+                break;
+
+            default:
+                MyPrintf("unknown pairing_status[%04x]\r\n",pairing_status);
+                break;
+            }
+        }
+        else	uartPrintStr("read PAIRING_STATE data error");
+    }
+    break;
+
+    case -1:
+        //no event
+        break;
+
+    default:
+    {
+        MyPrintf("unknown event:%02x\r\n",eventCmd);
+        uint8_t unknownData[MAX_BLUETOOTH_DATA_LEN];
+        int unknownDataLen=0;
+        unknownDataLen=BT_ReadBTData(unknownData);
+        if(unknownDataLen>0)
+        {
+            MyPrintf("datalen:%d\r\n",unknownDataLen);
+            for(int i=0; i<unknownDataLen; i++)
+            {
+                MyPrintf("%02X ",unknownData[i]);
+            }
+            MyPrintf("\n");
+        }
+    }
+    break;
+    }
 }
 
 
 
-uint8_t Get_Rssi(void)
-{
-    return *(volatile byte*)0xc0018;
-}
+#define  mem_rssi   0xc0018
+#define  mem_ui_state_map   0xc4652
 
-uint16_t Get_Ui_State_Map(void)
+uint16_t btGetUiStateMap(void)
 {
-    return ((*(volatile byte*)0xc4652) || (*(volatile byte*)0xc4653 << 8));
+    return HR_REG_16BIT(mem_ui_state_map);
 }
 
-uint8_t BT_Get_Rssi(void)
+uint8_t btGetRssi(void)
 {
-    if(Get_Ui_State_Map() & 0x0001)
+    uint8_t data;
+    data = HR_REG_8BIT(mem_rssi);
+    if(btGetUiStateMap() & 0x0001)
     {
-        MyPrintf("classic rssi:%d\r\n",Get_Rssi());
-        return Get_Rssi();
+        uartPrintArray("classic rssi",&data,1,TYPE_HEX);
+        return data;
     }
-    else
+    else if(btGetUiStateMap() & 0x0200)
     {
-        MyPrintf("classic connection link not found\r\n");
-        return -1;
+        uartPrintArray("ble rssi",&data,1,TYPE_HEX);
+        return data;
     }
+    else
+        return 0;
 }
 
 
-
-
+/**
+ * @brief 设置低功耗模式
+ *
+ * @param
+ */
+void btSetLpmMode(uint8_t mode)
+{
+    if(BT_SetLpmMode(mode) == TRUE)
+        uartPrintStr("BT_SetLpmMode set lpm mode sucess");
+    else
+        uartPrintStr("BT_SetLpmMode set lpm mode failed");
+}
 
 
 
