diff --git a/sdk_lib_nbgl/README.md b/sdk_lib_nbgl/README.md
new file mode 100644
index 00000000..39459c42
--- /dev/null
+++ b/sdk_lib_nbgl/README.md
@@ -0,0 +1,2 @@
+# NBGL library
+Graphic library for Stax
diff --git a/sdk_lib_nbgl/doc/mainpage.dox b/sdk_lib_nbgl/doc/mainpage.dox
new file mode 100644
index 00000000..aa5467a2
--- /dev/null
+++ b/sdk_lib_nbgl/doc/mainpage.dox
@@ -0,0 +1,61 @@
+#ifdef HAVE_SE_TOUCH
+/** @page nbgl_mainpage New BOLOS Graphic API for Stax
+
+@section mainpage_intro Introduction
+
+This documentation describes the different interfaces of NBGL, the library that
+is targeted to be integrated in Stax product.
+
+NBGL Engine is responsible for constructing screens and handling Touchscreen input.
+
+@section mainpage_overall_archi Overall architecture
+
+NBGL Engine is a library to be integrated in SDK.
+It is intended to replace existing BAGL/FLOW Graphical Engine (used on Nanos/Blue products)
+
+\image{inline} html NBGLArchi.png "caption" height=600
+
+@section nbgl_drawing_api Screen drawing APIs
+
+@subsection nbgl_app_use_case_api_1 Application Use-cases API
+This is the most preferred API level to write an embedded Application.
+
+The @subpage nbgl_app_use_case page contains all information necessary to understand
+and use \b NBGL Application Use cases API
+
+@subsection nbgl_high_level_api_1 High-Level API
+The @subpage nbgl_page page contains all information necessary to understand
+and use \b NBGL High-Level API, using predefined pages
+
+@subsection nbgl_mid_level_api_1 Mid-Level API
+The @subpage nbgl_layout page contains all information necessary to understand
+and use \b NBGL Mid-Level API, using complex objects
+
+@subsection nbgl_low_level_api_1 Low-Level API
+The @subpage nbgl_obj page contains all information necessary to understand
+and use \b NBGL Low-Level API
+
+@section nbgl_screen_objs Screen and objects management
+The @subpage nbgl_screens_and_objs page contains all information necessary to understand
+how \b NBGL manages the screens stack and the dynamically allocated objects
+
+@section nbgl_touch_api Touchscreen events management
+The @subpage nbgl_touchscreen page contains all information necessary to understand
+how \b NBGL manages the touchscreen events and how to receive and process these events.
+
+@section nbgl_building Compilation options
+In order to reduce the footprint (RAM+Flash), some features are only activated if some building options are defined.
+
+Define | Meaning | Default state
+------------- | ------------- | -------------
+\b NBGL_PAGE | Activate High-Level API | Active in SDK, not in OS
+\b NBGL_USE_CASE | Activate Use Case API | Active in SDK, not in OS
+\b NBGL_KEYBOARD | Activate Keyboard object | Active in OS, not in SDK
+\b NBGL_KEYPAD | Activate Keypad object | Active in OS, not in SDK
+\b NBGL_QRCODE | Activate QRCode object | Active in OS, not in SDK
+
+Applications are free to define \b NBGL_KEYBOARD, \b NBGL_KEYPAD or \b NBGL_QRCODE in their own Makefile if they need to use these
+"rare" objects.
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/mainpage_nanos.dox b/sdk_lib_nbgl/doc/mainpage_nanos.dox
new file mode 100644
index 00000000..5cb0e4af
--- /dev/null
+++ b/sdk_lib_nbgl/doc/mainpage_nanos.dox
@@ -0,0 +1,60 @@
+#ifndef HAVE_SE_TOUCH
+/** @page nbgl_mainpage New BOLOS Graphic API for Nanos
+
+@section mainpage_intro Introduction
+
+This documentation describes the different interfaces of NBGL, the library that
+is targeted to be integrated in Nano products (Nano X and Nano S+).
+
+NBGL Engine is responsible for constructing screens and handling Buttons input.
+
+@section mainpage_overall_archi Overall architecture
+
+NBGL Engine is a library to be integrated in SDK.
+It is intended to replace existing BAGL/FLOW Graphical Engine (used on Nano S product)
+
+\image{inline} html NBGLArchi.png "caption" height=600
+
+@section nbgl_drawing_api Screen drawing APIs
+
+@subsection nbgl_app_use_case_api_1 Application Use-cases API
+This is the most preferred API level to write an embedded Application.
+
+The @subpage nbgl_app_use_case_nanos page contains all information necessary to understand
+and use \b NBGL Application Use cases API
+
+@subsection nbgl_flow_level_api_1 Flow API
+The @subpage nbgl_flow page contains all information necessary to understand
+and use \b NBGL Flow API, managing a scenario flow, made of one or several steps
+
+@subsection nbgl_step_level_api_1 Step API
+The @subpage nbgl_step page contains all information necessary to understand
+and use \b NBGL Step API, managing the page(s) of a scenario step
+
+@subsection nbgl_mid_level_api_1 Complex objects (layout) API
+The @subpage nbgl_layout page contains all information necessary to understand
+and use \b NBGL Mid-Level API, using complex objects
+
+@subsection nbgl_low_level_api_1 Low-Level API
+The @subpage nbgl_obj page contains all information necessary to understand
+and use \b NBGL Low-Level API
+
+@section nbgl_screen_objs Screen and objects management
+The @subpage nbgl_screens_and_objs page contains all information necessary to understand
+how \b NBGL manages the screens stack and the dynamically allocated objects
+
+@section nbgl_building Compilation options
+In order to reduce the footprint (RAM+Flash), some features are only activated if some building options are defined.
+
+Define | Meaning | Default state
+------------- | ------------- | -------------
+\b NBGL_USE_CASE | Activate Use Case API | Active in SDK, not in OS
+\b NBGL_KEYBOARD | Activate Keyboard object | Active in OS, not in SDK
+\b NBGL_KEYPAD | Activate Keypad object | Active in OS, not in SDK
+\b NBGL_QRCODE | Activate QRCode object | Active in OS, not in SDK
+
+Applications are free to define \b NBGL_KEYBOARD, \b NBGL_KEYPAD or \b NBGL_QRCODE in their own Makefile if they need to use these
+"rare" objects.
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/nbgl_api.dox b/sdk_lib_nbgl/doc/nbgl_api.dox
new file mode 100644
index 00000000..6de3a240
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_api.dox
@@ -0,0 +1,170 @@
+/** @page nbgl_obj Advanced BOLOS GL API
+
+@section nbgl_api_intro Introduction
+This chapter describes briefly the main interface functions of NBGL Graphical Engine. A
+full description of each function can be found in this document
+
+@section concepts Concepts
+In this section, we provide information on how to use NBGL API
+
+@subsection obj_hierarchy Graphic objects hierarchy
+
+@startuml
+
+title Graphic objects types hierarchy
+
+abstract nbgl_obj_t
+nbgl_obj_t <|-- nbgl_container_t
+nbgl_obj_t <|-- nbgl_text_area_t
+nbgl_obj_t <|-- nbgl_button_t
+nbgl_obj_t <|-- nbgl_switch_t
+nbgl_obj_t <|-- nbgl_progress_bar_t
+nbgl_obj_t <|-- nbgl_page_indicator_t
+nbgl_obj_t <|-- nbgl_image_t
+
+@enduml
+
+@startuml
+
+title Graphic objects composition
+
+SCREEN o-- OBJECTS
+SCREEN o-- CONTAINER
+CONTAINER o-- OBJECTS
+
+@enduml
+
+@subsection create_objects Creating graphic objects
+
+Graphic objects cannot be created dynamically so they must be statically declared.
+
+There must be at least as many declared objects as objects presented on a given screen. But objects can be reused in another
+screen, as long as they are properly set.
+
+For example, if a "Back" button is present in many different screens of the application, it can be reused, the only change being
+the touch callback.
+
+For all objects, its **type** field must be explicitly specified, even if it seems redundant with the nbgl__t.
+
+For example:
+
+@code
+ nbgl_button_t backButton = {
+ .type = BUTTON, // Type of object, MANDATORY
+ .innerColor = WHITE, // Color used inside of the button, MANDATORY
+ .borderColor = LIGHT_GRAY, // Color used for border, MANDATORY
+ .foregroundColor = BLACK, // Color used for text and/or icon, MANDATORY
+ .width = 128, // Width in pixels, MANDATORY
+ .height = 64, // Height in pixels, MANDATORY
+ .radius = 32, // Radius of corners in pixels, can be null
+ .text = "Back", // Text of the button, if NULL, only an icon
+ .fontId = BAGL_FONT_INTER_REGULAR_24, // Font used for text, if text is not null
+ .icon = &C_leftArrow32px, // Icon of the button, if NULL, only text
+ .alignmentMarginX = 20, // Horizontal margin (see layout & alignment)
+ .alignmentMarginY = 20, // Vertical margin (see layout & alignment)
+ .alignment = TOP_LEFT, // Type of alignment (see layout & alignment)
+ .alignTo = NULL, // Alignment reference, if NULL, use parent (see layout & alignment)
+ .touchMask = (1<nbChildren = 2;
+ container->children = (nbgl_obj_t**)nbgl_containerPoolGet(container->nbChildren, layer);
+
+ /* set text areas as children of container */
+ container->children[0] = (nbgl_obj_t*)&text1;
+ container->children[1] = (nbgl_obj_t*)&text2;
+
+ /* set backButton and container as children of screen */
+ screenChildren[0] = (nbgl_obj_t*)backButton;
+ screenChildren[1] = (nbgl_obj_t*)container;
+
+@endcode
+
+@subsection draw_objects Drawing graphic objects
+
+Once defined and set as children (or sub-children) of the main @ref SCREEN, all objects can be drawn in **framebuffer**
+with a simple call to @ref nbgl_screenRedraw().
+
+But if only a given object has been modified since the last redraw, for example by changing its text or its color, it can be redrawn
+(with all of its children and sub-children, if any) with a call to @ref nbgl_redrawObject().
+
+The only properties that should not have changed for this object are its dimensions and position.
+
+Except in some specific cases, the previousObj parameter of @ref nbgl_redrawObject() can be set to NULL and computeDimensions set to false.
+
+@subsection refresh Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, it is necessary to transfer the content of the **framebuffer** on display.
+This operation is called a refresh.
+
+The API to do that is @ref nbgl_refresh().
+
+It will only refresh the rectangle part of the screen having changed (with any object redrawn) since the last refresh.
+
+
+*/
diff --git a/sdk_lib_nbgl/doc/nbgl_flow.dox b/sdk_lib_nbgl/doc/nbgl_flow.dox
new file mode 100644
index 00000000..560f1db2
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_flow.dox
@@ -0,0 +1,104 @@
+#ifdef NBGL_STEP
+/** @page nbgl_flow Flow API
+
+@section nbgl_flow_intro Introduction
+This chapter describes briefly the Flow API of Advanced BOLOS Graphic Library.
+
+This layer offers a way to handle multi-steps flows in typical scenarios of Nanos OS or Apps, like a transaction, a navigation in a menu.
+
+A full description of the way to create and interact with a flow can be found in this document
+
+@section nbgl_flow_concepts Concepts
+
+This layer uses the step API described in @ref nbgl_step, but for list of steps. The navigation between steps is entirely managed
+by the flow engine.
+
+@subsection nbgl_flow_example Example
+
+\image{inline} html layout_nanos_flow1.png "caption" height=200
+
+In this example, a flow made of 4 steps (each on one page) is built. The navigation is possible between these steps (no loop), and the
+last step can be selected (double button press).
+
+@section nbgl_flow_operations Operations
+
+@subsection create_flow Draw a flow
+
+The configuration of a flow is provided in a single function call, through @ref nbgl_flowDraw() which will:
+
+- draw the first step
+- Refresh after first step drawing
+
+The arguments of @ref nbgl_flowDraw() are:
+
+- An array of step descriptions (see below)
+- The index of the step to start with in step descriptions array
+- A boolean indicating whether the flow shall be modal or not
+- A boolean indicating whether the flow is circular or not (loop)
+
+@code
+static char string_buffer[128];
+
+static void onPrepareOSversion(void);
+static void onPrepareMCUversion(void);
+static void onPrepareBootloaderversion(void);
+static void onBack(void);
+
+static nbgl_flow_t flowContext;
+
+static const nbgl_stepDesc_t flowSteps[] = {
+ {
+ .text = "\bSecure Element",
+ .subText = string_buffer,
+ .init = onPrepareOSversion
+ },
+ {
+ .text = "\bMicrocontroller",
+ .subText = string_buffer,
+ .init = onPrepareMCUversion
+ },
+ {
+ .text = "\bBootloader",
+ .subText = string_buffer,
+ .init = onPrepareBootloaderversion
+ },
+ {
+ .text = "\bBack",
+ .callback = onBack,
+ .icon = &C_icon_back
+ }
+};
+
+static void onPrepareOSversion(void) {
+ os_version((unsigned char*)string_buffer, 32);
+}
+
+static void onPrepareMCUversion(void) {
+ os_seph_version((unsigned char*)string_buffer, 32);
+}
+
+static void onPrepareBootloaderversion(void) {
+ os_bootloader_version((unsigned char*)string_buffer, 32);
+}
+
+static void onBack(void) {
+ nbgl_flowRelease(flowContext);
+ // go to parent flow
+}
+
+void displayInfo() {
+ // use string_buffer as temporary buffer
+ memset(string_buffer, 0, 128);
+ flowContext = nbgl_flowDraw(flowSteps, 4, 0, false, false);
+}
+
+@endcode
+
+@subsection page_release Releasing a predefined page
+
+Before leaving a screen built with a layout, it must be released with a call to @ref nbgl_flowRelease(). It will free the allocated
+objects.
+
+
+*/
+#endif // NBGL_STEP
diff --git a/sdk_lib_nbgl/doc/nbgl_layout.dox b/sdk_lib_nbgl/doc/nbgl_layout.dox
new file mode 100644
index 00000000..5294d3d3
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_layout.dox
@@ -0,0 +1,746 @@
+#ifdef HAVE_SE_TOUCH
+/** @page nbgl_layout Complex objects layout API
+
+@section nbgl_layout_intro Introduction
+This chapter describes briefly the mid level API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of a screen page, using complex (aggregated) objects, like a radio buttons choice or touchable areas.
+
+A full description of each functions/types can be found in this document
+
+@section concepts2 Concepts
+
+This layer uses the low-level API described in @ref nbgl_obj, but all graphic objects are hidden, in favor to abstract complex objects
+like a radio buttons choice or touchable areas.
+
+Moreover, positions of objects in the page are mostly hidden and automatic.
+
+@subsection example_1 Example 1
+
+\image{inline} html layout1.png "caption" height=300
+
+In this example, 3 "objects" are used and added to the page with dedicated APIs:
+
+- A top-right button with a customizable icon
+- A centered information area with an icon, a main text and possibly a subsidiary text under it.
+- A centered bottom button with a customizable icon
+
+@subsection example_2 Example 2
+
+\image{inline} html layout9.png "caption" height=300
+
+In this more complex example, a "tapable" container is used for the whole screen, except the footer area and the progress indicator.
+
+In the "tapable" container, 2 objects are drawn, a single pair of tag/value, and a "more" button to execute an action.
+
+@section operations Common operations
+
+@subsection create_layout Getting a new layout
+
+The first operation is always to get a new layout, with the desired parameters:
+
+- An action callback used for all controls of the page
+- A text and token to be used for action callback if a potential "tapable" container is used in page
+- A boolean indicated whether the page is modal or not (first or second plane)
+- A potential ticker configuration if a ticker is required for the page
+
+The function to actually create the layout is @ref nbgl_layoutGet()
+
+For example 1:
+
+@code
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false, // not modal (so on plane 0)
+ .onActionCallback = &myActionCallback, // generic callback for all controls
+ .onTapText = NULL, // no "tapable" main container
+ .ticker.callback = NULL // no ticker
+ };
+ // create layout
+ nbgl_layout_t *layout = nbgl_layoutGet(&layoutDescription);
+@endcode
+
+For example 2:
+
+@code
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false, // not modal (so on plane 0)
+ .onActionCallback = &myActionCallback, // generic callback for all controls
+ .onTapText = "Tap to continue", // A "tapable" main container is necessary, with this text
+ .onTapToken = TAP_TOKEN, // token to be used when main container is touched
+ .ticker.callback = NULL // no ticker
+ };
+ /* create layout */
+ nbgl_layout_t *layout = nbgl_layoutGet(&layoutDescription);
+@endcode
+
+@subsection draw_layout Drawing a populated layout
+
+Once defined and populated, all objects can be drawn in **framebuffer**
+with a simple call to @ref nbgl_layoutDraw().
+
+@section add_objects Populating a layout
+
+Once the layout is defined and retrieved with @ref nbgl_layoutGet(), the page can be filled with complex objects.
+
+If a "tapable" container is used, most objects will be added in it, except the ones on top (progress indicator or top-right button) or on
+bottom (navigation bar or bottom button).
+Otherwise objects are all added in the whole page.
+
+@subsection top_right_button Top-right button
+
+\image{inline} html layout1.png "caption" height=300
+
+This object is made of a single round button, on top right of the screen.
+
+The only properties of this object are
+
+- The 32px/32px icon to use in it
+- A \b token used with the action callback when the button is touched
+
+The API to insert such an object is @ref nbgl_layoutAddTopRightButton()
+
+\warning This object is incompatible with Progress indicator, for example
+
+@subsection bottom_button Bottom centered button
+
+\image{inline} html layout1.png "caption" height=300
+
+This object is made of a single round button, on middle bottom of the screen.
+
+The only properties of this object are:
+
+- The 32px/32px icon to use in it
+- A \b token used with the action callback when the button is touched
+
+The API to insert such an object is @ref nbgl_layoutAddBottomButton().
+
+Optionally, a thin horizontal separation can be drawn on top of the button, if \b separationLine parameter of @ref nbgl_layoutAddBottomButton()
+is true.
+
+\warning This object is incompatible with navigation bar or footer, for example
+
+@subsection footer Footer section
+
+\image{inline} html layout3.png "caption" height=300
+
+This object acts as a full width text area at the bottom of the screen.
+
+The only properties of this object are:
+
+- The text to be drawn for the footer
+- A \b token used with the action callback when the footer is touched
+
+The API to insert such an object is @ref nbgl_layoutAddFooter().
+
+A thin horizontal separation is drawn on top of the text area.
+
+\warning This object is incompatible with navigation bar or bottom button, for example
+
+@subsection split_footer Split footer section
+
+\image{inline} html layout-SplitFooter.png "caption" height=300
+
+This object acts as a two horizontally adjacent touchable text areas at the bottom of the screen.
+
+The properties of this object are:
+
+- The text to be drawn on left part of footer
+- A \b token used with the action callback when the left part of footer is touched
+- The text to be drawn on right part of footer
+- A \b token used with the action callback when the right part of footer is touched
+
+The API to insert such an object is @ref nbgl_layoutAddSplitFooter().
+
+A thin horizontal separation is drawn on top of the text areas.
+A thin vertical separation is drawn between both text areas.
+
+\warning This object is incompatible with navigation bar or bottom button, for example
+
+@subsection centered_info Centered info area
+
+\image{inline} html layout1.png "caption" height=300
+
+This object is made of:
+
+- An optional icon
+- An optional main text under the icon
+- An optional sub text under the main text
+
+The whole object is centered horizontally in the page
+
+It can be either centered vertically or put on top of the page.
+
+The API to insert such an object is @ref nbgl_layoutAddCenteredInfo(), using @ref nbgl_layoutCenteredInfo_t structure
+
+The colors and fonts for the texts depends of the \b style field used in @ref nbgl_layoutCenteredInfo_t.
+
+- if @ref LARGE_CASE_INFO, main text is in @ref BLACK and large case (INTER 32px), subText in @ref BLACK in INTER 24px
+- if @ref NORMAL_INFO, icon in black and main text in INTER 24px in @ref BLACK under it, subText in INTER 24px in @ref DARK_GRAY under it
+
+@subsection choice_buttons Choice buttons
+
+\image{inline} html layout_choice_buttons1.png "caption" height=300
+
+\image{inline} html layout_choice_buttons2.png "caption" height=300
+
+This object is made of 2 buttons, aligned vertically, each containing a text.
+
+They are put at the bottom of the main container, on top of a potential navigation bar or bottom button.
+
+Regarding colors, Top-button (index 0 in callback) is painted in @ref BLACK and is on top of Bottom-buttom (index 1 in callback)
+
+If the \b style field is @ref ROUNDED_AND_FOOTER_STYLE, Bottom-button is painted in @ref WHITE, without border.
+
+If the \b style field is @ref BOTH_ROUNDED_STYLE, Bottom-button is painted in @ref WHITE, with border.
+
+The API to insert such an object is @ref nbgl_layoutAddChoiceButtons(), with @ref nbgl_layoutChoiceButtons_t structure
+
+@subsection single_button Single button
+
+\image{inline} html layout6.png "caption" height=300
+
+This object is made of a single button, in @ref BLACK. The text and optional icon are in @ref WHITE
+
+This button occupies the full width of the screen, except if \b fittingContent field of @ref nbgl_layoutButton_t is true, and is put at the bottom of the main container, on top of a potential navigation bar or bottom button.
+
+The API to insert such an object is @ref nbgl_layoutAddButton(), with @ref nbgl_layoutButton_t structure.
+
+@subsection long_press_button Long-press button
+
+\image{inline} html layout5.png "caption" height=300
+
+This object is made of an area containing a progress-bar (empty at the initialization), a text describing the action, and a fake round @ref BLACK button
+
+The whole area is touchable and as long as touched, the progress-bar will be automatically updated. After 3s, the long-press button is considered as "touched",
+and the action callback is called with the given \b token.
+
+This button occupies the full width of the screen and is put at the bottom of the main container, on top of a potential navigation bar or bottom button.
+
+The API to insert such an object is @ref nbgl_layoutAddLongPressButton(), with the button text and token as parameters.
+
+@subsection item_values Tag/value list
+
+\image{inline} html layout4.png "caption" height=300
+
+A touchable icon can also be added on right of value:
+
+\image{inline} html layout4_bis.png "caption" height=300
+
+The parameters to draw such an item are:
+
+- Array of tag/value pairs :
+ - \b tag being a single line text displayed in @ref DARK_GRAY in 24px font
+ - \b value being a multi-line text in @ref BLACK in 32px font (auto-wrap, so long lines are automatically broken at maximum
+fitting length)
+ - \b icon being buffer containing the 32px 1BPP icon for touchable icon on right of value (can be NULL)
+- Or a callback (if the array is NULL) to retrieve the pairs one by one
+- A boolean to wrap or not value field on spaces
+- A boolean to indicate whether to use a 24 px font for value field (only used when displaying details)
+- A token that will be used as argument of the callback if icon in any tag/value pair is touched (index is the index of the pair in pairs[])
+- The maximum number of lines of value field to display (if 0, not used)
+
+This area is displayed in the main container, under the previously inserted complex object.
+
+The API to insert such an object is @ref nbgl_layoutAddTagValueList(), with @ref nbgl_layoutTagValueList_t structure
+
+@subsection touchable_bar Touchable bar
+
+\image{inline} html layout8.png "caption" height=300
+
+This horizontal bar object is made of:
+
+- An optional icon on the left, in @ref BLACK
+- An optional text, in @ref BLACK
+- An optional icon on the right, in @ref BLACK
+
+Some extra fields in @ref nbgl_layoutBar_t, enable to:
+
+- center text horizontally instead of on the left
+- gray-out the bar to deactivate it
+
+This area is displayed in the main container, under the previously inserted complex object.
+
+If \b leftIcon and \b rightIcon fields are NULL, the bar is considered as a title.
+
+When touched, if not inactivated, the \b token provided in @ref nbgl_layoutBar_t is used with the action callback. \b index parameter is not relevant.
+
+The API to insert such an object is @ref nbgl_layoutAddTouchableBar(), with @ref nbgl_layoutBar_t structure
+
+@subsection switch Switch
+
+\image{inline} html layout15.png "caption" height=300
+
+This object is made of:
+
+- A mandatory text, in @ref BLACK and bold, on the left
+- An optional text, in @ref BLACK, under the mandatory text
+- A switch, at the given initial state, on the right
+
+This area is displayed in the main container, under the previously inserted complex object.
+
+When touched, if not inactivated, the \b token provided in @ref nbgl_layoutSwitch_t is used with the action callback. \b index parameter meaning is 0 for inactive, 1 for active.
+
+The API to insert such an object is @ref nbgl_layoutAddSwitch(), with @ref nbgl_layoutSwitch_t structure
+
+@subsection radio_choices Radio button choices
+
+\image{inline} html layout11.png "caption" height=300
+
+This object is made of a vertical list of *nbChoices* items made of:
+
+- A mandatory text, in @ref BLACK, on the left
+- A radio button, on the right
+
+One and only one button is active at the same time in a single object.
+
+Each line of choice is separated from the previous one by a thin horizontal sepatation line.
+
+The active button at start-up is given in *initChoice* field of @ref nbgl_layoutRadioChoice_t.
+
+This area is displayed in the main container, under the previously inserted complex object.
+
+The API to insert such an object is @ref nbgl_layoutAddRadioChoice(), with @ref nbgl_layoutRadioChoice_t structure
+
+@subsection spinner Spinner
+
+\image{inline} html layout2.png "caption" height=300
+
+This object is a simple centered "Ledger" logo in @ref LIGHT_GRAY, with one of the corner in @ref BLACK, to
+emulate a spinner, with an explanation text under the spinner
+
+The spinner "rotating" corner will automatically be updated every 800 ms.
+
+The API to insert such an object is @ref nbgl_layoutAddSpinner().
+
+\warning No other object shall be inserted beside this one.
+
+@subsection progress_indicator Progress indicator
+
+\image{inline} html layout5.png "caption" height=300
+
+This object, drawned in top of the screen, is essentially made of a discrete page progress bar (slashes or digits).
+An optional "back" button, symbolized with a left arrow, can also be drawned on the left of the page progress.
+
+The parameters to build this object are:
+
+- The total number of pages
+- The current page (from 0 to (total_nb_pages-1))
+- A boolean to indicate whether to use a "back" button or not
+- A \b token used with the action callback when the "back" button is touched
+
+Digits are represented instead of slashes if the number of pages exceeds 10. In this case, instead of marking the active page
+as a slash in @ref BLACK, the page indicator will indicate *" of "*
+
+The API to insert such an object is @ref nbgl_layoutAddProgressIndicator().
+
+\warning This object is incompatible with top-right button and page selector.
+
+@subsection qr_code QR Code
+
+\image{inline} html layout13.png "caption" height=300
+
+This object, centered in the main container, is made of a dynamically drawned QR Code (not a picture) and description texts under it.
+
+The parameters to build this object are:
+
+- The URL corresponding to the address to draw in the QR Code
+- The optional text to draw under the QR Code (in @ref BLACK, 24px bold)
+- The optional sub text to draw under the text (in @ref BLACK, 24px regular)
+
+The API to insert such an object is @ref nbgl_layoutAddQRCode(), with @ref nbgl_layoutQRCode_t structure as parameter.
+
+\warning This object is incompatible with top-right button and progress indicator.
+
+@subsection keyboard_section Keyboard-related objects
+
+Some rare screens require displaying a keyboard at the bottom of the page, to enter text.
+
+The text to enter may be a generic string or a word (for example BIP39).
+In the first case, a simple confirmation button is also displayed in the screen.
+In the second case, usually suggestion buttons are displayed to avoid issues with unknown words and save time.
+
+Here are some example of these pages in Bolos UX:
+
+\image{inline} html keyboard-usages.png "caption" height=300
+
+To build such screens, some dedicated APIs are necessary, which will be detailed in the sub-chapters.
+
+@subsubsection keyboard_sub_section_1 Adding/Updating keyboard
+
+This object, at the bottom of the main container (with a margin), proposes a Qwerty keyboard.
+
+The parameters to configure this object are:
+
+- The mode in which to start the keyboard (letters, digits or special characters)
+- A boolean to indicate whether to display letters in upper or lower case
+- A boolean to indicate whether to display only letters, with no space and no shift key to switch between modes
+- A 32 bits mask used to invalidate (remove) some keys on the keyboard.
+- A function called when an active key is pressed
+
+The API to insert such an object is @ref nbgl_layoutAddKeyboard(), with @ref nbgl_layoutKbd_t structure as parameter.
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateKeyboard() function,
+used to modify the mask of an existing keyboard.
+
+@note the 32 bits mask works like this:
+- If mask[0] bit is 1, the 'q' key is invalid
+- If mask[1] bit is 1, the 'w' key is invalid
+- And so on in "qwertyuiopasdfghjklzxcvbnm" string.
+- "space" key has index 29.
+
+@subsubsection keyboard_sub_section_2 Adding/Updating confirmation button
+
+This object, on top of an already added keyboard (the order in function calls is important) consists in a
+black background and white text button.
+
+The parameters to configure this object are:
+
+- The \b text to display in button
+- A boolean to indicate whether to activate/deactivate the button (when deactivated, it is grayed-out)
+- A \b token used with the action callback when the button is touched
+- The tune ID to play when any button is pressed
+
+The API to insert such an object is @ref nbgl_layoutAddConfirmationButton().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateConfirmationButton() function,
+used to modify the text or the state of the button (active/inactive).
+
+\warning This object is incompatible with suggestion buttons.
+
+@subsubsection keyboard_sub_section_3 Adding/Updating suggestion buttons
+
+This set of objects, on top of an already added keyboard (the order in function calls is important) consists in 0 to 4
+black background and white text buttons (2 rows x 2 columns).
+
+The parameters to configure this set are:
+
+- The number of actually used (=displayed) buttons
+- An array of 4 strings for buttons (not used can be NULL)
+- An integer for first token used for buttons, provided in onActionCallback (the next 3 integers will be used for other buttons)
+- The tune ID to play when any button is pressed
+
+The API to insert such an object is @ref nbgl_layoutAddSuggestionButtons().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateSuggestionButtons() function,
+used to modify the texts or the number of used buttons.
+
+\warning This object is incompatible with confirmation button.
+
+@subsubsection keyboard_sub_section_4 Adding/Updating entered text
+
+This object, displayed under a potential text (or under the back key) consists in a potential number, followed by a centered text
+representing the text entered with the keyboard. A thin gray line is also displayed under the text
+
+If text is too long to be displayed, the beginning is replaced by "..."
+
+The parameters to configure this object are:
+
+- The \b text to display
+- A boolean to indicate whether to displayed a number at the beginning of the line
+- A number to display at the beginning of the line (if \b numbered is true)
+- A boolean to indicate whether to display the text in gray or not.
+
+The API to insert such an object is @ref nbgl_layoutAddEnteredText().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateEnteredText() function,
+used to modify the text or the number preceding it.
+
+@subsubsection keyboard_example_1 Example 1
+
+\image{inline} html keyboard-example1.png "caption" height=300
+
+Here is the source code to display this first example:
+
+@code
+enum {
+ BACK_BUTTON_TOKEN = 0,
+ CONTINUE_BUTTON_TOKEN,
+ KBD_TEXT_TOKEN
+};
+
+static char textToEnter[48];
+static nbgl_layout_t *layout;
+static int textIndex;
+
+// function called when back or continue button is touched
+static void layoutTouchCallback(int token, uint8_t index) {
+ if (token == BACK_BUTTON_TOKEN) {
+ // go back to main screen of app
+ nbgl_layoutRelease(layout);
+ app_main();
+ }
+ else if (token == CONTINUE_BUTTON_TOKEN) {
+ // do something with entered text
+
+ // go back to main screen of app
+ nbgl_layoutRelease(layout);
+ app_main();
+ }
+ else if (token == KBD_TEXT_TOKEN) {
+ // do something with entered text
+ }
+}
+
+// function called when a key of keyboard is touched
+static void keyboardCallback(char touchedKey) {
+ // if not Backspace
+ if (touchedKey != BACKSPACE_KEY) {
+ int textLen = strlen(textToEnter);
+ textToEnter[textLen] = touchedKey;
+ textToEnter[textLen+1] = '\0';
+ }
+ else { // backspace
+ int textLen = strlen(textToEnter);
+ if (textLen == 0)
+ return;
+ textToEnter[textLen-1] = '\0';
+ }
+ // be sure to redraw the text
+ nbgl_layoutUpdateEnteredText(layout,textIndex,false,0,textToEnter,false);
+}
+
+void app_keyboard(void) {
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false,
+ .onActionCallback = &layoutTouchCallback
+ };
+ nbgl_layoutKbd_t kbdInfo = {
+ .callback = keyboardCallback,
+ .keyMask = 0, // no inactive key
+ .lettersOnly = false, // full keyboard
+ .mode = MODE_LETTERS, // start in letters mode
+ .upperCase = false // start with lower case letters
+ };
+ nbgl_layoutCenteredInfo_t centeredInfo = {
+ .text1 = NULL,
+ .text2 = "Enter passphrase:", // to use as "header"
+ .text3 = NULL,
+ .style = LARGE_CASE_INFO,
+ .icon = NULL,
+ .offsetY = 0,
+ .onTop = true
+ };
+ // get layout
+ layout = nbgl_layoutGet(&layoutDescription);
+ // add back key
+ nbgl_layoutAddProgressIndicator(layout, 0, 0, true, BACK_BUTTON_TOKEN, TUNE_TAP_CASUAL);
+ // add header
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+ // add keyboard
+ nbgl_layoutAddKeyboard(layout, &kbdInfo);
+ // add confirmation button
+ nbgl_layoutAddConfirmationButton(layout, "Continue", CONTINUE_BUTTON_TOKEN, TUNE_TAP_CASUAL);
+ // add entered text field and memorize index
+ strcpy(textToEnter,"Yellow23@");
+ textIndex = nbgl_layoutAddEnteredText(layout,
+ false, // not numbered
+ 0, // not used
+ textToEnter, // text to display
+ false, // not grayed-out
+ 32, // vertical margin from the button
+ KBD_TEXT_TOKEN); // token used when this area is touched
+
+ // draw layout
+ nbgl_layoutDraw(layout);
+}
+@endcode
+
+@subsubsection keyboard_example_2 Example 2
+
+\image{inline} html keyboard-example2.png "caption" height=300
+
+Here is the source code to display this second example (with simulated transitions):
+
+@code
+enum {
+ BACK_BUTTON_TOKEN = 0,
+ FIRST_SUGGESTION_TOKEN,
+ KBD_TEXT_TOKEN
+};
+
+static nbgl_layout_t *layout;
+static char textToEnter[20];
+static char headerText[48];
+static nbgl_layout_t *layout;
+static int textIndex, suggestionIndex, keyboardIndex;
+static int wordNum;
+static char *buttonTexts[NB_MAX_SUGGESTION_BUTTONS] = {0};
+
+// function called when back or any suggestion button is touched
+static void layoutTouchCallback(int token, uint8_t index) {
+ if (token == BACK_BUTTON_TOKEN) {
+ // go back to main screen of app
+ nbgl_layoutRelease(layout);
+ app_main();
+ }
+ else if (token >= FIRST_SUGGESTION_TOKEN) {
+ // do something with touched button
+ printf("Selected word is %s\n", buttonTexts[token - FIRST_SUGGESTION_TOKEN]);
+
+ // go back to main screen of app
+ nbgl_layoutRelease(layout);
+ app_main();
+ }
+}
+
+// function called when a key of keyboard is touched
+static void keyboardCallback(char touchedKey) {
+ // if not Backspace
+ if (touchedKey != BACKSPACE_KEY) {
+ int textLen = strlen(textToEnter);
+ textToEnter[textLen] = touchedKey;
+ textToEnter[textLen+1] = '\0';
+ }
+ else { // backspace
+ int textLen = strlen(textToEnter);
+ if (textLen == 0)
+ return;
+ textToEnter[textLen-1] = '\0';
+ }
+ if (textLen == 0) {
+ // remove any suggestion buttons because empty string
+ nbgl_layoutUpdateSuggestionButtons(layout,suggestionIndex,0,buttonTexts);
+ // clear keyboard mask
+ nbgl_layoutUpdateKeyboard(layout,keyboardIndex, 0x0, LOWER_CASE);
+ }
+ else {
+ // find up to NB_MAX_SUGGESTION_BUTTONS words beginning with textToEnter
+ int nbMatchingWords = getWordsBeginningWith(textToEnter, buttonTexts, NB_MAX_SUGGESTION_BUTTONS);
+ // use them for buttons
+ nbgl_layoutUpdateSuggestionButtons(layout,suggestionIndex,nbMatchingWords,buttonTexts);
+ // get keys to mask on keyboard for possible next letters
+ uint32_t mask = getKeyboardMask(textToEnter);
+ // use it for keyboard
+ nbgl_layoutUpdateKeyboard(layout,keyboardIndex, mask, LOWER_CASE);
+ }
+ // be sure to redraw the text
+ nbgl_layoutUpdateEnteredText(layout,textIndex,false,0,textToEnter,false);
+
+ // and refresh screen
+ nbgl_refresh();
+}
+
+void app_keyboard(void) {
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false,
+ .onActionCallback = &layoutTouchCallback
+ };
+ nbgl_layoutKbd_t kbdInfo = {
+ .callback = keyboardCallback,
+ .keyMask = 0, // no inactive key
+ .lettersOnly = true, // use only letters
+ .mode = MODE_LETTERS, // start in letters mode
+ .upperCase = false // start with lower case letters
+ };
+ nbgl_layoutCenteredInfo_t centeredInfo = {
+ .text1 = NULL,
+ .text2 = headerText, // to use as "header"
+ .text3 = NULL,
+ .style = LARGE_CASE_INFO,
+ .icon = NULL,
+ .offsetY = 0,
+ .onTop = true
+ };
+ // get layout
+ layout = nbgl_layoutGet(&layoutDescription);
+ // add back key
+ nbgl_layoutAddProgressIndicator(layout, 0, 0, true, BACK_BUTTON_TOKEN, TUNE_TAP_CASUAL);
+ // add header
+ wordNum = 1;
+ sprintf("Enter word no.%d from your Recovery Sheet",wordNum);
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+ // add keyboard and memorize index
+ keyboardIndex = nbgl_layoutAddKeyboard(layout, &kbdInfo);
+ // add suggestion words (will be removed later) and memorize index
+ suggestionIndex = nbgl_layoutAddSuggestionButtons(layout,
+ 0, // no used buttons at start-up
+ buttonTexts,
+ FIRST_SUGGESTION_TOKEN,
+ TUNE_TAP_CASUAL);
+ // add entered text field and memorize index
+ strcpy(textToEnter,"");
+ textIndex = nbgl_layoutAddEnteredText(layout,
+ true, // numbered
+ wordNum, // number to use
+ textToEnter, // text to display
+ false, // not grayed-out
+ 32, // vertical margin from the buttons
+ KBD_TEXT_TOKEN);
+ // draw layout
+ nbgl_layoutDraw(layout);
+}
+@endcode
+
+@subsection keypad_section Keypad-related objects
+
+Some rare screens require displaying a keypad at the bottom of the page, to enter digits.
+
+The digits to enter are usually a PIN code, so enter or to confirm.
+
+Here are some example of these pages in Bolos UX:
+
+\image{inline} html keypad-usages.png "caption" height=300
+
+To build such screens, some dedicated APIs are necessary, which will be detailed in the sub-chapters.
+
+@subsubsection keypad_sub_section_1 Adding/Updating keypad
+
+This object, at the bottom of the main container (with a margin), proposes a regular keypad, with 10 digits, a backspace and a validate keys.
+
+The only parameters to configure this object are:
+
+- the callback associated with active keypad keys touch events. Only digit keys are active.
+- a boolean to choose between shuffled and regular digits.
+
+The API to insert such an object is @ref nbgl_layoutAddKeypad().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateKeypad() function,
+used to modify the mask (active keys) of an existing keypad.
+
+@subsubsection keypad_sub_section_2 Adding/Updating hidden digits area
+
+This object, displayed under a potential text (or under the back key) consists in up to 8 discs (invisible or visible) corresponding to
+hidden entered/not entered digits.
+
+The parameters to configure this object are:
+
+- The number of total digits to be displayed (all digits are considered as "not entered")
+
+The API to insert such an object is @ref nbgl_layoutAddHiddenDigits().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateHiddenDigits() function,
+used to modify the number of entered digits.
+
+
+@section refresh_layout Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, it is necessary to transfer the content of the **framebuffer** on display.
+This operation is called a refresh.
+
+The API to do that is @ref nbgl_refresh() (in nbgl_obj.h)
+
+It will only refresh the rectangle part of the screen having changed (with objects redrawn) since the last refresh.
+
+@section callbacks Control actions management
+
+Some controls, like a touchable bar, or a choice by radio buttons, can be interacted with thanks to the Touchscreen.
+
+The developer can subscribe to these events by providing an action callback in @ref nbgl_layoutGet(), with @ref nbgl_layoutTouchCallback_t prototype.
+
+The first parameter (*token*) of this function is a token provided along with the definition of the complex object.
+
+The second parameter (*index*) is only used for some types of complex objects:
+
+- **Navigation bar**: in this case, *index* gives the index of the new active page, when navigating.
+- **Radio button choices**: in this case, *index* gives the index of the selected choice.
+- **Switches**: in this case, if *index* is 0 it means OFF, otherwise it means ON.
+- **Choice buttons**: in this case, if *index* is 0, it means top-button (choice 1), otherwise it means bottom-buttom (choice 2)
+
+@subsection release Releasing a layout
+
+Before leaving a screen built with a layout, it must be released with a call to @ref nbgl_layoutRelease(). It will free the potentially allocated
+objects.
+
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/nbgl_layout_nanos.dox b/sdk_lib_nbgl/doc/nbgl_layout_nanos.dox
new file mode 100644
index 00000000..7b8b22c4
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_layout_nanos.dox
@@ -0,0 +1,309 @@
+#ifndef HAVE_SE_TOUCH
+/** @page nbgl_layout Complex objects layout API
+
+@section nbgl_layout_intro Introduction
+This chapter describes briefly the mid level API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of a screen page, using complex (aggregated) objects, like a centered info or a set of navigation arrows.
+
+A full description of each functions/types can be found in this document
+
+@section concepts2 Concepts
+
+This layer uses the low-level API described in @ref nbgl_obj, but all graphic objects are hidden, in favor to abstract complex objects
+like a centered info or a set of navigation arrows.
+
+Moreover, positions of objects in the page are mostly hidden and automatic.
+
+@subsection example_1 Example
+
+\image{inline} html layout_nanos_1.png "caption" height=300
+
+In this example, 2 "objects" are used and added to the page with dedicated APIs:
+
+- A centered information area with an icon and a main text
+- A set of navigation arrows, indicating that the user can use left/right buttons to navigated across pages
+
+@section operations Common operations
+
+@subsection create_layout Getting a new layout
+
+The first operation is always to get a new layout, with the desired parameters:
+
+- An action callback used for all controls of the page
+- A boolean indicated whether the page is modal or not (on top of existing ones, or in background plane)
+- A potential ticker configuration if a ticker is required for the page
+
+The function to actually create the layout is @ref nbgl_layoutGet()
+
+For example:
+
+@code
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false, // not modal (so on plane 0)
+ .onActionCallback = &myActionCallback, // generic callback for all controls
+ .ticker.callback = NULL // no ticker
+ };
+ // create layout
+ nbgl_layout_t *layout = nbgl_layoutGet(&layoutDescription);
+@endcode
+
+@subsection draw_layout Drawing a populated layout
+
+Once defined and populated, all objects can be drawn in **framebuffer**
+with a simple call to @ref nbgl_layoutDraw().
+
+@section add_objects Populating a layout
+
+Once the layout is defined and retrieved with @ref nbgl_layoutGet(), the page can be filled with complex objects.
+
+@subsection centered_info Centered info area
+
+\image{inline} html layout_nanos_centered.png "caption" height=300
+
+This object is made of:
+
+- An optional icon
+- An optional main text under the icon
+- An optional sub text under the main text
+
+The whole object is centered horizontally in the page
+
+It can be either centered vertically or put on top of the page.
+
+The API to insert such an object is @ref nbgl_layoutAddCenteredInfo(), using @ref nbgl_layoutCenteredInfo_t structure
+
+The fonts for the texts depends of the \b style field used in @ref nbgl_layoutCenteredInfo_t.
+
+- if @ref REGULAR_INFO, main text and sub text are in regular case
+- if @ref BOLD_TEXT1_INFO, main text is in bold case (and sub text in regular case)
+
+@subsection navigation Navigation area
+
+\image{inline} html layout_nanos_nav1.png "caption" height=300
+
+or
+
+\image{inline} html layout_nanos_nav2.png "caption" height=300
+
+
+This object is made of:
+
+- 1 or 2 arrows on left and right of the screen
+
+The arrows are centered vertically in the page
+
+There are two styles for the arrows:
+
+- either @ref HORIZONTAL_NAV for navigation between pages
+- or @ref VERTICAL_NAV for navigation between menu items
+
+The API to insert such an object is @ref nbgl_layoutAddNavigation(), using @ref nbgl_layoutNavigation_t structure
+
+The "direction" and the number of arrows (left, right or both) to use are set in @ref nbgl_layoutNavigation_t.
+
+@subsection menu_list Menu List area
+
+\image{inline} html layout_nanos_menu_list.png "caption" height=300
+
+On screen, the visible part of his object is made of up to 5 menu item elements (single line, centered horizontally)
+
+The first and last of the 5 lines are only partially visible (horizontal cut)
+
+The API to insert such an object is @ref nbgl_layoutAddMenuList(), using @ref nbgl_layoutMenuList_t structure,
+which enables to configure:
+
+- The total number of items in the list.
+- The selected item index in the list (that will be highlighted in bold, and always be centered vertically)
+- A callback that will be called to get the text of each displayed menu item
+
+@subsection keyboard_section Keyboard-related objects
+
+Some rare screens require displaying a keyboard at the bottom of the page, to enter text.
+
+The text to enter may be a generic string or a word (for example BIP39).
+
+Here is an example of these pages in Bolos UX:
+
+\image{inline} html layout_nanos_keyboard1.png "caption" height=300
+
+To build such screens, some dedicated APIs are necessary, which will be detailed in the sub-chapters.
+
+@subsubsection keyboard_sub_section_1 Adding/Updating keyboard
+
+This object, in the center of screen (with a margin), proposes a rotating keyboard, displaying 3 letters at max,
+(from 'a' to 'z' in letters-only).
+
+The parameters to configure this object are:
+
+- The mode in which to start the keyboard (letters, digits or special characters)
+- A boolean to indicate whether to display only letters, with no space and no shift key to switch between modes
+- A boolean to indicate whether to display a backspace key or not.
+- A boolean to indicate whether to display a validate key or not.
+- A 32 bits mask used to invalidate (remove) some keys on the keyboard (in letters-only mode).
+- A function to be called when an active key is pressed
+
+The API to insert such an object is @ref nbgl_layoutAddKeyboard(), with @ref nbgl_layoutKbd_t structure as parameter.
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateKeyboard() function,
+used to modify an existing keyboard.
+
+@note the 32 bits mask works like this:
+- If mask[0] bit is 1, the 'a' key is invalid
+- If mask[1] bit is 1, the 'b' key is invalid
+- And so on in "abcdefghijklmnopqrstuvwxyz" string.
+- If mask[26] bit is 1, the backspace key is not used
+
+@subsubsection keyboard_sub_section_4 Adding/Updating entered text
+
+This object, displayed under the keyboard consists in a set of 9 placeholders
+representing the text entered with the keyboard.
+
+If text is too long to be displayed (more than 8 characters), the beginning is replaced by ".."
+
+The only parameter to configure this object is:
+
+- The \b text to display
+
+The API to insert such an object is @ref nbgl_layoutAddEnteredText().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateEnteredText() function,
+used to modify the text.
+
+@subsubsection keyboard_example Example
+
+Here is the source code to display the example:
+
+@code
+static nbgl_layout_t *layout;
+static char textToEnter[10];
+static char headerText[24];
+static int textIndex, keyboardIndex;
+
+// function called when a key of keyboard is touched
+static void keyboardCallback(char touchedKey) {
+
+}
+
+void app_keyboard(void) {
+ nbgl_layoutDescription_t layoutDescription = {
+ .modal = false,
+ .onActionCallback = NULL
+ };
+ nbgl_layoutKbd_t kbdInfo = {
+ .callback = keyboardCallback,
+ .keyMask = 1<<26, // no masked letter but masked backspace
+ .lettersOnly = true // only letters are allowed
+ };
+ nbgl_layoutCenteredInfo_t centeredInfo = {
+ .text1 = descriptionTxt,
+ .text2 = NULL,
+ .icon = NULL,
+ .onTop = true
+ };
+ nbgl_layoutNavigation_t navInfo = {
+ .direction = HORIZONTAL_NAV,
+ .indication = LEFT_ARROW | RIGHT_ARROW
+ };
+ int status;
+
+ // create description text
+ sprintf(headerText,"Enter word #%d",12);
+
+ // get empty layout
+ layout = nbgl_layoutGet(&layoutDescription);
+ // add description
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+
+ // add keyboard
+ status = nbgl_layoutAddKeyboard(layout, &kbdInfo);
+ if (status < 0)
+ return;
+ keyboardIndex = (uint8_t)status;
+ // add empty entered text
+ status = nbgl_layoutAddEnteredText(layout, "");
+ if (status < 0)
+ return;
+ textIndex = (uint8_t)status;
+ nbgl_layoutAddNavigation(layout, &navInfo);
+ nbgl_layoutDraw(layout);
+ nbgl_refresh();
+}
+@endcode
+
+@subsection keypad_section Keypad-related objects
+
+Some rare screens require displaying a keypad at the bottom of the page, to enter digits.
+
+The digits to enter are usually a PIN code, to enter or to confirm.
+
+Here are some example of these pages in Bolos UX:
+
+\image{inline} html layout_nanos_keypad1.png "caption" height=300
+
+To build such screens, some dedicated APIs are necessary, which will be detailed in the sub-chapters.
+
+@subsubsection keypad_sub_section_1 Adding/Updating keypad
+
+This object is made of an area at the bottom of the screen, presenting the 10 digits, a backspace and a validate keys, that can be navigated
+with left and right buttons and selected with both buttons. And a title at the top of the screen.
+
+The only parameters to configure this object (at creation time) are:
+
+- the callback associated with active keypad key selection.
+- a boolean to choose between shuffled (selection starts with any key) and regular mode (selection starts at '5' key).
+- a single line string to use as title.
+
+The API to insert such an object is @ref nbgl_layoutAddKeypad().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateKeypad() function,
+used to modify the active keys of an existing keypad (backspace and validate keys).
+
+@note at creation time, backspace and validate keys are inactive
+
+@subsubsection keypad_sub_section_2 Adding/Updating hidden digits area
+
+This object, displayed on top of the keypad, consists in up to 8 discs (plain or empty) corresponding to
+hidden entered/not entered digits.
+
+The parameters to configure this object are:
+
+- The number of total digits to be displayed (all digits are considered as "not entered")
+
+The API to insert such an object is @ref nbgl_layoutAddHiddenDigits().
+
+This function returns a positive integer (if successful) to be used as an index in @ref nbgl_layoutUpdateHiddenDigits() function,
+used to modify the number of entered digits.
+
+@section refresh_layout Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, it is necessary to transfer the content of the **framebuffer** on display.
+This operation is called a refresh.
+
+The API to do that is @ref nbgl_refresh() (in nbgl_obj.h)
+
+It will only refresh the rectangle part of the screen having changed (with objects redrawn) since the last refresh.
+
+@section callbacks Control actions management
+
+Some controls, like a touchable bar, or a choice by radio buttons, can be interacted with thanks to the Touchscreen.
+
+The developer can subscribe to these events by providing an action callback in @ref nbgl_layoutGet(), with @ref nbgl_layoutTouchCallback_t prototype.
+
+The first parameter (*token*) of this function is a token provided along with the definition of the complex object.
+
+The second parameter (*index*) is only used for some types of complex objects:
+
+- **Navigation bar**: in this case, *index* gives the index of the new active page, when navigating.
+- **Radio button choices**: in this case, *index* gives the index of the selected choice.
+- **Switches**: in this case, if *index* is 0 it means OFF, otherwise it means ON.
+- **Choice buttons**: in this case, if *index* is 0, it means top-button (choice 1), otherwise it means bottom-buttom (choice 2)
+
+@subsection release Releasing a layout
+
+Before leaving a screen built with a layout, it must be released with a call to @ref nbgl_layoutRelease(). It will free the potentially allocated
+objects.
+
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/nbgl_page.dox b/sdk_lib_nbgl/doc/nbgl_page.dox
new file mode 100644
index 00000000..13166e51
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_page.dox
@@ -0,0 +1,248 @@
+#ifdef NBGL_PAGE
+/** @page nbgl_page Predefined pages API
+
+@section nbgl_page_intro Introduction
+This chapter describes briefly the high-level API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of a screen page, using predefined pages, like a consent page for example.
+
+A full description of each predefined page can be found in this document
+
+@section nbgl_page_concepts Concepts
+
+This layer uses the mid-level API described in @ref nbgl_layout, but all objects are hidden, in favor to fields to configure, for example
+texts, icons, tokens for callbacks.
+
+Moreover, positions of objects in the page are mostly hidden and automatic.
+
+@subsection nbgl_page_example_1 Example 1
+
+\image{inline} html page1.png "caption" height=300
+
+In this example, a generic information page is used with some configurable fields:
+
+- Top-right button icon type and token when touched
+- Centered information icon, main text and possibly a subsidiary text under it.
+- Centered-bottom button icon type and token when touched
+
+@subsection nbgl_page_example_2 Example 2
+
+\image{inline} html page2.png "caption" height=300
+
+In this more complex example, we use a multi-pages configuration. In this configuration, we decided to use
+the navigation between pages by "tapping" on container to go forward, use the "Back" arrow in progress indicator (top-left of the page)
+to go backward, and footer to exit navigation.
+
+In the "tapable" container, we use a content of type @ref INFO_LONG_PRESS, containing a centered info and a long-press button.
+
+@section nbgl_page_operations Operations
+
+@subsection create_page Draw a predefined page
+
+The configuration of a page is provided in a single function call, and all predefined pages APIs will do the following operations:
+
+- Create the page
+- Add required complex objects in the page
+- Draw the objects in the **framebuffer**
+
+A few APIs are available to draw typical pages, like:
+
+- @ref nbgl_pageDrawLedgerInfo() to draw a simple centered text in a center info in large case, with a round check icon (typically to provide the status of an action)
+- @ref nbgl_pageDrawSpinner() to draw a spinner (typically a waiting screen)
+- @ref nbgl_pageDrawInfo() to draw a centered info with potential footer (or bottom button), "tapable" container and top-right button
+- @ref nbgl_pageDrawConfirmation() to draw a typical confirmation screen, for example when rejecting a transaction (with 1 button for confirmation)
+
+In addition, in order to factorize some code, a generic function is available to draw generic content, either for a single page
+or for a multi-pages configuration.
+
+- @ref nbgl_pageDrawGenericContent()
+
+@subsection page_typical_types Typical page types
+
+@subsubsection page_ledger_info Ledger information
+
+\image{inline} html page3.png "caption" height=300
+
+This type is intended to draw a simple centered text in large case, with a round check icon (typically to provide the status of an action)
+
+The API to insert such an object is @ref nbgl_pageDrawLedgerInfo() with:
+
+- The text to draw in centered info
+- A potential ticker configuration.
+
+@subsubsection page_spinner Spinner
+
+\image{inline} html page4.png "caption" height=300
+
+This type is intended to to draw a spinner (typically a waiting screen)
+
+The API to insert such an object is @ref nbgl_pageDrawSpinner() with:
+
+- The text to draw.
+
+@subsubsection page_info Generic information
+
+\image{inline} html page_drawInfo1.png "caption" height=300
+
+This type is intended to draw a centered info.
+In addition of this centered info, this page can offer controls to interact with the info:
+
+- A potential footer or bottom button
+- A potential "tapable" container
+- A potential top-right button
+
+The API to insert such an object is @ref nbgl_pageDrawInfo() with the @ref nbgl_pageInfoDescription_t structure, containing:
+
+- The text and token to use for a footer.
+- The icon and token to use for a bottom button.
+- The icon and token to use for a top-right button.
+- The centered information parameters (icon, text, sub-text...).
+
+An optional "action" button can also be displayed for the following case:
+
+\image{inline} html page_drawInfo2.png "caption" height=300
+
+In this case, the \b actionButtonText field of @ref nbgl_pageInfoDescription_t can be used, and \b bottomButtonsToken is used in
+\b actionCallback param, with \b index = 0 for action button, and \b index = 1 for quit button.
+
+
+@subsubsection page_confirmation Confirmation page
+
+\image{inline} html page6.png "caption" height=300
+
+This type is intended to draw a typical confirmation screen, for example when rejecting a transaction (with 1 button for confirmation).
+In addition of a centered info, this page offer control to interact with the info:
+
+- A bottom button to cancel
+- A single button to confirm
+
+The API to insert such an object is @ref nbgl_pageDrawConfirmation() with the @ref nbgl_pageConfirmationDescription_t structure, containing:
+
+- The text and token to use for the confirmation button.
+- The text and token to use for the bottom button.
+- The centered information parameters (icon, text, sub-text...).
+
+@subsection page_generic_types Generic content pages
+
+@subsubsection page_generic_content Generic content types
+
+The different types of generic content are given in @ref nbgl_pageContentType_t enumeration.
+
+- @ref CENTERED_INFO is used to draw a centered info. The structure containing data to build it is @ref nbgl_layoutCenteredInfo_t
+- @ref INFO_LONG_PRESS is used to draw a centered info and a long press button. The structure containing data to build it is @ref nbgl_pageInfoLongPress_t
+- @ref INFO_BUTTON is used to draw a centered info and a simple black button. The structure containing data to build it is @ref nbgl_pageInfoButton_t
+- @ref TAG_VALUE_LIST is used to draw alist of tag/value pairs. The structure containing data to build it is @ref nbgl_layoutTagValueList_t
+
+\image{inline} html page15.png "caption" height=300
+
+The \b smallCaseForValue field is used to indicate whether to use a 32px (false) or 24px (true) font for \b value text. Normally, the small font is
+supposed to be used only to display details.
+
+- @ref TAG_VALUE_DETAILS is used to draw a tag/value pair and a small button to get details on it. The structure containing data to build it is @ref nbgl_pageTagValueDetails_t
+
+\image{inline} html page14.png "caption" height=300
+
+The "details" button is only displayed if the \b value text is longer than 9 lines. And in this case, the \b value text is truncated at the 6th line, and
+"..." is used to show that the text is truncated.
+
+- @ref TAG_VALUE_CONFIRM is used to draw tag/value pairs and a potential confirmation button in the same page. The structure containing data to build it is @ref nbgl_pageTagValueConfirm_t
+
+\image{inline} html page-TagValueConfirm.png "caption" height=300
+
+The "details" button is only displayed if the \b detailsButtonText is not NULL.
+
+- @ref SWITCHES_LIST is used to draw a list of switches with descriptions. The structure containing data to build it is @ref nbgl_pageSwitchesList_t
+
+\image{inline} html page16.png "caption" height=300
+
+- @ref INFOS_LIST is used to draw a list of infos with titles. The structure containing data to build it is @ref nbgl_pageInfoList_t
+
+\image{inline} html page13.png "caption" height=300
+
+- @ref CHOICES_LIST is used to draw a list of choices through radio buttons. The structure containing data to build it is @ref nbgl_layoutRadioChoice_t
+
+\image{inline} html page11.png "caption" height=300
+
+- @ref BARS_LIST is used to draw a list of touchable bars (with > on the right to go to sub-pages). The structure containing data to build it is @ref nbgl_pageBarsList_t
+
+\image{inline} html page17.png "caption" height=300
+
+@subsubsection page_generic_single Generic content page API
+
+This type is intended to draw generic content for single or multi-pages, with an optional way to navigate.
+It doesn't directly manage the different pages, but it provides control to draw a new page when the navigation is used.
+
+The API to create such a page is @ref nbgl_pageDrawGenericContent().
+
+- The first parameter provides the action callback (for all controls)
+- The second one, if not NULL, provides the navigation parameters (see next chapter)
+- The last one provides the content of the page itself
+
+@subsubsection page_generic_navigation Generic content page navigation
+
+When used in a multi-pages configuration, the developer must provide a way to navigate between pages.
+
+There are two main possibilities, with extra-options:
+
+- Either with a navigation bar on the bottom on the screen (if \b navType field of @ref nbgl_pageNavigationInfo_t is set to @ref NAV_WITH_BUTTONS)
+- Or with a tapable container and back button in progress indicator (if \b navType field of @ref nbgl_pageNavigationInfo_t is set to @ref NAV_WITH_TAP)
+
+Navigation with buttons in bottom bar:
+
+In this case, all specific parameters can be found in @ref nbgl_pageNavWithButtons_t :
+
+- The navigation token used when pressing back (left) or forward (right) buttons.
+- A boolean to decide whether a Quit button (X) is used in addition of navigation buttons (in this case, the token value is @ref EXIT_PAGE)
+
+Navigation with "tap":
+
+In this case, all specific parameters can be found in @ref nbgl_pageNavWithTap_t :
+
+- a boolean to decide whether a back button (left arrow) is displayed in the top left corner (if page >=1)
+- a token attached to this potential back button
+- a text used as indication for "Tap to continue", to navigate forward
+- a token used as argument of the action callback when the main container is "taped"
+- the main text displayed in footer, used to quit. If NULL, no footer to quit.
+- the second text displayed in footer (on the right), used to skip. If NULL, only main text is displayed
+- a token used as argument of the action callback when the second text displayed in footer is touched
+
+Common parameters:
+
+Some navigation parameters are common to both types:
+
+- the index of the page to display at start-up (from 0 to (nb_pages-1))
+- the number of pages to display (if <2, no navigation bar)
+- the token used as argument of the action callback when the footer or the quit (X) button is touched
+- a boolean to display a progress indicator on top of the page or not
+
+@subsection page_refresh_page Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, it is necessary to transfer the content of the **framebuffer** on display.
+This operation is called a refresh.
+
+The API to do that is @ref nbgl_refresh() (in nbgl_obj.h)
+
+It will only refresh the rectangle part of the screen having changed (with objects redrawn) since the last refresh.
+
+@subsection page_callbacks Control actions management
+
+Some controls, like touchable bars, or a choice by radio buttons, can be interacted with thanks to the Touchscreen.
+
+The developer can subscribe to these events by providing an action callback in @ref nbgl_layoutGet(), with @ref nbgl_layoutTouchCallback_t prototype.
+
+The first parameter (*token*) of this function is a token provided along with the definition of the complex object.
+
+The second parameter (*index*) is only used for some types of complex objects:
+
+- **Navigation bar**: in this case, *index* gives the index of the new active page, when navigating (or @ref EXIT_PAGE when quit button is pressed).
+- **Radio buttons choice**: in this case, *index* gives the index of the selected choice.
+- **Switches**: in this case, if *index* is 0 it means OFF, otherwise it means ON.
+
+@subsection page_release Releasing a predefined page
+
+Before leaving a screen built with a layout, it must be released with a call to @ref nbgl_pageRelease(). It will free the allocated
+objects.
+
+
+*/
+#endif // NBGL_PAGE
diff --git a/sdk_lib_nbgl/doc/nbgl_screens_objs.dox b/sdk_lib_nbgl/doc/nbgl_screens_objs.dox
new file mode 100644
index 00000000..2f15980d
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_screens_objs.dox
@@ -0,0 +1,74 @@
+/** @page nbgl_screens_and_objs Screens Stack and dynamic objects management
+
+@section nbgl_screens_and_objs_intro Introduction
+This chapter describes briefly how \b NBGL manages the screens stack and the dynamically allocated objects
+
+@section nbgl_screens_mngt Screens stack management
+
+All windows are full screens, some of them are considered as modals when they are displayed on top of existing ones, catching all user events (on Touchscreen), and giving back the display (and the focus) once they are dismissed.
+
+Let's take the simple example of pin-validation window, which is displayed automatically after a period of inactivity, when the wallet is locked:
+
+\image{inline} html LockUnlock.png "caption" height=300
+
+Pin-validation window doesn't want to take care of the current screen, and to restore it afterwards.
+
+That's why it is created in a separate layer, called *screen*.
+
+*Screens* are organized in a stack. The top of the stack is recovering the previous screen, which is recovering the previous one, and so on.
+
+Even if its size is static, the screens stack is considered as empty at start-up. Then most of windows (and even all of them for applications) are simply created in the background layer of the stack (index 0), by using @ref nbgl_screenSet() function.
+
+When a modal window needs to be displayed, a new screen is pushed on the stack and graphical objects are attached to this new screen as its children (@ref nbgl_screenPush() function)
+
+Then, once this modal window is dismissed, it calls @ref nbgl_screenPop() function to remove it from the stack (even if it is not top of stack anymore), and adapt top of stack if necessary.
+
+\image{inline} html Pop_screens.png "caption" height=400
+
+After any of these operations, @ref nbgl_screenRedraw() needs to be called to actually draw the objects on Display.
+
+@section nbgl_objs_mngt Dynamic objects management
+
+In order to save RAM by not statically allocating memory for all graphic objects of the UX, a dynamic objects allocator has
+been developed.
+
+On the contrary of a regular dynamic memory allocator like malloc(), objects allocated for a given layer (= screen) are released all at once,
+usually when the screen is removed (or when a new one is build in replacement of it).
+
+Actually, there are two different allocators:
+
+- One for graphic objects (all derived from @ref nbgl_obj_t)
+- One for containers of object pointers, used for screen/container/panel children.
+
+The containers of object pointers are arrays of pointers on nbgl_obj_t.
+
+Because these two types of dynamic data are released by layer (= screen), the layer index is passed in all allocation/release API.
+
+@subsection nbgl_objs_mngt_api API
+
+The API to get a single graphic object of the given \b type from pool, for the given \b layer is
+
+- nbgl_obj_t* @ref nbgl_objPoolGet(nbgl_obj_type_t type, uint8_t layer)
+
+The API to release all objects for a given layer is:
+
+- void @ref nbgl_objPoolRelease(uint8_t layer)
+
+The API to get an array of \b nbObjs object pointers, for the given \b layer:
+
+- nbgl_obj_t** @ref nbgl_containerPoolGet(uint8_t nbObjs, uint8_t layer)
+
+The API to release all objects pointers for a given \b layer is:
+
+- void @ref nbgl_containerPoolRelease(uint8_t layer)
+
+\note \b layer can be either 0 for the background (when using @ref nbgl_screenSet()) or the return value of @ref nbgl_screenPush()
+
+@subsection nbgl_objs_mngt_automatic Automatic allocation and release
+
+The container for children of a screen are automatically allocated by @ref nbgl_screenSet() or @ref nbgl_screenPush(). It is also automatically
+release by the next call to @ref nbgl_screenSet() (before new allocation) or by @ref nbgl_screenPop().
+
+In the same spirit, all objects allocated for a given screen by the caller are released by the next call to @ref nbgl_screenSet() or by @ref nbgl_screenPop().
+
+*/
diff --git a/sdk_lib_nbgl/doc/nbgl_step.dox b/sdk_lib_nbgl/doc/nbgl_step.dox
new file mode 100644
index 00000000..4b583887
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_step.dox
@@ -0,0 +1,130 @@
+#ifdef NBGL_STEP
+/** @page nbgl_step Step API
+
+@section nbgl_step_intro Introduction
+This chapter describes briefly the high-level API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of a screen page (or multi-pages), using predefined models, like a centered info, or a menu list, managing
+the internal navigation between the internal pages of a step.
+
+A full description of each type of steps can be found in this document
+
+@section nbgl_step_concepts Concepts
+
+This layer uses the complex-objects API described in @ref nbgl_layout, but all objects are hidden, in favor to fields to configure, for example
+texts, icons and callbacks.
+
+Moreover, positions of objects in the page are hidden and automatic.
+
+And finally, if a step requires using multiple pages (for example for a long text to display, or a long menu list), the step engine manages the
+navigation between these pages.
+
+@section nbgl_step_operations Operations
+
+@subsection create_page Draw a step
+
+The configuration of a step is provided in a single function call, and all predefined pages APIs will do the following operations:
+
+- Create the page
+- Add required complex objects in the page
+- Draw the objects in the **framebuffer**
+- Refresh the display with **framebuffer** content
+
+For every types of steps, the navigation inside the step is managed by the step engine, but even for navigation outside it (between steps of
+a flow), the navigation arrows are drawned by the engine.
+
+A few APIs are available to draw typical pages, like:
+
+- @ref nbgl_stepDrawText() to draw a text and a sub-text on one or several lines/pages, with navigation
+- @ref nbgl_stepDrawCenteredInfo() to draw an icon, a text and a sub-text in a single page, with navigation
+- @ref nbgl_stepDrawMenuList() to draw a menu list, with navigation
+
+@subsection step_typical_types Typical step types
+
+@subsubsection step_text_type Generic Text Step
+
+This type is intended to draw one or two centered (vertically and horizontally) text(s) in the screen.
+
+If there is no sub-text and the main-text doesn't fit in a single page (taking wrapping into account), the text is automatically split
+into several pages, and the navigation is set accordingly, and manage automatically between these internal pages. See first example.
+
+\image{inline} html layout_nanos_step_text1.png "caption" height=200
+
+If there is a sub-text, the main-text must fit in a single line. The sub-text can be multi-pages, and in this case the main-text is
+considered as title, and an indication is automatically added to this "title" to show the current "page" and number of pages. See
+second example.
+
+\image{inline} html layout_nanos_step_text2.png "caption" height=200
+
+The API to insert such an object is @ref nbgl_stepDrawText() with:
+
+- A callback to handle the actions on buttons (left, right or both)
+- A potential ticker configuration.
+- A potential main text
+- A potential sub-text
+- The position of the step in a flow (see @subpage step_positioning)
+- A boolean to indicate whether this step is modal or not
+- The style to use for text and sub-text (@ref REGULAR_INFO or @ref BOLD_TEXT1_INFO)
+
+@note left or right buttons actions are only notified with the provided callback if on the first page (for left) or on the
+last page (right) for a multi-pages step.
+
+@subsubsection step_centered_info_type Centered Info Step
+
+This type is intended to draw a centered info, with an icon, a main text and a sub-text in the screen. The texts are optional.
+
+\image{inline} html layout_nanos_step_centered.png "caption" height=200
+
+The API to insert such an object is @ref nbgl_stepDrawCenteredInfo() with:
+
+- A callback to handle the actions on buttons (left, right or both)
+- A potential ticker configuration
+- A mandatory icon
+- A potential main text
+- A potential sub-text
+- The position of the step in a flow (see @subpage step_positioning)
+- A boolean to indicate whether this step is modal or not
+- The style to use for text and sub-text (@ref REGULAR_INFO or @ref BOLD_TEXT1_INFO)
+
+@subsubsection step_menu_list_type Menu List Step
+
+This type is intended to draw a menu list, and manage the navigation between the items of the list
+
+\image{inline} html layout_nanos_step_menu_list.png "caption" height=200
+
+The API to insert such an object is @ref nbgl_stepDrawMenuList() with:
+
+- A callback to handle the selection (press both buttons) of a menu item
+- A potential ticker configuration.
+- The menu list description structure
+- The position of the step in a flow (see @subpage step_positioning)
+- A boolean to indicate whether this step is modal or not
+
+@subsection step_release Releasing a step
+
+Before leaving a screen built with a layout, it must be released with a call to @ref nbgl_stepRelease(). It will free the allocated
+objects.
+
+Releasing a step has no effect on the display, even if a modal step is released.
+
+@note Releasing is mandatory for modal step, but if on background, it will be automatically released when a new step will be allocated
+
+@subsection step_positioning Step Positioning
+
+Usually, a step is part of a flow (list of steps, to be parsed in forward or backward direction).
+To indicate to the end-user that navigation between steps is possible, navigation arrows need to be displayed on left and right sides
+of the screen (as < and > 'arrows').
+
+The navigation can also loop in some cases (only for Applications), which means that at the end of the last step, when pressing
+right button the engine will display the beginning of first step (and vice versa).
+
+To indicate to step engine which 'flow navigation' to draw, an argument (position) is provided to all API used to create steps.
+This argument (of type @ref nbgl_stepPosition_t) can take the following values:
+
+- @ref SINGLE_STEP if this is a single step flow (in this case, no 'flow navigation' is displayed)
+- @ref FIRST_STEP if this is the first step in a multiple steps flow
+- @ref LAST_STEP if this is the last step in a multiple steps flow
+- @ref NEITHER_FIRST_NOR_LAST_STEP, if this is the neither the first nor the last step in a multiple steps flow
+
+*/
+#endif // NBGL_STEP
diff --git a/sdk_lib_nbgl/doc/nbgl_touch.dox b/sdk_lib_nbgl/doc/nbgl_touch.dox
new file mode 100644
index 00000000..a6d27a14
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_touch.dox
@@ -0,0 +1,52 @@
+/** @page nbgl_touchscreen Touchscreen management
+
+@section nbgl_touchscreen_intro Introduction
+This chapter describes briefly how \b NBGL manages the touchscreen events and how to receive and process these events.
+
+@section touchscreen_mngt Touchscreen management
+
+The low-level entry point of NBGL for Touchscreen management is @ref nbgl_touchHandler(). This function is supposed to be called periodically by the
+main scheduler to provide the current state and position of the finger on the Touchscreen.
+
+The position is always useful when the \b state field of @ref nbgl_touchStatePosition_t is @ref PRESSED, and also useful when the new state is @ref RELEASED.
+
+From a high-level perspective, every object can declare itself as "client" of touchscreen events.
+
+The low-level events are:
+
+- @ref TOUCHED corresponding to an object touched and released at least SHORT_TOUCH_DURATION ms later but less than LONG_TOUCH_DURATION ms
+- @ref LONG_TOUCHED corresponding to an object touched and released at least LONG_TOUCH_DURATION ms later.
+- @ref TOUCHING corresponding to an object that is currently touched
+- @ref OUT_OF_TOUCH corresponding to an object that was touched but that has lost the focus (the finger has moved)
+- @ref TOUCH_RELEASED corresponding to an object that was touched and where the finger has been released.
+
+@startuml
+
+state FINGER_OFF {
+ state TOUCHED #FFFF77
+ state LONG_TOUCHED #FFFF77
+ state RELEASED #FFFF77
+ state OUT_OF_TOUCH #FFFF77
+}
+
+[*] --> FINGER_OFF
+FINGER_OFF: the finger is not on the object
+
+state FINGER_ON {
+ state TOUCHING #FFFF77
+}
+FINGER_ON: the finger is on the object
+
+FINGER_OFF -> TOUCHING : finger pressed \non the object
+TOUCHING -> TOUCHING :finger still pressed on \nthe object 100ms later
+TOUCHING -up-> TOUCHED : finger released \nafter SHORT_PRESSED
+TOUCHING -up-> LONG_TOUCHED : finger released \nafter LONG_PRESSED
+TOUCHING -up-> RELEASED: finger released
+TOUCHING -up-> OUT_OF_TOUCH: finger moved \nout of object
+@enduml
+
+Typically, @ref nbgl_touchHandler() shall be called when \b SEPROXYHAL_TAG_FINGER_EVENT message is received by Bolos UX task or
+by Application's main task.
+
+
+*/
diff --git a/sdk_lib_nbgl/doc/nbgl_use_case.dox b/sdk_lib_nbgl/doc/nbgl_use_case.dox
new file mode 100644
index 00000000..19a60293
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_use_case.dox
@@ -0,0 +1,876 @@
+#ifdef HAVE_SE_TOUCH
+/** @page nbgl_app_use_case Predefined Application Use-cases API
+
+@section nbgl_use_case_intro Introduction
+This chapter describes the Application Use-cases API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of some typical use-cases of display in an Application running on Stax.
+For example, a use-case can be:
+
+- Reviewing a transaction/message
+- Reviewing details on a given data of a transaction/message
+- Displaying pages of settings
+
+A full description of each predefined use-case can be found in this document
+
+@section nbgl_use_case_concepts Concepts
+
+This layer uses the high-level API described in @ref nbgl_page, but offers to developer more than a single page.
+
+The goal is to simplify the usage of NBGL, but also to offer a better homogeneity across applications, by pushing
+developers to use common API for common use-cases.
+
+So that not only the look of the pages but also their transitions look the same. Which should be a real help
+for end-users, getting more and more familiar with the user experience of applications.
+
+@subsection nbgl_use_case_example_1 Example 1: transaction review
+
+\image{inline} html UseCase-Review1.png "caption" height=300
+
+In this example, a transaction review consists in 3 successive pages, and can be seen as a use-case
+
+@subsection nbgl_use_case_example_2 Example 2: settings pages
+
+\image{inline} html UseCase-Settings1.png "caption" height=300
+
+In this example, a parsing the settings (single level) consists in 2 pages, and can be seen as another use-case.
+
+@section nbgl_use_cases Use Cases
+
+A few APIs are available to draw typical Use-Cases, such as:
+
+- for Home Screen:
+ - @ref nbgl_useCaseHome() to draw the home screen of an application (see @subpage use_case_home)
+ - @ref nbgl_useCaseHomeExt() to draw an extended version of home screen of an application (with action button) (see @subpage use_case_ext_home)
+ - @ref nbgl_useCasePlugInHome() to draw the home screen of a Plug-In application (see @subpage use_case_plugin_home)
+- for Settings:
+ - @ref nbgl_useCaseSettings() to draw a level of settings pages (see @subpage use_case_settings)
+- for Individual pages:
+ - @ref nbgl_useCaseConfirm() to draw a typical confirmation page, for example when rejecting a transaction (see @subpage use_case_confirm)
+ - @ref nbgl_useCaseChoice() to draw a typical dual choice page (see @subpage use_case_choice)
+ - @ref nbgl_useCaseStatus() to draw a transient status page, without control, for example when a transaction is successfully signed (see @subpage use_case_status)
+ - @ref nbgl_useCaseSpinner() to draw an infinite spinner page (see @subpage use_case_spinner)
+- for most used reviews:
+ - @ref nbgl_useCaseStaticReview() to draw the pages of a regular review, when all info are available from the beginning (see @subpage use_case_static_review)
+ - @ref nbgl_useCaseReviewStart() to draw the cover page of a review (initial page, without data) (see @subpage use_case_review_start)
+ - @ref nbgl_useCaseRegularReview() to draw the pages of a regular review (all pages but the cover one) (see @subpage use_case_regular_review)
+- for rare reviews:
+ - @ref nbgl_useCaseForwardOnlyReview() to draw the pages of a forward-only review (without back key) (see @subpage use_case_forward_only_review)
+ - @ref nbgl_useCaseViewDetails() to draw the pages displaying the full value of a given long data of a review (see @subpage use_case_details_view)
+- for address verification:
+ - @ref nbgl_useCaseAddressConfirmation() to draw an address confirmation page, with a possibility to see it as QR Code (see @subpage use_case_addr_confirm)
+ - @ref nbgl_useCaseAddressConfirmationExt() to draw an address confirmation page, with a possibility to see it as QR Code and some extra tag/value pairs (see @subpage use_case_addr_confirm_ext)
+
+@subsection use_case_home Home screen Use Case
+
+\image{inline} html UseCase-Home.png "caption" height=300
+
+Ledger would like all application to have the same home screen, so the @ref nbgl_useCaseHome() function enables to
+create such a page, the only configurable parameters being:
+
+- the application name
+- the application icon
+- the tagline, a text under app name (if NULL, it will be "This app enables signing transactions on the network.")
+- the callbacks when touching *quit* or *top-right* buttons
+- the type of top-right button (info or settings)
+
+@code
+extern const nbgl_icon_details_t *myAppIcon;
+
+void myAppSettings(void) {
+ // draw settings page here
+}
+void onQuit(void) {
+ // exit app here
+}
+void appMain(void) {
+ nbgl_useCaseHome("MyApp",
+ &myAppIcon,
+ NULL,
+ true, // with settings button
+ myAppSettings,
+ onQuit);
+}
+@endcode
+
+@subsection use_case_ext_home Extended Home screen Use Case
+
+\image{inline} html UseCase-HomeExt.png "caption" height=300
+
+In some very specific case, the Home page should provide an "action" button. @ref nbgl_useCaseHomeExt() function enables to
+create such a page, adding to @ref nbgl_useCaseHome() the following parameters:
+
+- the text to display in "action" button
+- the callback when touching "action" buttons
+
+Here is the source code to display something similar to the example:
+
+@code
+extern const nbgl_icon_details_t *myAppIcon;
+
+void myAppSettings(void) {
+ // draw settings page here
+}
+
+void onQuit(void) {
+ // exit app here
+}
+
+// function called when "Do something" button is touched
+void onAction(void) {
+}
+
+void appMain(void) {
+ nbgl_useCaseHomeExt("MyApp",
+ &myAppIcon,
+ "This application is intended to do\nsomething",
+ false, // with info button
+ "Do something",
+ onAction,
+ myAppSettings,
+ onQuit);
+}
+@endcode
+
+@subsection use_case_plugin_home Plug-In Home screen Use Case
+
+\image{inline} html UseCase-HomePlugIn.png "caption" height=300
+
+For some plug-in apps (relying on a master application), the Home page should display extra lines of text. @ref nbgl_useCasePlugInHome() function enables to
+create such a page, adding to @ref nbgl_useCaseHome() the following parameter:
+
+- The name of the master application name
+- A text (subTagLine) to display under the master application icon (if NULL, it will be "This app relies on\n")
+
+Moreover, the default tagline, if the "tagline" parameter is NULL, is: "This app confirms actions for\n."
+
+Here is the source code to display something similar to the example:
+
+@code
+extern const nbgl_icon_details_t *myAppIcon;
+
+void myAppSettings(void) {
+ // draw settings page here
+}
+
+void onQuit(void) {
+ // exit app here
+}
+
+void appMain(void) {
+ nbgl_useCasePlugInHome("Ledger Market", //
+ "Ethereum", //
+ &C_Ethereum32px, //
+ NULL, // will use the default tagline ("This app confirms actions for\n.")
+ NULL, // will use the default subTagline ("This app relies on\n")
+ false, // use "info" type top-right icon
+ myAppSettings,
+ onQuit);
+}
+@endcode
+
+@subsection use_case_settings Settings Use Case
+
+\image{inline} html UseCase-Settings1.png "caption" height=300
+
+Usually settings (or information) of an application consist in a list of pages, each page containing:
+
+- some radio buttons to make a choice
+- some switches for various configuration
+- a list of information organized by pairs [info_name, info_value]
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseSettings(), providing:
+
+- the title of the settings series
+- the page in which to start
+- the number of pages
+- a boolean to indicate whether the title is touchable or not (if touchable, it is used to quit the series,
+so no Quit button in navigation bar)
+- a callback called when the quit button (or touchable title) is touched
+- a navigation callback called when navigation arrow buttons are touched (and to fill the initial page), to retrieve
+the content of the page
+- a last callback called when any of the controls provided in content is touched
+
+@note All tokens used for the given "settings" must be greater or equal than \ref FIRST_USER_TOKEN
+
+\image{inline} html UseCase-Settings2.png "caption" height=300
+
+Here is the source code to display the first example of settings:
+
+@code
+enum {
+ SWITCH1_TOKEN = FIRST_USER_TOKEN,
+ SWITCH2_TOKEN,
+ SWITCH3_TOKEN
+};
+
+static const nbgl_layoutSwitch_t switches[] = {
+ {
+ .initState = false,
+ .text = "Blind signing",
+ .subText = "Enable transaction blind\n" "signing",
+ .token = SWITCH1_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL
+ },
+ {
+ .initState = true,
+ .text = "Debug",
+ .subText = "Display contract data details",
+ .token = SWITCH2_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL
+ },
+ {
+ .initState = true,
+ .text = "Nonce",
+ .subText = "Display account nonce\n" "in transaction",
+ .token = SWITCH3_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL
+ },
+};
+
+static const char* infoTypes[] = {
+ "Version"
+};
+
+static const char* infoContents[] = {
+ "1.9.18"
+};
+
+static bool navCallback(uint8_t page, nbgl_pageContent_t *content) {
+ // the first settings page contains 3 switches
+ if (page == 0) {
+ content->type = SWITCHES_LIST;
+ content->switchesList.nbSwitches = 3;
+ content->switchesList.switches = (nbgl_layoutSwitch_t*)switches;
+ }
+ // the second settings page contains only the version of the app
+ else if (page == 1) {
+ content->type = INFOS_LIST;
+ content->infosList.nbInfos = 1;
+ content->infosList.infoTypes = infoTypes;
+ content->infosList.infoContents = infoContents;
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+static void controlsCallback(int token, uint8_t index) {
+ if (token == SWITCH1_TOKEN) {
+ // First switch touched
+ }
+}
+
+void myAppSettings(void) {
+ // draw the settings Use Case (2 pages), starting at page 0
+ nbgl_useCaseSettings("Ethereum settings",0,2,false,appMain,navCallback,controlsCallback);
+}
+@endcode
+
+@subsection use_case_confirm Confirmation Use Case
+
+\image{inline} html UseCase-Confirm.png "caption" height=300
+
+A confirmation use-case consists in a single page containing a fixed icon, a configurable message, a black button and a footer to make
+the choice, with configuration texts. The @ref nbgl_useCaseConfirm() function enables to create such a page.
+
+The *callback* argument is called when the button is touched.
+
+When the footer is touched, this modal screen is simply dismissed, revealing the previous page on background.
+
+Here is the code to display the example picture (and a status page for confirmation)
+
+@code
+static void confirmationCallback(void) {
+ // draw a status screen which continues by returning to appMain
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+void onRejectTransaction(void) {
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",confirmationCallback);
+}
+@endcode
+
+@subsection use_case_choice Choice Use Case
+
+\image{inline} html UseCase-Choice.png "caption" height=300
+
+A choice use-case consists in a single page containing a fixed icon, a configurable icon, a configurable message, a black button and a footer to make
+the choice, with configuration texts. The @ref nbgl_useCaseChoice() function enables to create such a page.
+
+The *callback* argument is called when the button or the footer is touched. Its argument is a boolean which is *true* when button is
+touched, *false* when footer is touched.
+
+Here is the code to display the example picture
+
+@code
+static void onChoice(bool confirm) {
+ if (confirm) {
+ // do something on button touch
+ }
+ else {
+ // do something on footer touch
+ }
+}
+
+void onRejectTransaction(void) {
+ nbgl_useCaseChoice(&C_key_64px,
+ "Delete all credentials?",
+ "This includes all saved\ncredentials from all websites\nand services.",
+ "Yes, erase","No, don't erase",
+ onChoice);
+}
+@endcode
+@subsection use_case_status Status Use Case
+
+\image{inline} html UseCase-Status.png "caption" height=300
+
+A status is a transient page, without control, to display during a short time, for example when a transaction is successfully signed.
+The @ref nbgl_useCaseStatus() function enables to create such a page, with the following arguments:
+
+- a message string to set in middle of page (Upper case for success)
+- a boolean to indicate if true, that the message is drawn in a Ledger style (with corners)
+- a quit callback, called when quit timer times out
+
+If it's a success status, a "success" tune will be automatically played.
+
+@subsection use_case_review_start Review Start Use Case
+
+\image{inline} html UseCase-ReviewStart.png "caption" height=300
+
+All message/transaction reviews should start with a same cover page, presenting an icon, the goal of the review, and offering
+the end-user to possibility to enter the review (by "tapping to continue") or to reject it immediately by touching the footer.
+
+The @ref nbgl_useCaseReviewStart() function enables to create such a page, with the following arguments:
+
+- the icon to use in centered info
+- the string to set in middle of page (in 32px font)
+- the string to set under reviewTitle (in 24px font) (can be NULL)
+- the string to set in footer, to reject review
+- the callback called when main panel is touched
+- the callback called when footer is touched
+
+A "look at me" tune will be automatically played when displaying the screen.
+
+Here is the code to display the example picture:
+
+@code
+static void reviewContinue(void) {
+ // when review start page is "tapped", display the review itself
+ nbgl_useCaseRegularReview(0, NB_PAGES, "Reject transaction", confirmTransaction,
+ displayTransactionPage, reviewReject);
+}
+
+void reviewStart(void) {
+ nbgl_useCaseReviewStart(myAppIcon, "Review transaction\nMyCoin send", NULL,
+ "Reject transaction", reviewContinue, reviewReject);
+}
+
+@endcode
+
+@subsection use_case_regular_review Regular Review Use Case
+
+\image{inline} html UseCase-Review1.png "caption" height=300
+
+Usually transaction/message reviews consist in a sequence of pages, each page containing:
+
+- one or several tag/value pair or a long press button for the final page, to validate the review
+- a footer to reject the review
+
+To navigate between pages, a back arrow is available on the top-left of the screen, and the whole page is "tappable".
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseRegularReview(), providing:
+
+- the page in which to start (usually 0)
+- the number of pages (if unknown, set to 0)
+- a "button" callback called when a potential button in the page's content is touched
+- a navigation callback called when back key or screen is "tapped" , to retrieve
+the content of the previous/next page. It is also called to fill the initial page.
+- a callback called when the long press button (with param true) on last page or the footer to reject is used (with param false)
+
+If the number of pages is unknown at the beginning, no progress indicator will be display on top of the screen.
+
+Here is the code to display something similar to example picture:
+
+@code
+// 4 pairs of tag/value to display
+static nbgl_layoutTagValue_t pairs[4];
+
+static void onConfirmAbandon(void) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+// called when long press button on 3rd page is long-touched or when reject footer is touched
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction signed",true,appMain);
+ }
+ else {
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",onConfirmAbandon);
+ }
+}
+
+// called to get the content of the given page
+static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) {
+ if (page == 0) {
+ // the first page contains 3 tag/value pairs
+ content->type = TAG_VALUE_LIST;
+ content->tagValueList.nbPairs = 3;
+ content->tagValueList.pairs = (nbgl_layoutTagValue_t *)pairs;
+ content->tagValueList.smallCaseForValue = false;
+ }
+ else if (page == 1) {
+ // the second page contains 1 tag/value pair
+ content->type = TAG_VALUE_LIST;
+ content->tagValueList.nbPairs = 1;
+ content->tagValueList.pairs = (nbgl_layoutTagValue_t *)&pairs[3];
+ content->tagValueList.smallCaseForValue = false;
+ }
+ else if (page == 2) {
+ // the last page must contain a long press button
+ content->type = INFO_LONG_PRESS,
+ content->infoLongPress.icon = &myAppIcon;
+ content->infoLongPress.text = "Confirm transaction\nMyCoin send";
+ content->infoLongPress.longPressText = "Hold to send";
+ content->infoLongPress.longPressToken = VALIDATE_TRANSACTION_TOKEN;
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+void reviewContinue(void) {
+ // review on 3 pages, starting at 0
+ nbgl_useCaseRegularReview(0, 3, "Reject transaction",
+ NULL, // no buttons because no value is too long to fit
+ displayTransactionPage, reviewChoice);
+}
+@endcode
+
+@subsection use_case_forward_only_review Forward only Review Use Case
+
+\image{inline} html UseCase-ReviewForwardOnly.png "caption" height=500
+
+Some message/transaction reviews may be too long to be memorized, so it is only possible to move forward.
+
+In this case, no back arrow is available on the top-left of the screen. Moreover, these reviews are always done with
+an unknown number of pages.
+A "Skip" button is added automatically in all pages except the one with Long Press button,
+to jump to last page, after an automatic confirmation modal window is displayed.
+
+The API to initiate the display of the series of forward-only review pages is @ref nbgl_useCaseForwardOnlyReview(), providing:
+
+- a "button" callback called when a potential button in the page's content is touched
+- a navigation callback called when screen is "tapped" , to retrieve
+the content of the next page. It is also called to fill the initial page.
+- a callback called when the long press button (with param true) on last page or the footer to reject is used (with param false)
+
+Here is the code to display something similar to example picture:
+
+@code
+
+// 5 pairs of tag/value to display
+static nbgl_layoutTagValue_t pairs[5];
+
+// result of the rejection
+static void onConfirmAbandon(void) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+// called when long press button on 3rd page is long-touched or when reject footer is touched
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction signed",true,appMain);
+ }
+ else {
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",onConfirmAbandon);
+ }
+}
+
+// called to get the content of the given page
+static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) {
+ if (page == 0) {
+ // the first page contains 3 tag/value pairs
+ content->type = TAG_VALUE_LIST;
+ content->tagValueList.nbPairs = 3;
+ content->tagValueList.pairs = (nbgl_layoutTagValue_t *)pairs;
+ content->tagValueList.smallCaseForValue = false;
+ }
+ else if (page == 1) {
+ // the second page contains 2 tag/value pairs
+ content->type = TAG_VALUE_LIST;
+ content->tagValueList.nbPairs = 2;
+ content->tagValueList.pairs = (nbgl_layoutTagValue_t *)&pairs[3];
+ content->tagValueList.smallCaseForValue = false;
+ }
+ else if (page == 2) {
+ // the last page must contain a long press button
+ content->type = INFO_LONG_PRESS,
+ content->infoLongPress.icon = &myAppIcon;
+ content->infoLongPress.text = "Confirm transaction\nMyCoin send";
+ content->infoLongPress.longPressText = "Hold to send";
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+void reviewContinue(void) {
+ nbgl_useCaseForwardOnlyReview("Reject transaction",
+ NULL, // No details button so no callback needed
+ displayTransactionPage, reviewChoice);
+}
+@endcode
+
+@subsection use_case_static_review Static Review Use Case
+
+\image{inline} html UseCase-Review1.png "caption" height=300
+
+In some cases, the developer may know all tag/value pairs of a transaction when it is submitted.
+
+In this case, what we call a "static" review can be used. It is similar to a regular review with know number of pages in terms of
+presentation and interactions with end-users, but much easier to use for developer.
+
+Indeed, in this case, NBGL automatically computes the number of pages, and the pairs to draw in each page.
+In case of a tag/value pair too long to be fully displayed, the "more" button will be automatically drawn and its handling
+automatically performed by NBGL by building a detailed modal view.
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseStaticReview(), providing:
+
+- the list of tag/value pairs (or a callback to get them one by one)
+- the texts to use in footer and in last page
+- a callback called when the long press button on last page or the footer to reject is used. The callback's param is true for confirmation, false for rejection.
+
+Here is the code to display something similar to example picture:
+
+@code
+// 4 pairs of tag/value to display
+static nbgl_layoutTagValue_t pairs[4];
+
+static nbgl_layoutTagValueList_t pairList = {
+ .nbMaxLinesForValue = 0,
+ .nbPairs = 4,
+ .pairs = (nbgl_layoutTagValue_t*)pairs
+};
+
+// result of the rejection choice
+static void onConfirmAbandon(void) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+// called when long press button on 3rd page is long-touched or when reject footer is touched
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction signed",true,appMain);
+ }
+ else {
+ // display a confirmation to confirm/cancel rejection
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",onConfirmAbandon);
+ }
+}
+
+void reviewContinue(void) {
+ static nbgl_pageInfoLongPress_t infoLongPress = {
+ .icon = &myAppIcon,
+ .text = "Confirm transaction\nMyAppCoin send",
+ .longPressText = "Hold to send"
+ };
+
+ // static review, providing the whole list of pairs
+ nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", reviewChoice);
+}
+@endcode
+
+Here is another version of the example code, using a callback mechanism to get tag/value pairs:
+
+@code
+// common tag/value pair to return
+static nbgl_layoutTagValue_t pair;
+
+static nbgl_layoutTagValue_t* getPair(uint8_t index);
+
+static nbgl_layoutTagValueList_t pairList = {
+ .nbMaxLinesForValue = 0,
+ .nbPairs = 4,
+ .pairs = NULL, // to indicate that callback should be used
+ .callback = getPair,
+ .startIndex = 0
+};
+
+// result of the rejection choice
+static void onConfirmAbandon(void) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+// called when long press button on 3rd page is long-touched or when reject footer is touched
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction signed",true,appMain);
+ }
+ else {
+ // display a confirmation to confirm/cancel rejection
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",onConfirmAbandon);
+ }
+}
+
+// function called by NBGL to get the pair indexed by "index"
+static nbgl_layoutTagValue_t* getPair(uint8_t index) {
+ switch (index) {
+ case 0:
+ pair.item = "To";
+ pair.value = "0x123456";
+ break;
+ case 1:
+ pair.item = "From";
+ pair.value = "0x654321";
+ break;
+ case 2:
+ pair.item = "Amount";
+ pair.value = "1.2345 BTC";
+ break;
+ case 3:
+ pair.item = "Fees";
+ pair.value = "0.1 BTC";
+ break;
+ }
+ return &pair;
+}
+
+void reviewContinue(void) {
+ static nbgl_pageInfoLongPress_t infoLongPress = {
+ .icon = &myAppIcon,
+ .text = "Confirm transaction\nMyAppCoin send",
+ .longPressText = "Hold to send"
+ };
+
+ // static review, providing the whole list of pairs
+ nbgl_useCaseStaticReview(&pairList, &infoLongPress, "Reject transaction", reviewChoice);
+}
+@endcode
+
+@subsection use_case_static_review_light Light Static Review Use Case
+
+\image{inline} html UseCase-ReviewLight.png "caption" height=300
+
+In some cases, the developer may want to display a review but with a less intense confirmation than a long-press button. A simple button is used in this
+case.
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseStaticReviewLight(), providing:
+
+- the list of tag/value pairs (or a callback to get them one by one)
+- the texts to use in footer and in last page (icon, title, confirmation button text)
+- a callback called when the black button on last page or the footer to reject is used. The callback's param is true for confirmation, false for rejection.
+
+@subsection use_case_details_view Details View Use Case
+
+\image{inline} html UseCase-DetailsView.png "caption" height=300
+
+Sometimes some values in tag/value pairs are too long to be displayed in a transaction/message review, and for that a
+special content type (@ref TAG_VALUE_DETAILS) to display only the first lines of value, ended with "...".
+And a button (for example with "More" text) is display to offer to the end-user a way to view details on this
+tag/value, in a modal set of pages.
+
+To navigate in this set of pages, a navigation bar is available, with a quit button that will close the modal and redisplay the
+page with the "More" button.
+
+The API to initiate the display of the set of pages is @ref nbgl_useCaseViewDetails(), providing:
+
+- the tag name (displayed in gray)
+- the value full value string, that will automatically be split in multiple pages
+- a boolean to indicate whether to wrap \b value text on ' ' or not
+
+In every page except the last one, the last 3 characters of the last line of value are replaced by "...".
+
+Here is the code to display something similar to example picture:
+
+@code
+// 4 pairs of tag/value to display
+static nbgl_layoutTagValue_t pair[] = {
+ {
+ .item = "msg/value/funds",
+ .value = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor"\
+ "congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada"\
+ libero, sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim."\
+ Fusce est. Vivamus a tellus. Pellentesque habitant morbi tristique senectus"\
+ et netus et malesuada fames ac turpis egestas. Proin pharetra nonummy pede."\
+ Mauris et orci. Aenean nec lorem. In porttitor. Donec laoreet nonummy augue."
+ }
+
+};
+
+// result of the rejection choice
+static void onConfirmAbandon(void) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction rejected",false,appMain);
+}
+
+// called when long press button on 3rd page is long-touched or when reject footer is touched
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // display a status page and go back to main
+ nbgl_useCaseStatus("Transaction signed",true,appMain);
+ }
+ else {
+ nbgl_useCaseConfirm("Reject transaction?","Yes, Reject","Go back to transaction",onConfirmAbandon);
+ }
+}
+
+// called when "more" button is touched
+static void onButton(int token, uint8_t index) {
+ if (token == MORE_DETAILS_TOKEN) {
+ // display details review (no wrapping)
+ nbgl_useCaseViewDetails(pair[0].item,pairs[0].value,false);
+ }
+}
+
+// called to get the content of the given page
+static bool displayTransactionPage(uint8_t page, nbgl_pageContent_t *content) {
+ if (page == 0) {
+ // the first page contains 1 tag/value pair, with long text
+ content->type = TAG_VALUE_DETAILS;
+ content->tagValueList.nbPairs = 1;
+ content->tagValueList.pairs = (nbgl_layoutTagValue_t *)pair;
+ content->tagValueDetails.detailsButtonText = "More";
+ content->tagValueDetails.detailsButtonToken = MORE_DETAILS_TOKEN;
+ }
+ else (page == 1) {
+ // the second page contains a long press button
+ content->type = INFO_LONG_PRESS,
+ content->infoLongPress.icon = &myAppIcon;
+ content->infoLongPress.text = "Confirm transaction\nMyCoin send";
+ content->infoLongPress.longPressText = "Hold to send";
+ content->infoLongPress.longPressToken = VALIDATE_TRANSACTION_TOKEN;
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+void reviewContinue(void) {
+ // review on 2 pages, starting at 0
+ nbgl_useCaseRegularReview(0, 2, "Reject transaction", confirmTransaction,
+ displayTransactionPage, reviewChoice);
+}
+@endcode
+
+@subsection use_case_addr_confirm Address Confirmation Use Case
+
+\image{inline} html UseCase-AddressConfirmation.png "caption" height=300
+
+When an address needs to be confirmed, it can be displayed in a Address Confirmation Use Case, at first as simple page with
+the raw address (as text) and a black button/Footer pair to choose to confirm or reject the address.
+
+An extra button under the raw address enables to open a modal page to see the address as a QR code.
+
+The @ref nbgl_useCaseAddressConfirmation() function enables to create such a page, with the following parameters:
+
+- the address to confirm (NULL terminated string)
+- a callback called when button or footer is touched (if true, confirm, if false reject)
+
+Here is the code to display something similar to example picture:
+
+@code
+// called when either confirm button or reject token is called
+static void displayAddressCallback(bool confirm) {
+ if (confirm) {
+ nbgl_useCaseStatus("Address\nVerified",true,app_fullEthereum);
+ }
+ else {
+ nbgl_useCaseStatus("Address rejected",false,app_fullEthereum);
+ }
+}
+
+// called when tapping on review start page to actually display address
+static void displayAddr(void) {
+ nbgl_useCaseAddressConfirmation("bc1pkdcufjh6dxjaaa05hudvxqg5fhspfmwmp8g92gq8cv4gwwnmgrfqfd4jlg", &displayAddressCallback);
+}
+
+void app_ethereumVerifyAddress(void) {
+ nbgl_useCaseReviewStart(myAppIcon,"Verify MyCoin\naddress",NULL,"Cancel",
+ displayAddr, appMain);
+}
+@endcode
+
+@subsection use_case_addr_confirm_ext Extended Address Confirmation Use Case
+
+\image{inline} html UseCase-AddressConfirmationExt.png "caption" height=500
+
+When an address needs to be confirmed, it can be displayed in a Address Confirmation Use Case, at first as simple page with
+the raw address (as text). An extra button under the raw address enables to open a modal page to see the address as a QR code.
+Moreover, if extra information need to be displayed, for example a derivation path, it is provided in a second page, also containing
+a black button/Footer pair to choose to confirm or reject the address.
+
+The @ref nbgl_useCaseAddressConfirmationExt() function enables to create such a set of pages, with the following parameters:
+
+- the address to confirm (NULL terminated string)
+- a callback called when button or footer is touched (if true, confirm, if false reject)
+- the list of extra tag/value pairs
+
+Here is the code to display something similar to example picture:
+
+@code
+// 2 pairs of tag/value to display in second page
+static nbgl_layoutTagValue_t pairs[2];
+
+static nbgl_layoutTagValueList_t pairList = {
+ .nbMaxLinesForValue = 0,
+ .nbPairs = 2,
+ .pairs = (nbgl_layoutTagValue_t*)pairs
+};
+
+// called when either confirm button or reject token is called
+static void displayAddressCallback(bool confirm) {
+ if (confirm) {
+ nbgl_useCaseStatus("ADDRESS\nVERIFIED",true,app_fullEthereum);
+ }
+ else {
+ nbgl_useCaseStatus("Address rejected",false,app_fullEthereum);
+ }
+}
+
+// called when tapping on review start page to actually display address
+static void displayAddr(void) {
+ nbgl_useCaseAddressConfirmationExt("bc1pkdcufjh6dxjaaa05hudvxqg5fhspfmwmp8g92gq8cv4gwwnmgrfqfd4jlg", &displayAddressCallback, &pairList);
+}
+
+void app_ethereumVerifyAddress(void) {
+ nbgl_useCaseReviewStart(myAppIcon,"Verify MyCoin\naddress",NULL,"Cancel",
+ displayAddr, appMain);
+}
+@endcode
+
+@subsection use_case_spinner Spinner Use Case
+
+\image{inline} html UseCase-Spinner.png "caption" height=300
+
+When an address needs to be confirmed, it can be displayed in a Address Confirmation Use Case, at first as simple page with
+the raw address (as text) and a black button/Footer pair to choose to confirm or reject the address.
+
+An extra button under the raw address enables to open a modal page to see the address as a QR code.
+
+The @ref nbgl_useCaseSpinner() function enables to create such a page, with the following parameters:
+
+@section use_case_refresh_page Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, all functions of this API automatically refresh the screen.
+So no need to call @ref nbgl_refresh().
+
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/nbgl_use_case_nanos.dox b/sdk_lib_nbgl/doc/nbgl_use_case_nanos.dox
new file mode 100644
index 00000000..1c110717
--- /dev/null
+++ b/sdk_lib_nbgl/doc/nbgl_use_case_nanos.dox
@@ -0,0 +1,461 @@
+#ifndef HAVE_SE_TOUCH
+/** @page nbgl_app_use_case_nanos Predefined Application Use-cases API
+
+@section nbgl_use_case_intro Introduction
+This chapter describes the Application Use-cases API of Advanced BOLOS Graphic Library.
+
+This layer offers a simplified view of some typical use-cases of display in an Application running on Stax.
+For example, a use-case can be:
+
+- Reviewing a transaction/message
+- Reviewing details on a given data of a transaction/message
+- Displaying pages of settings
+
+A full description of each predefined use-case can be found in this document
+
+@section nbgl_use_case_concepts Concepts
+
+This layer uses the Step API described in @ref nbgl_step, but offers to developer more than a single step.
+
+The goal is to simplify the usage of NBGL, but also to offer a better homogeneity across applications, by pushing
+developers to use common API for common use-cases.
+
+So that not only the look of the pages but also their transitions look the same. Which should be a real help
+for end-users, getting more and more familiar with the user experience of applications.
+
+@subsection nbgl_use_case_example_1 Example 1: transaction review
+
+\image{inline} html UseCase-Nano-Review1.png "caption" width=1000
+
+In this example, a transaction review consists in 5 successive pages, and can be seen as a use-case
+
+@subsection nbgl_use_case_example_2 Example 2: about pages
+
+\image{inline} html UseCase-Nano-About1.png "caption" width=800
+
+In this example, the settings/about (accessed from "Settings"/"About" in Home, single level) consists in 4 pages, and can be seen as another use-case.
+
+@section nbgl_use_cases Use Cases
+
+A few APIs are available to draw typical Use-Cases, such as:
+
+- for Home Screen:
+ - @ref nbgl_useCaseHome() to draw the home screen of an application (see @subpage use_case_home)
+- for Settings:
+ - @ref nbgl_useCaseSettings() to draw a level of settings pages (see @subpage use_case_settings)
+- for most used reviews:
+ - @ref nbgl_useCaseStaticReview() to draw the pages of a regular review, when all info are available from the beginning (see @subpage use_case_static_review)
+ - @ref nbgl_useCaseRegularReview() to draw the pages of a regular review (all pages but the cover one) (see @subpage use_case_regular_review)
+- for rare reviews:
+ - @ref nbgl_useCaseForwardOnlyReview() to draw the pages of a forward-only review (without back) (see @subpage use_case_forward_only_review)
+- for address verification:
+ - @ref nbgl_useCaseAddressConfirmation() to draw an address confirmation page (see @subpage use_case_addr_confirm)
+ - @ref nbgl_useCaseAddressConfirmationExt() to draw an address confirmation page, with some extra tag/value pairs (see @subpage use_case_addr_confirm_ext)
+
+@subsection use_case_home Home screen Use Case
+
+\image{inline} html UseCase-Nano-Home.png "caption" width=800
+
+Ledger would like all application to have the same home screen, so the @ref nbgl_useCaseHome() function enables to
+create such a page, the only configurable parameters being:
+
+- the application name
+- the application icon
+- the application version
+- the tagline, which is the text of the first page (if NULL, it will be the .")
+- the callbacks when touching *quit* or *about* buttons
+- the type of *about* button (about or settings)
+
+@code
+extern const nbgl_icon_details_t *myAppIcon;
+
+void onAbout(void) {
+ // draw settings page here
+}
+void onQuit(void) {
+ // exit app here
+}
+void appMain(void) {
+ nbgl_useCaseHome("MyApp",
+ &myAppIcon,
+ "1.0", // App version
+ NULL, // no tagline
+ false, // with settings button
+ onAbout,
+ onQuit);
+}
+@endcode
+
+
+@subsection use_case_settings Settings Use Case
+
+\image{inline} html UseCase-Nano-About1.png "caption" width=800
+
+Usually settings (or information) of an application consists in a list of pages, each page containing either:
+
+- a static information (version, developer)
+- a changeable settings (boolean, list of values)
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseSettings(), providing:
+
+- the page in which to start
+- the number of pages
+- a callback called when the "Back" page is double-pressed
+- a navigation callback called when left or right buttons are pressed (and also to fill the initial page), to retrieve
+the content of the page
+- a last callback called when a page is selected (double-pressed)
+
+Here is the source code to display the example of settings:
+
+@code
+typedef struct {
+ const char *text; ///< main text for the switch
+ nbgl_state_t initState; ///< initial state of the switch
+} Switch_t;
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static Switch_t switches[] = {
+ {
+ .initState = false,
+ .text = "Blind signing",
+ },
+ {
+ .initState = true,
+ .text = "Debug",
+ },
+ {
+ .initState = true,
+ .text = "Nonce",
+ },
+};
+
+static bool navCallback(uint8_t page, nbgl_pageContent_t *content)
+{
+ if (page < 3) {
+ content->text = switches[page].text;
+ content->subText = switches[page].initState ? "Enabled" : "Disabled";
+ }
+ else {
+ return false;
+ }
+ return true;
+}
+
+static void actionCallback(uint8_t page) {
+ switches[page].initState = !switches[page].initState;
+ nbgl_useCaseSettings(page, 3, app_fullEthereum, navCallback, actionCallback);
+}
+
+void myAppSettings(void) {
+ // draw the settings Use Case (3 pages), starting at page 0
+ nbgl_useCaseSettings(0, // init page
+ 3, // number of pages
+ appMain, // "Back" callback
+ navCallback, // navigation callback, to get content of pages
+ actionCallback // action callback, when a page is selected
+ );
+}
+@endcode
+
+
+@subsection use_case_regular_review Regular Review Use Case
+
+\image{inline} html UseCase-Nano-Review1.png "caption" width=1000
+
+Usually transaction/message reviews consist in a sequence of pages, each page containing:
+
+- one tag/value pair page (sometimes with a multi-pages value)
+- two selectable pages at the end, to accept or reject the transaction
+
+To navigate between pages, right and left buttons can be pressed. And the last two pages can be selected with a double-press.
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseRegularReview(), providing:
+
+- the page in which to start (usually 0)
+- the number of pages (if unknown, set to 0)
+- a navigation callback called when right or left button is pressed, to retrieve
+the content of the previous/next page. It is also called to fill the initial page.
+
+Here is the code to display something similar to the example picture:
+
+@code
+// 2 pairs of tag/value to display
+static nbgl_layoutTagValue_t pairs[2] = {
+ {
+ .item = "Address",
+ .value = "0xEAEAEAEAEAEAEAEAE"
+ },
+ {
+ .item = "Amount",
+ .value = "BOL 0.666"
+ }
+};
+
+static void onApprove(void) {
+ // confirm transaction
+
+ // and go back to main
+ appMain();
+}
+
+static void onReject(void) {
+ // reject transaction
+
+ // and go back to main
+ appMain();
+}
+
+// called to get the content of the given page
+static bool navCallback(uint8_t page, nbgl_pageContent_t *content) {
+ memset(content, 0, sizeof(nbgl_pageContent_t));
+ if (page == 0) {
+ // the first page is used to display the title of the review
+ content->text = "Review\ntransaction";
+ content->icon = &C_icon_eye;
+ }
+ else if (page < 3) {
+ // the 2 next pages contain the two pairs of tag/values
+ content->text = pairs[page - 1].item;
+ content->subText = pairs[page - 1].value;
+ }
+ else if (page == 3) {
+ // this page is for approval
+ content->text = "Approve";
+ content->icon = &C_icon_validate;
+ content->callback = onApprove;
+ }
+ else if (page == 4) {
+ // this page is for rejection
+ content->text = "Reject";
+ content->icon = &C_icon_crossmark;
+ content->callback = onReject;
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+void startReview(void) {
+ // review on 3 pages, starting at 0
+ nbgl_useCaseRegularReview(0, // start at first page
+ 5, // number of pages
+ navCallback);
+}
+@endcode
+
+@subsection use_case_forward_only_review Forward only Review Use Case
+
+Some message/transaction reviews may be too long to be memorized, so it is only possible to move forward.
+
+In this case, no backward navigation is possible, and the number of pages cannot be defined at start-up.
+
+The API to initiate the display of the series of forward-only review pages is @ref nbgl_useCaseForwardOnlyReview(), providing:
+
+- a navigation callback called when to retrieve the content of the next page. It is also called to fill the initial page.
+
+Here is an example code:
+
+@code
+
+static uint8_t last_transaction_page;
+
+static void onApprove(void) {
+ // confirm transaction
+
+ // and go back to main
+ appMain();
+}
+
+static void onReject(void) {
+ // reject transaction
+
+ // and go back to main
+ appMain();
+}
+
+// called to get the content of the given page
+static bool navCallback(uint8_t page, nbgl_pageContent_t *content) {
+ memset(content, 0, sizeof(nbgl_pageContent_t));
+ if (page == 0) {
+ // the first page is used to display the title of the review
+ content->text = "Review\ntransaction";
+ content->icon = &C_icon_eye;
+ }
+ else if (page == (last_transaction+1)) {
+ // try to get a new tag/value pair in this transaction
+ char *tag;
+ char *value;
+ if (getNextTagValuePair(&tag, &value)) {
+ content->text = tag;
+ content->subText = value;
+ last_transaction_page = page;
+ }
+ else {
+ // this page is for approval
+ content->text = "Approve";
+ content->icon = &C_icon_validate;
+ content->callback = onApprove;
+ }
+ }
+ else if (page == (last_transaction+2)) {
+ // this page is for rejection
+ content->text = "Reject";
+ content->icon = &C_icon_crossmark;
+ content->callback = onReject;
+ }
+ else {
+ return false;
+ }
+ // valid page so return true
+ return true;
+}
+
+void startForwardOnlyTransaction(void) {
+ last_transaction_page = 0;
+ nbgl_useCaseForwardOnlyReview(navCallback);
+}
+@endcode
+
+@subsection use_case_static_review Static Review Use Case
+
+\image{inline} html UseCase-Nano-Review1.png "caption" width=1000
+
+In some cases, the developer may know all tag/value pairs of a transaction when it is submitted.
+And he may want to use a more standardized transaction review Use Case, with less interaction.
+
+In this case, what we call a "static" review can be used. It is similar to a regular review with known number of pages in terms of
+presentation and interactions with end-users, but much easier to use for developer.
+
+Indeed, in this case, NBGL automatically computes the number of pages, and the pairs to draw in each page.
+In case of a tag/value pair too long to be fully displayed, it is split in a multi-pages steps.
+
+The API to initiate the display of the series of pages is @ref nbgl_useCaseStaticReview(), providing:
+
+- the list of tag/value pairs (or a callback to get them one by one)
+- the text to use in first page
+- an action callback called when a page's content is selectable (double-pressed)
+- a callback called when the "accept" (with param equal to \b true) or "reject" (with param equal to \b false) last two pages is selected
+
+Here is the code to display something similar to example picture:
+
+@code
+// 2 pairs of tag/value to display
+static nbgl_layoutTagValue_t pairs[2] = {
+ {
+ .item = "Address",
+ .value = "0xEAEAEAEAEAEAEAEAE"
+ },
+ {
+ .item = "Amount",
+ .value = "BOL 0.666"
+ }
+};
+
+static nbgl_layoutTagValueList_t pairList = {
+ .nbMaxLinesForValue = 0,
+ .nbPairs = 2,
+ .pairs = (nbgl_layoutTagValue_t*)pairs
+};
+
+// called when "Approve" or "Reject" page is selected (double-press)
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // confirm transaction
+ }
+ else {
+ // reject transaction
+ }
+ // go back to main
+ appMain();
+}
+
+void startStaticReview(void) {
+ // static review, providing the whole list of pairs
+ nbgl_useCaseStaticReview(&pairList,
+ &C_icon_eye,
+ "Review\ntransaction",
+ "Approve",
+ "Reject",
+ reviewChoice);
+}
+@endcode
+
+Here is another version of the example code, using a callback mechanism to get tag/value pairs:
+
+@code
+// common tag/value pair to return
+static nbgl_layoutTagValue_t pair;
+
+static nbgl_layoutTagValue_t* getPair(uint8_t index);
+
+static nbgl_layoutTagValueList_t pairList = {
+ .nbMaxLinesForValue = 0,
+ .nbPairs = 5,
+ .pairs = NULL, // to indicate that callback should be used
+ .callback = getPair,
+ .startIndex = 0
+};
+
+// called when "Approve" or "Reject" page is selected (double-press)
+static void reviewChoice(bool confirm) {
+ if (confirm) {
+ // confirm transaction
+ }
+ else {
+ // reject transaction
+ }
+ // go back to main
+ appMain();
+}
+
+// function called by NBGL to get the pair indexed by "index"
+static nbgl_layoutTagValue_t* getPair(uint8_t index) {
+ switch (index) {
+ case 0:
+ pair.item = "To";
+ pair.value = "0x123456";
+ break;
+ case 1:
+ pair.item = "From";
+ pair.value = "0x654321";
+ break;
+ case 2:
+ pair.item = "Amount";
+ pair.value = "1.2345 BTC";
+ break;
+ case 3:
+ pair.item = "Fees";
+ pair.value = "0.1 BTC";
+ break;
+ }
+ return &pair;
+}
+
+void startStaticReview(void) {
+ // static review, providing the description of pairs
+ nbgl_useCaseStaticReview(&pairList,
+ &C_icon_eye,
+ "Review\ntransaction",
+ "Approve",
+ "Reject",
+ reviewChoice);
+}
+@endcode
+
+@subsection use_case_spinner Spinner Use Case
+
+This Use Case is simply to display a static "waiting page"
+
+The @ref nbgl_useCaseSpinner() function enables to create such a page.
+
+@section use_case_refresh_page Refreshing screen
+
+After having drawn graphic objects in **framebuffer**, all functions of this API automatically refresh the screen.
+So no need to call @ref nbgl_refresh().
+
+*/
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/doc/resources/LockUnlock.png b/sdk_lib_nbgl/doc/resources/LockUnlock.png
new file mode 100755
index 00000000..f4dd23a2
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/LockUnlock.png differ
diff --git a/sdk_lib_nbgl/doc/resources/NBGLArchi.png b/sdk_lib_nbgl/doc/resources/NBGLArchi.png
new file mode 100755
index 00000000..d87e8c94
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/NBGLArchi.png differ
diff --git a/sdk_lib_nbgl/doc/resources/Pop_screens.png b/sdk_lib_nbgl/doc/resources/Pop_screens.png
new file mode 100755
index 00000000..375d24f3
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/Pop_screens.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmation.png b/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmation.png
new file mode 100755
index 00000000..de7a42aa
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmation.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmationExt.png b/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmationExt.png
new file mode 100755
index 00000000..f47b764c
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-AddressConfirmationExt.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Choice.png b/sdk_lib_nbgl/doc/resources/UseCase-Choice.png
new file mode 100755
index 00000000..c92c3d30
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Choice.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Confirm.png b/sdk_lib_nbgl/doc/resources/UseCase-Confirm.png
new file mode 100755
index 00000000..525a8388
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Confirm.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-DetailsView.png b/sdk_lib_nbgl/doc/resources/UseCase-DetailsView.png
new file mode 100755
index 00000000..70d91fe0
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-DetailsView.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Home.png b/sdk_lib_nbgl/doc/resources/UseCase-Home.png
new file mode 100755
index 00000000..e9091512
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Home.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-HomeExt.png b/sdk_lib_nbgl/doc/resources/UseCase-HomeExt.png
new file mode 100755
index 00000000..112ee545
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-HomeExt.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-HomePlugIn.png b/sdk_lib_nbgl/doc/resources/UseCase-HomePlugIn.png
new file mode 100755
index 00000000..ac1b0016
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-HomePlugIn.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Nano-About1.png b/sdk_lib_nbgl/doc/resources/UseCase-Nano-About1.png
new file mode 100755
index 00000000..86ffb044
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Nano-About1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Nano-Home.png b/sdk_lib_nbgl/doc/resources/UseCase-Nano-Home.png
new file mode 100755
index 00000000..981cbd26
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Nano-Home.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Nano-Review1.png b/sdk_lib_nbgl/doc/resources/UseCase-Nano-Review1.png
new file mode 100755
index 00000000..f0afae8a
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Nano-Review1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Review-Transitions.png b/sdk_lib_nbgl/doc/resources/UseCase-Review-Transitions.png
new file mode 100755
index 00000000..1b7524ab
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Review-Transitions.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Review1.png b/sdk_lib_nbgl/doc/resources/UseCase-Review1.png
new file mode 100755
index 00000000..cbe85469
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Review1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-ReviewForwardOnly.png b/sdk_lib_nbgl/doc/resources/UseCase-ReviewForwardOnly.png
new file mode 100755
index 00000000..9ff2bbd1
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-ReviewForwardOnly.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-ReviewLight.png b/sdk_lib_nbgl/doc/resources/UseCase-ReviewLight.png
new file mode 100755
index 00000000..046e0056
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-ReviewLight.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-ReviewStart.png b/sdk_lib_nbgl/doc/resources/UseCase-ReviewStart.png
new file mode 100755
index 00000000..b2757c1c
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-ReviewStart.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Settings1.png b/sdk_lib_nbgl/doc/resources/UseCase-Settings1.png
new file mode 100755
index 00000000..d1957cce
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Settings1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Settings2.png b/sdk_lib_nbgl/doc/resources/UseCase-Settings2.png
new file mode 100755
index 00000000..a354cb70
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Settings2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Spinner.png b/sdk_lib_nbgl/doc/resources/UseCase-Spinner.png
new file mode 100755
index 00000000..99c26c8b
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Spinner.png differ
diff --git a/sdk_lib_nbgl/doc/resources/UseCase-Status.png b/sdk_lib_nbgl/doc/resources/UseCase-Status.png
new file mode 100755
index 00000000..d381c43f
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/UseCase-Status.png differ
diff --git a/sdk_lib_nbgl/doc/resources/keyboard-example1.png b/sdk_lib_nbgl/doc/resources/keyboard-example1.png
new file mode 100755
index 00000000..a5c93132
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/keyboard-example1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/keyboard-example2.png b/sdk_lib_nbgl/doc/resources/keyboard-example2.png
new file mode 100755
index 00000000..cdd34ca8
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/keyboard-example2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/keyboard-usages.png b/sdk_lib_nbgl/doc/resources/keyboard-usages.png
new file mode 100755
index 00000000..3aa5460e
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/keyboard-usages.png differ
diff --git a/sdk_lib_nbgl/doc/resources/keypad-usages.png b/sdk_lib_nbgl/doc/resources/keypad-usages.png
new file mode 100755
index 00000000..d17949cd
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/keypad-usages.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout-SplitFooter.png b/sdk_lib_nbgl/doc/resources/layout-SplitFooter.png
new file mode 100755
index 00000000..7010581e
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout-SplitFooter.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout1.png b/sdk_lib_nbgl/doc/resources/layout1.png
new file mode 100755
index 00000000..f310d04c
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout10.png b/sdk_lib_nbgl/doc/resources/layout10.png
new file mode 100755
index 00000000..8fe6f629
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout10.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout11.png b/sdk_lib_nbgl/doc/resources/layout11.png
new file mode 100755
index 00000000..881e8b97
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout11.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout12.png b/sdk_lib_nbgl/doc/resources/layout12.png
new file mode 100755
index 00000000..28e22333
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout12.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout13.png b/sdk_lib_nbgl/doc/resources/layout13.png
new file mode 100755
index 00000000..ff7e32eb
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout13.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout15.png b/sdk_lib_nbgl/doc/resources/layout15.png
new file mode 100755
index 00000000..1f7d2cf8
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout15.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout2.png b/sdk_lib_nbgl/doc/resources/layout2.png
new file mode 100755
index 00000000..ddcb3834
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout3.png b/sdk_lib_nbgl/doc/resources/layout3.png
new file mode 100755
index 00000000..853fb434
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout3.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout4.png b/sdk_lib_nbgl/doc/resources/layout4.png
new file mode 100755
index 00000000..1d8778c5
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout4.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout4_bis.png b/sdk_lib_nbgl/doc/resources/layout4_bis.png
new file mode 100755
index 00000000..17925add
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout4_bis.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout5.png b/sdk_lib_nbgl/doc/resources/layout5.png
new file mode 100755
index 00000000..8613bd46
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout5.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout6.png b/sdk_lib_nbgl/doc/resources/layout6.png
new file mode 100755
index 00000000..93cfea0a
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout6.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout7.png b/sdk_lib_nbgl/doc/resources/layout7.png
new file mode 100755
index 00000000..e48a5bc0
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout7.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout8.png b/sdk_lib_nbgl/doc/resources/layout8.png
new file mode 100755
index 00000000..16948f3b
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout8.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout9.png b/sdk_lib_nbgl/doc/resources/layout9.png
new file mode 100755
index 00000000..b7532748
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout9.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_choice_buttons1.png b/sdk_lib_nbgl/doc/resources/layout_choice_buttons1.png
new file mode 100755
index 00000000..df5e20c8
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_choice_buttons1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_choice_buttons2.png b/sdk_lib_nbgl/doc/resources/layout_choice_buttons2.png
new file mode 100755
index 00000000..edc0caed
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_choice_buttons2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_1.png
new file mode 100755
index 00000000..ceceed23
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_centered.png b/sdk_lib_nbgl/doc/resources/layout_nanos_centered.png
new file mode 100755
index 00000000..34786fd3
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_centered.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_flow1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_flow1.png
new file mode 100755
index 00000000..6e95ba14
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_flow1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_keyboard1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_keyboard1.png
new file mode 100755
index 00000000..c5735006
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_keyboard1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_keypad1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_keypad1.png
new file mode 100755
index 00000000..1f322f3d
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_keypad1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_menu_list.png b/sdk_lib_nbgl/doc/resources/layout_nanos_menu_list.png
new file mode 100755
index 00000000..de9ce113
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_menu_list.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_nav1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_nav1.png
new file mode 100755
index 00000000..eb19e4a8
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_nav1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_nav2.png b/sdk_lib_nbgl/doc/resources/layout_nanos_nav2.png
new file mode 100755
index 00000000..c9444712
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_nav2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_step_centered.png b/sdk_lib_nbgl/doc/resources/layout_nanos_step_centered.png
new file mode 100755
index 00000000..66f72158
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_step_centered.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_step_menu_list.png b/sdk_lib_nbgl/doc/resources/layout_nanos_step_menu_list.png
new file mode 100755
index 00000000..f9c9636b
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_step_menu_list.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_step_text1.png b/sdk_lib_nbgl/doc/resources/layout_nanos_step_text1.png
new file mode 100755
index 00000000..80697169
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_step_text1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/layout_nanos_step_text2.png b/sdk_lib_nbgl/doc/resources/layout_nanos_step_text2.png
new file mode 100755
index 00000000..d73b7102
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/layout_nanos_step_text2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page-TagValueConfirm.png b/sdk_lib_nbgl/doc/resources/page-TagValueConfirm.png
new file mode 100755
index 00000000..09b2379c
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page-TagValueConfirm.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page1.png b/sdk_lib_nbgl/doc/resources/page1.png
new file mode 100755
index 00000000..139bf4b2
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page11.png b/sdk_lib_nbgl/doc/resources/page11.png
new file mode 100755
index 00000000..8647ce40
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page11.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page12.png b/sdk_lib_nbgl/doc/resources/page12.png
new file mode 100755
index 00000000..bb97fb93
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page12.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page13.png b/sdk_lib_nbgl/doc/resources/page13.png
new file mode 100755
index 00000000..681d828a
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page13.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page14.png b/sdk_lib_nbgl/doc/resources/page14.png
new file mode 100755
index 00000000..917bcd12
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page14.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page15.png b/sdk_lib_nbgl/doc/resources/page15.png
new file mode 100755
index 00000000..f27b464b
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page15.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page16.png b/sdk_lib_nbgl/doc/resources/page16.png
new file mode 100755
index 00000000..6ceb0896
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page16.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page17.png b/sdk_lib_nbgl/doc/resources/page17.png
new file mode 100755
index 00000000..4ee379d6
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page17.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page2.png b/sdk_lib_nbgl/doc/resources/page2.png
new file mode 100755
index 00000000..711b6ae2
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page2.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page22.png b/sdk_lib_nbgl/doc/resources/page22.png
new file mode 100755
index 00000000..5c4d0f2d
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page22.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page3.png b/sdk_lib_nbgl/doc/resources/page3.png
new file mode 100755
index 00000000..d2b7b80d
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page3.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page4.png b/sdk_lib_nbgl/doc/resources/page4.png
new file mode 100755
index 00000000..99c26c8b
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page4.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page6.png b/sdk_lib_nbgl/doc/resources/page6.png
new file mode 100755
index 00000000..bbc0570d
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page6.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page_drawInfo1.png b/sdk_lib_nbgl/doc/resources/page_drawInfo1.png
new file mode 100755
index 00000000..29560d12
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page_drawInfo1.png differ
diff --git a/sdk_lib_nbgl/doc/resources/page_drawInfo2.png b/sdk_lib_nbgl/doc/resources/page_drawInfo2.png
new file mode 100755
index 00000000..35da8cb9
Binary files /dev/null and b/sdk_lib_nbgl/doc/resources/page_drawInfo2.png differ
diff --git a/sdk_lib_nbgl/fonts/Inter-Medium.ttf b/sdk_lib_nbgl/fonts/Inter-Medium.ttf
new file mode 100644
index 00000000..b53fb1c4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/Inter-Medium.ttf differ
diff --git a/sdk_lib_nbgl/fonts/Inter-Regular.ttf b/sdk_lib_nbgl/fonts/Inter-Regular.ttf
new file mode 100644
index 00000000..8d4eebf2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/Inter-Regular.ttf differ
diff --git a/sdk_lib_nbgl/fonts/Inter-SemiBold.ttf b/sdk_lib_nbgl/fonts/Inter-SemiBold.ttf
new file mode 100644
index 00000000..c6aeeb16
Binary files /dev/null and b/sdk_lib_nbgl/fonts/Inter-SemiBold.ttf differ
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Medium32-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-Medium32-1bpp.ini
new file mode 100644
index 00000000..df0b9c97
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Medium32-1bpp.ini
@@ -0,0 +1,16 @@
+[main]
+font=Inter-Medium.ttf
+font_id_name=BAGL_FONT_INTER_MEDIUM_32px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=26
+# This font can display characters at y=-1 => we need to compensate that
+baseline_offset=1
+fontSize=32
+lineSize=40
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Medium32.ini b/sdk_lib_nbgl/fonts/config-Inter-Medium32.ini
new file mode 100644
index 00000000..cee43133
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Medium32.ini
@@ -0,0 +1,16 @@
+[main]
+font=Inter-Medium.ttf
+font_id_name=BAGL_FONT_INTER_MEDIUM_32px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=24
+# This font can display characters at y=-1 => we need to compensate that
+baseline_offset=1
+fontSize=32
+lineSize=40
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=4
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Medium36-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-Medium36-1bpp.ini
new file mode 100644
index 00000000..9eb1e265
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Medium36-1bpp.ini
@@ -0,0 +1,16 @@
+[main]
+font=Inter-Medium.ttf
+font_id_name=BAGL_FONT_INTER_MEDIUM_36px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=30
+# This font can display characters at y=-1 => we need to compensate that
+baseline_offset=1
+fontSize=36
+lineSize=44
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Medium36.ini b/sdk_lib_nbgl/fonts/config-Inter-Medium36.ini
new file mode 100644
index 00000000..0805b7b4
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Medium36.ini
@@ -0,0 +1,16 @@
+[main]
+font=Inter-Medium.ttf
+font_id_name=BAGL_FONT_INTER_MEDIUM_36px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=28
+# This font can display characters at y=-1 => we need to compensate that
+baseline_offset=1
+fontSize=36
+lineSize=44
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=4
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Regular24-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-Regular24-1bpp.ini
new file mode 100644
index 00000000..db27268c
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Regular24-1bpp.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-Regular.ttf
+font_id_name=BAGL_FONT_INTER_REGULAR_24px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=18
+fontSize=24
+lineSize=32
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Regular24.ini b/sdk_lib_nbgl/fonts/config-Inter-Regular24.ini
new file mode 100644
index 00000000..fa115d73
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Regular24.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-Regular.ttf
+font_id_name=BAGL_FONT_INTER_REGULAR_24px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=19
+fontSize=24
+lineSize=32
+firstChar=0x20
+lastChar=0x7E
+firstLine=4
+align=true
+crop=true
+bpp=4
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Regular28-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-Regular28-1bpp.ini
new file mode 100644
index 00000000..303fbe3e
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Regular28-1bpp.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-Regular.ttf
+font_id_name=BAGL_FONT_INTER_REGULAR_28px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=22
+fontSize=28
+lineSize=36
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+align=true
+crop=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-Regular28.ini b/sdk_lib_nbgl/fonts/config-Inter-Regular28.ini
new file mode 100644
index 00000000..5b054a51
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-Regular28.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-Regular.ttf
+font_id_name=BAGL_FONT_INTER_REGULAR_28px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=23
+fontSize=28
+lineSize=36
+firstChar=0x20
+lastChar=0x7E
+firstLine=4
+align=true
+crop=true
+bpp=4
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-SemiBold24-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-SemiBold24-1bpp.ini
new file mode 100644
index 00000000..fb6c49de
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-SemiBold24-1bpp.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-SemiBold.ttf
+font_id_name=BAGL_FONT_INTER_SEMIBOLD_24px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=18
+fontSize=24
+lineSize=32
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+crop=false
+align=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-SemiBold24.ini b/sdk_lib_nbgl/fonts/config-Inter-SemiBold24.ini
new file mode 100644
index 00000000..9afa4e3d
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-SemiBold24.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-SemiBold.ttf
+font_id_name=BAGL_FONT_INTER_SEMIBOLD_24px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=19
+fontSize=24
+lineSize=32
+firstChar=0x20
+lastChar=0x7E
+firstLine=4
+crop=true
+bpp=4
+align=true
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-SemiBold28-1bpp.ini b/sdk_lib_nbgl/fonts/config-Inter-SemiBold28-1bpp.ini
new file mode 100644
index 00000000..54a234ec
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-SemiBold28-1bpp.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-SemiBold.ttf
+font_id_name=BAGL_FONT_INTER_SEMIBOLD_28px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=22
+fontSize=28
+lineSize=36
+firstChar=0x20
+lastChar=0x7E
+firstLine=5
+crop=false
+align=true
+bpp=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-Inter-SemiBold28.ini b/sdk_lib_nbgl/fonts/config-Inter-SemiBold28.ini
new file mode 100644
index 00000000..6ccdf4d2
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-Inter-SemiBold28.ini
@@ -0,0 +1,14 @@
+[main]
+font=Inter-SemiBold.ttf
+font_id_name=BAGL_FONT_INTER_SEMIBOLD_28px
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=23
+fontSize=28
+lineSize=36
+firstChar=0x20
+lastChar=0x7E
+firstLine=4
+crop=true
+bpp=4
+align=true
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-open_sans_extrabold_11.ini b/sdk_lib_nbgl/fonts/config-open_sans_extrabold_11.ini
new file mode 100644
index 00000000..eebde765
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-open_sans_extrabold_11.ini
@@ -0,0 +1,14 @@
+[main]
+font=open_sans_extrabold.ttf
+font_id_name=BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=12
+fontSize=11
+lineSize=14
+firstChar=0x20
+lastChar=0x7E
+baseline_offset=0
+crop=true
+bpp=1
+kerning=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-open_sans_light_16.ini b/sdk_lib_nbgl/fonts/config-open_sans_light_16.ini
new file mode 100644
index 00000000..881f122e
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-open_sans_light_16.ini
@@ -0,0 +1,14 @@
+[main]
+font=open_sans_light.ttf
+font_id_name=BAGL_FONT_OPEN_SANS_LIGHT_16px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=16
+fontSize=16
+lineSize=21
+firstChar=0x20
+lastChar=0x7E
+firstLine=4
+crop=true
+bpp=1
+kerning=2
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/config-open_sans_regular_11.ini b/sdk_lib_nbgl/fonts/config-open_sans_regular_11.ini
new file mode 100644
index 00000000..a8dd2629
--- /dev/null
+++ b/sdk_lib_nbgl/fonts/config-open_sans_regular_11.ini
@@ -0,0 +1,14 @@
+[main]
+font=open_sans_regular.ttf
+font_id_name=BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp
+# Distance of the baseline from the top of the loaded pictures
+loaded_baseline=12
+fontSize=11
+lineSize=14
+firstChar=0x20
+lastChar=0x7E
+baseline_offset=0
+crop=true
+bpp=1
+kerning=1
+nbgl=true
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000020.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000020.png
new file mode 100644
index 00000000..54ed0c5e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000020.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000021.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000021.png
new file mode 100644
index 00000000..cc7e040c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000021.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000022.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000022.png
new file mode 100644
index 00000000..ef9bb849
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000022.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000023.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000023.png
new file mode 100644
index 00000000..2a7bf068
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000023.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000024.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000024.png
new file mode 100644
index 00000000..1f05ecce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000024.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000025.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000025.png
new file mode 100644
index 00000000..6d73a087
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000025.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000026.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000026.png
new file mode 100644
index 00000000..d5d83f3d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000026.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000027.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000027.png
new file mode 100644
index 00000000..8747585d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000027.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000028.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000028.png
new file mode 100644
index 00000000..9909433d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000028.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000029.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000029.png
new file mode 100644
index 00000000..c967cb1b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000029.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002A.png
new file mode 100644
index 00000000..4b0dc995
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002B.png
new file mode 100644
index 00000000..b6024f1c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002C.png
new file mode 100644
index 00000000..d68b9283
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002D.png
new file mode 100644
index 00000000..8848b342
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002E.png
new file mode 100644
index 00000000..95a81fd1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002F.png
new file mode 100644
index 00000000..8d5fe992
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00002F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000030.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000030.png
new file mode 100644
index 00000000..de2d4340
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000030.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000031.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000031.png
new file mode 100644
index 00000000..ed545a6f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000031.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000032.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000032.png
new file mode 100644
index 00000000..4bb50365
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000032.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000033.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000033.png
new file mode 100644
index 00000000..a047944d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000033.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000034.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000034.png
new file mode 100644
index 00000000..d3657dfe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000034.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000035.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000035.png
new file mode 100644
index 00000000..d253433b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000035.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000036.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000036.png
new file mode 100644
index 00000000..2b540f66
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000036.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000037.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000037.png
new file mode 100644
index 00000000..0d6e8203
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000037.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000038.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000038.png
new file mode 100644
index 00000000..44674869
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000038.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000039.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000039.png
new file mode 100644
index 00000000..0169631c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000039.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003A.png
new file mode 100644
index 00000000..4ed1f7ad
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003B.png
new file mode 100644
index 00000000..c91cee83
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003C.png
new file mode 100644
index 00000000..e385028b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003D.png
new file mode 100644
index 00000000..fe8b2dd8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003E.png
new file mode 100644
index 00000000..a45aaa92
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003F.png
new file mode 100644
index 00000000..af934515
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00003F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000040.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000040.png
new file mode 100644
index 00000000..dc30a60c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000040.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000041.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000041.png
new file mode 100644
index 00000000..07dcba4b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000041.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000042.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000042.png
new file mode 100644
index 00000000..e6b0e6a2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000042.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000043.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000043.png
new file mode 100644
index 00000000..a599c383
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000043.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000044.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000044.png
new file mode 100644
index 00000000..4aafd5a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000044.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000045.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000045.png
new file mode 100644
index 00000000..cee1f027
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000045.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000046.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000046.png
new file mode 100644
index 00000000..e7e20581
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000046.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000047.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000047.png
new file mode 100644
index 00000000..08d3d13b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000047.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000048.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000048.png
new file mode 100644
index 00000000..15ac0ec0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000048.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000049.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000049.png
new file mode 100644
index 00000000..4dc792e7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000049.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004A.png
new file mode 100644
index 00000000..5cd467e9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004B.png
new file mode 100644
index 00000000..110457a1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004C.png
new file mode 100644
index 00000000..dab39b28
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004D.png
new file mode 100644
index 00000000..6b1beddd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004E.png
new file mode 100644
index 00000000..6bf36eb1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004F.png
new file mode 100644
index 00000000..1fed4b23
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00004F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000050.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000050.png
new file mode 100644
index 00000000..e1907c08
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000050.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000051.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000051.png
new file mode 100644
index 00000000..72a1b2fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000051.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000052.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000052.png
new file mode 100644
index 00000000..da2b196f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000052.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000053.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000053.png
new file mode 100644
index 00000000..ae542535
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000053.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000054.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000054.png
new file mode 100644
index 00000000..886c2206
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000054.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000055.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000055.png
new file mode 100644
index 00000000..5ba8287f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000055.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000056.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000056.png
new file mode 100644
index 00000000..c5f0bda6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000056.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000057.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000057.png
new file mode 100644
index 00000000..cdedb5fc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000057.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000058.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000058.png
new file mode 100644
index 00000000..13891961
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000058.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000059.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000059.png
new file mode 100644
index 00000000..e2efc508
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000059.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005A.png
new file mode 100644
index 00000000..6978a503
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005B.png
new file mode 100644
index 00000000..202e5d30
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005C.png
new file mode 100644
index 00000000..36388a37
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005D.png
new file mode 100644
index 00000000..196ea411
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005E.png
new file mode 100644
index 00000000..e17fdc14
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005F.png
new file mode 100644
index 00000000..8c7d7d29
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00005F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000060.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000060.png
new file mode 100644
index 00000000..07585d98
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000060.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000061.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000061.png
new file mode 100644
index 00000000..d1f60a57
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000061.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000062.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000062.png
new file mode 100644
index 00000000..8bb23a3f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000062.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000063.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000063.png
new file mode 100644
index 00000000..e0a1e260
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000063.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000064.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000064.png
new file mode 100644
index 00000000..db840119
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000064.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000065.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000065.png
new file mode 100644
index 00000000..00f5064e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000065.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000066.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000066.png
new file mode 100644
index 00000000..6df6d96a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000066.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000067.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000067.png
new file mode 100644
index 00000000..94df5129
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000067.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000068.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000068.png
new file mode 100644
index 00000000..6b237566
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000068.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000069.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000069.png
new file mode 100644
index 00000000..4ebb910c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000069.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006A.png
new file mode 100644
index 00000000..5deb3f11
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006B.png
new file mode 100644
index 00000000..7d33fdaf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006C.png
new file mode 100644
index 00000000..34641cf6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006D.png
new file mode 100644
index 00000000..e2d244ee
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006E.png
new file mode 100644
index 00000000..7d2eddbf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006F.png
new file mode 100644
index 00000000..98ffb705
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00006F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000070.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000070.png
new file mode 100644
index 00000000..d46ab2dc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000070.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000071.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000071.png
new file mode 100644
index 00000000..d64d7e22
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000071.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000072.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000072.png
new file mode 100644
index 00000000..46bcda1b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000072.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000073.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000073.png
new file mode 100644
index 00000000..630705ad
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000073.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000074.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000074.png
new file mode 100644
index 00000000..48fc7f48
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000074.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000075.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000075.png
new file mode 100644
index 00000000..83dd6465
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000075.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000076.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000076.png
new file mode 100644
index 00000000..32f00569
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000076.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000077.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000077.png
new file mode 100644
index 00000000..050e9d58
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000077.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000078.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000078.png
new file mode 100644
index 00000000..ebb38e5f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000078.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000079.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000079.png
new file mode 100644
index 00000000..3600177c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x000079.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007A.png
new file mode 100644
index 00000000..e9b16042
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007B.png
new file mode 100644
index 00000000..29ec90f2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007C.png
new file mode 100644
index 00000000..2fc1f522
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007D.png
new file mode 100644
index 00000000..78e39c6b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007E.png
new file mode 100644
index 00000000..5f352a7d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px/nbgl_font_Inter_Medium_32px_0x00007E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000020.gif
new file mode 100644
index 00000000..e74778b2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000021.gif
new file mode 100644
index 00000000..29c02a21
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000022.gif
new file mode 100644
index 00000000..6c11c9dc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000023.gif
new file mode 100644
index 00000000..b9d08dbd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000024.gif
new file mode 100644
index 00000000..77d04a62
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000025.gif
new file mode 100644
index 00000000..9f16b28f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000026.gif
new file mode 100644
index 00000000..2a4aa167
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000027.gif
new file mode 100644
index 00000000..3d785bc5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000028.gif
new file mode 100644
index 00000000..f2d70658
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000029.gif
new file mode 100644
index 00000000..ab77845b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..c6180d0b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..ceddb802
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..05e505e3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..89836109
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..0530988f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..134733ec
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000030.gif
new file mode 100644
index 00000000..356df232
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000031.gif
new file mode 100644
index 00000000..dba1ce1a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000032.gif
new file mode 100644
index 00000000..8fbf2d6e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000033.gif
new file mode 100644
index 00000000..238c3b5f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000034.gif
new file mode 100644
index 00000000..a2ee7e0e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000035.gif
new file mode 100644
index 00000000..73fd39ae
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000036.gif
new file mode 100644
index 00000000..53722d22
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000037.gif
new file mode 100644
index 00000000..a680c6ba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000038.gif
new file mode 100644
index 00000000..47f8848d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000039.gif
new file mode 100644
index 00000000..a05d76cf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..7157dc57
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..6fbfd020
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..94634e37
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..98d35c7c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..c48af315
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..dc4bcb79
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000040.gif
new file mode 100644
index 00000000..b5d93351
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000041.gif
new file mode 100644
index 00000000..9de176fc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000042.gif
new file mode 100644
index 00000000..e61672f0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000043.gif
new file mode 100644
index 00000000..cdf94183
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000044.gif
new file mode 100644
index 00000000..500248ba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000045.gif
new file mode 100644
index 00000000..519c65bd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000046.gif
new file mode 100644
index 00000000..f2f9099f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000047.gif
new file mode 100644
index 00000000..41907994
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000048.gif
new file mode 100644
index 00000000..8277956b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000049.gif
new file mode 100644
index 00000000..7ce96419
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..faf1cdcf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..67a869b9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..1884b2c9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..280af928
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..2774c709
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..a17dfd3b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000050.gif
new file mode 100644
index 00000000..5298e5db
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000051.gif
new file mode 100644
index 00000000..5e33ec3b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000052.gif
new file mode 100644
index 00000000..48e6cf4f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000053.gif
new file mode 100644
index 00000000..4299506b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000054.gif
new file mode 100644
index 00000000..e754a57f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000055.gif
new file mode 100644
index 00000000..fbc2c675
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000056.gif
new file mode 100644
index 00000000..ace8ce63
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000057.gif
new file mode 100644
index 00000000..4093eafc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000058.gif
new file mode 100644
index 00000000..fd23bf27
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000059.gif
new file mode 100644
index 00000000..f0b88347
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..09131e4f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..951f891d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..886849c8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..66aa0901
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..3573f7c9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..7c5553e0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000060.gif
new file mode 100644
index 00000000..3848c550
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000061.gif
new file mode 100644
index 00000000..862b1e5f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000062.gif
new file mode 100644
index 00000000..03cec0ed
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000063.gif
new file mode 100644
index 00000000..7dc30a95
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000064.gif
new file mode 100644
index 00000000..9f24b4dd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000065.gif
new file mode 100644
index 00000000..30761910
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000066.gif
new file mode 100644
index 00000000..27905f33
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000067.gif
new file mode 100644
index 00000000..80b88dd6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000068.gif
new file mode 100644
index 00000000..1a8867fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000069.gif
new file mode 100644
index 00000000..c138eaeb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..0ff901d8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..c0caffa5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..2cc6345b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..a5d5dff7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..6fa98fca
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..b9d2ac08
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000070.gif
new file mode 100644
index 00000000..6fd86271
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000071.gif
new file mode 100644
index 00000000..f9b9d22e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000072.gif
new file mode 100644
index 00000000..c4f2d4e5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000073.gif
new file mode 100644
index 00000000..b96e8bf9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000074.gif
new file mode 100644
index 00000000..2d57d3d5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000075.gif
new file mode 100644
index 00000000..deac5424
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000076.gif
new file mode 100644
index 00000000..dce02f7e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000077.gif
new file mode 100644
index 00000000..62a36c17
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000078.gif
new file mode 100644
index 00000000..4f902353
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000079.gif
new file mode 100644
index 00000000..bdcde4f4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..df226de6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..80baf6e7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..db383284
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..6290ec83
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..9bf7952f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp/nbgl_font_Inter_Medium_32px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp_unicode/nbgl_font_Inter_Medium_32px_1bpp_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp_unicode/nbgl_font_Inter_Medium_32px_1bpp_unicode_0x00FFFD.png
new file mode 100644
index 00000000..11ee0d9c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_1bpp_unicode/nbgl_font_Inter_Medium_32px_1bpp_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_unicode/nbgl_font_Inter_Medium_32px_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_unicode/nbgl_font_Inter_Medium_32px_unicode_0x00FFFD.png
new file mode 100644
index 00000000..c34462fa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Medium_32px_unicode/nbgl_font_Inter_Medium_32px_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000020.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000020.png
new file mode 100644
index 00000000..35ef747b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000020.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000021.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000021.png
new file mode 100644
index 00000000..4c750a19
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000021.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000022.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000022.png
new file mode 100644
index 00000000..2e6b505d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000022.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000023.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000023.png
new file mode 100644
index 00000000..ff08770b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000023.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000024.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000024.png
new file mode 100644
index 00000000..09a1edc3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000024.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000025.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000025.png
new file mode 100644
index 00000000..33f21f9c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000025.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000026.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000026.png
new file mode 100644
index 00000000..5a78c45b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000026.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000027.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000027.png
new file mode 100644
index 00000000..133ccb2f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000027.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000028.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000028.png
new file mode 100644
index 00000000..f7bff7ad
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000028.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000029.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000029.png
new file mode 100644
index 00000000..a9cb85a1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000029.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002A.png
new file mode 100644
index 00000000..aa5b7772
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002B.png
new file mode 100644
index 00000000..ead715c6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002C.png
new file mode 100644
index 00000000..48662b37
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002D.png
new file mode 100644
index 00000000..ae7b8d26
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002E.png
new file mode 100644
index 00000000..3f489734
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002F.png
new file mode 100644
index 00000000..349c5f65
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00002F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000030.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000030.png
new file mode 100644
index 00000000..dafe08e8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000030.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000031.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000031.png
new file mode 100644
index 00000000..8102d6ac
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000031.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000032.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000032.png
new file mode 100644
index 00000000..d2ee8ed5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000032.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000033.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000033.png
new file mode 100644
index 00000000..8b3d0d92
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000033.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000034.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000034.png
new file mode 100644
index 00000000..15f52da6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000034.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000035.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000035.png
new file mode 100644
index 00000000..ea4bbc45
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000035.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000036.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000036.png
new file mode 100644
index 00000000..890e28f0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000036.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000037.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000037.png
new file mode 100644
index 00000000..c6b0468a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000037.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000038.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000038.png
new file mode 100644
index 00000000..9f00109c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000038.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000039.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000039.png
new file mode 100644
index 00000000..5791e45c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000039.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003A.png
new file mode 100644
index 00000000..dd0b1935
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003B.png
new file mode 100644
index 00000000..fb19cd86
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003C.png
new file mode 100644
index 00000000..da34f5cb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003D.png
new file mode 100644
index 00000000..3e4be612
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003E.png
new file mode 100644
index 00000000..b7445d6a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003F.png
new file mode 100644
index 00000000..494a7ce4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00003F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000040.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000040.png
new file mode 100644
index 00000000..c41464bb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000040.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000041.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000041.png
new file mode 100644
index 00000000..097b2573
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000041.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000042.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000042.png
new file mode 100644
index 00000000..363d42fc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000042.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000043.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000043.png
new file mode 100644
index 00000000..16a5f7fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000043.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000044.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000044.png
new file mode 100644
index 00000000..8d487287
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000044.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000045.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000045.png
new file mode 100644
index 00000000..05fe2543
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000045.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000046.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000046.png
new file mode 100644
index 00000000..9e553a23
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000046.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000047.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000047.png
new file mode 100644
index 00000000..842d348e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000047.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000048.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000048.png
new file mode 100644
index 00000000..f57b752d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000048.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000049.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000049.png
new file mode 100644
index 00000000..2733e5db
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000049.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004A.png
new file mode 100644
index 00000000..a80c63d0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004B.png
new file mode 100644
index 00000000..40b1e0b8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004C.png
new file mode 100644
index 00000000..ccc44d6c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004D.png
new file mode 100644
index 00000000..a4377aa0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004E.png
new file mode 100644
index 00000000..011a4c8b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004F.png
new file mode 100644
index 00000000..a0b2eda3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00004F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000050.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000050.png
new file mode 100644
index 00000000..d5f281b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000050.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000051.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000051.png
new file mode 100644
index 00000000..fa406864
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000051.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000052.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000052.png
new file mode 100644
index 00000000..8ab344fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000052.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000053.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000053.png
new file mode 100644
index 00000000..6d79f1ad
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000053.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000054.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000054.png
new file mode 100644
index 00000000..8f333005
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000054.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000055.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000055.png
new file mode 100644
index 00000000..caf7ca8d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000055.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000056.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000056.png
new file mode 100644
index 00000000..1d79e335
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000056.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000057.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000057.png
new file mode 100644
index 00000000..958b47ab
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000057.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000058.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000058.png
new file mode 100644
index 00000000..9650a0c6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000058.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000059.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000059.png
new file mode 100644
index 00000000..1b4abc84
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000059.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005A.png
new file mode 100644
index 00000000..7605297e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005B.png
new file mode 100644
index 00000000..7be230ed
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005C.png
new file mode 100644
index 00000000..01a48141
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005D.png
new file mode 100644
index 00000000..0499a904
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005E.png
new file mode 100644
index 00000000..26065661
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005F.png
new file mode 100644
index 00000000..76c00b00
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00005F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000060.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000060.png
new file mode 100644
index 00000000..2bae5fce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000060.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000061.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000061.png
new file mode 100644
index 00000000..f643756b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000061.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000062.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000062.png
new file mode 100644
index 00000000..13d8b39d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000062.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000063.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000063.png
new file mode 100644
index 00000000..0e439d91
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000063.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000064.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000064.png
new file mode 100644
index 00000000..31786b42
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000064.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000065.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000065.png
new file mode 100644
index 00000000..e7a4d821
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000065.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000066.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000066.png
new file mode 100644
index 00000000..6131d086
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000066.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000067.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000067.png
new file mode 100644
index 00000000..4580b03d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000067.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000068.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000068.png
new file mode 100644
index 00000000..413a4530
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000068.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000069.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000069.png
new file mode 100644
index 00000000..240cbd22
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000069.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006A.png
new file mode 100644
index 00000000..88ec1dcb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006B.png
new file mode 100644
index 00000000..f8b99a02
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006C.png
new file mode 100644
index 00000000..732d0942
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006D.png
new file mode 100644
index 00000000..6ae45331
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006E.png
new file mode 100644
index 00000000..40897f50
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006F.png
new file mode 100644
index 00000000..f501305c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00006F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000070.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000070.png
new file mode 100644
index 00000000..7f960c28
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000070.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000071.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000071.png
new file mode 100644
index 00000000..6926598f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000071.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000072.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000072.png
new file mode 100644
index 00000000..ebf52211
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000072.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000073.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000073.png
new file mode 100644
index 00000000..e3b95120
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000073.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000074.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000074.png
new file mode 100644
index 00000000..2c4661a5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000074.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000075.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000075.png
new file mode 100644
index 00000000..abcf48b4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000075.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000076.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000076.png
new file mode 100644
index 00000000..432c5bf0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000076.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000077.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000077.png
new file mode 100644
index 00000000..9b0aa4b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000077.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000078.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000078.png
new file mode 100644
index 00000000..bd70c59d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000078.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000079.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000079.png
new file mode 100644
index 00000000..20c984c0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x000079.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007A.png
new file mode 100644
index 00000000..22b52df8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007B.png
new file mode 100644
index 00000000..453d1940
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007C.png
new file mode 100644
index 00000000..a46f318f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007D.png
new file mode 100644
index 00000000..92b44cf7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007E.png
new file mode 100644
index 00000000..e08d4dce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px/nbgl_font_Inter_Regular_24px_0x00007E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000020.gif
new file mode 100644
index 00000000..51feff67
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000021.gif
new file mode 100644
index 00000000..d0f4458c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000022.gif
new file mode 100644
index 00000000..2323112c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000023.gif
new file mode 100644
index 00000000..e1e0203b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000024.gif
new file mode 100644
index 00000000..3c11be24
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000025.gif
new file mode 100644
index 00000000..77446ccd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000026.gif
new file mode 100644
index 00000000..16c08ab9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000027.gif
new file mode 100644
index 00000000..2cdb66ad
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000028.gif
new file mode 100644
index 00000000..0fff5f33
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000029.gif
new file mode 100644
index 00000000..2fc8101b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..e60c3b59
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..65163593
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..03b48890
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..d456038c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..392e2214
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..4d9722d6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000030.gif
new file mode 100644
index 00000000..7d5bf7ac
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000031.gif
new file mode 100644
index 00000000..1df9a4d8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000032.gif
new file mode 100644
index 00000000..9ec4c1b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000033.gif
new file mode 100644
index 00000000..bc03535e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000034.gif
new file mode 100644
index 00000000..8e94d919
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000035.gif
new file mode 100644
index 00000000..31fce48c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000036.gif
new file mode 100644
index 00000000..136a43f5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000037.gif
new file mode 100644
index 00000000..efba6d6c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000038.gif
new file mode 100644
index 00000000..67744819
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000039.gif
new file mode 100644
index 00000000..c322bf93
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..24af95c0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..5e487adb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..080e49a4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..0b81e4ae
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..e0575cef
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..8e39c2b1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000040.gif
new file mode 100644
index 00000000..5cfd135b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000041.gif
new file mode 100644
index 00000000..a1e71961
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000042.gif
new file mode 100644
index 00000000..b9372d6f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000043.gif
new file mode 100644
index 00000000..18dcbd50
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000044.gif
new file mode 100644
index 00000000..2e8a372a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000045.gif
new file mode 100644
index 00000000..b931b009
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000046.gif
new file mode 100644
index 00000000..f8ee9277
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000047.gif
new file mode 100644
index 00000000..6ae4e30b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000048.gif
new file mode 100644
index 00000000..4e7061b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000049.gif
new file mode 100644
index 00000000..d76c67f9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..8d36c2af
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..0b96b9da
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..fb33a14c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..3ffc4530
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..20a3877e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..363624f6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000050.gif
new file mode 100644
index 00000000..ab2557b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000051.gif
new file mode 100644
index 00000000..e46c6566
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000052.gif
new file mode 100644
index 00000000..52d00c12
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000053.gif
new file mode 100644
index 00000000..23d839fd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000054.gif
new file mode 100644
index 00000000..fd13d35a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000055.gif
new file mode 100644
index 00000000..38842c8a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000056.gif
new file mode 100644
index 00000000..fa45ce4f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000057.gif
new file mode 100644
index 00000000..172b617f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000058.gif
new file mode 100644
index 00000000..95c8485d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000059.gif
new file mode 100644
index 00000000..035053dd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..f3981e19
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..b43dc351
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..b7fdbf1f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..49b29b77
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..127b53cb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..b33d7bc1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000060.gif
new file mode 100644
index 00000000..edb22539
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000061.gif
new file mode 100644
index 00000000..35953084
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000062.gif
new file mode 100644
index 00000000..462372b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000063.gif
new file mode 100644
index 00000000..96364cfb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000064.gif
new file mode 100644
index 00000000..4b04e1a3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000065.gif
new file mode 100644
index 00000000..1bf22846
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000066.gif
new file mode 100644
index 00000000..60d0dbba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000067.gif
new file mode 100644
index 00000000..5ee8641c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000068.gif
new file mode 100644
index 00000000..1584f9b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000069.gif
new file mode 100644
index 00000000..4db17458
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..867222a2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..8db97362
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..05bfd003
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..6e4d5b61
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..171ca46a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..a6a50860
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000070.gif
new file mode 100644
index 00000000..5cf74498
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000071.gif
new file mode 100644
index 00000000..72f97692
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000072.gif
new file mode 100644
index 00000000..60b1bc96
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000073.gif
new file mode 100644
index 00000000..77c27b5e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000074.gif
new file mode 100644
index 00000000..79187633
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000075.gif
new file mode 100644
index 00000000..3979f59f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000076.gif
new file mode 100644
index 00000000..0bc99a03
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000077.gif
new file mode 100644
index 00000000..c6ab3e3d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000078.gif
new file mode 100644
index 00000000..720faab9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000079.gif
new file mode 100644
index 00000000..0c37003d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..261a0bf9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..eda0daea
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..79d1b410
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..62dd474f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..ec96e3c9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp/nbgl_font_Inter_Regular_24px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp_unicode/nbgl_font_Inter_Regular_24px_1bpp_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp_unicode/nbgl_font_Inter_Regular_24px_1bpp_unicode_0x00FFFD.png
new file mode 100644
index 00000000..3f093de5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_1bpp_unicode/nbgl_font_Inter_Regular_24px_1bpp_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_unicode/nbgl_font_Inter_Regular_24px_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_unicode/nbgl_font_Inter_Regular_24px_unicode_0x00FFFD.png
new file mode 100644
index 00000000..8ca1b7b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_Regular_24px_unicode/nbgl_font_Inter_Regular_24px_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000020.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000020.png
new file mode 100644
index 00000000..753c7028
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000020.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000021.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000021.png
new file mode 100644
index 00000000..51d7de7d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000021.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000022.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000022.png
new file mode 100644
index 00000000..293af94d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000022.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000023.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000023.png
new file mode 100644
index 00000000..0c54064e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000023.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000024.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000024.png
new file mode 100644
index 00000000..eac0c429
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000024.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000025.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000025.png
new file mode 100644
index 00000000..988d4108
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000025.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000026.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000026.png
new file mode 100644
index 00000000..11f8590c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000026.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000027.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000027.png
new file mode 100644
index 00000000..87971682
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000027.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000028.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000028.png
new file mode 100644
index 00000000..39273731
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000028.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000029.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000029.png
new file mode 100644
index 00000000..1a59e50e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000029.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002A.png
new file mode 100644
index 00000000..6a0473ea
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002B.png
new file mode 100644
index 00000000..40bcfdb4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002C.png
new file mode 100644
index 00000000..592431dc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002D.png
new file mode 100644
index 00000000..f0b93ccc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002E.png
new file mode 100644
index 00000000..5be7cffe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002F.png
new file mode 100644
index 00000000..4b1ff205
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00002F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000030.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000030.png
new file mode 100644
index 00000000..88fdc894
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000030.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000031.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000031.png
new file mode 100644
index 00000000..9a2cbecc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000031.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000032.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000032.png
new file mode 100644
index 00000000..29d94c39
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000032.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000033.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000033.png
new file mode 100644
index 00000000..aba187b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000033.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000034.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000034.png
new file mode 100644
index 00000000..2a12169c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000034.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000035.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000035.png
new file mode 100644
index 00000000..aa9bf952
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000035.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000036.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000036.png
new file mode 100644
index 00000000..f4c2df35
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000036.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000037.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000037.png
new file mode 100644
index 00000000..f2296f5d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000037.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000038.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000038.png
new file mode 100644
index 00000000..2757851c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000038.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000039.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000039.png
new file mode 100644
index 00000000..0ab6527b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000039.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003A.png
new file mode 100644
index 00000000..a8005a62
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003B.png
new file mode 100644
index 00000000..22f715f2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003C.png
new file mode 100644
index 00000000..da852d31
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003D.png
new file mode 100644
index 00000000..f42e92b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003E.png
new file mode 100644
index 00000000..65bcaad0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003F.png
new file mode 100644
index 00000000..2414c126
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00003F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000040.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000040.png
new file mode 100644
index 00000000..5dc5fcb9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000040.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000041.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000041.png
new file mode 100644
index 00000000..612d2d71
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000041.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000042.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000042.png
new file mode 100644
index 00000000..5f8908f5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000042.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000043.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000043.png
new file mode 100644
index 00000000..e954b9d1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000043.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000044.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000044.png
new file mode 100644
index 00000000..15b39e78
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000044.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000045.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000045.png
new file mode 100644
index 00000000..46247961
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000045.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000046.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000046.png
new file mode 100644
index 00000000..557aa525
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000046.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000047.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000047.png
new file mode 100644
index 00000000..fa2510ab
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000047.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000048.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000048.png
new file mode 100644
index 00000000..1b438349
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000048.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000049.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000049.png
new file mode 100644
index 00000000..f881fd77
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000049.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004A.png
new file mode 100644
index 00000000..0fab1232
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004B.png
new file mode 100644
index 00000000..f8493ea6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004C.png
new file mode 100644
index 00000000..31b18cd2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004D.png
new file mode 100644
index 00000000..a5dc54b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004E.png
new file mode 100644
index 00000000..e7f6d44c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004F.png
new file mode 100644
index 00000000..84f642a5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00004F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000050.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000050.png
new file mode 100644
index 00000000..b1f6f64c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000050.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000051.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000051.png
new file mode 100644
index 00000000..2a8f3c44
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000051.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000052.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000052.png
new file mode 100644
index 00000000..e81fc533
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000052.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000053.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000053.png
new file mode 100644
index 00000000..0889a3a8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000053.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000054.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000054.png
new file mode 100644
index 00000000..50eb69e8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000054.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000055.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000055.png
new file mode 100644
index 00000000..4bd9a6f1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000055.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000056.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000056.png
new file mode 100644
index 00000000..ff5d6209
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000056.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000057.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000057.png
new file mode 100644
index 00000000..4b47fd54
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000057.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000058.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000058.png
new file mode 100644
index 00000000..ee38644b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000058.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000059.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000059.png
new file mode 100644
index 00000000..cba564ee
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000059.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005A.png
new file mode 100644
index 00000000..045912c1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005B.png
new file mode 100644
index 00000000..4f953373
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005C.png
new file mode 100644
index 00000000..11761025
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005D.png
new file mode 100644
index 00000000..11560b0d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005E.png
new file mode 100644
index 00000000..5e251e65
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005F.png
new file mode 100644
index 00000000..44ce91aa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00005F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000060.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000060.png
new file mode 100644
index 00000000..6fa173ea
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000060.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000061.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000061.png
new file mode 100644
index 00000000..f748b40d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000061.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000062.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000062.png
new file mode 100644
index 00000000..017a3ad7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000062.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000063.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000063.png
new file mode 100644
index 00000000..e9d51221
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000063.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000064.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000064.png
new file mode 100644
index 00000000..84c59de2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000064.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000065.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000065.png
new file mode 100644
index 00000000..8e1637bb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000065.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000066.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000066.png
new file mode 100644
index 00000000..43363ea7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000066.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000067.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000067.png
new file mode 100644
index 00000000..6bd3210c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000067.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000068.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000068.png
new file mode 100644
index 00000000..2a77a46f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000068.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000069.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000069.png
new file mode 100644
index 00000000..873b5ba0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000069.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006A.png
new file mode 100644
index 00000000..3b77defb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006B.png
new file mode 100644
index 00000000..daa41924
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006C.png
new file mode 100644
index 00000000..33017749
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006D.png
new file mode 100644
index 00000000..5394589c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006E.png
new file mode 100644
index 00000000..0f5dd2f0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006F.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006F.png
new file mode 100644
index 00000000..69bd452b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00006F.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000070.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000070.png
new file mode 100644
index 00000000..c5f5c343
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000070.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000071.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000071.png
new file mode 100644
index 00000000..da2313fa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000071.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000072.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000072.png
new file mode 100644
index 00000000..a3601a5e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000072.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000073.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000073.png
new file mode 100644
index 00000000..6459a040
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000073.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000074.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000074.png
new file mode 100644
index 00000000..140dff75
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000074.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000075.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000075.png
new file mode 100644
index 00000000..cde32d38
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000075.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000076.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000076.png
new file mode 100644
index 00000000..a3d78120
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000076.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000077.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000077.png
new file mode 100644
index 00000000..19ea8506
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000077.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000078.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000078.png
new file mode 100644
index 00000000..ad159953
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000078.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000079.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000079.png
new file mode 100644
index 00000000..3c5684b7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x000079.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007A.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007A.png
new file mode 100644
index 00000000..a0c9a915
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007A.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007B.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007B.png
new file mode 100644
index 00000000..913f46ab
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007B.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007C.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007C.png
new file mode 100644
index 00000000..6c8343c7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007C.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007D.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007D.png
new file mode 100644
index 00000000..11278e5b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007D.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007E.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007E.png
new file mode 100644
index 00000000..d284bbdc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px/nbgl_font_Inter_SemiBold_24px_0x00007E.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000020.gif
new file mode 100644
index 00000000..51feff67
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000021.gif
new file mode 100644
index 00000000..ef601af8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000022.gif
new file mode 100644
index 00000000..b689f93c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000023.gif
new file mode 100644
index 00000000..efb2ea1d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000024.gif
new file mode 100644
index 00000000..286e2b1d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000025.gif
new file mode 100644
index 00000000..fc348341
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000026.gif
new file mode 100644
index 00000000..5f433de0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000027.gif
new file mode 100644
index 00000000..91c7fceb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000028.gif
new file mode 100644
index 00000000..8a14539a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000029.gif
new file mode 100644
index 00000000..bbfec9b9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..29c71b53
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..61bd6a7c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..e328f8d7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..d456038c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..1cde04aa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..4980569f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000030.gif
new file mode 100644
index 00000000..b2bef933
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000031.gif
new file mode 100644
index 00000000..1bbd676e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000032.gif
new file mode 100644
index 00000000..e3ed3d88
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000033.gif
new file mode 100644
index 00000000..ad941811
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000034.gif
new file mode 100644
index 00000000..b781de3b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000035.gif
new file mode 100644
index 00000000..73b38d7f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000036.gif
new file mode 100644
index 00000000..ebf657ba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000037.gif
new file mode 100644
index 00000000..db42585c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000038.gif
new file mode 100644
index 00000000..ee7df9db
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000039.gif
new file mode 100644
index 00000000..c89c89f6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..4b0ea6a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..ee097e97
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..89383712
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..0f15550a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..772ed217
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..17782194
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000040.gif
new file mode 100644
index 00000000..be3c0c3d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000041.gif
new file mode 100644
index 00000000..160714ea
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000042.gif
new file mode 100644
index 00000000..0f69a52a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000043.gif
new file mode 100644
index 00000000..49fa5c6a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000044.gif
new file mode 100644
index 00000000..4ffa782b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000045.gif
new file mode 100644
index 00000000..aa08440b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000046.gif
new file mode 100644
index 00000000..53727fe3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000047.gif
new file mode 100644
index 00000000..69df9696
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000048.gif
new file mode 100644
index 00000000..e957a771
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000049.gif
new file mode 100644
index 00000000..7b7d4d24
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..ea9a704e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..0d6fa692
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..4ae22960
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..30bd40fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..094b92c7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..2287eb59
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000050.gif
new file mode 100644
index 00000000..978fbe39
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000051.gif
new file mode 100644
index 00000000..b2630b86
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000052.gif
new file mode 100644
index 00000000..7df3836f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000053.gif
new file mode 100644
index 00000000..f988c555
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000054.gif
new file mode 100644
index 00000000..b3f90f98
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000055.gif
new file mode 100644
index 00000000..a5aae159
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000056.gif
new file mode 100644
index 00000000..4fbeec41
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000057.gif
new file mode 100644
index 00000000..17ed5a45
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000058.gif
new file mode 100644
index 00000000..12c6b814
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000059.gif
new file mode 100644
index 00000000..d81902c7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..f83752f0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..96f3686d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..cd4614ba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..24724219
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..14cfffb6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..78d5858d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000060.gif
new file mode 100644
index 00000000..05c471a7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000061.gif
new file mode 100644
index 00000000..1d2b686b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000062.gif
new file mode 100644
index 00000000..3e259397
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000063.gif
new file mode 100644
index 00000000..617c9048
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000064.gif
new file mode 100644
index 00000000..1e9f1880
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000065.gif
new file mode 100644
index 00000000..4b4017f7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000066.gif
new file mode 100644
index 00000000..fbd177dd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000067.gif
new file mode 100644
index 00000000..2009ee70
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000068.gif
new file mode 100644
index 00000000..192cfbfb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000069.gif
new file mode 100644
index 00000000..16ff9e7a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..32224780
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..b7f129b5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..61abc1b0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..9c978ab1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..e652300b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..66979e17
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000070.gif
new file mode 100644
index 00000000..89966b10
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000071.gif
new file mode 100644
index 00000000..3275fad9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000072.gif
new file mode 100644
index 00000000..86c62c64
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000073.gif
new file mode 100644
index 00000000..5061332c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000074.gif
new file mode 100644
index 00000000..667ce62d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000075.gif
new file mode 100644
index 00000000..1db9f850
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000076.gif
new file mode 100644
index 00000000..bda2a8d8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000077.gif
new file mode 100644
index 00000000..ca34ae7b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000078.gif
new file mode 100644
index 00000000..d3bc0892
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000079.gif
new file mode 100644
index 00000000..17e81baf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..afee13c7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..80be74a6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..79d1b410
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..28283986
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..f9035992
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp/nbgl_font_Inter_SemiBold_24px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp_unicode/nbgl_font_Inter_SemiBold_24px_1bpp_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp_unicode/nbgl_font_Inter_SemiBold_24px_1bpp_unicode_0x00FFFD.png
new file mode 100644
index 00000000..3f093de5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_1bpp_unicode/nbgl_font_Inter_SemiBold_24px_1bpp_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_unicode/nbgl_font_Inter_SemiBold_24px_unicode_0x00FFFD.png b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_unicode/nbgl_font_Inter_SemiBold_24px_unicode_0x00FFFD.png
new file mode 100644
index 00000000..8ca1b7b6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_Inter_SemiBold_24px_unicode/nbgl_font_Inter_SemiBold_24px_unicode_0x00FFFD.png differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000020.gif
new file mode 100644
index 00000000..7b0f8a4a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000021.gif
new file mode 100644
index 00000000..578ba07f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000022.gif
new file mode 100644
index 00000000..62cf4826
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000023.gif
new file mode 100644
index 00000000..7c09ea60
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000024.gif
new file mode 100644
index 00000000..3e471611
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000025.gif
new file mode 100644
index 00000000..c9db4d0d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000026.gif
new file mode 100644
index 00000000..c35dd6bd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000027.gif
new file mode 100644
index 00000000..a6ed2c98
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000028.gif
new file mode 100644
index 00000000..93347e48
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000029.gif
new file mode 100644
index 00000000..297af345
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..0512efae
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..7d4a731b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..6ab4ce25
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..ea4d72aa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..c2cb96ef
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..3c10824b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000030.gif
new file mode 100644
index 00000000..bcecb6fc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000031.gif
new file mode 100644
index 00000000..07abc95f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000032.gif
new file mode 100644
index 00000000..333a45da
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000033.gif
new file mode 100644
index 00000000..3f532dc9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000034.gif
new file mode 100644
index 00000000..a0d10802
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000035.gif
new file mode 100644
index 00000000..ccb81998
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000036.gif
new file mode 100644
index 00000000..fa121157
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000037.gif
new file mode 100644
index 00000000..ff9c75e1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000038.gif
new file mode 100644
index 00000000..3f510d10
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000039.gif
new file mode 100644
index 00000000..237d0bd6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..6c6b7fa0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..76f9246d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..1928d17c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..8f6926f6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..30b2d516
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..1bdae053
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000040.gif
new file mode 100644
index 00000000..208527db
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000041.gif
new file mode 100644
index 00000000..4d0842ee
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000042.gif
new file mode 100644
index 00000000..d938cbfd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000043.gif
new file mode 100644
index 00000000..8f3d9448
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000044.gif
new file mode 100644
index 00000000..86e095f3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000045.gif
new file mode 100644
index 00000000..fd328824
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000046.gif
new file mode 100644
index 00000000..9424a382
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000047.gif
new file mode 100644
index 00000000..4f58a26a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000048.gif
new file mode 100644
index 00000000..e8421b62
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000049.gif
new file mode 100644
index 00000000..7a0cc09e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..c9bd9d10
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..22251491
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..250ce6b4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..bdbd52f5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..42b9de32
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..9f8d50ee
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000050.gif
new file mode 100644
index 00000000..44a46e10
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000051.gif
new file mode 100644
index 00000000..b7092108
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000052.gif
new file mode 100644
index 00000000..8d2bbeb9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000053.gif
new file mode 100644
index 00000000..35425a1d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000054.gif
new file mode 100644
index 00000000..f1aa9dec
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000055.gif
new file mode 100644
index 00000000..5925a23f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000056.gif
new file mode 100644
index 00000000..4658a25f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000057.gif
new file mode 100644
index 00000000..45731654
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000058.gif
new file mode 100644
index 00000000..01642e93
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000059.gif
new file mode 100644
index 00000000..dc1d5363
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..cbde6ea5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..c29bca2b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..2c5170a6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..62983f01
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..8b298278
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..9f6b721c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000060.gif
new file mode 100644
index 00000000..b8dc88be
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000061.gif
new file mode 100644
index 00000000..94b70728
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000062.gif
new file mode 100644
index 00000000..6ad82e2d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000063.gif
new file mode 100644
index 00000000..d6015487
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000064.gif
new file mode 100644
index 00000000..4417bbd9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000065.gif
new file mode 100644
index 00000000..72981a22
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000066.gif
new file mode 100644
index 00000000..6ad80415
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000067.gif
new file mode 100644
index 00000000..a9c757d9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000068.gif
new file mode 100644
index 00000000..ba6775b5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000069.gif
new file mode 100644
index 00000000..da2c2fc3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..d8d482e7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..4221495c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..7a0cc09e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..a74df592
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..fb134cae
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..1fa7c82c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000070.gif
new file mode 100644
index 00000000..4790bae1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000071.gif
new file mode 100644
index 00000000..fcb91d96
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000072.gif
new file mode 100644
index 00000000..b7a26ca3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000073.gif
new file mode 100644
index 00000000..36c919d7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000074.gif
new file mode 100644
index 00000000..bb306bb8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000075.gif
new file mode 100644
index 00000000..fdad64f3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000076.gif
new file mode 100644
index 00000000..ce01d41a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000077.gif
new file mode 100644
index 00000000..c6596d57
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000078.gif
new file mode 100644
index 00000000..9178a668
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000079.gif
new file mode 100644
index 00000000..2f677267
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..fc82d831
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..752cb02d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..70ba6ffd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..5aad2c27
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..85eda365
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007F.gif
new file mode 100644
index 00000000..3e6c38b1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp/nbgl_font_open_sans_extrabold_11px_1bpp_0x00007F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000A1.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000A1.gif
new file mode 100644
index 00000000..12a9039a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000A1.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000BF.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000BF.gif
new file mode 100644
index 00000000..03a2e695
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000BF.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E0.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E0.gif
new file mode 100644
index 00000000..d0e52dcf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E0.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E2.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E2.gif
new file mode 100644
index 00000000..50b2fc95
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E2.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E7.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E7.gif
new file mode 100644
index 00000000..180b56fc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E7.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E8.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E8.gif
new file mode 100644
index 00000000..ed7dd325
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E8.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E9.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E9.gif
new file mode 100644
index 00000000..9ea10de1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000E9.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EA.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EA.gif
new file mode 100644
index 00000000..adab0b5b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EA.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EB.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EB.gif
new file mode 100644
index 00000000..c952ecd1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EB.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EE.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EE.gif
new file mode 100644
index 00000000..cbf7d973
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EE.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EF.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EF.gif
new file mode 100644
index 00000000..744f8784
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000EF.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000F4.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000F4.gif
new file mode 100644
index 00000000..f6b832d0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000F4.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000FB.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000FB.gif
new file mode 100644
index 00000000..18180162
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_extrabold_11px_1bpp_unicode/nbgl_font_open_sans_extrabold_11px_1bpp_unicode_0x0000FB.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000020.gif
new file mode 100644
index 00000000..4d3c7765
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000021.gif
new file mode 100644
index 00000000..7717f998
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000022.gif
new file mode 100644
index 00000000..33c3bfe3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000023.gif
new file mode 100644
index 00000000..3434b029
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000024.gif
new file mode 100644
index 00000000..985f1fce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000025.gif
new file mode 100644
index 00000000..1f56b8f6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000026.gif
new file mode 100644
index 00000000..b7d92851
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000027.gif
new file mode 100644
index 00000000..865ed79a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000028.gif
new file mode 100644
index 00000000..9254b1a4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000029.gif
new file mode 100644
index 00000000..684be887
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..20772d96
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..11781376
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..86b1f1d0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..bb1f8c12
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..105f80b1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..73f1a139
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000030.gif
new file mode 100644
index 00000000..ddcac64f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000031.gif
new file mode 100644
index 00000000..252545cd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000032.gif
new file mode 100644
index 00000000..817d18e6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000033.gif
new file mode 100644
index 00000000..b1e0e88c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000034.gif
new file mode 100644
index 00000000..c5bcb20e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000035.gif
new file mode 100644
index 00000000..2f33ea07
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000036.gif
new file mode 100644
index 00000000..42ef3bfc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000037.gif
new file mode 100644
index 00000000..74512bce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000038.gif
new file mode 100644
index 00000000..7ef15b78
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000039.gif
new file mode 100644
index 00000000..e8f767e4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..b4e781c8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..9e407ebe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..0191430c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..8d480721
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..1856c930
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..ec9f246f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000040.gif
new file mode 100644
index 00000000..5f84d061
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000041.gif
new file mode 100644
index 00000000..38da71a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000042.gif
new file mode 100644
index 00000000..4245fbe6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000043.gif
new file mode 100644
index 00000000..4f8ce2d2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000044.gif
new file mode 100644
index 00000000..ffdbf1eb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000045.gif
new file mode 100644
index 00000000..a206bf23
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000046.gif
new file mode 100644
index 00000000..22ccbf51
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000047.gif
new file mode 100644
index 00000000..41354a1b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000048.gif
new file mode 100644
index 00000000..ec5b6867
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000049.gif
new file mode 100644
index 00000000..dc72db19
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..e58ce4fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..d083fd8d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..bcddc17e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..b994ada6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..aada270d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..7cf0c182
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000050.gif
new file mode 100644
index 00000000..a3108a42
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000051.gif
new file mode 100644
index 00000000..21bd1b6e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000052.gif
new file mode 100644
index 00000000..5e7c79da
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000053.gif
new file mode 100644
index 00000000..6966f7f9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000054.gif
new file mode 100644
index 00000000..a53c48b8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000055.gif
new file mode 100644
index 00000000..3bb4c397
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000056.gif
new file mode 100644
index 00000000..e294960e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000057.gif
new file mode 100644
index 00000000..c4278566
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000058.gif
new file mode 100644
index 00000000..7781e371
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000059.gif
new file mode 100644
index 00000000..050f211b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..9a4f23bb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..9d8fa4a4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..8700dfaa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..e5b91d6c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..d23f214e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..92c21014
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000060.gif
new file mode 100644
index 00000000..df1a67e4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000061.gif
new file mode 100644
index 00000000..2e0183cc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000062.gif
new file mode 100644
index 00000000..d99b7997
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000063.gif
new file mode 100644
index 00000000..c5672237
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000064.gif
new file mode 100644
index 00000000..64cf90cc
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000065.gif
new file mode 100644
index 00000000..6de8f4c9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000066.gif
new file mode 100644
index 00000000..53da4e50
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000067.gif
new file mode 100644
index 00000000..d71a4374
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000068.gif
new file mode 100644
index 00000000..f322e1fe
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000069.gif
new file mode 100644
index 00000000..e01ea7f4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..bc8f49eb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..2233473d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..ab21c773
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..0806fb8f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..e8c4cae7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..0241dd6a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000070.gif
new file mode 100644
index 00000000..018c7f10
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000071.gif
new file mode 100644
index 00000000..608ae1fd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000072.gif
new file mode 100644
index 00000000..d324b461
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000073.gif
new file mode 100644
index 00000000..3bfd6531
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000074.gif
new file mode 100644
index 00000000..bef28ed0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000075.gif
new file mode 100644
index 00000000..7880323d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000076.gif
new file mode 100644
index 00000000..25776f9e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000077.gif
new file mode 100644
index 00000000..71c4b299
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000078.gif
new file mode 100644
index 00000000..5eaf90ab
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000079.gif
new file mode 100644
index 00000000..1972c1a8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..b0c9f805
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..bd51d063
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..60a3c89f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..c7125c3f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..55754860
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007F.gif
new file mode 100644
index 00000000..c7ad1a1c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp/nbgl_font_open_sans_light_16px_1bpp_0x00007F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000A1.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000A1.gif
new file mode 100644
index 00000000..050dc8f1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000A1.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000C9.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000C9.gif
new file mode 100644
index 00000000..8a7d1d19
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000C9.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E0.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E0.gif
new file mode 100644
index 00000000..38e5cf96
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E0.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E2.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E2.gif
new file mode 100644
index 00000000..d4cea9b0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E2.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E8.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E8.gif
new file mode 100644
index 00000000..5457ff84
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E8.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E9.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E9.gif
new file mode 100644
index 00000000..5d2870a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000E9.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EA.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EA.gif
new file mode 100644
index 00000000..bb80d6da
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EA.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EB.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EB.gif
new file mode 100644
index 00000000..3beb161c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EB.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EE.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EE.gif
new file mode 100644
index 00000000..d0058cf4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EE.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EF.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EF.gif
new file mode 100644
index 00000000..59f3a1af
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000EF.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F1.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F1.gif
new file mode 100644
index 00000000..7e5363a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F1.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F9.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F9.gif
new file mode 100644
index 00000000..4be8f7d6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000F9.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000FB.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000FB.gif
new file mode 100644
index 00000000..07bcd45d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_light_16px_1bpp_unicode/nbgl_font_open_sans_light_16px_1bpp_unicode_0x0000FB.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000020.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000020.gif
new file mode 100644
index 00000000..7b0f8a4a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000020.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000021.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000021.gif
new file mode 100644
index 00000000..3e7ee9a9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000021.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000022.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000022.gif
new file mode 100644
index 00000000..71d9a006
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000022.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000023.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000023.gif
new file mode 100644
index 00000000..197f0308
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000023.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000024.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000024.gif
new file mode 100644
index 00000000..2ba618a9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000024.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000025.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000025.gif
new file mode 100644
index 00000000..69db0ba6
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000025.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000026.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000026.gif
new file mode 100644
index 00000000..a5e4764e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000026.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000027.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000027.gif
new file mode 100644
index 00000000..eafb9532
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000027.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000028.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000028.gif
new file mode 100644
index 00000000..080817df
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000028.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000029.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000029.gif
new file mode 100644
index 00000000..e55c5be1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000029.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002A.gif
new file mode 100644
index 00000000..186c9ef1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002B.gif
new file mode 100644
index 00000000..618ea80c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002C.gif
new file mode 100644
index 00000000..5a48f88e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002D.gif
new file mode 100644
index 00000000..a9f5b517
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002E.gif
new file mode 100644
index 00000000..af6662e1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002F.gif
new file mode 100644
index 00000000..14119ab4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00002F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000030.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000030.gif
new file mode 100644
index 00000000..88057244
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000030.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000031.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000031.gif
new file mode 100644
index 00000000..9e28bcb4
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000031.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000032.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000032.gif
new file mode 100644
index 00000000..99f3dd13
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000032.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000033.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000033.gif
new file mode 100644
index 00000000..46536760
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000033.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000034.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000034.gif
new file mode 100644
index 00000000..9034940d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000034.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000035.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000035.gif
new file mode 100644
index 00000000..07158d96
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000035.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000036.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000036.gif
new file mode 100644
index 00000000..d97976c8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000036.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000037.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000037.gif
new file mode 100644
index 00000000..47cfa11d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000037.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000038.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000038.gif
new file mode 100644
index 00000000..0e8d50b2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000038.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000039.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000039.gif
new file mode 100644
index 00000000..f992bdbd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000039.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003A.gif
new file mode 100644
index 00000000..acf6dba8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003B.gif
new file mode 100644
index 00000000..17972af2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003C.gif
new file mode 100644
index 00000000..0705b34c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003D.gif
new file mode 100644
index 00000000..81547b55
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003E.gif
new file mode 100644
index 00000000..13fac8b3
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003F.gif
new file mode 100644
index 00000000..6053d7ce
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00003F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000040.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000040.gif
new file mode 100644
index 00000000..3d3cf2d1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000040.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000041.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000041.gif
new file mode 100644
index 00000000..9a88ace9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000041.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000042.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000042.gif
new file mode 100644
index 00000000..3c8d17df
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000042.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000043.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000043.gif
new file mode 100644
index 00000000..3e16314e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000043.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000044.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000044.gif
new file mode 100644
index 00000000..5a071c9a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000044.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000045.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000045.gif
new file mode 100644
index 00000000..6d591cf5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000045.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000046.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000046.gif
new file mode 100644
index 00000000..0a5edfe2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000046.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000047.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000047.gif
new file mode 100644
index 00000000..f92d51d1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000047.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000048.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000048.gif
new file mode 100644
index 00000000..50ba02a1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000048.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000049.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000049.gif
new file mode 100644
index 00000000..7e5701cf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000049.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004A.gif
new file mode 100644
index 00000000..1745057d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004B.gif
new file mode 100644
index 00000000..e55f1f7c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004C.gif
new file mode 100644
index 00000000..3071a82a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004D.gif
new file mode 100644
index 00000000..f8170feb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004E.gif
new file mode 100644
index 00000000..35814b53
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004F.gif
new file mode 100644
index 00000000..5b3f9da9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00004F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000050.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000050.gif
new file mode 100644
index 00000000..21e019f5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000050.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000051.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000051.gif
new file mode 100644
index 00000000..edbe4b84
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000051.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000052.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000052.gif
new file mode 100644
index 00000000..6420edde
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000052.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000053.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000053.gif
new file mode 100644
index 00000000..d98d2108
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000053.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000054.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000054.gif
new file mode 100644
index 00000000..9a2fc4ba
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000054.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000055.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000055.gif
new file mode 100644
index 00000000..a0c8fd16
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000055.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000056.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000056.gif
new file mode 100644
index 00000000..cfef2796
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000056.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000057.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000057.gif
new file mode 100644
index 00000000..1c315f90
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000057.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000058.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000058.gif
new file mode 100644
index 00000000..3d035bd9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000058.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000059.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000059.gif
new file mode 100644
index 00000000..b02f0dd1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000059.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005A.gif
new file mode 100644
index 00000000..7a0e312c
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005B.gif
new file mode 100644
index 00000000..886f4378
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005C.gif
new file mode 100644
index 00000000..8bcc5b20
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005D.gif
new file mode 100644
index 00000000..a70c7872
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005E.gif
new file mode 100644
index 00000000..f158a69b
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005F.gif
new file mode 100644
index 00000000..89777689
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00005F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000060.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000060.gif
new file mode 100644
index 00000000..b5388caf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000060.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000061.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000061.gif
new file mode 100644
index 00000000..6d9fad85
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000061.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000062.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000062.gif
new file mode 100644
index 00000000..a3046baa
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000062.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000063.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000063.gif
new file mode 100644
index 00000000..e462b695
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000063.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000064.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000064.gif
new file mode 100644
index 00000000..3e557f95
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000064.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000065.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000065.gif
new file mode 100644
index 00000000..b35b4917
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000065.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000066.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000066.gif
new file mode 100644
index 00000000..3f2803a0
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000066.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000067.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000067.gif
new file mode 100644
index 00000000..6808a404
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000067.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000068.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000068.gif
new file mode 100644
index 00000000..0853582a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000068.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000069.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000069.gif
new file mode 100644
index 00000000..16a5cecb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000069.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006A.gif
new file mode 100644
index 00000000..2634f2ec
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006B.gif
new file mode 100644
index 00000000..a14913c2
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006C.gif
new file mode 100644
index 00000000..7e5701cf
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006D.gif
new file mode 100644
index 00000000..99a70f08
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006E.gif
new file mode 100644
index 00000000..1a70fca5
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006F.gif
new file mode 100644
index 00000000..703e17f7
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00006F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000070.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000070.gif
new file mode 100644
index 00000000..f86a5e94
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000070.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000071.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000071.gif
new file mode 100644
index 00000000..89901a5f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000071.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000072.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000072.gif
new file mode 100644
index 00000000..73d42e2f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000072.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000073.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000073.gif
new file mode 100644
index 00000000..325c1a5e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000073.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000074.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000074.gif
new file mode 100644
index 00000000..d4b952cb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000074.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000075.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000075.gif
new file mode 100644
index 00000000..0bc37235
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000075.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000076.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000076.gif
new file mode 100644
index 00000000..d91bfd4d
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000076.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000077.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000077.gif
new file mode 100644
index 00000000..ac3cb195
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000077.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000078.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000078.gif
new file mode 100644
index 00000000..fd082a20
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000078.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000079.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000079.gif
new file mode 100644
index 00000000..44036ac8
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x000079.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007A.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007A.gif
new file mode 100644
index 00000000..186a051e
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007A.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007B.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007B.gif
new file mode 100644
index 00000000..101c4149
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007B.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007C.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007C.gif
new file mode 100644
index 00000000..5a2956b9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007C.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007D.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007D.gif
new file mode 100644
index 00000000..89f2f38a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007D.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007E.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007E.gif
new file mode 100644
index 00000000..9f9b677f
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007E.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007F.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007F.gif
new file mode 100644
index 00000000..e8daaa30
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp/nbgl_font_open_sans_regular_11px_1bpp_0x00007F.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000BF.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000BF.gif
new file mode 100644
index 00000000..153220b9
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000BF.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E0.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E0.gif
new file mode 100644
index 00000000..bace9e27
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E0.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E2.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E2.gif
new file mode 100644
index 00000000..401a64ea
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E2.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E8.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E8.gif
new file mode 100644
index 00000000..69096ede
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E8.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E9.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E9.gif
new file mode 100644
index 00000000..26794031
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000E9.gif differ
diff --git a/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000EB.gif b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000EB.gif
new file mode 100644
index 00000000..25eb9fcd
Binary files /dev/null and b/sdk_lib_nbgl/fonts/nbgl_font_open_sans_regular_11px_1bpp_unicode/nbgl_font_open_sans_regular_11px_1bpp_unicode_0x0000EB.gif differ
diff --git a/sdk_lib_nbgl/fonts/open_sans_extrabold.ttf b/sdk_lib_nbgl/fonts/open_sans_extrabold.ttf
new file mode 100644
index 00000000..67fcf0fb
Binary files /dev/null and b/sdk_lib_nbgl/fonts/open_sans_extrabold.ttf differ
diff --git a/sdk_lib_nbgl/fonts/open_sans_light.ttf b/sdk_lib_nbgl/fonts/open_sans_light.ttf
new file mode 100644
index 00000000..6580d3a1
Binary files /dev/null and b/sdk_lib_nbgl/fonts/open_sans_light.ttf differ
diff --git a/sdk_lib_nbgl/fonts/open_sans_regular.ttf b/sdk_lib_nbgl/fonts/open_sans_regular.ttf
new file mode 100644
index 00000000..29bfd35a
Binary files /dev/null and b/sdk_lib_nbgl/fonts/open_sans_regular.ttf differ
diff --git a/sdk_lib_nbgl/glyphs/Device_64px.bmp b/sdk_lib_nbgl/glyphs/Device_64px.bmp
new file mode 100755
index 00000000..100ac263
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/Device_64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/Message_64px.bmp b/sdk_lib_nbgl/glyphs/Message_64px.bmp
new file mode 100755
index 00000000..308582d1
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/Message_64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/Next32px.bmp b/sdk_lib_nbgl/glyphs/Next32px.bmp
new file mode 100755
index 00000000..82188435
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/Next32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/QRcode32px.bmp b/sdk_lib_nbgl/glyphs/QRcode32px.bmp
new file mode 100755
index 00000000..79b43fde
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/QRcode32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/SecurityShield64px.bmp b/sdk_lib_nbgl/glyphs/SecurityShield64px.bmp
new file mode 100644
index 00000000..a6d4dd22
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/SecurityShield64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/backspace32px.bmp b/sdk_lib_nbgl/glyphs/backspace32px.bmp
new file mode 100755
index 00000000..3443a460
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/backspace32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/check32px.bmp b/sdk_lib_nbgl/glyphs/check32px.bmp
new file mode 100755
index 00000000..e6474f3a
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/check32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/cross32px.bmp b/sdk_lib_nbgl/glyphs/cross32px.bmp
new file mode 100755
index 00000000..f311c897
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/cross32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/info_i_32px.bmp b/sdk_lib_nbgl/glyphs/info_i_32px.bmp
new file mode 100644
index 00000000..a868579f
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/info_i_32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/leftArrow32px.bmp b/sdk_lib_nbgl/glyphs/leftArrow32px.bmp
new file mode 100755
index 00000000..da3bc3a5
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/leftArrow32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_16px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_16px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..56f3054b
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_16px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_20px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_20px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..94d0f3b1
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_20px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_24px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_24px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..44e43df1
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_24px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_32px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_32px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..6490b4b1
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_32px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_40px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_40px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..488fdbc1
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_40px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_48px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_48px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..6b635619
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_48px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_circle_8px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_circle_8px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..59458f39
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_circle_8px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_16px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_16px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..4849417d
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_16px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_20px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_20px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..80832d7a
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_20px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_24px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_24px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..3e115567
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_24px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_32px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_32px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..6dc99eaf
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_32px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_40px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_40px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..e448df59
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_40px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_48px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_48px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..14e5f824
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_48px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/quarter_round_8px_1bpp_nocomp.bmp b/sdk_lib_nbgl/glyphs/quarter_round_8px_1bpp_nocomp.bmp
new file mode 100755
index 00000000..9f8cfcfb
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/quarter_round_8px_1bpp_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/radio_active_32px.bmp b/sdk_lib_nbgl/glyphs/radio_active_32px.bmp
new file mode 100755
index 00000000..0c7e213d
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/radio_active_32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/radio_inactive_32px.bmp b/sdk_lib_nbgl/glyphs/radio_inactive_32px.bmp
new file mode 100755
index 00000000..a15bc3d5
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/radio_inactive_32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/rightArrow32px.bmp b/sdk_lib_nbgl/glyphs/rightArrow32px.bmp
new file mode 100755
index 00000000..a8646b91
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/rightArrow32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/round_24px.bmp b/sdk_lib_nbgl/glyphs/round_24px.bmp
new file mode 100755
index 00000000..0afe949b
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/round_24px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/round_check_64px.bmp b/sdk_lib_nbgl/glyphs/round_check_64px.bmp
new file mode 100755
index 00000000..42c25cb3
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/round_check_64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/round_cross_64px.bmp b/sdk_lib_nbgl/glyphs/round_cross_64px.bmp
new file mode 100755
index 00000000..74372094
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/round_cross_64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/round_warning_64px.bmp b/sdk_lib_nbgl/glyphs/round_warning_64px.bmp
new file mode 100755
index 00000000..81f35b97
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/round_warning_64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/shift32px.bmp b/sdk_lib_nbgl/glyphs/shift32px.bmp
new file mode 100755
index 00000000..34094084
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/shift32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/shift_lock32px.bmp b/sdk_lib_nbgl/glyphs/shift_lock32px.bmp
new file mode 100755
index 00000000..c919b1dd
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/shift_lock32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/space32px.bmp b/sdk_lib_nbgl/glyphs/space32px.bmp
new file mode 100755
index 00000000..85acf464
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/space32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/switch_60_40_nocomp.bmp b/sdk_lib_nbgl/glyphs/switch_60_40_nocomp.bmp
new file mode 100755
index 00000000..204ba630
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/switch_60_40_nocomp.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/warning64px.bmp b/sdk_lib_nbgl/glyphs/warning64px.bmp
new file mode 100755
index 00000000..f4df774d
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/warning64px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs/wheel32px.bmp b/sdk_lib_nbgl/glyphs/wheel32px.bmp
new file mode 100755
index 00000000..61e2b1da
Binary files /dev/null and b/sdk_lib_nbgl/glyphs/wheel32px.bmp differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_back_x.gif b/sdk_lib_nbgl/glyphs_nano/icon_back_x.gif
new file mode 100644
index 00000000..ff043615
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_back_x.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_backspace.gif b/sdk_lib_nbgl/glyphs_nano/icon_backspace.gif
new file mode 100644
index 00000000..7374da39
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_backspace.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_backspace_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_backspace_invert.gif
new file mode 100644
index 00000000..0cffcc03
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_backspace_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_certificate.gif b/sdk_lib_nbgl/glyphs_nano/icon_certificate.gif
new file mode 100644
index 00000000..89b529f7
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_certificate.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_classes.gif b/sdk_lib_nbgl/glyphs_nano/icon_classes.gif
new file mode 100644
index 00000000..459d545b
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_classes.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_classes_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_classes_invert.gif
new file mode 100644
index 00000000..4fcaad1c
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_classes_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_crossmark.gif b/sdk_lib_nbgl/glyphs_nano/icon_crossmark.gif
new file mode 100644
index 00000000..2dcf9d9e
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_crossmark.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_dashboard_x.gif b/sdk_lib_nbgl/glyphs_nano/icon_dashboard_x.gif
new file mode 100644
index 00000000..33d9b0a7
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_dashboard_x.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_digits.gif b/sdk_lib_nbgl/glyphs_nano/icon_digits.gif
new file mode 100644
index 00000000..70da9c66
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_digits.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_digits_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_digits_invert.gif
new file mode 100644
index 00000000..22487c72
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_digits_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_down.gif b/sdk_lib_nbgl/glyphs_nano/icon_down.gif
new file mode 100644
index 00000000..4f4e39ee
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_down.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_eye.gif b/sdk_lib_nbgl/glyphs_nano/icon_eye.gif
new file mode 100644
index 00000000..df4bb829
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_eye.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_left.gif b/sdk_lib_nbgl/glyphs_nano/icon_left.gif
new file mode 100644
index 00000000..524226ba
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_left.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_lowercase.gif b/sdk_lib_nbgl/glyphs_nano/icon_lowercase.gif
new file mode 100644
index 00000000..c167cc7b
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_lowercase.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_lowercase_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_lowercase_invert.gif
new file mode 100644
index 00000000..cdd5ed41
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_lowercase_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_right.gif b/sdk_lib_nbgl/glyphs_nano/icon_right.gif
new file mode 100644
index 00000000..15ff3cf5
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_right.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_up.gif b/sdk_lib_nbgl/glyphs_nano/icon_up.gif
new file mode 100644
index 00000000..4e13c064
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_up.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_uppercase.gif b/sdk_lib_nbgl/glyphs_nano/icon_uppercase.gif
new file mode 100644
index 00000000..ebff3704
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_uppercase.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_uppercase_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_uppercase_invert.gif
new file mode 100644
index 00000000..098c6a27
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_uppercase_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_validate.gif b/sdk_lib_nbgl/glyphs_nano/icon_validate.gif
new file mode 100644
index 00000000..5d1bc5ac
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_validate.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_validate_10.gif b/sdk_lib_nbgl/glyphs_nano/icon_validate_10.gif
new file mode 100755
index 00000000..f69bbee9
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_validate_10.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_validate_14.gif b/sdk_lib_nbgl/glyphs_nano/icon_validate_14.gif
new file mode 100644
index 00000000..ccb5cabe
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_validate_14.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/icon_validate_invert.gif b/sdk_lib_nbgl/glyphs_nano/icon_validate_invert.gif
new file mode 100644
index 00000000..c1464d90
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/icon_validate_invert.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/pin_bullet_empty.gif b/sdk_lib_nbgl/glyphs_nano/pin_bullet_empty.gif
new file mode 100644
index 00000000..1387dc9e
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/pin_bullet_empty.gif differ
diff --git a/sdk_lib_nbgl/glyphs_nano/pin_bullet_filled.gif b/sdk_lib_nbgl/glyphs_nano/pin_bullet_filled.gif
new file mode 100644
index 00000000..b6f61d2e
Binary files /dev/null and b/sdk_lib_nbgl/glyphs_nano/pin_bullet_filled.gif differ
diff --git a/sdk_lib_nbgl/include/nbgl_buttons.h b/sdk_lib_nbgl/include/nbgl_buttons.h
new file mode 100644
index 00000000..fd008c1e
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_buttons.h
@@ -0,0 +1,47 @@
+/**
+ * @file nbgl_buttons.h
+ * Buttons management of NBGL
+ *
+ */
+
+#ifndef NBGL_BUTTONS_H
+#define NBGL_BUTTONS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+#include "nbgl_obj.h"
+
+/*********************
+ * DEFINES
+ *********************/
+///< Time after the beginning of continuous press on button(s) after which "continuous press" event
+///< start to be sent (in 100ms)
+#define CONTINOUS_PRESS_THRESHOLD 8
+///< Periodicity of "continuous press" events (in 100ms)
+#define CONTINUOUS_PRESS_PERIOD 3
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_buttonsHandler(uint8_t buttonState, uint32_t currentTimeMs);
+void nbgl_buttonsReset(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_BUTTONS_H */
diff --git a/sdk_lib_nbgl/include/nbgl_debug.h b/sdk_lib_nbgl/include/nbgl_debug.h
new file mode 100644
index 00000000..e0a69a88
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_debug.h
@@ -0,0 +1,95 @@
+/**
+ * @file nbgl_debug.h
+ * @brief debug traces management
+ *
+ */
+
+#ifndef NBGL_DEBUG_H
+#define NBGL_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// #define WITH_STDIO 1
+
+/*********************
+ * INCLUDES
+ *********************/
+#ifdef WITH_STDIO
+#include
+#include
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+enum {
+ LOW_LOGGER,
+ DRAW_LOGGER,
+ OBJ_LOGGER,
+ OBJ_POOL_LOGGER,
+ SCREEN_LOGGER,
+ LAYOUT_LOGGER,
+ PAGE_LOGGER,
+ TOUCH_LOGGER,
+ APP_LOGGER,
+ UX_LOGGER,
+ MISC_LOGGER,
+ STEP_LOGGER,
+ FLOW_LOGGER
+};
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+extern unsigned long gLogger;
+
+/**********************
+ * MACROS
+ **********************/
+#ifdef WITH_STDIO
+extern void mainExit(int exitCode);
+#define LOG_DEBUG(__logger, ...) \
+ { \
+ if (gLogger & (1 << __logger)) \
+ printf(__VA_ARGS__); \
+ }
+#define LOG_WARN(__logger, ...) printf(__VA_ARGS__)
+#define LOG_FATAL(__logger, ...) \
+ { \
+ printf(__VA_ARGS__); \
+ mainExit(-1); \
+ }
+
+#else // WITH_STDIO
+#ifdef NBGL_DEBUG
+#include
+#define LOG_DEBUG(__logger, ...) \
+ do { \
+ PRINTF(__VA_ARGS__); \
+ } while (0)
+#define LOG_WARN(__logger, ...) \
+ do { \
+ PRINTF(__VA_ARGS__); \
+ } while (0)
+#define LOG_FATAL(__logger, ...) \
+ do { \
+ PRINTF(__VA_ARGS__); \
+ halt(); \
+ } while (0)
+#else
+#define LOG_DEBUG(__logger, ...)
+#define LOG_WARN(__logger, ...)
+#define LOG_FATAL(__logger, ...)
+#endif // NBGL_DEBUG
+#endif // WITH_STDIO
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_DEBUG_H */
diff --git a/sdk_lib_nbgl/include/nbgl_draw.h b/sdk_lib_nbgl/include/nbgl_draw.h
new file mode 100644
index 00000000..2c52b0b1
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_draw.h
@@ -0,0 +1,60 @@
+/**
+ * @file nbgl_draw.h
+ * @brief Middle Level API of the new BOLOS Graphical Library
+ *
+ */
+
+#ifndef NBGL_DRAW_H
+#define NBGL_DRAW_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+#include "nbgl_fonts.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define QR_V4_NB_PIX_SIZE 33 // qr V4 number of pixels
+#define QR_V10_NB_PIX_SIZE 57 // qr V10 number of pixels
+#define QR_MAX_PIX_SIZE QR_V10_NB_PIX_SIZE // we support up to V10 qr code version
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void nbgl_drawIcon(nbgl_area_t *area, nbgl_color_map_t color_map, const nbgl_icon_details_t *icon);
+void nbgl_drawRoundedRect(const nbgl_area_t *area, nbgl_radius_t radius, color_t innerColor);
+void nbgl_drawRoundedBorderedRect(const nbgl_area_t *area,
+ nbgl_radius_t radius,
+ uint8_t stroke,
+ color_t innerColor,
+ color_t borderColor);
+nbgl_font_id_e nbgl_drawText(const nbgl_area_t *area,
+ const char *text,
+ uint16_t textLen,
+ nbgl_font_id_e fontId,
+ color_t fontColor);
+void nbgl_drawQrCode(const nbgl_area_t *area,
+ uint8_t version,
+ const char *text,
+ color_t backgroundColor);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_DRAW_H */
diff --git a/sdk_lib_nbgl/include/nbgl_flow.h b/sdk_lib_nbgl/include/nbgl_flow.h
new file mode 100644
index 00000000..f12c1ae0
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_flow.h
@@ -0,0 +1,86 @@
+/**
+ * @file nbgl_flow.h
+ * @brief Flow construction API of NBGL
+ *
+ */
+
+#ifndef NBGL_FLOW_H
+#define NBGL_FLOW_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "nbgl_step.h"
+#include "nbgl_obj.h"
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+/**
+ * @brief type shared externally
+ *
+ */
+typedef void *nbgl_flow_t;
+
+/**
+ * @brief prototype of function to be called when a step is using a callback on "double-key" action
+ */
+typedef void (*nbgl_stepCallback_t)(void);
+
+/**
+ * @brief Structure containing all specific information when creating a NBGL step.
+ */
+typedef struct nbgl_stepDesc_s {
+ nbgl_stepCallback_t init; ///< if not NULL, function to be called when the step is entered
+ nbgl_stepCallback_t callback; ///< if not NULL, function to be called on "double-key" action
+ const char *text; ///< text to display in step (can be multi-pages if icon == NULL)
+ const char *subText; ///< sub-text to display in step (NULL most of the time)
+ const nbgl_icon_details_t *icon; ///< icon to display in step (text must be single-page)
+#ifdef HAVE_LANGUAGE_PACK
+ UX_LOC_STRINGS_INDEX textId; ///< text Id to display in step (if text field is NULL)
+#endif // HAVE_LANGUAGE_PACK
+} nbgl_stepDesc_t;
+
+typedef nbgl_stepDesc_t nbgl_pageContent_t;
+
+/**
+ * @brief This structure contains data to build a centered info + long press button page content
+ */
+typedef struct nbgl_pageInfoLongPress_s {
+ const char *text; ///< centered text in large case
+ const nbgl_icon_details_t *icon; ///< a buffer containing the 1BPP icon
+ const char *longPressText; ///< text of the long press button
+ uint8_t longPressToken; ///< the token used as argument of the onActionCallback when button is
+ ///< long pressed
+} nbgl_pageInfoLongPress_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+nbgl_flow_t nbgl_flowDraw(const nbgl_stepDesc_t *steps,
+ uint8_t nbSteps,
+ uint8_t initStep,
+ bool loop,
+ bool modal);
+void nbgl_flowRelease(nbgl_flow_t flow);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_FLOW_H */
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.inc b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.inc
new file mode 100644
index 00000000..a81d4f0a
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.inc
@@ -0,0 +1,1516 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_MEDIUM_32PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC0, 0x0D, 0x17, 0x38, 0x5A, 0x3B, 0xC2, 0x0A,
+ 0x12, 0x0B, 0xC3, 0x0B, 0x70, 0x70, 0x0B, 0xC0,
+ 0x0D, 0x30, 0xC3, 0x0B, 0x70, 0x70, 0x0B, 0xC0,
+ 0x0B, 0x30, 0x0D, 0xC2, 0x0B, 0x70, 0x40, 0x22,
+ 0x0B, 0xC1, 0x02, 0x10, 0x02, 0xC4, 0x1D, 0x1E,
+ 0xCE, 0x0E, 0x18,
+//ascii 0x0022
+ 0xC0, 0x0D, 0x75, 0xC2, 0x0C, 0x70, 0xC2, 0x0C,
+ 0x70, 0xC3, 0x7E, 0xDA, 0x0D, 0x72, 0xC2, 0x0C,
+ 0x70, 0xC2, 0x0C, 0x71,
+//ascii 0x0023
+ 0xC7, 0x83, 0x5B, 0xD8, 0x10, 0x05, 0xC4, 0x89,
+ 0xBE, 0xC9, 0x9E, 0x9C, 0xE0, 0xC2, 0x10, 0x05,
+ 0xC4, 0x81, 0x04, 0xC9, 0x0C, 0x20, 0x81, 0x46,
+ 0x10, 0x05, 0xC4, 0x81, 0x04, 0xC9, 0x0C, 0x70,
+ 0xB0, 0x13, 0x69, 0xC0, 0x81, 0x04, 0xCA, 0xAC,
+ 0x96, 0x31, 0x70, 0x20, 0xA1, 0x69, 0xBE, 0xCB,
+ 0x0E, 0x10, 0x81, 0x41, 0x70, 0x10, 0x01, 0x03,
+ 0xCA, 0x10, 0x05, 0xC1, 0x8E, 0xC9, 0x70, 0x00,
+ 0xCA, 0x10, 0x05, 0xC4, 0xB1, 0x04, 0xEC, 0x90,
+ 0x86, 0x41, 0xCA, 0x10, 0x05, 0xC4, 0x81, 0x04,
+ 0xC9, 0x8E, 0xCE, 0xC3, 0x10, 0x05, 0xC4, 0x81,
+ 0x04, 0xC9, 0x0C, 0x10, 0x91, 0x46, 0x90, 0x10,
+ 0x05, 0xC4, 0x81, 0x04, 0xC9, 0x0C, 0x70, 0xB1,
+ 0x46, 0x9C, 0xE0, 0x81, 0x04, 0xC9, 0xAE, 0x95,
+ 0x31, 0x70, 0x30, 0x91, 0x9C, 0xE0, 0xCB, 0x0E,
+ 0x0B, 0x10, 0x11, 0x70, 0x10, 0x81, 0x36, 0xCA,
+ 0x10, 0x05, 0xC0, 0x9E, 0xC9, 0x60, 0x70, 0x00,
+ 0xCA, 0x10, 0x05, 0xC4, 0xB1, 0x03, 0xC9, 0x60,
+ 0x84, 0x10, 0xCA, 0x83, 0x05, 0xC4, 0x81, 0x04,
+ 0xC4, 0x0E, 0xCC, 0x0E, 0xC4, 0x81, 0x04, 0xD8,
+ 0x0E, 0x1B, 0xC0,
+//ascii 0x0024
+ 0xC5, 0x09, 0x07, 0xC6, 0xBD, 0x72, 0x02, 0x50,
+ 0x0B, 0xC9, 0x07, 0x10, 0x02, 0xC5, 0x0B, 0x60,
+ 0x07, 0xC7, 0x07, 0x20, 0x02, 0xC4, 0x0D, 0x70,
+ 0x00, 0x07, 0xC5, 0x0B, 0x30, 0x05, 0xC4, 0x02,
+ 0x20, 0x85, 0x75, 0x30, 0x0D, 0xC4, 0x02, 0x10,
+ 0x02, 0x0D, 0xC4, 0x0B, 0x20, 0x09, 0xC2, 0x0D,
+ 0x20, 0x05, 0xC3, 0x0D, 0x20, 0x0D, 0xC5, 0x07,
+ 0x10, 0x02, 0xC4, 0x09, 0x20, 0xC3, 0x09, 0x10,
+ 0x05, 0xC6, 0x02, 0x10, 0x09, 0xC5, 0x20, 0x0D,
+ 0xC1, 0x0B, 0x05, 0x10, 0x05, 0x5B, 0x09, 0x20,
+ 0x09, 0x5B, 0x02, 0x10, 0x07, 0x1B, 0x70, 0x70,
+ 0x70, 0x20, 0x82, 0x72, 0x10, 0x02, 0x57, 0x02,
+ 0x10, 0x02, 0x67, 0x02, 0x10, 0x05, 0x17, 0xC0,
+ 0x09, 0x10, 0x05, 0xC5, 0x20, 0x0B, 0xC6, 0x02,
+ 0x10, 0x0B, 0xC2, 0x0D, 0x20, 0x0D, 0xC3, 0x07,
+ 0x20, 0xC6, 0x0B, 0x20, 0xC4, 0x02, 0x10, 0x02,
+ 0x0D, 0xC1, 0x0B, 0x20, 0x07, 0xC6, 0x02, 0x10,
+ 0x02, 0xC4, 0x0B, 0x30, 0x12, 0x30, 0x0D, 0xC4,
+ 0x09, 0x02, 0x20, 0x09, 0xC5, 0x07, 0x70, 0x09,
+ 0xC4, 0x09, 0x30, 0x02, 0xC7, 0x07, 0x50, 0x07,
+ 0xC5, 0x09, 0x20, 0x02, 0xC9, 0x0D, 0x07, 0x15,
+ 0x07, 0x0D, 0xC6, 0x09, 0x10, 0x07, 0xD7, 0x0D,
+ 0x0B,
+//ascii 0x0025
+ 0xD0, 0x07, 0x04, 0x12, 0x04, 0x07, 0xC5, 0x0E,
+ 0xCC, 0x0E, 0x02, 0x50, 0x02, 0x0C, 0xC3, 0x8C,
+ 0x2C, 0xCA, 0x02, 0x10, 0x02, 0x14, 0x02, 0x10,
+ 0x02, 0xC3, 0x0C, 0x10, 0x07, 0xC8, 0x0C, 0x10,
+ 0x0A, 0xC3, 0x0A, 0x10, 0x0C, 0xC3, 0x04, 0x10,
+ 0x02, 0x0C, 0xC6, 0x8A, 0x02, 0xC5, 0x82, 0x0A,
+ 0xC4, 0x0A, 0x20, 0x07, 0xC5, 0x8A, 0x02, 0xC5,
+ 0x82, 0x0A, 0xC5, 0x0E, 0x04, 0x10, 0x04, 0x0E,
+ 0xC3, 0x0E, 0x10, 0x05, 0x0E, 0xC1, 0x0E, 0x05,
+ 0x10, 0x0C, 0xC7, 0x07, 0x20, 0x0A, 0xC3, 0x04,
+ 0x70, 0x04, 0xC9, 0x0C, 0x02, 0x10, 0x04, 0x0E,
+ 0xC2, 0x04, 0x50, 0x04, 0xCC, 0x07, 0x20, 0x0A,
+ 0xC2, 0x0C, 0x07, 0x15, 0x07, 0x0C, 0xCE, 0x0C,
+ 0x02, 0x10, 0x05, 0xD2, 0x1E, 0xC3, 0x05, 0x10,
+ 0x02, 0x0A, 0xCD, 0x07, 0x02, 0x30, 0x05, 0x0E,
+ 0xC1, 0x0C, 0x02, 0x10, 0x05, 0xCB, 0x05, 0x60,
+ 0x02, 0x0E, 0xC2, 0x05, 0x10, 0x02, 0x0C, 0xC8,
+ 0x0A, 0x10, 0x02, 0x27, 0x04, 0x10, 0x04, 0xC3,
+ 0x0A, 0x20, 0x07, 0xC7, 0x85, 0x04, 0xC4, 0x0A,
+ 0x10, 0xC4, 0x0E, 0x04, 0x10, 0x02, 0x0C, 0xC5,
+ 0x84, 0x07, 0xC4, 0x0E, 0x10, 0x0E, 0xC5, 0x0A,
+ 0x20, 0x07, 0xC4, 0x85, 0x04, 0xC4, 0x0A, 0x10,
+ 0xC7, 0x0E, 0x04, 0x10, 0x04, 0xC3, 0x0A, 0x10,
+ 0x04, 0x2A, 0x07, 0x10, 0x04, 0xC9, 0x07, 0x10,
+ 0xC4, 0x04, 0x70, 0x0C, 0xCA, 0x0C, 0x02, 0xC5,
+ 0x05, 0x40, 0x02, 0x0C, 0xD5, 0x2C, 0x0E, 0xC0,
+//ascii 0x0026
+ 0xD7, 0x0E, 0xDD, 0x0C, 0x02, 0xD4, 0x08, 0x10,
+ 0x84, 0x8E, 0xC1, 0x0A, 0x10, 0xD4, 0x08, 0x40,
+ 0x18, 0x20, 0xD4, 0x08, 0x70, 0x00, 0x04, 0xD6,
+ 0x8C, 0x82, 0x30, 0x06, 0xCB, 0x06, 0x20, 0x04,
+ 0x0C, 0xC6, 0x0C, 0x02, 0x30, 0x06, 0xC9, 0x0E,
+ 0x02, 0x50, 0x08, 0xC4, 0x0A, 0x60, 0x0C, 0xC8,
+ 0x04, 0x70, 0x0A, 0xC2, 0x08, 0x20, 0x82, 0xC6,
+ 0x10, 0x06, 0xC7, 0x0D, 0x20, 0x0A, 0xC0, 0x0D,
+ 0x06, 0x20, 0x0D, 0xC0, 0x06, 0x20, 0x02, 0x0E,
+ 0xC0, 0x0E, 0x20, 0xC7, 0x0A, 0x10, 0x08, 0xC3,
+ 0x04, 0x10, 0x02, 0x04, 0x20, 0x04, 0xC3, 0x04,
+ 0x10, 0x0C, 0xC6, 0x08, 0x10, 0x0A, 0xC4, 0x02,
+ 0x40, 0x06, 0xC4, 0x08, 0x10, 0x0A, 0xC6, 0x08,
+ 0x10, 0x08, 0xC4, 0x08, 0x30, 0x08, 0xC5, 0x06,
+ 0x10, 0x0A, 0xC6, 0x0C, 0x10, 0x02, 0x0D, 0xC2,
+ 0x06, 0x40, 0x0D, 0xC5, 0x04, 0x10, 0x0C, 0xC7,
+ 0x02, 0x20, 0x04, 0x06, 0x60, 0x02, 0xC4, 0x0A,
+ 0x20, 0xC8, 0x0A, 0x70, 0x04, 0x0C, 0x20, 0x02,
+ 0x0C, 0xC1, 0x0A, 0x20, 0x06, 0xC9, 0x0A, 0x50,
+ 0x08, 0xC1, 0x0A, 0x30, 0x02, 0x40, 0x0D, 0xCB,
+ 0x0A, 0x18, 0x0A, 0xC4, 0x08, 0x70, 0x0A, 0xD6,
+ 0x0A, 0x02, 0x30, 0x02, 0x0A, 0xD9, 0x0A, 0x18,
+ 0x0C, 0xC0,
+//ascii 0x0027
+ 0xC0, 0x0C, 0x72, 0xC2, 0x0C, 0x70, 0xC2, 0x0C,
+ 0x71,
+//ascii 0x0028
+ 0xDF, 0x0E, 0x0B, 0xDA, 0x09, 0xC1, 0x9E, 0x03,
+ 0xB0, 0xD6, 0x89, 0x23, 0xC1, 0x0E, 0x20, 0x82,
+ 0x9D, 0xD0, 0x0B, 0x06, 0x20, 0x03, 0xC2, 0x04,
+ 0x40, 0x92, 0x69, 0xC0, 0xC7, 0x9E, 0xB9, 0x40,
+ 0x50, 0x09, 0xC3, 0x09, 0x02, 0x70, 0x00, 0x02,
+ 0x23, 0x02, 0x70, 0x80, 0x3C, 0xC6, 0x09, 0x02,
+ 0x70, 0x70, 0x20, 0x04, 0x0B, 0xCA, 0x8B, 0x62,
+ 0x70, 0x40, 0x83, 0x9D, 0xCF, 0x9E, 0xB9, 0x60,
+ 0x34, 0x16, 0x09, 0x0B, 0xC0,
+//ascii 0x0029
+ 0xC8, 0x9C, 0xA8, 0x60, 0x14, 0x02, 0x14, 0x96,
+ 0x8A, 0xE0, 0xCF, 0x8A, 0x41, 0x70, 0x40, 0x82,
+ 0x6C, 0xCA, 0x08, 0x01, 0x70, 0x70, 0x20, 0x02,
+ 0x0A, 0xC6, 0x08, 0x01, 0x60, 0x01, 0x02, 0x44,
+ 0x02, 0x70, 0x02, 0x0C, 0xC3, 0x02, 0x40, 0x94,
+ 0x8A, 0xE0, 0xC8, 0x9C, 0xA6, 0x20, 0x40, 0x06,
+ 0xC1, 0x0E, 0x20, 0x04, 0x0A, 0xD1, 0x8E, 0x82,
+ 0x10, 0x02, 0xC1, 0x9E, 0x04, 0xC0, 0xD6, 0x0A,
+ 0x12, 0xC2, 0x0C, 0xDA, 0x0A,
+//ascii 0x002A
+ 0xC4, 0x0A, 0x0D, 0xC2, 0x0A, 0x0E, 0xC7, 0x85,
+ 0x05, 0xC1, 0x9D, 0x01, 0xA0, 0xC6, 0x08, 0x10,
+ 0x0D, 0xC0, 0x95, 0x01, 0xE0, 0xC7, 0x93, 0x05,
+ 0xD0, 0x10, 0x0A, 0xC8, 0x0C, 0x10, 0x83, 0x05,
+ 0xC5, 0x0D, 0x28, 0x0A, 0x03, 0x20, 0x48, 0xC1,
+ 0x0C, 0x70, 0x30, 0x03, 0xC1, 0x0C, 0x23, 0x05,
+ 0x03, 0x20, 0x15, 0x13, 0x05, 0xC5, 0xBE, 0x10,
+ 0x10, 0x80, 0xC9, 0x95, 0x03, 0xA0, 0x10, 0x0C,
+ 0xC7, 0x0A, 0x10, 0x0A, 0xC0, 0x83, 0x03, 0xC7,
+ 0x83, 0x03, 0xC1, 0x0C, 0x10, 0x0A, 0xC6, 0x8E,
+ 0x5A, 0xC2, 0x05, 0x0A,
+//ascii 0x002B
+ 0xC5, 0x0C, 0x1A, 0x0D, 0xCB, 0x05, 0x10, 0x0A,
+ 0xCB, 0x05, 0x10, 0x0A, 0xCB, 0x05, 0x10, 0x0A,
+ 0xCB, 0x05, 0x10, 0x0A, 0xCB, 0x05, 0x10, 0x0A,
+ 0xC5, 0x5D, 0x04, 0x10, 0x08, 0x5D, 0x02, 0x70,
+ 0x50, 0x08, 0x02, 0x70, 0x50, 0x08, 0x04, 0x42,
+ 0x20, 0x01, 0x42, 0x08, 0xC5, 0x05, 0x10, 0x0A,
+ 0xCB, 0x05, 0x10, 0x0A, 0xCB, 0x05, 0x10, 0x0A,
+ 0xCB, 0x05, 0x10, 0x0A, 0xCB, 0x05, 0x10, 0x0A,
+ 0xCB, 0x05, 0x10, 0x0A,
+//ascii 0x002C
+ 0xC0, 0x9D, 0x68, 0xB0, 0xC7, 0x0D, 0x30, 0x83,
+ 0x8D, 0xC3, 0x0D, 0x60, 0x03, 0x0B, 0xC2, 0x06,
+ 0x13, 0x40, 0x06, 0xC6, 0xAD, 0xB8, 0x36, 0xC0,
+//ascii 0x002D
+ 0xC0, 0x0D, 0x17, 0x0B, 0xC3, 0x0B, 0x10, 0x06,
+ 0xC3, 0x0B, 0x10, 0x06, 0xC3, 0x0B, 0x10, 0x06,
+ 0xC3, 0x0B, 0x10, 0x06, 0xC3, 0x0B, 0x10, 0x06,
+ 0xC3, 0x0B, 0x10, 0x06, 0xC3, 0x0B, 0x10, 0x06,
+ 0xC3, 0x0B, 0x10, 0x06, 0xC3, 0x0B, 0x10, 0x06,
+ 0xC3, 0x0D, 0x14, 0x08, 0xC0,
+//ascii 0x002E
+ 0xC0, 0x0C, 0x15, 0x0D, 0xC2, 0x0E, 0x01, 0x10,
+ 0x01, 0xC2, 0x0B, 0x30, 0x0D, 0xC2, 0x01, 0x10,
+ 0x01, 0xC3, 0x0C, 0x15, 0x0D, 0xC0,
+//ascii 0x002F
+ 0xDF, 0xAB, 0x26, 0xBE, 0xDA, 0x0B, 0x30, 0x82,
+ 0x7B, 0xD7, 0x0B, 0x70, 0x84, 0x8D, 0xD4, 0x9E,
+ 0x96, 0x20, 0x60, 0x92, 0x69, 0xE0, 0xD4, 0x8D,
+ 0x84, 0x70, 0x82, 0x6B, 0xD5, 0x8B, 0x72, 0x70,
+ 0x84, 0x8D, 0xD4, 0x9E, 0xB6, 0x20, 0x70, 0x84,
+ 0x9D, 0xD4, 0x8D, 0x94, 0x70, 0x02, 0x0B, 0xD6,
+ 0x8D, 0x84, 0x40, 0x08, 0xDA, 0xAB, 0x72, 0x08,
+ 0xDD, 0x0E, 0x0D, 0xC0,
+//ascii 0x0030
+ 0xC7, 0x8B, 0x75, 0x43, 0x85, 0x7B, 0xCD, 0x0D,
+ 0x05, 0x70, 0x40, 0x07, 0x0E, 0xC9, 0x07, 0x70,
+ 0x70, 0x00, 0x0A, 0xC7, 0x05, 0x50, 0x03, 0x45,
+ 0x03, 0x50, 0x07, 0xC5, 0x0A, 0x30, 0x05, 0x0B,
+ 0xC8, 0x0B, 0x05, 0x30, 0x0B, 0xC4, 0x20, 0x03,
+ 0x0E, 0xCC, 0x0B, 0x20, 0x03, 0xC3, 0x0B, 0x20,
+ 0x0E, 0xCE, 0x0B, 0x20, 0x0E, 0xC2, 0x07, 0x10,
+ 0x07, 0xD0, 0x03, 0x10, 0x0B, 0xC2, 0x07, 0x10,
+ 0x0A, 0xD0, 0x05, 0x10, 0x0A, 0xC2, 0x07, 0x10,
+ 0x07, 0xD0, 0x05, 0x10, 0x0B, 0xC2, 0x0A, 0x10,
+ 0x03, 0xCF, 0x0E, 0x20, 0x0D, 0xC2, 0x0E, 0x20,
+ 0x07, 0xCE, 0x03, 0x10, 0x03, 0xC4, 0x05, 0x20,
+ 0x03, 0x0B, 0xCA, 0x0A, 0x03, 0x20, 0x0A, 0xC5,
+ 0x03, 0x30, 0x93, 0x57, 0xA0, 0x2B, 0x8A, 0x75,
+ 0x40, 0x03, 0xC6, 0x0E, 0x03, 0x70, 0x70, 0x00,
+ 0x05, 0xC9, 0x07, 0x70, 0x50, 0x03, 0x0A, 0xCC,
+ 0x8A, 0x53, 0x60, 0x83, 0x5B, 0xD2, 0x0E, 0x1D,
+ 0x1E,
+//ascii 0x0031
+ 0xDC, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70,
+ 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3,
+ 0x0D, 0x20, 0x06, 0x79, 0x79, 0x29, 0xC4, 0x08,
+ 0x10, 0x03, 0xD8, 0x03, 0x10, 0x08, 0xD7, 0x0C,
+ 0x20, 0x0D, 0xD7, 0x08, 0x10, 0x03, 0xD8, 0x03,
+ 0x10, 0x09, 0xD8, 0x1D, 0x0E, 0xC0,
+//ascii 0x0032
+ 0xFF, 0xC6, 0x1E, 0xCC, 0x27, 0xCA, 0x0E, 0x05,
+ 0x30, 0x05, 0x0C, 0xC9, 0x20, 0xC9, 0x0B, 0x70,
+ 0x07, 0xC8, 0x20, 0xC8, 0x0D, 0x70, 0x10, 0x03,
+ 0x0E, 0xC6, 0x20, 0xC8, 0x03, 0x20, 0xA8, 0xCD,
+ 0xA3, 0x20, 0x03, 0x0D, 0xC5, 0x20, 0xC7, 0x0D,
+ 0x20, 0x0B, 0xC4, 0x08, 0x30, 0x0C, 0xC4, 0x20,
+ 0xC7, 0x09, 0x10, 0x05, 0xC6, 0x0B, 0x30, 0x0C,
+ 0xC3, 0x20, 0xC7, 0x07, 0x10, 0x09, 0xC7, 0x0C,
+ 0x30, 0x0B, 0xC2, 0x20, 0xC7, 0x07, 0x10, 0x0A,
+ 0xC8, 0x0D, 0x03, 0x20, 0x0B, 0xC1, 0x20, 0xC7,
+ 0x08, 0x10, 0x08, 0xC9, 0x0E, 0x03, 0x20, 0x0A,
+ 0xC0, 0x20, 0xC7, 0x0B, 0x10, 0x03, 0xCA, 0x0E,
+ 0x03, 0x20, 0x09, 0x20, 0xC8, 0x20, 0x05, 0xCA,
+ 0x0E, 0x03, 0x50, 0xC8, 0x08, 0x30, 0x05, 0x0B,
+ 0xC8, 0x0E, 0x03, 0x40, 0xC9, 0x05, 0x30, 0x08,
+ 0xC9, 0x0E, 0x03, 0x30, 0xCA, 0x07, 0x20, 0x08,
+ 0xCB, 0x03, 0x20, 0xCB, 0x9D, 0x85, 0xA0, 0xCC,
+ 0x05, 0x13, 0xC0,
+//ascii 0x0033
+ 0xCF, 0x0D, 0x09, 0x17, 0x0B, 0xCB, 0x0B, 0x07,
+ 0x16, 0x09, 0xC4, 0x06, 0x40, 0x03, 0x0D, 0xC7,
+ 0x0E, 0x03, 0x50, 0x0D, 0xC1, 0x03, 0x70, 0x0D,
+ 0xC6, 0x03, 0x70, 0x0E, 0x09, 0x70, 0x00, 0x03,
+ 0xC5, 0x06, 0x30, 0x13, 0x20, 0x06, 0x03, 0x10,
+ 0x07, 0x0E, 0xC0, 0x0E, 0x06, 0x20, 0x09, 0xC3,
+ 0x0E, 0x20, 0x06, 0xC3, 0x03, 0x30, 0x07, 0xC4,
+ 0x06, 0x10, 0x03, 0xC3, 0x09, 0x10, 0x03, 0xC5,
+ 0x30, 0xC5, 0x0E, 0x20, 0x0E, 0xC2, 0x07, 0x10,
+ 0x09, 0xC5, 0x07, 0x10, 0x06, 0xC6, 0x03, 0x10,
+ 0x0D, 0xC2, 0x07, 0x10, 0x0B, 0xC5, 0x09, 0x10,
+ 0x07, 0xC6, 0x03, 0x10, 0x0B, 0xC2, 0x07, 0x10,
+ 0x09, 0xC5, 0x0B, 0x10, 0x07, 0xC6, 0x03, 0x10,
+ 0x0B, 0xC2, 0x09, 0x10, 0x06, 0xC5, 0x0B, 0x10,
+ 0x07, 0xC6, 0x20, 0x0D, 0xC2, 0x0E, 0x20, 0x0D,
+ 0xCE, 0x09, 0x20, 0xC4, 0x03, 0x20, 0x0B, 0xCC,
+ 0x0D, 0x20, 0x06, 0xC4, 0x0D, 0x30, 0x03, 0xCA,
+ 0x03, 0x30, 0x0D, 0xC5, 0x09, 0x20, 0x03, 0xCA,
+ 0x30, 0x07, 0xC7, 0x9B, 0x30, 0x30, 0xCA, 0x20,
+ 0x07, 0xCA, 0x0D, 0x0B, 0xCA, 0x83, 0x6D,
+//ascii 0x0034
+ 0xD0, 0x0E, 0x1C, 0x0E, 0xD7, 0x08, 0x10, 0x08,
+ 0xD7, 0x08, 0x10, 0x08, 0xC8, 0x7E, 0x6E, 0x06,
+ 0x10, 0x08, 0x3E, 0xC3, 0x0C, 0x70, 0x70, 0x60,
+ 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70,
+ 0x70, 0x60, 0xC3, 0x0C, 0x30, 0x08, 0x7D, 0x1D,
+ 0x06, 0x10, 0x06, 0x3C, 0xC4, 0x06, 0x30, 0x06,
+ 0xC8, 0x08, 0x10, 0x08, 0xC9, 0x0A, 0x02, 0x20,
+ 0x02, 0x0A, 0xC6, 0x08, 0x10, 0x08, 0xCB, 0x06,
+ 0x30, 0x04, 0x0E, 0xC4, 0x08, 0x10, 0x08, 0xCC,
+ 0x0C, 0x04, 0x30, 0x08, 0xC3, 0x08, 0x10, 0x08,
+ 0xCE, 0x08, 0x30, 0x04, 0x0C, 0xC1, 0x08, 0x10,
+ 0x08, 0xCF, 0x0E, 0x04, 0x30, 0x06, 0xC0, 0x08,
+ 0x10, 0x08, 0xD1, 0x0A, 0x02, 0x20, 0x02, 0x04,
+ 0x10, 0x08, 0xD3, 0x06, 0x50, 0x08, 0xD4, 0x0C,
+ 0x02, 0x30, 0x08, 0xD6, 0x06, 0x20, 0x08, 0xD7,
+ 0x0E, 0x1C, 0x0E, 0xC0,
+//ascii 0x0035
+ 0xFF, 0xCD, 0x09, 0x04, 0x22, 0x04, 0x0A, 0xCB,
+ 0x0D, 0x14, 0x06, 0xC6, 0x0B, 0x02, 0x60, 0x02,
+ 0x0C, 0xC9, 0x0B, 0x10, 0x04, 0xC5, 0x0A, 0x70,
+ 0x20, 0x0B, 0xC8, 0x0B, 0x10, 0x04, 0xC4, 0x0D,
+ 0x30, 0x02, 0x06, 0x18, 0x02, 0x20, 0x02, 0x0E,
+ 0xC7, 0x0B, 0x10, 0x04, 0xC4, 0x04, 0x20, 0x09,
+ 0xC4, 0x0A, 0x20, 0x06, 0xC7, 0x0B, 0x10, 0x04,
+ 0xC4, 0x20, 0x09, 0xC6, 0x0A, 0x10, 0x02, 0xC7,
+ 0x0B, 0x10, 0x04, 0xC3, 0x0C, 0x10, 0x02, 0xC8,
+ 0x02, 0x10, 0x0D, 0xC6, 0x0B, 0x10, 0x04, 0xC3,
+ 0x0B, 0x10, 0x04, 0xC8, 0x04, 0x10, 0x0B, 0xC6,
+ 0x0B, 0x10, 0x04, 0xC3, 0x0D, 0x10, 0x06, 0xC8,
+ 0x06, 0x10, 0x0B, 0xC6, 0x0B, 0x10, 0x04, 0xC4,
+ 0x10, 0x04, 0xC8, 0x02, 0x10, 0x0D, 0xC6, 0x0B,
+ 0x10, 0x04, 0xC4, 0x08, 0x10, 0xC7, 0x0B, 0x20,
+ 0xC7, 0x0B, 0x20, 0xB2, 0x46, 0x8A, 0xB0, 0x82,
+ 0x08, 0xC5, 0x0C, 0x02, 0x10, 0x06, 0xC7, 0x0B,
+ 0x70, 0x20, 0x02, 0xC4, 0x04, 0x30, 0x0D, 0xC7,
+ 0x0B, 0x70, 0x20, 0x04, 0xC4, 0x30, 0x09, 0xCA,
+ 0xBD, 0xBA, 0x86, 0x40, 0x02, 0x20, 0x06, 0xC4,
+ 0x20, 0x0A, 0xD4, 0x0D, 0x0E, 0xC4, 0x06, 0x09,
+ 0xC0,
+//ascii 0x0036
+ 0xC6, 0x0E, 0xC6, 0x0C, 0x19, 0x0B, 0x0D, 0xCC,
+ 0x87, 0x04, 0xC4, 0x07, 0x02, 0x40, 0x02, 0x09,
+ 0xC8, 0x0D, 0x02, 0x10, 0x04, 0xC3, 0x04, 0x70,
+ 0x00, 0x05, 0xC6, 0x0E, 0x02, 0x20, 0x04, 0xC2,
+ 0x04, 0x70, 0x20, 0x05, 0xC5, 0x05, 0x20, 0x04,
+ 0x0C, 0xC1, 0x09, 0x20, 0x02, 0x0B, 0xC2, 0x09,
+ 0x02, 0x20, 0x0B, 0xC3, 0x0E, 0x20, 0x07, 0xC3,
+ 0x02, 0x10, 0x04, 0xC6, 0x02, 0x10, 0x02, 0xC3,
+ 0x09, 0x10, 0x02, 0xC3, 0x0E, 0x20, 0x0E, 0xC6,
+ 0x0D, 0x20, 0xC3, 0x07, 0x10, 0x07, 0xC3, 0x0C,
+ 0x10, 0x04, 0xC8, 0x04, 0x10, 0x0C, 0xC2, 0x07,
+ 0x10, 0x07, 0xC3, 0x0D, 0x10, 0x05, 0xC8, 0x05,
+ 0x10, 0x0B, 0xC2, 0x07, 0x10, 0x05, 0xC4, 0x10,
+ 0x04, 0xC8, 0x04, 0x10, 0x0C, 0xC2, 0x0B, 0x20,
+ 0xC4, 0x04, 0x10, 0xC8, 0x20, 0xC4, 0x02, 0x10,
+ 0x05, 0xC3, 0x0C, 0x10, 0x05, 0xC6, 0x05, 0x10,
+ 0x02, 0xC4, 0x09, 0x20, 0x02, 0x0C, 0xC2, 0x09,
+ 0x10, 0x05, 0x0E, 0xC2, 0x0E, 0x05, 0x20, 0x09,
+ 0xC5, 0x05, 0x30, 0xA2, 0x79, 0xB7, 0x20, 0x84,
+ 0x54, 0x30, 0x04, 0xC7, 0x07, 0x70, 0x70, 0x00,
+ 0x04, 0xC9, 0x0C, 0x04, 0x70, 0x50, 0x07, 0xCC,
+ 0x9E, 0x95, 0x20, 0x50, 0x82, 0x59, 0xD4, 0x1E,
+ 0xC0,
+//ascii 0x0037
+ 0xFF, 0xC0, 0x0C, 0x22, 0x09, 0xDA, 0x0C, 0x30,
+ 0x02, 0x09, 0xD8, 0x0C, 0x50, 0x02, 0x09, 0xD6,
+ 0x0C, 0x70, 0x02, 0x09, 0xD4, 0x0C, 0x10, 0x84,
+ 0xE6, 0x40, 0x02, 0x09, 0xD2, 0x0C, 0x10, 0x04,
+ 0xC1, 0x0E, 0x06, 0x40, 0x02, 0x09, 0xD0, 0x0C,
+ 0x10, 0x04, 0xC3, 0x0E, 0x06, 0x40, 0x02, 0x09,
+ 0xCE, 0x0C, 0x10, 0x04, 0xC5, 0x0E, 0x06, 0x40,
+ 0x02, 0x09, 0xCC, 0x0C, 0x10, 0x04, 0xC7, 0x0E,
+ 0x04, 0x40, 0x02, 0x09, 0xCA, 0x0C, 0x10, 0x04,
+ 0xC9, 0x0D, 0x04, 0x40, 0x02, 0x09, 0xC8, 0x0C,
+ 0x10, 0x04, 0xCB, 0x0D, 0x04, 0x40, 0x02, 0xC7,
+ 0x0C, 0x10, 0x04, 0xCD, 0x0D, 0x04, 0x30, 0xC7,
+ 0x0C, 0x10, 0x04, 0xCF, 0x0C, 0x04, 0x10, 0xC7,
+ 0x0C, 0x10, 0x04, 0xD1, 0x0C, 0x04, 0xC7, 0x0C,
+ 0x10, 0x04, 0xDB, 0x0E, 0x16, 0x09, 0xC0,
+//ascii 0x0038
+ 0xD0, 0x0C, 0x1B, 0x0E, 0xCB, 0xAE, 0x98, 0x9C,
+ 0xC4, 0x09, 0x02, 0x30, 0x04, 0x0E, 0xC8, 0x06,
+ 0x40, 0x04, 0x0E, 0xC1, 0x06, 0x60, 0x02, 0x0E,
+ 0xC6, 0x04, 0x60, 0x02, 0xC0, 0x09, 0x70, 0x00,
+ 0x02, 0xC5, 0x09, 0x30, 0x02, 0x30, 0x08, 0x02,
+ 0x10, 0xA4, 0xBC, 0xB4, 0x20, 0x09, 0xC4, 0x02,
+ 0x10, 0x04, 0x0C, 0xC1, 0x9C, 0x20, 0x20, 0x10,
+ 0x06, 0xC4, 0x06, 0x10, 0x04, 0xC3, 0x0B, 0x10,
+ 0x02, 0xC4, 0x0E, 0x20, 0x02, 0xC6, 0x20, 0xC3,
+ 0x08, 0x10, 0x08, 0xC5, 0x06, 0x10, 0x06, 0xC6,
+ 0x04, 0x10, 0x0C, 0xC2, 0x06, 0x10, 0x0B, 0xC5,
+ 0x09, 0x10, 0x09, 0xC6, 0x06, 0x10, 0x0B, 0xC2,
+ 0x06, 0x10, 0x0B, 0xC5, 0x09, 0x10, 0x08, 0xC6,
+ 0x06, 0x10, 0x0B, 0xC2, 0x09, 0x10, 0x08, 0xC5,
+ 0x06, 0x10, 0x06, 0xC6, 0x04, 0x10, 0x0C, 0xC2,
+ 0x0C, 0x10, 0x02, 0x0E, 0xC3, 0x0C, 0x30, 0x0E,
+ 0xC4, 0x0E, 0x20, 0xC4, 0x02, 0x10, 0x02, 0x09,
+ 0x1E, 0x09, 0x10, 0x02, 0x10, 0x04, 0xC4, 0x04,
+ 0x10, 0x04, 0xC4, 0x0B, 0x70, 0x80, 0x94, 0x10,
+ 0xA2, 0x89, 0x82, 0x20, 0x0B, 0xC5, 0x06, 0x60,
+ 0x04, 0xC0, 0x0C, 0x70, 0x00, 0x04, 0xC7, 0x09,
+ 0x02, 0x30, 0x08, 0xC2, 0x09, 0x60, 0x04, 0xCA,
+ 0x8C, 0xBC, 0xC5, 0x0C, 0x04, 0x20, 0x02, 0x08,
+ 0xD7, 0x1E,
+//ascii 0x0039
+ 0xC7, 0x8E, 0xCA, 0x28, 0x8A, 0xCD, 0xD0, 0x08,
+ 0x03, 0x70, 0x10, 0x06, 0x0A, 0xCB, 0x0A, 0x01,
+ 0x70, 0x50, 0x01, 0x0A, 0xC8, 0x08, 0x70, 0x10,
+ 0x01, 0x60, 0x06, 0xC6, 0x0C, 0x30, 0x06, 0x1A,
+ 0x08, 0x01, 0x10, 0x0A, 0xC0, 0x8E, 0xC6, 0x30,
+ 0x06, 0xC5, 0x03, 0x10, 0x01, 0x0D, 0xC4, 0x06,
+ 0x10, 0x0A, 0xC2, 0x0E, 0x06, 0x20, 0x0A, 0xC3,
+ 0x0D, 0x20, 0x0D, 0xC6, 0x03, 0x10, 0x0E, 0xC3,
+ 0x06, 0x10, 0x03, 0xC3, 0x08, 0x10, 0x06, 0xC7,
+ 0x0C, 0x10, 0x08, 0xC3, 0x0E, 0x20, 0x0E, 0xC2,
+ 0x06, 0x10, 0x0A, 0xC8, 0x10, 0x03, 0xC4, 0x03,
+ 0x10, 0x0C, 0xC2, 0x06, 0x10, 0x0A, 0xC8, 0x10,
+ 0x01, 0xC4, 0x03, 0x10, 0x0C, 0xC2, 0x08, 0x10,
+ 0x06, 0xC7, 0x0D, 0x10, 0x01, 0xC4, 0x01, 0x10,
+ 0x0C, 0xC2, 0x0C, 0x20, 0x0D, 0xC6, 0x06, 0x10,
+ 0x03, 0xC3, 0x0C, 0x20, 0xC4, 0x01, 0x10, 0x03,
+ 0x0D, 0xC4, 0x08, 0x20, 0x0A, 0xC2, 0x0C, 0x01,
+ 0x10, 0x06, 0xC4, 0x0A, 0x30, 0xA6, 0xAC, 0x83,
+ 0x20, 0x01, 0xC2, 0x03, 0x30, 0x0C, 0xC5, 0x06,
+ 0x70, 0x20, 0x0C, 0xC1, 0x0E, 0x30, 0x08, 0xC7,
+ 0x06, 0x70, 0x01, 0x0C, 0xC2, 0x0E, 0x20, 0x0A,
+ 0xC9, 0x8D, 0x61, 0x20, 0x03, 0x08, 0xC4, 0x9E,
+ 0x38, 0xE0, 0xCE, 0x0E,
+//ascii 0x003A
+ 0x9E, 0x64, 0xA0, 0xC8, 0x0C, 0x14, 0x0D, 0xC2,
+ 0x04, 0x20, 0x0C, 0xC6, 0x0E, 0x30, 0xC2, 0x30,
+ 0x08, 0xC6, 0x0C, 0x30, 0x0D, 0xC1, 0x04, 0x20,
+ 0x0C, 0xC6, 0x0E, 0x30, 0xC2, 0x9E, 0x64, 0xA0,
+ 0xC8, 0x9D, 0x46, 0xD0, 0xC0,
+//ascii 0x003B
+ 0xE9, 0x0D, 0xDC, 0x0B, 0x10, 0x04, 0xC8, 0x9E,
+ 0x69, 0xB0, 0xCE, 0x01, 0x20, 0x09, 0xC7, 0x0D,
+ 0x30, 0x83, 0x9D, 0xCA, 0x01, 0x20, 0x09, 0xC7,
+ 0x0D, 0x60, 0x03, 0x09, 0xC8, 0x09, 0x10, 0x03,
+ 0xC8, 0x9E, 0x64, 0x30, 0x40, 0x06, 0xC9, 0x0D,
+ 0x0B, 0xCE, 0xAE, 0xB9, 0x46, 0xC0,
+//ascii 0x003C
+ 0xC2, 0x0D, 0x1C, 0x0D, 0xC9, 0x2C, 0xC6, 0x09,
+ 0x20, 0xC8, 0x09, 0x20, 0x0E, 0xC6, 0x01, 0x10,
+ 0x07, 0xC7, 0x04, 0x10, 0x06, 0xC7, 0x09, 0x10,
+ 0x01, 0xC6, 0x0C, 0x20, 0x0D, 0xC8, 0x01, 0x10,
+ 0x09, 0xC5, 0x04, 0x10, 0x06, 0xC9, 0x09, 0x10,
+ 0x01, 0xC4, 0x0D, 0x20, 0x0D, 0xCA, 0x01, 0x10,
+ 0x0C, 0xC3, 0x06, 0x10, 0x05, 0xCB, 0x07, 0x10,
+ 0x04, 0xC2, 0x0E, 0x20, 0x0D, 0xCC, 0x20, 0x0C,
+ 0xC1, 0x07, 0x10, 0x05, 0xCD, 0x07, 0x10, 0x05,
+ 0xC1, 0x01, 0x10, 0x0C, 0xCE, 0x20, 0x0D, 0x09,
+ 0x10, 0x04, 0xCF, 0x07, 0x10, 0x06, 0x01, 0x10,
+ 0x0C, 0xCF, 0x0E, 0x40, 0x04, 0xD1, 0x06, 0x30,
+ 0x0C, 0xD1, 0x0E, 0x20, 0x04, 0xD3, 0x07, 0x11,
+ 0x0C,
+//ascii 0x003D
+ 0xFF, 0xE9, 0x0E, 0x11, 0x03, 0xC2, 0x0E, 0x11,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x10, 0x03, 0xC2, 0x0E, 0x10,
+ 0x03, 0xD4, 0x0E, 0x16, 0x08, 0xC2, 0x0E, 0x16,
+ 0x08, 0xC0,
+//ascii 0x003E
+ 0xFF, 0xCD, 0x0E, 0x1D, 0xDC, 0x04, 0x10, 0x08,
+ 0xDA, 0x0B, 0x20, 0x02, 0xDA, 0x04, 0x30, 0x0A,
+ 0xD8, 0x0D, 0x40, 0x02, 0xD8, 0x04, 0x10, 0x08,
+ 0x04, 0x10, 0x0A, 0xD6, 0x0D, 0x20, 0xC0, 0x0B,
+ 0x10, 0x02, 0xD6, 0x06, 0x10, 0x08, 0xC1, 0x02,
+ 0x10, 0x0A, 0xD4, 0x0D, 0x20, 0x0E, 0xC1, 0x0A,
+ 0x10, 0x02, 0xD4, 0x06, 0x10, 0x06, 0xC3, 0x02,
+ 0x10, 0x0A, 0xD2, 0x0D, 0x20, 0x0D, 0xC3, 0x08,
+ 0x10, 0x04, 0xD2, 0x06, 0x10, 0x04, 0xC5, 0x20,
+ 0x0B, 0xD0, 0x0E, 0x20, 0x0B, 0xC5, 0x06, 0x10,
+ 0x04, 0xD0, 0x06, 0x10, 0x04, 0xC6, 0x0D, 0x20,
+ 0x0B, 0xCE, 0x0E, 0x20, 0x0A, 0xC7, 0x06, 0x10,
+ 0x04, 0xCE, 0x08, 0x12, 0x04, 0xC8, 0x0D, 0x22,
+ 0x0D, 0xC0,
+//ascii 0x003F
+ 0xC5, 0x8D, 0xCD, 0xD6, 0x09, 0x02, 0x30, 0x07,
+ 0xD3, 0x04, 0x60, 0x02, 0xD1, 0x09, 0x70, 0x00,
+ 0x04, 0xD0, 0x20, 0xA2, 0x9C, 0xB4, 0x20, 0x09,
+ 0xCE, 0x0B, 0x10, 0x02, 0xC4, 0x07, 0x20, 0x0B,
+ 0xCD, 0x07, 0x10, 0x09, 0xC5, 0x04, 0x20, 0x84,
+ 0x9B, 0xC2, 0x09, 0x12, 0x0B, 0xC3, 0x07, 0x10,
+ 0x0B, 0xC5, 0x0E, 0x02, 0x40, 0x0B, 0xC0, 0x0E,
+ 0x30, 0xC3, 0x07, 0x10, 0x0B, 0xC6, 0x0C, 0x02,
+ 0x30, 0x0B, 0xC0, 0x0B, 0x30, 0x0D, 0xC2, 0x09,
+ 0x10, 0x04, 0xC8, 0xA9, 0x42, 0x0B, 0xC1, 0x02,
+ 0x10, 0x04, 0xC3, 0x0E, 0x20, 0x07, 0xCF, 0x07,
+ 0x09, 0xC5, 0x04, 0x20, 0x02, 0x07, 0xD5, 0x0E,
+ 0x02, 0x20, 0x04, 0xD6, 0x0D, 0x02, 0x10, 0x04,
+ 0xD8, 0x0B, 0x17,
+//ascii 0x0040
+ 0xEB, 0x0D, 0x09, 0x18, 0x99, 0xAB, 0xE0, 0xD4,
+ 0x0B, 0x05, 0x70, 0x90, 0x38, 0xE0, 0xCF, 0x0D,
+ 0x03, 0x70, 0x50, 0x0D, 0xCD, 0x0A, 0x40, 0x96,
+ 0x89, 0xA0, 0x19, 0x08, 0x05, 0x30, 0x0E, 0xCB,
+ 0x0A, 0x20, 0x03, 0x0B, 0xC9, 0x06, 0x10, 0x08,
+ 0xCA, 0x0D, 0x20, 0x06, 0xCC, 0x10, 0x05, 0xCA,
+ 0x03, 0x10, 0x08, 0xCD, 0x83, 0x03, 0xC3, 0x0D,
+ 0xC4, 0x0A, 0x10, 0x03, 0xC2, 0x7E, 0x1E, 0x0D,
+ 0x06, 0x10, 0x05, 0xC1, 0x9B, 0x30, 0xB0, 0xC3,
+ 0x03, 0x10, 0x0D, 0xC1, 0x08, 0x70, 0x50, 0x09,
+ 0xC1, 0x0D, 0x10, 0x06, 0xC2, 0x0E, 0x10, 0x05,
+ 0xC2, 0x08, 0x70, 0x40, 0x03, 0xC3, 0x10, 0x03,
+ 0xC2, 0x0A, 0x10, 0x09, 0xC2, 0x0A, 0x03, 0x20,
+ 0x03, 0x25, 0x03, 0x20, 0x05, 0xC4, 0x05, 0x10,
+ 0xC2, 0x08, 0x10, 0x0D, 0xC2, 0x0E, 0x20, 0x0B,
+ 0xC4, 0x0E, 0x06, 0x10, 0x09, 0xC3, 0x08, 0x10,
+ 0x0D, 0xC1, 0x06, 0x10, 0xC3, 0x06, 0x10, 0x0B,
+ 0xC7, 0x05, 0x10, 0x0E, 0xC2, 0x09, 0x10, 0x0B,
+ 0xC1, 0x06, 0x10, 0xC3, 0x03, 0x10, 0xC8, 0x0B,
+ 0x10, 0x08, 0xC2, 0x0A, 0x10, 0x0B, 0xC1, 0x06,
+ 0x10, 0xC3, 0x83, 0x03, 0xC8, 0x0E, 0x10, 0x06,
+ 0xC2, 0x09, 0x10, 0x0B, 0xC1, 0x06, 0x10, 0xC3,
+ 0x03, 0x10, 0xC8, 0x0D, 0x10, 0x06, 0xC2, 0x08,
+ 0x10, 0x0B, 0xC1, 0x08, 0x10, 0x0D, 0xC2, 0x05,
+ 0x10, 0x0B, 0xC7, 0x08, 0x10, 0x08, 0xC2, 0x06,
+ 0x10, 0x0E, 0xC1, 0x0B, 0x10, 0x09, 0xC2, 0x0B,
+ 0x10, 0x03, 0x0D, 0xC5, 0x0A, 0x20, 0x0D, 0xC2,
+ 0x03, 0x10, 0xC2, 0x0E, 0x10, 0x05, 0xC3, 0x05,
+ 0x20, 0x06, 0x0A, 0x1B, 0x08, 0x03, 0x20, 0x05,
+ 0xC2, 0x0E, 0x10, 0x03, 0xC3, 0x03, 0x10, 0x0E,
+ 0xC2, 0x0E, 0x03, 0x70, 0x10, 0x03, 0xC3, 0x08,
+ 0x10, 0x08, 0xC3, 0x09, 0x10, 0x05, 0xC4, 0x06,
+ 0x70, 0x08, 0xC3, 0x0E, 0x20, 0x0E, 0xC4, 0x03,
+ 0x10, 0x09, 0xC4, 0x8E, 0xA8, 0x16, 0x08, 0x0B,
+ 0xC5, 0x05, 0x10, 0x05, 0xC5, 0x0A, 0x20, 0x09,
+ 0xCF, 0x06, 0x20, 0x0D, 0xC6, 0x06, 0x20, 0x06,
+ 0x0E, 0xCB, 0x0D, 0x03, 0x20, 0x09, 0xC8, 0x05,
+ 0x30, 0x06, 0x0B, 0xC7, 0x0A, 0x05, 0x30, 0x08,
+ 0xCA, 0x06, 0x50, 0x03, 0x35, 0x03, 0x50, 0x09,
+ 0xCC, 0x0D, 0x03, 0x70, 0x50, 0x05, 0x0D, 0xCF,
+ 0x8D, 0x63, 0x70, 0x83, 0x8D, 0xD5, 0x0D, 0x3B,
+ 0x0D,
+//ascii 0x0041
+ 0xD7, 0x09, 0xDB, 0x0B, 0x05, 0x10, 0xD8, 0x8C,
+ 0x51, 0x30, 0xD5, 0x8D, 0x71, 0x60, 0xD2, 0x8E,
+ 0x93, 0x60, 0x81, 0x5B, 0xD0, 0x09, 0x05, 0x70,
+ 0x05, 0x0B, 0xD0, 0x0B, 0x05, 0x70, 0x00, 0x01,
+ 0xD0, 0x8C, 0x71, 0x60, 0x05, 0x07, 0x10, 0x03,
+ 0xCE, 0x07, 0x03, 0x60, 0x83, 0x9E, 0xC0, 0x0E,
+ 0x10, 0x03, 0xCD, 0x0C, 0x50, 0x83, 0x7E, 0xC3,
+ 0x0E, 0x10, 0x03, 0xCD, 0x0C, 0x30, 0x07, 0x0D,
+ 0xC6, 0x0E, 0x10, 0x03, 0xCD, 0x0C, 0x30, 0x81,
+ 0x7C, 0xC5, 0x0E, 0x10, 0x03, 0xCD, 0x0C, 0x60,
+ 0x81, 0x7D, 0xC2, 0x0E, 0x10, 0x03, 0xCE, 0x8E,
+ 0x93, 0x60, 0x03, 0x07, 0x1E, 0x10, 0x03, 0xD1,
+ 0x8D, 0x71, 0x60, 0x03, 0x10, 0x03, 0xD4, 0x8C,
+ 0x51, 0x60, 0x01, 0x09, 0xD6, 0x0B, 0x05, 0x70,
+ 0x05, 0x09, 0xD6, 0x09, 0x03, 0x70, 0x05, 0xD6,
+ 0x8E, 0x73, 0x50, 0xD9, 0x8C, 0x71, 0x20, 0xDC,
+ 0x8B, 0x50, 0xC0,
+//ascii 0x0042
+ 0xF0, 0x8D, 0xBC, 0xD1, 0x0C, 0x1A, 0x0D, 0xC4,
+ 0x09, 0x40, 0x05, 0x0E, 0xCC, 0x09, 0x40, 0x05,
+ 0x0E, 0xC1, 0x05, 0x70, 0x0D, 0xCA, 0x07, 0x60,
+ 0x03, 0xC0, 0x09, 0x70, 0x00, 0x03, 0xC9, 0x0C,
+ 0x70, 0x80, 0xA3, 0x10, 0xA5, 0xBD, 0xB3, 0x20,
+ 0x0A, 0xC8, 0x05, 0x20, 0x09, 0xC1, 0x9B, 0x30,
+ 0x30, 0x10, 0x05, 0xC4, 0x03, 0x10, 0x05, 0xC8,
+ 0x20, 0x0A, 0xC3, 0x0E, 0x30, 0xC5, 0x0A, 0x10,
+ 0x03, 0xC7, 0x0D, 0x20, 0xC5, 0x07, 0x10, 0x05,
+ 0xC5, 0x0E, 0x20, 0xC7, 0x0C, 0x10, 0x05, 0xC5,
+ 0x0C, 0x10, 0x07, 0xC6, 0x20, 0xC7, 0x0C, 0x10,
+ 0x05, 0xC5, 0x0D, 0x10, 0x07, 0xC6, 0x20, 0xC7,
+ 0x0C, 0x10, 0x05, 0xC5, 0x0D, 0x10, 0x07, 0xC6,
+ 0x20, 0xC7, 0x0C, 0x10, 0x05, 0xC5, 0x0D, 0x10,
+ 0x07, 0xC6, 0x20, 0xC7, 0x0C, 0x10, 0x05, 0xC5,
+ 0x0D, 0x10, 0x07, 0xC6, 0x20, 0xC7, 0x0C, 0x10,
+ 0x05, 0xC5, 0x0C, 0x10, 0x07, 0xC6, 0x20, 0xC7,
+ 0x0C, 0x70, 0x70, 0x60, 0xC7, 0x0C, 0x70, 0x70,
+ 0x60, 0xC7, 0x0C, 0x70, 0x70, 0x60, 0xC7, 0x0E,
+ 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x0043
+ 0xFF, 0xC6, 0x89, 0x4B, 0xC6, 0x89, 0x5A, 0xD0,
+ 0x08, 0x01, 0x10, 0x0B, 0xC6, 0x08, 0x10, 0x02,
+ 0x0B, 0xCD, 0x05, 0x30, 0x0B, 0xC6, 0x08, 0x30,
+ 0x09, 0xCB, 0x06, 0x30, 0x02, 0x0D, 0xC6, 0x0A,
+ 0x01, 0x30, 0x0B, 0xC9, 0x0B, 0x20, 0x01, 0x0A,
+ 0xCA, 0x08, 0x20, 0x01, 0xC9, 0x04, 0x10, 0x01,
+ 0x0D, 0xCC, 0x0A, 0x20, 0x08, 0xC7, 0x0E, 0x20,
+ 0x09, 0xCE, 0x05, 0x10, 0x02, 0xC7, 0x0A, 0x10,
+ 0x01, 0xCF, 0x0D, 0x20, 0x0E, 0xC6, 0x08, 0x10,
+ 0x04, 0xD0, 0x20, 0x0B, 0xC6, 0x06, 0x10, 0x06,
+ 0xD0, 0x01, 0x10, 0x0B, 0xC6, 0x06, 0x10, 0x05,
+ 0xD0, 0x01, 0x10, 0x0B, 0xC6, 0x08, 0x10, 0x02,
+ 0xCF, 0x0D, 0x20, 0x0D, 0xC6, 0x0B, 0x20, 0x0D,
+ 0xCE, 0x08, 0x10, 0x01, 0xC8, 0x01, 0x10, 0x04,
+ 0xCD, 0x0E, 0x01, 0x10, 0x05, 0xC8, 0x08, 0x20,
+ 0x05, 0xCB, 0x0E, 0x02, 0x20, 0x0D, 0xC9, 0x02,
+ 0x20, 0x02, 0x0B, 0xC8, 0x09, 0x01, 0x20, 0x06,
+ 0xCA, 0x0D, 0x01, 0x30, 0xB2, 0x69, 0xAB, 0xA0,
+ 0x88, 0x51, 0x30, 0x04, 0xCC, 0x0D, 0x02, 0x70,
+ 0x60, 0x04, 0xCF, 0x06, 0x70, 0x30, 0x01, 0x09,
+ 0xD1, 0x9E, 0x84, 0x10, 0x40, 0x81, 0x5A, 0xD7,
+ 0x0E, 0x2D, 0xC0,
+//ascii 0x0044
+ 0xCA, 0x0D, 0x2C, 0x0D, 0xD2, 0x8D, 0x72, 0x60,
+ 0x04, 0x09, 0xCE, 0x06, 0x70, 0x40, 0x09, 0xCA,
+ 0x0D, 0x02, 0x70, 0x60, 0x06, 0xC8, 0x0E, 0x02,
+ 0x30, 0x04, 0x09, 0x1C, 0xAD, 0xCA, 0x72, 0x30,
+ 0x06, 0xC7, 0x04, 0x20, 0x04, 0x0D, 0xC8, 0x0A,
+ 0x02, 0x20, 0x0A, 0xC5, 0x0C, 0x20, 0x06, 0xCB,
+ 0x0E, 0x02, 0x10, 0x02, 0xC5, 0x06, 0x10, 0x02,
+ 0xCD, 0x0C, 0x20, 0x0A, 0xC4, 0x02, 0x10, 0x0A,
+ 0xCE, 0x04, 0x10, 0x06, 0xC3, 0x0E, 0x20, 0xCF,
+ 0x0A, 0x10, 0x02, 0xC3, 0x0C, 0x10, 0x02, 0xCF,
+ 0x0D, 0x20, 0xC3, 0x0C, 0x10, 0x02, 0xCF, 0x0E,
+ 0x20, 0xC3, 0x0C, 0x10, 0x02, 0xD0, 0x20, 0xC3,
+ 0x0C, 0x10, 0x02, 0xD0, 0x20, 0xC3, 0x0C, 0x10,
+ 0x02, 0xD0, 0x20, 0xC3, 0x0C, 0x10, 0x02, 0xCF,
+ 0x0E, 0x20, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3,
+ 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0E, 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x0045
+ 0xC1, 0x1D, 0xD1, 0x2C, 0xC3, 0x0C, 0x10, 0x04,
+ 0xC6, 0x19, 0x0C, 0xC6, 0x20, 0xC3, 0x0C, 0x10,
+ 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6, 0x20, 0xC3,
+ 0x0C, 0x10, 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6,
+ 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xC5, 0x0D, 0x10,
+ 0x02, 0xC6, 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xC5,
+ 0x0D, 0x10, 0x02, 0xC6, 0x20, 0xC3, 0x0C, 0x10,
+ 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6, 0x20, 0xC3,
+ 0x0C, 0x10, 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6,
+ 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xC5, 0x0D, 0x10,
+ 0x02, 0xC6, 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xC5,
+ 0x0D, 0x10, 0x02, 0xC6, 0x20, 0xC3, 0x0C, 0x10,
+ 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6, 0x20, 0xC3,
+ 0x0C, 0x10, 0x04, 0xC5, 0x0D, 0x10, 0x02, 0xC6,
+ 0x20, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60,
+ 0xC3, 0x0D, 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x0046
+ 0xC0, 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x11, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0E, 0x10, 0x02, 0xCD, 0x0C, 0x10, 0x04,
+ 0xC5, 0x0C, 0x10, 0x02, 0xCD, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0E, 0x79, 0x79, 0x69,
+ 0xC0,
+//ascii 0x0047
+ 0xFF, 0xC6, 0x09, 0x04, 0xC3, 0x01, 0x20, 0x81,
+ 0x49, 0xD0, 0x09, 0x20, 0xC3, 0x01, 0x50, 0x01,
+ 0x0A, 0xCD, 0x06, 0x30, 0xC3, 0x01, 0x70, 0x07,
+ 0xCB, 0x07, 0x30, 0x01, 0xC3, 0x01, 0x10, 0x8A,
+ 0x73, 0x30, 0x09, 0xC9, 0x0C, 0x20, 0x01, 0x09,
+ 0xC4, 0x01, 0x10, 0xC2, 0x0A, 0x01, 0x10, 0x01,
+ 0x0E, 0xC8, 0x04, 0x10, 0x01, 0x0C, 0xC5, 0x01,
+ 0x10, 0xC3, 0x0C, 0x20, 0x07, 0xC7, 0x0E, 0x20,
+ 0x09, 0xC6, 0x01, 0x10, 0xC4, 0x07, 0x10, 0x01,
+ 0xC7, 0x0A, 0x10, 0x01, 0xC7, 0x01, 0x10, 0xC4,
+ 0x0D, 0x20, 0x0E, 0xC6, 0x07, 0x10, 0x04, 0xC7,
+ 0x01, 0x10, 0xC5, 0x20, 0x0C, 0xC6, 0x07, 0x10,
+ 0x06, 0xD0, 0x01, 0x10, 0x0A, 0xC6, 0x07, 0x10,
+ 0x06, 0xD0, 0x01, 0x10, 0x0C, 0xC6, 0x09, 0x10,
+ 0x03, 0xCF, 0x0D, 0x20, 0x0D, 0xC6, 0x0C, 0x20,
+ 0x0D, 0xCE, 0x07, 0x10, 0x01, 0xC8, 0x01, 0x10,
+ 0x04, 0xCD, 0x0E, 0x01, 0x10, 0x06, 0xC8, 0x09,
+ 0x20, 0x06, 0xCB, 0x0E, 0x03, 0x20, 0x0C, 0xC9,
+ 0x03, 0x20, 0x03, 0x0C, 0xC8, 0x09, 0x01, 0x20,
+ 0x06, 0xCA, 0x0D, 0x01, 0x30, 0x83, 0x79, 0x2A,
+ 0x89, 0x61, 0x30, 0x03, 0xCC, 0x0D, 0x01, 0x70,
+ 0x60, 0x04, 0xCF, 0x07, 0x70, 0x30, 0x01, 0x09,
+ 0xD2, 0x89, 0x41, 0x40, 0x81, 0x6A, 0xD8, 0x2D,
+ 0xC0,
+//ascii 0x0048
+ 0xC1, 0x7D, 0x7D, 0x6D, 0xC3, 0x0B, 0x70, 0x70,
+ 0x60, 0xC3, 0x0B, 0x70, 0x70, 0x60, 0xC3, 0x0B,
+ 0x70, 0x70, 0x60, 0xC4, 0x7B, 0x0B, 0x09, 0x10,
+ 0x01, 0x7B, 0x1B, 0xCD, 0x0D, 0x10, 0x02, 0xD7,
+ 0x0D, 0x10, 0x02, 0xD7, 0x0D, 0x10, 0x02, 0xD7,
+ 0x0D, 0x10, 0x02, 0xD7, 0x0D, 0x10, 0x02, 0xD7,
+ 0x0D, 0x10, 0x02, 0xD7, 0x0D, 0x10, 0x02, 0xD7,
+ 0x0D, 0x10, 0x02, 0xD7, 0x0D, 0x10, 0x02, 0xD7,
+ 0x0D, 0x10, 0x02, 0xD7, 0x0D, 0x10, 0x02, 0xCD,
+ 0x0B, 0x70, 0x70, 0x60, 0xC3, 0x0B, 0x70, 0x70,
+ 0x60, 0xC3, 0x0B, 0x70, 0x70, 0x60, 0xC4, 0x79,
+ 0x79, 0x69, 0xC0,
+//ascii 0x0049
+ 0xC1, 0x2E, 0xD0, 0x2E, 0xC3, 0x0C, 0x10, 0x04,
+ 0xD0, 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xD0, 0x20,
+ 0xC3, 0x0C, 0x10, 0x04, 0xD0, 0x20, 0xC3, 0x0C,
+ 0x10, 0x04, 0xD0, 0x20, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x10, 0x04, 0x78,
+ 0x78, 0x08, 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xD0,
+ 0x20, 0xC3, 0x0C, 0x10, 0x04, 0xD0, 0x20, 0xC3,
+ 0x0C, 0x10, 0x04, 0xD0, 0x20, 0xC3, 0x0E, 0x16,
+ 0x08, 0xD0, 0x26, 0xC0,
+//ascii 0x004A
+ 0xC1, 0x7E, 0x7E, 0x0E, 0xC9, 0x0C, 0x70, 0x70,
+ 0x10, 0x03, 0x08, 0xC6, 0x0C, 0x70, 0x70, 0x30,
+ 0x01, 0x0C, 0xC4, 0x0C, 0x70, 0x70, 0x40, 0x01,
+ 0x0E, 0xC3, 0x0E, 0x7A, 0x7A, 0x8A, 0x83, 0x20,
+ 0x07, 0xD7, 0x07, 0x10, 0x01, 0xD8, 0x01, 0x10,
+ 0x0C, 0xD7, 0x05, 0x10, 0x0C, 0xD7, 0x05, 0x10,
+ 0x0C, 0xD7, 0x01, 0x10, 0x0C, 0xD6, 0x05, 0x10,
+ 0x01, 0xD5, 0x07, 0x01, 0x20, 0x07, 0xD5, 0x03,
+ 0x20, 0x01, 0x0E, 0xD5, 0x03, 0x10, 0x01, 0x0C,
+ 0xD6, 0x15, 0x08,
+//ascii 0x004B
+ 0xC0, 0x0E, 0xD5, 0x0C, 0xC3, 0x0C, 0x04, 0xD3,
+ 0x09, 0x00, 0xC3, 0x9C, 0x02, 0xE0, 0xD0, 0x05,
+ 0x10, 0xC3, 0x0C, 0x10, 0x02, 0x0C, 0xCD, 0x0C,
+ 0x02, 0x20, 0xC3, 0x0C, 0x30, 0x0C, 0xCB, 0x07,
+ 0x30, 0x02, 0xC4, 0x07, 0x30, 0x09, 0xC8, 0x0E,
+ 0x04, 0x30, 0x04, 0x0E, 0xC5, 0x09, 0x30, 0x09,
+ 0xC6, 0x0C, 0x02, 0x30, 0x09, 0xC8, 0x0C, 0x30,
+ 0x07, 0xC4, 0x07, 0x30, 0x02, 0x0C, 0xCA, 0x0C,
+ 0x02, 0x20, 0x05, 0xC1, 0x0E, 0x04, 0x30, 0x05,
+ 0xCD, 0x0E, 0x02, 0x20, 0x04, 0x09, 0x40, 0x09,
+ 0xD0, 0x04, 0x60, 0x04, 0x0E, 0xD2, 0x05, 0x40,
+ 0x07, 0xD5, 0x07, 0x20, 0x02, 0x0E, 0xD6, 0x09,
+ 0x20, 0x02, 0x0C, 0xD6, 0x09, 0x30, 0x0C, 0xCA,
+ 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0E,
+ 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x004C
+ 0xD5, 0x26, 0xD8, 0x20, 0xD8, 0x20, 0xD8, 0x20,
+ 0xD8, 0x20, 0xD8, 0x20, 0xD8, 0x20, 0xD8, 0x20,
+ 0xD8, 0x20, 0xD8, 0x20, 0xD8, 0x20, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60,
+ 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0E, 0x79,
+ 0x79, 0x69, 0xC0,
+//ascii 0x004D
+ 0xC1, 0x7D, 0x7D, 0x6D, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x50, 0x06, 0x0C,
+ 0x7D, 0x6D, 0xC4, 0x09, 0x02, 0x50, 0x06, 0x0C,
+ 0xD3, 0x0C, 0x06, 0x50, 0x02, 0x09, 0xD4, 0x09,
+ 0x02, 0x50, 0x06, 0x0D, 0xD3, 0x0C, 0x04, 0x50,
+ 0x04, 0x09, 0xD3, 0x8E, 0x72, 0x50, 0x07, 0x0D,
+ 0xD3, 0x0C, 0x04, 0x50, 0x04, 0x0C, 0xD3, 0x8D,
+ 0x72, 0x40, 0x02, 0xD5, 0x07, 0x40, 0xD3, 0x0C,
+ 0x04, 0x50, 0xD1, 0x09, 0x02, 0x50, 0x06, 0x0D,
+ 0xCE, 0x0C, 0x06, 0x50, 0x02, 0x09, 0xCF, 0x09,
+ 0x02, 0x50, 0x06, 0x0C, 0xCE, 0x0D, 0x06, 0x50,
+ 0x82, 0x9E, 0xCE, 0x09, 0x04, 0x50, 0x04, 0x0C,
+ 0xCE, 0x8E, 0x72, 0x40, 0x82, 0x7E, 0xCF, 0x0C,
+ 0x50, 0x04, 0x0C, 0xD2, 0x0C, 0x50, 0x72, 0x72,
+ 0x02, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0E, 0x79, 0x79, 0x69,
+ 0xC0,
+//ascii 0x004E
+ 0xC1, 0x7A, 0x7A, 0x6A, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC4, 0x7E, 0x7E, 0x06, 0x30,
+ 0x02, 0x0C, 0xD2, 0x0E, 0x06, 0x30, 0x06, 0xD3,
+ 0x0A, 0x02, 0x20, 0x02, 0x0A, 0xD3, 0x06, 0x30,
+ 0x06, 0xD3, 0x0C, 0x02, 0x30, 0x09, 0xD3, 0x06,
+ 0x30, 0x02, 0x0E, 0xD2, 0x0D, 0x02, 0x30, 0x09,
+ 0xD3, 0x09, 0x30, 0x02, 0x0D, 0xD2, 0x0E, 0x02,
+ 0x30, 0x06, 0xD3, 0x09, 0x30, 0x02, 0x0C, 0xD2,
+ 0x0E, 0x06, 0x30, 0x06, 0xD3, 0x0A, 0x02, 0x30,
+ 0x0A, 0xD3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60,
+ 0xC3, 0x0E, 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x004F
+ 0xFF, 0xC8, 0x8B, 0x75, 0x24, 0x85, 0x8C, 0xD3,
+ 0x0D, 0x05, 0x70, 0x10, 0x01, 0x07, 0xD0, 0x08,
+ 0x70, 0x50, 0x01, 0x0B, 0xCD, 0x05, 0x50, 0x14,
+ 0x85, 0x41, 0x50, 0x09, 0xCB, 0x07, 0x30, 0x05,
+ 0x0C, 0xC6, 0x0B, 0x04, 0x30, 0x0B, 0xC9, 0x0C,
+ 0x20, 0x01, 0x0C, 0xCA, 0x09, 0x20, 0x01, 0xC9,
+ 0x04, 0x10, 0x01, 0x0D, 0xCC, 0x09, 0x20, 0x08,
+ 0xC7, 0x0E, 0x20, 0x09, 0xCE, 0x05, 0x10, 0x01,
+ 0xC7, 0x09, 0x10, 0x01, 0xCF, 0x0C, 0x20, 0x0E,
+ 0xC6, 0x07, 0x10, 0x05, 0xD0, 0x20, 0x0C, 0xC6,
+ 0x07, 0x10, 0x05, 0xD0, 0x01, 0x10, 0x0B, 0xC6,
+ 0x07, 0x10, 0x05, 0xD0, 0x20, 0x0C, 0xC6, 0x08,
+ 0x10, 0x01, 0xCF, 0x0E, 0x20, 0x0D, 0xC6, 0x0C,
+ 0x20, 0x0D, 0xCE, 0x08, 0x10, 0x01, 0xC8, 0x01,
+ 0x10, 0x04, 0xCD, 0x0E, 0x01, 0x10, 0x05, 0xC8,
+ 0x08, 0x20, 0x05, 0xCB, 0x0E, 0x04, 0x20, 0x0D,
+ 0xC9, 0x01, 0x20, 0x04, 0x0C, 0xC8, 0x09, 0x01,
+ 0x20, 0x07, 0xCA, 0x0D, 0x01, 0x30, 0x81, 0x79,
+ 0x2B, 0x88, 0x51, 0x30, 0x04, 0xCC, 0x0D, 0x01,
+ 0x70, 0x60, 0x05, 0xCF, 0x07, 0x70, 0x30, 0x01,
+ 0x09, 0xD1, 0x8E, 0x84, 0x50, 0x81, 0x5B, 0xD7,
+ 0x0E, 0x2D, 0xC0,
+//ascii 0x0050
+ 0xC5, 0x09, 0x04, 0x12, 0x83, 0x6C, 0xD2, 0x09,
+ 0x70, 0x03, 0x0E, 0xCF, 0x09, 0x70, 0x10, 0x02,
+ 0x0E, 0xCD, 0x0D, 0x30, 0x02, 0x16, 0x03, 0x30,
+ 0x04, 0xCD, 0x06, 0x20, 0x09, 0xC3, 0x0E, 0x04,
+ 0x20, 0x0D, 0xCC, 0x20, 0x09, 0xC6, 0x02, 0x10,
+ 0x09, 0xCB, 0x0D, 0x20, 0xC7, 0x09, 0x10, 0x04,
+ 0xCB, 0x0C, 0x10, 0x03, 0xC7, 0x0C, 0x10, 0x03,
+ 0xCB, 0x0C, 0x10, 0x04, 0xC7, 0x0D, 0x10, 0x03,
+ 0xCB, 0x0C, 0x10, 0x04, 0xC7, 0x0D, 0x10, 0x03,
+ 0xCB, 0x0C, 0x10, 0x04, 0xC7, 0x0D, 0x10, 0x03,
+ 0xCB, 0x0C, 0x10, 0x04, 0xC7, 0x0D, 0x10, 0x03,
+ 0xCB, 0x0C, 0x10, 0x04, 0xC7, 0x0C, 0x10, 0x03,
+ 0xCB, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70,
+ 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3,
+ 0x0E, 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x0051
+ 0xC8, 0x0B, 0x07, 0x45, 0x07, 0x0B, 0xCF, 0x0D,
+ 0x05, 0x70, 0x10, 0x02, 0x07, 0xC5, 0x07, 0x0E,
+ 0xC4, 0x07, 0x70, 0x50, 0x02, 0x0B, 0xC1, 0x9E,
+ 0x50, 0xE0, 0xC3, 0x05, 0x50, 0x02, 0x25, 0x02,
+ 0x50, 0x89, 0xB2, 0x10, 0x0E, 0xC2, 0x07, 0x30,
+ 0x05, 0x0B, 0xC6, 0x09, 0x05, 0x60, 0x02, 0xC2,
+ 0x0B, 0x20, 0x02, 0x0B, 0xCA, 0x09, 0x40, 0x05,
+ 0x0E, 0xC2, 0x05, 0x10, 0x02, 0x0E, 0xCB, 0x0D,
+ 0x02, 0x20, 0x05, 0xC3, 0x0E, 0x20, 0x09, 0xCB,
+ 0x09, 0x40, 0x02, 0xC3, 0x09, 0x10, 0x02, 0xCB,
+ 0x09, 0x20, 0x02, 0x20, 0x0E, 0xC2, 0x07, 0x10,
+ 0x05, 0xCB, 0x07, 0x10, 0x07, 0xC0, 0x20, 0x0B,
+ 0xC2, 0x07, 0x10, 0x07, 0xCB, 0x87, 0x0B, 0xC1,
+ 0x02, 0x10, 0x0B, 0xC2, 0x07, 0x10, 0x05, 0xCB,
+ 0x09, 0x0E, 0xC2, 0x20, 0x0B, 0xC2, 0x09, 0x10,
+ 0x02, 0xCF, 0x0E, 0x20, 0x0D, 0xC2, 0x0B, 0x20,
+ 0x0D, 0xCE, 0x07, 0x20, 0xC4, 0x02, 0x10, 0x05,
+ 0xCD, 0x0E, 0x02, 0x10, 0x05, 0xC4, 0x07, 0x20,
+ 0x05, 0xCB, 0x0E, 0x02, 0x20, 0x0D, 0xC5, 0x02,
+ 0x20, 0x02, 0x0B, 0xC8, 0x09, 0x02, 0x20, 0x07,
+ 0xC6, 0x0D, 0x02, 0x30, 0x82, 0x79, 0x1B, 0x19,
+ 0x05, 0x02, 0x30, 0x05, 0xC8, 0x0D, 0x02, 0x70,
+ 0x60, 0x05, 0xCB, 0x07, 0x70, 0x30, 0x02, 0x09,
+ 0xCD, 0x8E, 0x95, 0x50, 0x82, 0x59, 0xD3, 0x0E,
+ 0x1D, 0x0E, 0xC0,
+//ascii 0x0052
+ 0xF7, 0x07, 0xCB, 0x8E, 0x74, 0x12, 0x84, 0x7E,
+ 0xC8, 0x89, 0x20, 0xCA, 0x07, 0x70, 0x07, 0xC5,
+ 0x0C, 0x02, 0x20, 0xC9, 0x07, 0x70, 0x10, 0x07,
+ 0xC2, 0x0C, 0x04, 0x40, 0xC8, 0x0C, 0x30, 0x02,
+ 0x15, 0x02, 0x30, 0x8D, 0xE5, 0x50, 0x09, 0xC8,
+ 0x05, 0x20, 0x0C, 0xC3, 0x0C, 0x20, 0x02, 0x50,
+ 0x07, 0xCA, 0x20, 0x09, 0xC5, 0x09, 0x60, 0x05,
+ 0x0E, 0xCA, 0x0E, 0x20, 0xC7, 0x40, 0x05, 0x0D,
+ 0xCC, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10, 0x04,
+ 0x0C, 0xCE, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10,
+ 0x0D, 0xCF, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10,
+ 0x0D, 0xCF, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10,
+ 0x0D, 0xCF, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10,
+ 0x0D, 0xCF, 0x0C, 0x10, 0x04, 0xC7, 0x02, 0x10,
+ 0x0C, 0xCF, 0x0C, 0x70, 0x70, 0x60, 0xC7, 0x0C,
+ 0x70, 0x70, 0x60, 0xC7, 0x0C, 0x70, 0x70, 0x60,
+ 0xC7, 0x0E, 0x79, 0x79, 0x69, 0xC0,
+//ascii 0x0053
+ 0xC4, 0x0E, 0x19, 0xC6, 0xBE, 0x72, 0x02, 0x50,
+ 0x0C, 0xC9, 0x09, 0x10, 0x02, 0xC5, 0x0B, 0x60,
+ 0x07, 0xC7, 0x07, 0x20, 0x02, 0xC4, 0x0D, 0x70,
+ 0x00, 0x07, 0xC5, 0x0B, 0x30, 0x05, 0xC4, 0x03,
+ 0x20, 0x85, 0x75, 0x30, 0x0C, 0xC4, 0x02, 0x10,
+ 0x02, 0x0C, 0xC4, 0x0C, 0x20, 0x09, 0xC2, 0x0C,
+ 0x20, 0x05, 0xC3, 0x0D, 0x20, 0x0C, 0xC5, 0x07,
+ 0x10, 0x02, 0xC4, 0x09, 0x20, 0xC3, 0x09, 0x10,
+ 0x03, 0xC6, 0x02, 0x10, 0x09, 0xC5, 0x20, 0x0C,
+ 0xC2, 0x07, 0x10, 0x07, 0xC5, 0x0D, 0x20, 0x0E,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC2, 0x07, 0x10, 0x09,
+ 0xC5, 0x09, 0x10, 0x02, 0xC6, 0x05, 0x10, 0x0B,
+ 0xC2, 0x07, 0x10, 0x09, 0xC5, 0x05, 0x10, 0x07,
+ 0xC6, 0x05, 0x10, 0x0B, 0xC2, 0x09, 0x10, 0x05,
+ 0xC5, 0x20, 0x0B, 0xC6, 0x02, 0x10, 0x0C, 0xC2,
+ 0x0D, 0x20, 0x0D, 0xC3, 0x09, 0x20, 0xC6, 0x0C,
+ 0x20, 0xC4, 0x03, 0x10, 0x02, 0x0D, 0xC1, 0x0B,
+ 0x20, 0x07, 0xC6, 0x03, 0x10, 0x03, 0xC4, 0x0B,
+ 0x30, 0x03, 0x02, 0x30, 0x0D, 0xC4, 0x0B, 0x02,
+ 0x20, 0x09, 0xC5, 0x07, 0x70, 0x09, 0xC4, 0x09,
+ 0x30, 0x03, 0xC7, 0x07, 0x50, 0x07, 0xC5, 0x09,
+ 0x20, 0x02, 0x0E, 0xC8, 0x0D, 0x07, 0x15, 0x07,
+ 0x0C, 0xC6, 0x09, 0x10, 0x07, 0xD7, 0x0D, 0x0C,
+//ascii 0x0054
+ 0xC0, 0x0D, 0x2A, 0xD7, 0x0C, 0x10, 0x04, 0xD7,
+ 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04, 0xD7,
+ 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04, 0xD7,
+ 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x03, 0x7D,
+ 0x7D, 0x3D, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3,
+ 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x10, 0x03, 0x7A, 0x7A, 0x3A,
+ 0xC3, 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04,
+ 0xD7, 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04,
+ 0xD7, 0x0C, 0x10, 0x04, 0xD7, 0x0C, 0x10, 0x04,
+ 0xD7, 0x0D, 0x16, 0x0A, 0xC0,
+//ascii 0x0055
+ 0xFF, 0xE0, 0x0B, 0x70, 0x70, 0x80, 0x4A, 0xCB,
+ 0x0B, 0x70, 0x70, 0x20, 0x03, 0x0E, 0xC9, 0x0B,
+ 0x70, 0x70, 0x30, 0x03, 0x0E, 0xC8, 0x0E, 0x78,
+ 0x78, 0x04, 0x30, 0x03, 0xDA, 0x0D, 0x03, 0x20,
+ 0x0A, 0xDB, 0x03, 0x10, 0x03, 0xDB, 0x0A, 0x20,
+ 0x0E, 0xDB, 0x20, 0x0B, 0xDB, 0x03, 0x10, 0x0A,
+ 0xDB, 0x03, 0x10, 0x0A, 0xDB, 0x20, 0x0B, 0xDA,
+ 0x0D, 0x20, 0x0D, 0xDA, 0x04, 0x20, 0xDA, 0x08,
+ 0x20, 0x08, 0xD7, 0x8E, 0xB4, 0x30, 0x0E, 0xC7,
+ 0x0B, 0x70, 0x70, 0x40, 0x0A, 0xC8, 0x0B, 0x70,
+ 0x70, 0x30, 0x09, 0xC9, 0x0B, 0x70, 0x70, 0x10,
+ 0x04, 0x0D, 0xCA, 0x0E, 0x79, 0x79, 0x0B, 0x0E,
+//ascii 0x0056
+ 0xC0, 0x0E, 0x0B, 0xD9, 0x0C, 0x10, 0x06, 0x0C,
+ 0xD6, 0x0C, 0x30, 0x83, 0x8E, 0xD3, 0x0C, 0x60,
+ 0x83, 0x8E, 0xD1, 0x08, 0x03, 0x70, 0x03, 0x0B,
+ 0xD1, 0x8E, 0x83, 0x70, 0x06, 0x0B, 0xD1, 0x8E,
+ 0x83, 0x70, 0x06, 0x0C, 0xD1, 0x8E, 0x83, 0x60,
+ 0x83, 0x8E, 0xD1, 0x8C, 0x63, 0x60, 0x03, 0x08,
+ 0xD2, 0x0C, 0x06, 0x60, 0xD5, 0x0C, 0x06, 0x30,
+ 0xD4, 0x0B, 0x06, 0x40, 0xD1, 0x0B, 0x06, 0x70,
+ 0xCE, 0x0C, 0x06, 0x70, 0x03, 0x0B, 0xCC, 0x0C,
+ 0x06, 0x70, 0x83, 0x8E, 0xCB, 0x8C, 0x63, 0x60,
+ 0x83, 0x8E, 0xCB, 0x8E, 0x63, 0x70, 0x06, 0x0C,
+ 0xCC, 0x0E, 0x03, 0x70, 0x06, 0x0B, 0xCF, 0x0C,
+ 0x50, 0x03, 0x08, 0xD2, 0x0C, 0x20, 0x83, 0x8E,
+ 0xD4, 0x9C, 0x06, 0xC0, 0xC0,
+//ascii 0x0057
+ 0xC0, 0x8E, 0x9E, 0xD8, 0x0B, 0x10, 0x83, 0x7B,
+ 0xD5, 0x0B, 0x50, 0x83, 0x9D, 0xD1, 0x0B, 0x70,
+ 0x10, 0x85, 0x9E, 0xCE, 0x8B, 0x73, 0x70, 0x10,
+ 0x83, 0x7B, 0xCF, 0x8B, 0x73, 0x70, 0x10, 0x85,
+ 0x9E, 0xCF, 0x8B, 0x73, 0x70, 0x90, 0x37, 0xB0,
+ 0xD0, 0x8B, 0x73, 0x70, 0xD4, 0x0B, 0x05, 0x40,
+ 0xD2, 0x8B, 0x73, 0x50, 0xCE, 0x8B, 0x73, 0x70,
+ 0x03, 0x07, 0xCA, 0x8B, 0x73, 0x70, 0x83, 0x5B,
+ 0xC9, 0x8D, 0x95, 0x70, 0x90, 0x39, 0xD0, 0xC9,
+ 0x0E, 0x05, 0x70, 0x90, 0x37, 0xB0, 0xCD, 0x0B,
+ 0x60, 0x85, 0x9E, 0xD0, 0x0B, 0x40, 0x03, 0x0B,
+ 0xD3, 0x0B, 0x70, 0x85, 0x9D, 0xD0, 0x09, 0x05,
+ 0x70, 0x90, 0x35, 0xB0, 0xD0, 0x8D, 0x95, 0x70,
+ 0x90, 0x37, 0xD0, 0xD0, 0x8D, 0x95, 0x70, 0x80,
+ 0x59, 0xD1, 0x8B, 0x73, 0x70, 0x03, 0xD3, 0x8B,
+ 0x73, 0x40, 0xD3, 0x8B, 0x73, 0x40, 0xCF, 0x8B,
+ 0x73, 0x70, 0x00, 0xCB, 0x8B, 0x73, 0x70, 0x90,
+ 0x37, 0xB0, 0xC8, 0x8B, 0x73, 0x70, 0x10, 0x85,
+ 0x9E, 0xC7, 0x8E, 0x73, 0x70, 0x10, 0x83, 0x7B,
+ 0xCB, 0x0B, 0x70, 0x80, 0x59, 0xCF, 0x0B, 0x40,
+ 0x85, 0x9D, 0xD2, 0xAB, 0x03, 0x7B, 0xD7, 0x0E,
+ 0xC0,
+//ascii 0x0058
+ 0xC0, 0x0E, 0xD5, 0x0D, 0xC7, 0x8C, 0x2B, 0xD2,
+ 0x09, 0x00, 0xC7, 0x0C, 0x10, 0x05, 0x0E, 0xCE,
+ 0x0C, 0x02, 0x10, 0xC7, 0x0C, 0x20, 0x01, 0x09,
+ 0xCC, 0x07, 0x30, 0xC7, 0x0D, 0x40, 0x04, 0x0D,
+ 0xC8, 0x0B, 0x01, 0x30, 0x01, 0xC8, 0x0D, 0x04,
+ 0x40, 0x07, 0xC5, 0x0D, 0x04, 0x40, 0x07, 0xCB,
+ 0x0B, 0x01, 0x30, 0x02, 0x0B, 0xC2, 0x09, 0x40,
+ 0x02, 0x0C, 0xCE, 0x07, 0x40, 0x85, 0xB2, 0x30,
+ 0x01, 0x09, 0xD1, 0x0C, 0x02, 0x70, 0x80, 0x5E,
+ 0xD4, 0x09, 0x01, 0x40, 0x01, 0x0B, 0xD7, 0x09,
+ 0x40, 0x0B, 0xD6, 0x0D, 0x04, 0x60, 0x05, 0x0E,
+ 0xD3, 0x07, 0x40, 0x02, 0x30, 0x01, 0x09, 0xD0,
+ 0x0B, 0x02, 0x30, 0x02, 0x0C, 0xC0, 0x09, 0x01,
+ 0x30, 0x04, 0x0D, 0xCC, 0x0E, 0x05, 0x40, 0x09,
+ 0xC3, 0x0E, 0x05, 0x40, 0x07, 0xCA, 0x09, 0x01,
+ 0x30, 0x04, 0x0D, 0xC6, 0x0B, 0x01, 0x30, 0x02,
+ 0x0B, 0xC7, 0x0C, 0x30, 0x01, 0x09, 0xCA, 0x07,
+ 0x40, 0xC7, 0x0C, 0x20, 0x05, 0x0E, 0xCC, 0x0C,
+ 0x02, 0x20, 0xC7, 0x9C, 0x02, 0xB0, 0xD0, 0x09,
+ 0x10, 0xC7, 0x0C, 0x07, 0xD3, 0x0D, 0x04, 0xC0,
+//ascii 0x0059
+ 0xE0, 0x8C, 0x5E, 0xDC, 0x9C, 0x01, 0x80, 0xDB,
+ 0x0C, 0x20, 0x02, 0x0C, 0xD9, 0x0C, 0x40, 0x05,
+ 0x0E, 0xD8, 0x0C, 0x02, 0x30, 0x01, 0x08, 0xD9,
+ 0x0A, 0x01, 0x30, 0x02, 0x0C, 0xD9, 0x06, 0x40,
+ 0x05, 0x0E, 0xD8, 0x0D, 0x05, 0x40, 0x08, 0xD9,
+ 0x0C, 0x02, 0x30, 0x02, 0x75, 0x05, 0xD1, 0x08,
+ 0x01, 0x70, 0x30, 0xD1, 0x0A, 0x01, 0x70, 0x30,
+ 0xCF, 0x0D, 0x03, 0x30, 0x01, 0x73, 0x03, 0xCD,
+ 0x0E, 0x06, 0x40, 0x06, 0xD6, 0x08, 0x01, 0x30,
+ 0x03, 0x0D, 0xD5, 0x0A, 0x02, 0x30, 0x01, 0x0A,
+ 0xD5, 0x0D, 0x04, 0x40, 0x06, 0xD6, 0x0D, 0x40,
+ 0x03, 0x0D, 0xD7, 0x0C, 0x20, 0x01, 0x0A, 0xD9,
+ 0x0C, 0x10, 0x06, 0xDB, 0x8C, 0x3D,
+//ascii 0x005A
+ 0xC0, 0x0E, 0x18, 0x0D, 0xD0, 0x26, 0xC3, 0x0B,
+ 0x20, 0x08, 0xCF, 0x20, 0xC3, 0x0B, 0x30, 0x04,
+ 0x0D, 0xCD, 0x20, 0xC3, 0x0B, 0x50, 0x08, 0xCC,
+ 0x20, 0xC3, 0x0B, 0x60, 0x04, 0x0E, 0xCA, 0x20,
+ 0xC3, 0x0B, 0x10, 0x84, 0xB1, 0x30, 0x08, 0xC9,
+ 0x20, 0xC3, 0x0B, 0x10, 0x04, 0xC0, 0x0E, 0x04,
+ 0x30, 0x04, 0x0E, 0xC7, 0x20, 0xC3, 0x0B, 0x10,
+ 0x04, 0xC2, 0x0B, 0x01, 0x20, 0x01, 0x0B, 0xC6,
+ 0x20, 0xC3, 0x0B, 0x10, 0x04, 0xC3, 0x0E, 0x04,
+ 0x30, 0x06, 0x0E, 0xC4, 0x20, 0xC3, 0x0B, 0x10,
+ 0x04, 0xC5, 0x08, 0x30, 0x01, 0x0B, 0xC3, 0x20,
+ 0xC3, 0x0B, 0x10, 0x04, 0xC6, 0x0E, 0x04, 0x30,
+ 0x06, 0xC2, 0x20, 0xC3, 0x0B, 0x10, 0x04, 0xC8,
+ 0x08, 0x30, 0x01, 0x0B, 0xC0, 0x20, 0xC3, 0x0B,
+ 0x10, 0x04, 0xC9, 0x0D, 0x04, 0x30, 0x06, 0x20,
+ 0xC3, 0x0B, 0x10, 0x04, 0xCB, 0x08, 0x60, 0xC3,
+ 0x0B, 0x10, 0x04, 0xCC, 0x0C, 0x01, 0x40, 0xC3,
+ 0x0B, 0x10, 0x04, 0xCE, 0x06, 0x30, 0xC3, 0x0B,
+ 0x10, 0x04, 0xCF, 0x0B, 0x01, 0x10, 0xC4, 0x2E,
+ 0xC0,
+//ascii 0x005B
+ 0xC0, 0x1E, 0xD7, 0x2E, 0xC1, 0x0E, 0x10, 0x07,
+ 0xD6, 0x82, 0x02, 0xC1, 0x0E, 0x10, 0x07, 0xD6,
+ 0x82, 0x02, 0xC1, 0x0E, 0x10, 0x07, 0xD6, 0x82,
+ 0x02, 0xC1, 0x0E, 0x10, 0x07, 0xD6, 0x82, 0x02,
+ 0xC1, 0x0E, 0x20, 0x72, 0x72, 0x62, 0x10, 0x02,
+ 0xC1, 0x0E, 0x70, 0x70, 0x70, 0x30, 0x02, 0xC1,
+ 0x0E, 0x70, 0x70, 0x70, 0x30, 0x02, 0xC2, 0x7A,
+ 0x7A, 0x7A, 0x4A,
+//ascii 0x005C
+ 0xF8, 0x9A, 0x72, 0x80, 0xD7, 0x8C, 0x84, 0x30,
+ 0x08, 0xD3, 0x8D, 0x85, 0x70, 0x08, 0xCF, 0x9E,
+ 0xA5, 0x20, 0x70, 0x85, 0x8D, 0xCD, 0x8C, 0x72,
+ 0x70, 0x84, 0x8C, 0xCD, 0x8C, 0x84, 0x70, 0x82,
+ 0x7A, 0xCD, 0x8E, 0xA5, 0x70, 0x92, 0x5A, 0xE0,
+ 0xCE, 0x0C, 0x02, 0x70, 0x84, 0x8D, 0xD2, 0x0A,
+ 0x40, 0x84, 0x7C, 0xD6, 0xAA, 0x02, 0x7A, 0xDA,
+ 0x0E, 0x0D,
+//ascii 0x005D
+ 0xC0, 0x79, 0x79, 0x79, 0x39, 0x0A, 0xC1, 0x0E,
+ 0x70, 0x70, 0x70, 0x30, 0x03, 0xC1, 0x0E, 0x70,
+ 0x70, 0x70, 0x30, 0x03, 0xC1, 0x0E, 0x20, 0x73,
+ 0x73, 0x63, 0x10, 0x03, 0xC1, 0x0E, 0x10, 0x07,
+ 0xD6, 0x83, 0x03, 0xC1, 0x0E, 0x10, 0x07, 0xD6,
+ 0x83, 0x03, 0xC1, 0x0E, 0x10, 0x07, 0xD6, 0x83,
+ 0x03, 0xC1, 0x0E, 0x10, 0x07, 0xD6, 0x83, 0x03,
+//ascii 0x005E
+ 0xC9, 0x8D, 0x6C, 0xCA, 0x0D, 0x05, 0x10, 0x0C,
+ 0xC8, 0x0C, 0x05, 0x30, 0x0C, 0xC6, 0x0C, 0x03,
+ 0x30, 0x02, 0x0C, 0xC5, 0x0C, 0x03, 0x30, 0x05,
+ 0x0C, 0xC7, 0x06, 0x20, 0x06, 0x0D, 0xC9, 0x06,
+ 0x10, 0x08, 0xCB, 0x06, 0x20, 0x02, 0x08, 0xC9,
+ 0x0D, 0x06, 0x30, 0x01, 0x08, 0xCA, 0x06, 0x01,
+ 0x20, 0x01, 0x06, 0xCA, 0x08, 0x01, 0x20, 0x0C,
+ 0xCB, 0x98, 0x10, 0xC0, 0xCD, 0x08, 0x0D, 0xC0,
+//ascii 0x005F
+ 0xC0, 0x22, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02,
+ 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10,
+ 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0,
+ 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02,
+ 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10,
+ 0x02, 0xC0, 0x10, 0x02,
+//ascii 0x0060
+ 0xCA, 0x8D, 0x5D, 0xC2, 0x0D, 0x05, 0x10, 0x0C,
+ 0xC1, 0x05, 0x30, 0x0D, 0xC1, 0x20, 0x03, 0x0D,
+ 0xC2, 0x10, 0x09, 0xC4, 0x03, 0x0D,
+//ascii 0x0061
+ 0xFF, 0xC9, 0x8A, 0x32, 0x70, 0x30, 0xCF, 0x03,
+ 0x70, 0x60, 0xCE, 0x06, 0x70, 0x70, 0xCD, 0x0E,
+ 0x20, 0x02, 0x18, 0x10, 0x03, 0x19, 0x98, 0x20,
+ 0x20, 0x1A, 0xCD, 0x09, 0x10, 0x03, 0xC2, 0x86,
+ 0x02, 0xC3, 0x86, 0x02, 0xCE, 0x06, 0x10, 0x0C,
+ 0xC2, 0x09, 0x10, 0xC4, 0x82, 0x06, 0xCD, 0x06,
+ 0x10, 0xC3, 0x0B, 0x10, 0x0C, 0xC3, 0x08, 0x10,
+ 0xCD, 0x06, 0x10, 0x0E, 0xC2, 0x0C, 0x10, 0x0A,
+ 0xC3, 0x0A, 0x10, 0x0B, 0xCC, 0x08, 0x10, 0x0B,
+ 0xC3, 0x10, 0x08, 0xC3, 0x0A, 0x10, 0x0A, 0xCC,
+ 0x0B, 0x10, 0x02, 0xC3, 0x82, 0x02, 0xC3, 0x06,
+ 0x10, 0x0B, 0xCD, 0x02, 0x10, 0x03, 0x0E, 0xC1,
+ 0x06, 0x10, 0x08, 0xC1, 0x0C, 0x20, 0x0E, 0xCD,
+ 0x09, 0x20, 0x0A, 0xC1, 0x0B, 0x20, 0x12, 0x20,
+ 0x03, 0xCF, 0x06, 0x10, 0x0E, 0xC2, 0x03, 0x60,
+ 0x0C, 0xD0, 0x0A, 0x03, 0xC3, 0x0E, 0x03, 0x40,
+ 0x0B, 0xD9, 0x0B, 0x18, 0x0A,
+//ascii 0x0062
+ 0xCC, 0xBC, 0xB9, 0x89, 0xB0, 0x0E, 0xD2, 0x08,
+ 0x01, 0x60, 0x03, 0x0B, 0xCE, 0x0C, 0x01, 0x70,
+ 0x20, 0x05, 0xCC, 0x0C, 0x60, 0x01, 0x50, 0x03,
+ 0xCB, 0x03, 0x20, 0x83, 0xBE, 0xC2, 0x8C, 0x81,
+ 0x20, 0x08, 0xC9, 0x0B, 0x20, 0x08, 0xC8, 0x03,
+ 0x10, 0x01, 0xC9, 0x08, 0x10, 0x05, 0xC9, 0x0E,
+ 0x20, 0x0C, 0xC8, 0x05, 0x10, 0x0B, 0xCA, 0x05,
+ 0x10, 0x0B, 0xC8, 0x05, 0x10, 0x0C, 0xCA, 0x08,
+ 0x10, 0x0B, 0xC8, 0x08, 0x10, 0x0B, 0xCA, 0x05,
+ 0x10, 0x0E, 0xC8, 0x0E, 0x10, 0x05, 0xCA, 0x81,
+ 0x05, 0xCA, 0x09, 0x10, 0x09, 0xC8, 0x95, 0x01,
+ 0xE0, 0xCB, 0xAB, 0x10, 0x5B, 0xC3, 0xBE, 0x91,
+ 0x05, 0xE0, 0xC4, 0x0C, 0x70, 0x40, 0x11, 0x40,
+ 0x21, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0E, 0x79, 0x79, 0x69,
+ 0xC0,
+//ascii 0x0063
+ 0xC6, 0x8A, 0x6D, 0xC4, 0x8A, 0x6B, 0xCA, 0x0D,
+ 0x02, 0x10, 0x0D, 0xC4, 0x08, 0x10, 0x06, 0xC8,
+ 0x0D, 0x02, 0x20, 0x0D, 0xC4, 0x08, 0x20, 0x04,
+ 0xC7, 0x04, 0x20, 0x04, 0x0E, 0xC4, 0x0B, 0x02,
+ 0x20, 0x0A, 0xC5, 0x0D, 0x20, 0x0A, 0xC8, 0x06,
+ 0x10, 0x02, 0xC5, 0x08, 0x10, 0x06, 0xCA, 0x02,
+ 0x10, 0x0D, 0xC4, 0x06, 0x10, 0x0B, 0xCA, 0x06,
+ 0x10, 0x0B, 0xC4, 0x06, 0x10, 0x0D, 0xCA, 0x08,
+ 0x10, 0x0A, 0xC4, 0x06, 0x10, 0x0A, 0xCA, 0x06,
+ 0x10, 0x0B, 0xC4, 0x0A, 0x10, 0x04, 0xC9, 0x0E,
+ 0x20, 0x0E, 0xC4, 0x0E, 0x20, 0x08, 0xC7, 0x0E,
+ 0x04, 0x10, 0x04, 0xC6, 0x06, 0x20, 0x84, 0xAE,
+ 0xC2, 0x8D, 0x82, 0x20, 0x0B, 0xC7, 0x02, 0x70,
+ 0x40, 0x06, 0xC8, 0x0E, 0x04, 0x70, 0x20, 0x06,
+ 0xCB, 0x0A, 0x02, 0x60, 0x04, 0x0B, 0xCE, 0x0D,
+ 0x0A, 0x18, 0x0A, 0x0B, 0xC0,
+//ascii 0x0064
+ 0xFF, 0xC0, 0x0E, 0x78, 0x78, 0x68, 0xC7, 0x0C,
+ 0x70, 0x70, 0x60, 0xC7, 0x0C, 0x70, 0x70, 0x60,
+ 0xC7, 0x0C, 0x71, 0x40, 0x81, 0x21, 0x30, 0x22,
+ 0xCF, 0xAB, 0x20, 0x5C, 0xC3, 0xBE, 0x82, 0x05,
+ 0xE0, 0xCF, 0x08, 0x10, 0x0B, 0xC8, 0x95, 0x02,
+ 0xE0, 0xCD, 0x0E, 0x10, 0x05, 0xCA, 0x81, 0x05,
+ 0xCD, 0x08, 0x10, 0x0B, 0xCA, 0x05, 0x10, 0x0E,
+ 0xCC, 0x05, 0x10, 0x0C, 0xCA, 0x07, 0x10, 0x0B,
+ 0xCC, 0x05, 0x10, 0x0B, 0xCA, 0x05, 0x10, 0x0B,
+ 0xCC, 0x07, 0x10, 0x05, 0xC9, 0x0E, 0x20, 0x0C,
+ 0xCC, 0x0B, 0x20, 0x08, 0xC7, 0x0E, 0x03, 0x10,
+ 0x01, 0xCE, 0x02, 0x20, 0x83, 0xBE, 0xC2, 0x8C,
+ 0x71, 0x20, 0x07, 0xCE, 0x0C, 0x01, 0x50, 0x01,
+ 0x50, 0x03, 0xD0, 0x0C, 0x02, 0x70, 0x20, 0x05,
+ 0xD3, 0x07, 0x01, 0x60, 0x03, 0x0B, 0xD6, 0x0C,
+ 0x0B, 0x28, 0x0B, 0x0E,
+//ascii 0x0065
+ 0xC9, 0x9D, 0xCB, 0xE0, 0xD0, 0x09, 0x03, 0x30,
+ 0x0B, 0xC1, 0x89, 0x5D, 0xC9, 0x0E, 0x03, 0x50,
+ 0x0B, 0xC1, 0x06, 0x10, 0x0B, 0xC7, 0x0E, 0x03,
+ 0x60, 0x0B, 0xC1, 0x03, 0x20, 0x0E, 0xC6, 0x05,
+ 0x20, 0x86, 0xDB, 0x10, 0x0B, 0xC1, 0x0B, 0x20,
+ 0x06, 0xC5, 0x0E, 0x20, 0x0C, 0xC1, 0x0C, 0x10,
+ 0x0B, 0xC2, 0x0D, 0x20, 0xC5, 0x09, 0x10, 0x06,
+ 0xC2, 0x0C, 0x10, 0x0B, 0xC3, 0x05, 0x10, 0x0D,
+ 0xC4, 0x06, 0x10, 0x0D, 0xC2, 0x0C, 0x10, 0x0B,
+ 0xC3, 0x09, 0x10, 0x0B, 0xC4, 0x05, 0x10, 0x0E,
+ 0xC2, 0x0C, 0x10, 0x0B, 0xC3, 0x09, 0x10, 0x0B,
+ 0xC4, 0x06, 0x10, 0x0C, 0xC2, 0x0C, 0x10, 0x0B,
+ 0xC3, 0x06, 0x10, 0x0C, 0xC4, 0x09, 0x10, 0x06,
+ 0xC2, 0x0C, 0x10, 0x0B, 0xC3, 0x20, 0x0E, 0xC4,
+ 0x0E, 0x20, 0x0B, 0xC1, 0x0C, 0x10, 0x0B, 0xC2,
+ 0x05, 0x10, 0x03, 0xC6, 0x06, 0x20, 0x86, 0xEC,
+ 0x10, 0x0B, 0xC0, 0x0B, 0x03, 0x20, 0x0B, 0xC7,
+ 0x03, 0x70, 0x40, 0x06, 0xC8, 0x0E, 0x03, 0x70,
+ 0x20, 0x06, 0xCB, 0x09, 0x03, 0x60, 0x05, 0x0C,
+ 0xCE, 0x0E, 0x0B, 0x29, 0x0B, 0x0E,
+//ascii 0x0066
+ 0xC0, 0x0B, 0xD9, 0x0E, 0x10, 0x06, 0xC2, 0x0C,
+ 0x16, 0x0E, 0xD0, 0x0B, 0x10, 0x06, 0xC2, 0x09,
+ 0x10, 0x0C, 0xD0, 0x0B, 0x10, 0x06, 0xC2, 0x09,
+ 0x10, 0x0C, 0xD0, 0x0C, 0x20, 0x0D, 0xC1, 0x09,
+ 0x10, 0x0C, 0xD1, 0x30, 0x13, 0x20, 0x73, 0x63,
+ 0xC3, 0x09, 0x70, 0x70, 0x60, 0xC4, 0x06, 0x70,
+ 0x70, 0x50, 0xC5, 0x0D, 0x09, 0x17, 0x03, 0x10,
+ 0x06, 0x77, 0x57, 0xC9, 0x09, 0x10, 0x0C, 0xD7,
+ 0x09, 0x10, 0x0C, 0xD7, 0x0E, 0x1C,
+//ascii 0x0067
+ 0xFF, 0xC6, 0x0C, 0x78, 0x78, 0x18, 0x0A, 0x0D,
+ 0xCA, 0x08, 0x70, 0x70, 0x30, 0x04, 0x0E, 0xC8,
+ 0x08, 0x70, 0x70, 0x40, 0x02, 0x0E, 0xC7, 0x0A,
+ 0x12, 0x01, 0x30, 0x12, 0x01, 0x30, 0x32, 0x30,
+ 0x04, 0xC9, 0xAB, 0x20, 0x6C, 0xC3, 0x0D, 0x08,
+ 0x11, 0x0A, 0xC3, 0x08, 0x20, 0x0C, 0xC7, 0x0A,
+ 0x10, 0x0A, 0xC7, 0x9C, 0x10, 0x80, 0xC3, 0x06,
+ 0x10, 0x08, 0xC6, 0x0E, 0x10, 0x06, 0xC9, 0x08,
+ 0x10, 0x0D, 0xC2, 0x0E, 0x10, 0x04, 0xC6, 0x08,
+ 0x10, 0x0B, 0xC9, 0x0D, 0x10, 0x08, 0xC3, 0x82,
+ 0x02, 0xC6, 0x06, 0x10, 0x0C, 0xC9, 0x0E, 0x10,
+ 0x04, 0xC3, 0x82, 0x02, 0xC6, 0x04, 0x10, 0x0A,
+ 0xC9, 0x0D, 0x10, 0x04, 0xC3, 0x82, 0x02, 0xC6,
+ 0x06, 0x10, 0x04, 0xC9, 0x08, 0x10, 0x06, 0xC2,
+ 0x0D, 0x10, 0x04, 0xC6, 0x0B, 0x20, 0x08, 0xC7,
+ 0x0B, 0x20, 0x0A, 0xC2, 0x04, 0x10, 0x08, 0xC7,
+ 0x02, 0x20, 0x84, 0xAE, 0xC2, 0x0B, 0x06, 0x20,
+ 0x02, 0xC2, 0x06, 0x20, 0x0E, 0xC7, 0x0C, 0x01,
+ 0x50, 0x01, 0x50, 0x0A, 0xC2, 0x01, 0x10, 0x06,
+ 0xC9, 0x0C, 0x02, 0x70, 0x20, 0x0A, 0xC3, 0x86,
+ 0x04, 0xCC, 0x08, 0x01, 0x60, 0x04, 0x0D, 0xC4,
+ 0x0D, 0x08, 0xCF, 0x0C, 0x0A, 0x18, 0x0A, 0x0B,
+ 0xC0,
+//ascii 0x0068
+ 0xC9, 0x8A, 0x42, 0x70, 0x30, 0xCB, 0x04, 0x70,
+ 0x60, 0xCA, 0x04, 0x70, 0x70, 0xC9, 0x0C, 0x30,
+ 0x04, 0x7A, 0x3A, 0xC9, 0x07, 0x20, 0x0B, 0xD6,
+ 0x05, 0x10, 0x07, 0xD7, 0x05, 0x10, 0x0B, 0xD7,
+ 0x07, 0x10, 0x0B, 0xD7, 0x0C, 0x10, 0x0A, 0xD8,
+ 0x85, 0x02, 0xD9, 0x95, 0x04, 0xD0, 0xCF, 0x0D,
+ 0x75, 0x02, 0x10, 0x02, 0x04, 0x75, 0x15, 0xC3,
+ 0x0B, 0x70, 0x70, 0x60, 0xC3, 0x0B, 0x70, 0x70,
+ 0x60, 0xC3, 0x0C, 0x74, 0x74, 0x64, 0xC0,
+//ascii 0x0069
+ 0xC1, 0x0E, 0xD9, 0x97, 0x01, 0xB0, 0xC1, 0x0B,
+ 0x75, 0x75, 0x05, 0xC2, 0x0E, 0x20, 0x03, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC2, 0x0E, 0x20, 0x03,
+ 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC3, 0x97, 0x01,
+ 0xB0, 0xC1, 0x0B, 0x75, 0x75, 0x05, 0xC4, 0x0E,
+ 0xC0,
+//ascii 0x006A
+ 0xE0, 0x97, 0x01, 0xB0, 0xC1, 0x0B, 0x75, 0x75,
+ 0x25, 0x07, 0x0B, 0xC2, 0x0E, 0x20, 0x04, 0xC1,
+ 0x09, 0x70, 0x70, 0x40, 0x04, 0xC1, 0x0E, 0x20,
+ 0x04, 0xC1, 0x09, 0x70, 0x70, 0x50, 0x04, 0xC1,
+ 0x97, 0x01, 0xB0, 0xC1, 0x0B, 0x74, 0x74, 0x24,
+ 0x01, 0x20, 0x0E, 0xC1, 0x0E, 0xD8, 0x04, 0x10,
+ 0x09, 0xDB, 0x09, 0x10, 0x07,
+//ascii 0x006B
+ 0xD7, 0x0D, 0xC9, 0x0A, 0x0D, 0xCD, 0x0A, 0x00,
+ 0xC9, 0x88, 0x0D, 0xCB, 0x08, 0x10, 0xC9, 0x08,
+ 0x10, 0x0C, 0xC8, 0x0E, 0x03, 0x20, 0xC9, 0x08,
+ 0x20, 0x0B, 0xC6, 0x0B, 0x40, 0xC9, 0x0E, 0x03,
+ 0x20, 0x0A, 0xC4, 0x08, 0x30, 0x03, 0x0E, 0xCA,
+ 0x0E, 0x03, 0x20, 0x0A, 0xC1, 0x0E, 0x03, 0x30,
+ 0x08, 0xCE, 0x03, 0x20, 0x08, 0x0B, 0x40, 0x0A,
+ 0xD0, 0x05, 0x60, 0x03, 0x0E, 0xD2, 0x05, 0x40,
+ 0x08, 0xD5, 0x05, 0x20, 0x08, 0xD7, 0x08, 0x10,
+ 0x03, 0x0E, 0xC9, 0x0D, 0x75, 0x45, 0x20, 0x03,
+ 0x55, 0xC3, 0x0C, 0x70, 0x70, 0x60, 0xC3, 0x0C,
+ 0x70, 0x70, 0x60, 0xC3, 0x0D, 0x75, 0x75, 0x65,
+ 0xC0,
+//ascii 0x006C
+ 0xD5, 0x8D, 0x85, 0xD8, 0x03, 0x10, 0xD8, 0x02,
+ 0x10, 0x0E, 0xC2, 0x0D, 0x75, 0x75, 0x25, 0x02,
+ 0x20, 0xC3, 0x0C, 0x70, 0x70, 0x50, 0x03, 0xC3,
+ 0x0C, 0x70, 0x70, 0x50, 0x0D, 0xC3, 0x0D, 0x75,
+ 0x75, 0x35, 0x08, 0x0E,
+//ascii 0x006D
+ 0xDC, 0x8E, 0x72, 0x70, 0x40, 0xC6, 0x0C, 0x70,
+ 0x70, 0xC6, 0x02, 0x70, 0x70, 0xC5, 0x0A, 0x20,
+ 0x02, 0x07, 0x7A, 0x3A, 0xC5, 0x05, 0x10, 0x02,
+ 0xD3, 0x05, 0x10, 0x0A, 0xD3, 0x07, 0x10, 0x0C,
+ 0xD3, 0x0A, 0x10, 0x0A, 0xD4, 0x82, 0x04, 0xD4,
+ 0x0D, 0x10, 0x07, 0xD4, 0x0E, 0x02, 0x10, 0x72,
+ 0x32, 0xC7, 0x04, 0x70, 0x60, 0xC6, 0x02, 0x70,
+ 0x70, 0xC5, 0x0A, 0x30, 0x05, 0x77, 0x37, 0xC5,
+ 0x07, 0x20, 0x0D, 0xD2, 0x05, 0x10, 0x07, 0xD3,
+ 0x07, 0x10, 0x0C, 0xD3, 0x0A, 0x10, 0x0A, 0xD4,
+ 0x82, 0x04, 0xD5, 0x84, 0x05, 0xD2, 0x0C, 0x17,
+ 0x02, 0x10, 0x04, 0x75, 0x25, 0xC5, 0x0A, 0x70,
+ 0x70, 0x00, 0xC5, 0x0A, 0x70, 0x70, 0x00, 0xC5,
+ 0x0A, 0x74, 0x74, 0x04, 0xC0,
+//ascii 0x006E
+ 0xC5, 0x8D, 0x84, 0x72, 0x32, 0xC7, 0x05, 0x70,
+ 0x60, 0xC6, 0x05, 0x70, 0x70, 0xC5, 0x0D, 0x30,
+ 0x02, 0x05, 0x78, 0x28, 0xC5, 0x08, 0x20, 0x08,
+ 0xD2, 0x05, 0x10, 0x05, 0xD3, 0x05, 0x10, 0x0B,
+ 0xD3, 0x08, 0x10, 0x0B, 0xD3, 0x0B, 0x10, 0x08,
+ 0xD4, 0x84, 0x02, 0xD5, 0x94, 0x04, 0xD0, 0xD1,
+ 0x0B, 0x18, 0x02, 0x10, 0x02, 0x04, 0x75, 0x15,
+ 0xC5, 0x08, 0x70, 0x70, 0x00, 0xC5, 0x08, 0x70,
+ 0x70, 0x00, 0xC5, 0x0B, 0x74, 0x74, 0x04, 0xC0,
+//ascii 0x006F
+ 0xEB, 0xAE, 0x87, 0x54, 0x85, 0x7A, 0xD5, 0x0E,
+ 0x05, 0x70, 0x00, 0x08, 0xD2, 0x0B, 0x70, 0x30,
+ 0x04, 0xD0, 0x0D, 0x40, 0x02, 0x15, 0x04, 0x02,
+ 0x30, 0x04, 0xCF, 0x04, 0x20, 0x08, 0x0E, 0xC4,
+ 0x0D, 0x05, 0x20, 0x08, 0xCD, 0x0C, 0x20, 0x0C,
+ 0xC8, 0x07, 0x10, 0x02, 0xCD, 0x08, 0x10, 0x07,
+ 0xCA, 0x02, 0x10, 0x0D, 0xCC, 0x05, 0x10, 0x0C,
+ 0xCA, 0x07, 0x10, 0x0B, 0xCC, 0x05, 0x10, 0x0D,
+ 0xCA, 0x08, 0x10, 0x0A, 0xCC, 0x07, 0x10, 0x0B,
+ 0xCA, 0x05, 0x10, 0x0B, 0xCC, 0x08, 0x10, 0x05,
+ 0xCA, 0x20, 0x0E, 0xCC, 0x0E, 0x20, 0x08, 0xC8,
+ 0x04, 0x10, 0x04, 0xCE, 0x05, 0x20, 0x84, 0xAE,
+ 0xC2, 0x8D, 0x82, 0x20, 0x0B, 0xCF, 0x02, 0x70,
+ 0x40, 0x07, 0xD0, 0x0E, 0x04, 0x70, 0x20, 0x07,
+ 0xD3, 0x08, 0x02, 0x60, 0x04, 0x0C, 0xD6, 0x0D,
+ 0x0A, 0x28, 0x0B, 0xC0,
+//ascii 0x0070
+ 0xC9, 0x0E, 0x2D, 0xD4, 0x0B, 0x05, 0x50, 0x82,
+ 0x7E, 0xCE, 0x0E, 0x05, 0x70, 0x20, 0x09, 0xCC,
+ 0x0E, 0x02, 0x70, 0x40, 0x07, 0xCB, 0x05, 0x30,
+ 0x07, 0x0B, 0x1D, 0x8B, 0x94, 0x30, 0x0B, 0xC9,
+ 0x0D, 0x20, 0x05, 0x0E, 0xC6, 0x0B, 0x20, 0x02,
+ 0xC9, 0x09, 0x10, 0x02, 0xC9, 0x0D, 0x20, 0x0D,
+ 0xC8, 0x05, 0x10, 0x09, 0xCA, 0x04, 0x10, 0x0B,
+ 0xC8, 0x05, 0x10, 0x0D, 0xCA, 0x07, 0x10, 0x0B,
+ 0xC8, 0x07, 0x10, 0x0D, 0xCA, 0x07, 0x10, 0x0D,
+ 0xC8, 0x0D, 0x10, 0x07, 0xCA, 0x82, 0x02, 0xCA,
+ 0x07, 0x10, 0x0D, 0xC8, 0x07, 0x10, 0x0D, 0xCB,
+ 0x07, 0x10, 0x09, 0xC5, 0xAD, 0x50, 0x2B, 0xCA,
+ 0x0B, 0x17, 0x02, 0x20, 0x04, 0x17, 0x05, 0x02,
+ 0x20, 0x04, 0x75, 0x0B, 0xC2, 0x09, 0x70, 0x70,
+ 0x60, 0x07, 0xC2, 0x09, 0x70, 0x70, 0x60, 0x07,
+ 0xC2, 0x0B, 0x75, 0x75, 0x65, 0x09,
+//ascii 0x0071
+ 0xC2, 0x0C, 0x78, 0x78, 0x68, 0x0B, 0xC2, 0x08,
+ 0x70, 0x70, 0x60, 0x08, 0xC2, 0x08, 0x70, 0x70,
+ 0x60, 0x08, 0xC2, 0x0B, 0x13, 0x01, 0x30, 0x21,
+ 0x30, 0x71, 0x01, 0x08, 0xC4, 0xAB, 0x10, 0x5B,
+ 0xC3, 0xBE, 0x83, 0x05, 0xE0, 0xCB, 0x08, 0x10,
+ 0x0B, 0xC8, 0x95, 0x01, 0xE0, 0xC9, 0x0E, 0x10,
+ 0x05, 0xC9, 0x9E, 0x10, 0x50, 0xC9, 0x08, 0x10,
+ 0x0B, 0xCA, 0x05, 0x10, 0x0E, 0xC8, 0x05, 0x10,
+ 0x0C, 0xCA, 0x08, 0x10, 0x0B, 0xC8, 0x05, 0x10,
+ 0x0B, 0xCA, 0x05, 0x10, 0x0B, 0xC8, 0x08, 0x10,
+ 0x05, 0xC9, 0x0E, 0x20, 0x0C, 0xC8, 0x0B, 0x20,
+ 0x08, 0xC7, 0x0E, 0x03, 0x10, 0x01, 0xCA, 0x03,
+ 0x20, 0x83, 0xBE, 0xC2, 0x8C, 0x81, 0x20, 0x08,
+ 0xCA, 0x0C, 0x01, 0x50, 0x01, 0x50, 0x03, 0xCC,
+ 0x0C, 0x01, 0x70, 0x20, 0x05, 0x0E, 0xCE, 0x08,
+ 0x01, 0x60, 0x03, 0x0B, 0xD2, 0x0C, 0x0B, 0x28,
+ 0x0B, 0x0E,
+//ascii 0x0072
+ 0xC2, 0x09, 0x15, 0x0B, 0xD3, 0x04, 0x10, 0x09,
+ 0xD3, 0x05, 0x10, 0x09, 0xD3, 0x09, 0x10, 0x05,
+ 0xD4, 0x93, 0x01, 0xE0, 0xD3, 0xAD, 0x30, 0x3E,
+ 0xD1, 0x0B, 0x15, 0x01, 0x10, 0x03, 0x04, 0x75,
+ 0x15, 0xC5, 0x09, 0x70, 0x70, 0x00, 0xC5, 0x09,
+ 0x70, 0x70, 0x00, 0xC5, 0x0B, 0x74, 0x74, 0x04,
+ 0xC0,
+//ascii 0x0073
+ 0xC6, 0x0D, 0xC5, 0x08, 0x15, 0x0A, 0xCA, 0x8D,
+ 0x31, 0xC3, 0x0D, 0x02, 0x30, 0x02, 0x0D, 0xC7,
+ 0x0D, 0x20, 0x0D, 0xC2, 0x03, 0x50, 0x02, 0xC7,
+ 0x02, 0x20, 0x0D, 0xC1, 0x0A, 0x20, 0x01, 0x03,
+ 0x20, 0x08, 0xC5, 0x0A, 0x10, 0x02, 0x0D, 0xC2,
+ 0x05, 0x10, 0x03, 0xC1, 0x0A, 0x10, 0x01, 0xC5,
+ 0x08, 0x10, 0x0A, 0xC3, 0x02, 0x10, 0x0D, 0xC2,
+ 0x05, 0x10, 0x0D, 0xC4, 0x05, 0x10, 0xC4, 0x10,
+ 0x01, 0xC3, 0x08, 0x10, 0x0A, 0xC4, 0x05, 0x10,
+ 0xC3, 0x0A, 0x10, 0x05, 0xC3, 0x0A, 0x10, 0x0A,
+ 0xC4, 0x05, 0x10, 0x0D, 0xC2, 0x05, 0x10, 0x08,
+ 0xC3, 0x08, 0x10, 0x0A, 0xC4, 0x0A, 0x10, 0x05,
+ 0xC2, 0x01, 0x10, 0x0D, 0xC3, 0x03, 0x10, 0x0D,
+ 0xC5, 0x20, 0x85, 0x83, 0x10, 0x01, 0xC3, 0x08,
+ 0x10, 0x02, 0xC6, 0x05, 0x60, 0x08, 0xC2, 0x02,
+ 0x20, 0x08, 0xC7, 0x03, 0x40, 0x03, 0xC3, 0x03,
+ 0x10, 0x03, 0xC9, 0xA8, 0x20, 0x28, 0xC4, 0x85,
+ 0x05, 0xD4, 0x1D,
+//ascii 0x0074
+ 0xC6, 0x0D, 0x19, 0x0E, 0xCA, 0x8D, 0x96, 0xC9,
+ 0x09, 0x10, 0x0B, 0xCA, 0x02, 0x10, 0x0D, 0xC8,
+ 0x09, 0x10, 0x0B, 0xCA, 0x02, 0x10, 0x0D, 0xC8,
+ 0x09, 0x10, 0x0B, 0xC9, 0x0B, 0x20, 0x0D, 0xC4,
+ 0x07, 0x32, 0x10, 0x72, 0x22, 0x20, 0x02, 0xC5,
+ 0x06, 0x70, 0x70, 0x30, 0x09, 0xC5, 0x06, 0x70,
+ 0x70, 0x20, 0x07, 0xC6, 0x0B, 0x27, 0x04, 0x10,
+ 0x06, 0x77, 0x17, 0x09, 0x0D, 0xCB, 0x09, 0x10,
+ 0x0B, 0xD7, 0x09, 0x10, 0x0B, 0xD8, 0x1E,
+//ascii 0x0075
+ 0xFF, 0xC6, 0x0B, 0x74, 0x74, 0x04, 0xCD, 0x08,
+ 0x70, 0x70, 0x00, 0xCD, 0x08, 0x70, 0x70, 0x00,
+ 0xCD, 0x0B, 0x76, 0x16, 0x04, 0x01, 0x10, 0x26,
+ 0xDA, 0x98, 0x01, 0xC0, 0xDC, 0x98, 0x01, 0xD0,
+ 0xDC, 0x10, 0x04, 0xDC, 0x02, 0x10, 0xDC, 0x01,
+ 0x10, 0x0D, 0xDA, 0x0B, 0x20, 0x0D, 0xD9, 0x0B,
+ 0x01, 0x20, 0xCD, 0x0B, 0x74, 0x24, 0x02, 0x30,
+ 0x04, 0xCD, 0x08, 0x70, 0x60, 0x01, 0x0D, 0xCD,
+ 0x08, 0x70, 0x50, 0x02, 0x0D, 0xCE, 0x0B, 0x74,
+ 0x24, 0x86, 0x8B,
+//ascii 0x0076
+ 0xE6, 0x98, 0x28, 0xD0, 0xDB, 0x08, 0x20, 0x04,
+ 0x0A, 0xD9, 0x08, 0x50, 0x05, 0x0A, 0xD6, 0x0C,
+ 0x04, 0x60, 0x81, 0x5C, 0xD6, 0x0A, 0x04, 0x60,
+ 0x82, 0x8D, 0xD6, 0x0A, 0x04, 0x60, 0x04, 0x0A,
+ 0xD7, 0x0A, 0x05, 0x60, 0xD9, 0x0A, 0x05, 0x30,
+ 0xD8, 0x8D, 0x82, 0x30, 0xD5, 0x8D, 0x82, 0x50,
+ 0x01, 0xD2, 0x8D, 0x82, 0x50, 0x81, 0x5C, 0xD0,
+ 0x8D, 0x82, 0x60, 0x04, 0x0A, 0xD1, 0x0C, 0x02,
+ 0x60, 0x82, 0x8E, 0xD3, 0x08, 0x40, 0x81, 0x8D,
+ 0xD6, 0x08, 0x10, 0x81, 0x5C, 0xD9, 0x88, 0x4A,
+//ascii 0x0077
+ 0xC6, 0x1D, 0xDD, 0xA9, 0x01, 0x6A, 0xDA, 0x09,
+ 0x40, 0x84, 0x9E, 0xD6, 0x09, 0x70, 0x83, 0x7C,
+ 0xD4, 0x8A, 0x73, 0x70, 0x81, 0x6A, 0xD5, 0x8A,
+ 0x61, 0x70, 0x04, 0x09, 0xD5, 0x9D, 0x96, 0x10,
+ 0x50, 0xD9, 0x09, 0x01, 0x30, 0xD5, 0x9E, 0xA6,
+ 0x10, 0x50, 0xD2, 0x8A, 0x73, 0x60, 0x83, 0x7C,
+ 0xCE, 0x8C, 0x74, 0x60, 0x91, 0x6A, 0xE0, 0xD0,
+ 0x09, 0x60, 0x84, 0x7C, 0xD4, 0x09, 0x30, 0x04,
+ 0x0A, 0xD8, 0x09, 0x40, 0x84, 0x9D, 0xD6, 0x0C,
+ 0x04, 0x60, 0x81, 0x6A, 0xD6, 0x8A, 0x73, 0x60,
+ 0x84, 0x7C, 0xD5, 0x9E, 0xA6, 0x10, 0x50, 0x01,
+ 0x06, 0xD7, 0x8D, 0x94, 0x40, 0xD8, 0x8A, 0x61,
+ 0x30, 0xD4, 0x8C, 0x73, 0x70, 0xD0, 0x8C, 0x94,
+ 0x70, 0x81, 0x6A, 0xCE, 0x8C, 0x61, 0x70, 0x83,
+ 0x7C, 0xD1, 0x09, 0x60, 0x84, 0x9E, 0xD4, 0x09,
+ 0x20, 0x81, 0x6A, 0xD8, 0x99, 0x49, 0xD0, 0xC0,
+//ascii 0x0078
+ 0xC2, 0x0E, 0xCF, 0x0D, 0xC5, 0x88, 0x3D, 0xCC,
+ 0x08, 0x00, 0xC5, 0x08, 0x10, 0x08, 0xC9, 0x0A,
+ 0x03, 0x10, 0xC5, 0x08, 0x20, 0x01, 0x0A, 0xC5,
+ 0x0E, 0x05, 0x30, 0xC5, 0x0D, 0x03, 0x30, 0x05,
+ 0x0E, 0xC2, 0x0A, 0x01, 0x30, 0x08, 0xC7, 0x0A,
+ 0x01, 0x20, 0x91, 0x8D, 0x30, 0x30, 0x03, 0x0D,
+ 0xCA, 0x08, 0x70, 0x01, 0x0A, 0xCD, 0x0D, 0x05,
+ 0x40, 0x08, 0xD0, 0x0A, 0x01, 0x20, 0x03, 0x0D,
+ 0xCE, 0x0D, 0x03, 0x60, 0x05, 0xCB, 0x0E, 0x05,
+ 0x30, 0x03, 0x08, 0x30, 0x01, 0x0A, 0xC8, 0x08,
+ 0x01, 0x20, 0x01, 0x08, 0xC1, 0x0D, 0x03, 0x30,
+ 0x03, 0x0D, 0xC5, 0x08, 0x30, 0x05, 0x0E, 0xC4,
+ 0x0A, 0x01, 0x30, 0xC5, 0x08, 0x10, 0x01, 0x0A,
+ 0xC7, 0x0E, 0x05, 0x20, 0xC5, 0x88, 0x08, 0xCB,
+ 0x8A, 0x30, 0xC5, 0x0A, 0x0D, 0xCE, 0x08, 0xC0,
+//ascii 0x0079
+ 0xE6, 0x99, 0x38, 0xD0, 0xDB, 0x09, 0x20, 0x03,
+ 0x09, 0xD9, 0x09, 0x40, 0x81, 0x5B, 0xD6, 0x0D,
+ 0x05, 0x60, 0x81, 0x8D, 0xD6, 0x09, 0x05, 0x60,
+ 0x83, 0x8D, 0xD6, 0x89, 0x51, 0x50, 0x03, 0x09,
+ 0xD7, 0x8B, 0x51, 0x40, 0x81, 0x5B, 0xD7, 0x0B,
+ 0x05, 0x50, 0x01, 0x08, 0xD5, 0x09, 0x03, 0x70,
+ 0x03, 0xD0, 0x8D, 0x93, 0x50, 0x01, 0x03, 0x30,
+ 0x05, 0xCC, 0x8D, 0x83, 0x60, 0x05, 0x0B, 0xC1,
+ 0x0D, 0x05, 0x20, 0x0D, 0xC8, 0x8D, 0x83, 0x60,
+ 0x03, 0x09, 0xC6, 0x05, 0x10, 0x09, 0xC6, 0x0B,
+ 0x03, 0x60, 0x83, 0x8D, 0xC8, 0x09, 0x10, 0x08,
+ 0xC6, 0x09, 0x40, 0x81, 0x8D, 0xCB, 0x08, 0x10,
+ 0x08, 0xC6, 0x09, 0x10, 0x81, 0x5B, 0xCF, 0x89,
+ 0x5B, 0xC6, 0x89, 0x59,
+//ascii 0x007A
+ 0xC2, 0x0C, 0x16, 0x0C, 0xCA, 0x02, 0x11, 0xC5,
+ 0x08, 0x20, 0x08, 0xC9, 0x01, 0x10, 0xC5, 0x08,
+ 0x30, 0x04, 0xC8, 0x01, 0x10, 0xC5, 0x08, 0x40,
+ 0x02, 0x0D, 0xC6, 0x01, 0x10, 0xC5, 0x08, 0x10,
+ 0x02, 0x30, 0x0A, 0xC5, 0x01, 0x10, 0xC5, 0x08,
+ 0x10, 0x88, 0xC1, 0x20, 0x06, 0xC4, 0x01, 0x10,
+ 0xC5, 0x08, 0x10, 0x08, 0xC0, 0x0E, 0x02, 0x20,
+ 0x02, 0x0E, 0xC2, 0x01, 0x10, 0xC5, 0x08, 0x10,
+ 0x08, 0xC2, 0x06, 0x20, 0x01, 0x0A, 0xC1, 0x01,
+ 0x10, 0xC5, 0x08, 0x10, 0x08, 0xC3, 0x08, 0x30,
+ 0x06, 0xC0, 0x01, 0x10, 0xC5, 0x08, 0x10, 0x08,
+ 0xC4, 0x0C, 0x01, 0x20, 0x04, 0x20, 0xC5, 0x08,
+ 0x10, 0x08, 0xC6, 0x04, 0x50, 0xC5, 0x08, 0x10,
+ 0x08, 0xC7, 0x06, 0x40, 0xC5, 0x08, 0x10, 0x08,
+ 0xC8, 0x0A, 0x01, 0x20, 0xC5, 0x0A, 0x14, 0x0A,
+ 0xC9, 0x0D, 0x02, 0x10, 0xC0,
+//ascii 0x007B
+ 0xC0, 0x1E, 0xD8, 0x0E, 0xC2, 0x0E, 0x10, 0x06,
+ 0xD6, 0x81, 0x03, 0xC2, 0x10, 0x04, 0xD6, 0x10,
+ 0x04, 0xC2, 0x01, 0x10, 0x09, 0xD4, 0x04, 0x10,
+ 0x06, 0xC2, 0x06, 0x20, 0x01, 0x54, 0x06, 0x0D,
+ 0xC2, 0x0B, 0x06, 0x44, 0x03, 0x30, 0x0B, 0xC2,
+ 0x0E, 0x01, 0x70, 0x20, 0x0B, 0xC0, 0x06, 0x70,
+ 0x20, 0x04, 0xC4, 0x0D, 0x03, 0x70, 0x10, 0x03,
+ 0x0E, 0x70, 0x20, 0x06, 0xC7, 0x0D, 0x0B, 0x49,
+ 0x06, 0x01, 0x10, 0x06, 0x10, 0x04, 0x59, 0x0B,
+ 0xD2, 0x03, 0x20, 0x06, 0xDA, 0x09, 0x20, 0x0E,
+ 0xDA, 0x0B, 0x20, 0xC0,
+//ascii 0x007C
+ 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70,
+ 0x70, 0x70, 0x70, 0x70,
+//ascii 0x007D
+ 0xEC, 0x0A, 0x20, 0xDB, 0x08, 0x20, 0x0D, 0xDA,
+ 0x03, 0x20, 0x06, 0xD1, 0x0C, 0x0A, 0x48, 0x06,
+ 0x20, 0x08, 0x10, 0x03, 0x06, 0x48, 0x0A, 0x0D,
+ 0xC6, 0x0C, 0x03, 0x70, 0x10, 0x03, 0xC0, 0x70,
+ 0x20, 0x06, 0xC4, 0x0D, 0x70, 0x30, 0x0C, 0xC0,
+ 0x08, 0x70, 0x20, 0x03, 0xC3, 0x06, 0x20, 0x03,
+ 0x56, 0x08, 0x0E, 0xC2, 0x0C, 0x08, 0x56, 0x30,
+ 0x0A, 0xC2, 0x20, 0x0A, 0xD4, 0x06, 0x10, 0x06,
+ 0xC2, 0x10, 0x03, 0xD6, 0x10, 0x03, 0xC1, 0x0E,
+ 0x10, 0x08, 0xD6, 0x83, 0x03,
+//ascii 0x007E
+ 0xC0, 0x97, 0x57, 0xE0, 0xC3, 0x03, 0x20, 0x0A,
+ 0xC2, 0x03, 0x30, 0x0D, 0xC1, 0x8E, 0xB3, 0x10,
+ 0x05, 0xC3, 0x0D, 0x10, 0x03, 0xC3, 0x0E, 0x10,
+ 0x03, 0xC3, 0x07, 0x10, 0x07, 0xC2, 0x0A, 0x20,
+ 0x0E, 0xC1, 0x0D, 0x20, 0x0A, 0xC2, 0x03, 0x10,
+ 0x07, 0xC2, 0x0D, 0x10, 0x03, 0xC3, 0x0A, 0x10,
+ 0x07, 0xC3, 0x0B, 0x10, 0x03, 0xC3, 0x0E, 0x20,
+ 0x83, 0x7E, 0xC1, 0x07, 0x30, 0x0B, 0xC2, 0x07,
+ 0x20, 0x0B, 0xC4, 0x8B, 0xAE, 0xC0,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_MEDIUM_32PX[95] = {
+ { 0, 0, 8,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 9,2, 0, 2, 4 }, //asciii 0x0021
+ { 43, 1, 13,2, 0, 2, 20 }, //asciii 0x0022
+ { 63, 1, 20,0, 0, 0, 4 }, //asciii 0x0023
+ { 226, 1, 21,1, 0, 2, 4 }, //asciii 0x0024
+ { 403, 1, 27,2, 0, 3, 4 }, //asciii 0x0025
+ { 611, 1, 21,0, 0, 0, 0 }, //asciii 0x0026
+ { 789, 1, 7,2, 0, 2, 20 }, //asciii 0x0027
+ { 798, 1, 12,0, 0, 0, 0 }, //asciii 0x0028
+ { 867, 1, 12,1, 0, 3, 0 }, //asciii 0x0029
+ { 936, 1, 17,2, 0, 2, 16 }, //asciii 0x002A
+ { 1020, 1, 21,2, 8, 2, 8 }, //asciii 0x002B
+ { 1088, 1, 9,2, 20, 2, 0 }, //asciii 0x002C
+ { 1112, 1, 15,2, 12, 2, 12 }, //asciii 0x002D
+ { 1157, 1, 9,2, 20, 2, 4 }, //asciii 0x002E
+ { 1179, 1, 12,0, 0, 0, 0 }, //asciii 0x002F
+ { 1239, 1, 21,1, 0, 2, 4 }, //asciii 0x0030
+ { 1376, 1, 15,1, 0, 3, 4 }, //asciii 0x0031
+ { 1422, 1, 20,0, 0, 0, 0 }, //asciii 0x0032
+ { 1561, 1, 21,2, 0, 2, 4 }, //asciii 0x0033
+ { 1720, 1, 21,1, 0, 1, 4 }, //asciii 0x0034
+ { 1844, 1, 20,0, 0, 0, 0 }, //asciii 0x0035
+ { 2013, 1, 20,1, 0, 1, 4 }, //asciii 0x0036
+ { 2190, 1, 19,0, 0, 0, 0 }, //asciii 0x0037
+ { 2309, 1, 20,1, 0, 1, 4 }, //asciii 0x0038
+ { 2495, 1, 20,1, 0, 1, 4 }, //asciii 0x0039
+ { 2675, 1, 9,2, 8, 2, 4 }, //asciii 0x003A
+ { 2712, 1, 9,0, 0, 0, 0 }, //asciii 0x003B
+ { 2758, 1, 21,3, 4, 2, 4 }, //asciii 0x003C
+ { 2863, 1, 21,0, 0, 0, 0 }, //asciii 0x003D
+ { 2985, 1, 21,0, 0, 0, 0 }, //asciii 0x003E
+ { 3091, 1, 17,1, 0, 1, 4 }, //asciii 0x003F
+ { 3198, 1, 31,0, 0, 0, 0 }, //asciii 0x0040
+ { 3527, 1, 22,0, 0, 0, 0 }, //asciii 0x0041
+ { 3658, 1, 21,0, 0, 0, 0 }, //asciii 0x0042
+ { 3814, 1, 24,0, 0, 0, 0 }, //asciii 0x0043
+ { 3985, 1, 23,2, 0, 1, 4 }, //asciii 0x0044
+ { 4120, 1, 19,2, 0, 1, 4 }, //asciii 0x0045
+ { 4254, 1, 19,2, 0, 2, 4 }, //asciii 0x0046
+ { 4359, 1, 24,0, 0, 0, 0 }, //asciii 0x0047
+ { 4544, 1, 24,2, 0, 2, 4 }, //asciii 0x0048
+ { 4635, 1, 15,1, 0, 1, 4 }, //asciii 0x0049
+ { 4711, 1, 18,1, 0, 2, 4 }, //asciii 0x004A
+ { 4786, 1, 21,2, 0, 0, 4 }, //asciii 0x004B
+ { 4910, 1, 18,2, 0, 1, 4 }, //asciii 0x004C
+ { 4953, 1, 29,2, 0, 2, 4 }, //asciii 0x004D
+ { 5090, 1, 24,2, 0, 2, 4 }, //asciii 0x004E
+ { 5192, 1, 25,0, 0, 0, 0 }, //asciii 0x004F
+ { 5363, 1, 20,2, 0, 1, 4 }, //asciii 0x0050
+ { 5480, 1, 25,1, 0, 2, 4 }, //asciii 0x0051
+ { 5675, 1, 21,0, 0, 0, 0 }, //asciii 0x0052
+ { 5809, 1, 21,1, 0, 2, 4 }, //asciii 0x0053
+ { 5993, 1, 21,1, 0, 1, 4 }, //asciii 0x0054
+ { 6078, 1, 24,0, 0, 0, 0 }, //asciii 0x0055
+ { 6174, 1, 22,0, 0, 0, 4 }, //asciii 0x0056
+ { 6283, 1, 31,0, 0, 0, 4 }, //asciii 0x0057
+ { 6452, 1, 21,0, 0, 0, 0 }, //asciii 0x0058
+ { 6612, 1, 22,0, 0, 0, 0 }, //asciii 0x0059
+ { 6714, 1, 20,1, 0, 1, 4 }, //asciii 0x005A
+ { 6867, 1, 12,3, 0, 0, 0 }, //asciii 0x005B
+ { 6926, 1, 12,0, 0, 0, 0 }, //asciii 0x005C
+ { 6984, 1, 12,0, 0, 3, 0 }, //asciii 0x005D
+ { 7040, 1, 15,1, 0, 1, 16 }, //asciii 0x005E
+ { 7104, 1, 15,0, 24, 0, 4 }, //asciii 0x005F
+ { 7148, 1, 16,4, 0, 4, 24 }, //asciii 0x0060
+ { 7170, 1, 18,0, 0, 0, 0 }, //asciii 0x0061
+ { 7303, 1, 20,2, 0, 1, 4 }, //asciii 0x0062
+ { 7424, 1, 18,1, 4, 1, 4 }, //asciii 0x0063
+ { 7549, 1, 20,0, 0, 0, 0 }, //asciii 0x0064
+ { 7673, 1, 19,1, 4, 1, 4 }, //asciii 0x0065
+ { 7831, 1, 12,0, 0, 0, 4 }, //asciii 0x0066
+ { 7901, 1, 20,0, 0, 0, 0 }, //asciii 0x0067
+ { 8078, 1, 19,2, 0, 2, 4 }, //asciii 0x0068
+ { 8149, 1, 8,1, 0, 1, 4 }, //asciii 0x0069
+ { 8190, 1, 8,0, 0, 1, 0 }, //asciii 0x006A
+ { 8243, 1, 18,2, 0, 0, 4 }, //asciii 0x006B
+ { 8340, 1, 9,2, 0, 0, 4 }, //asciii 0x006C
+ { 8376, 1, 28,2, 4, 1, 4 }, //asciii 0x006D
+ { 8485, 1, 19,2, 4, 2, 4 }, //asciii 0x006E
+ { 8557, 1, 19,0, 0, 0, 0 }, //asciii 0x006F
+ { 8681, 1, 20,2, 4, 1, 0 }, //asciii 0x0070
+ { 8807, 1, 20,1, 4, 2, 0 }, //asciii 0x0071
+ { 8937, 1, 12,2, 4, 0, 4 }, //asciii 0x0072
+ { 8986, 1, 17,1, 4, 1, 4 }, //asciii 0x0073
+ { 9125, 1, 12,0, 0, 1, 4 }, //asciii 0x0074
+ { 9196, 1, 19,0, 0, 0, 0 }, //asciii 0x0075
+ { 9271, 1, 18,0, 0, 0, 0 }, //asciii 0x0076
+ { 9351, 1, 26,0, 0, 0, 0 }, //asciii 0x0077
+ { 9479, 1, 18,1, 4, 1, 4 }, //asciii 0x0078
+ { 9599, 1, 18,0, 0, 0, 0 }, //asciii 0x0079
+ { 9707, 1, 18,1, 4, 2, 4 }, //asciii 0x007A
+ { 9832, 1, 12,1, 0, 0, 0 }, //asciii 0x007B
+ { 9916, 1, 11,3, 0, 4, 0 }, //asciii 0x007C
+ { 9928, 1, 12,0, 0, 0, 0 }, //asciii 0x007D
+ { 10005, 1, 21,2, 12, 2, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_MEDIUM_32PX= {
+ 10075, // bitmap len
+ BAGL_FONT_INTER_MEDIUM_32px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 40, // height of all characters in pixels
+ 40, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 8, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_MEDIUM_32PX,
+ bitmapINTER_MEDIUM_32PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.json b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.json
new file mode 100644
index 00000000..eab75769
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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DccNIA3CA1ACxwIgDcEKIAEDIAjFChACDcIFEAPBChABxQgQCsMCEA3CBRANxAUQxBABwwgQCsQFEMMKEAXDChAKxAUQDcIFEAjDCBAKxAoQBcIBEA3DAxANxSCFgxABwwgQAsYFYAjCAiAIxwNAA8MDEAPJqCAoxIUF1B3GDRkOyo2WyQkQC8oCEA3ICRALygIQDcgJEAvJCyANxAcyEHIiIALFBnBwMAnFBnBwIAfGCycEEAZ3FwkNywkQC9cJEAvYHv/GC3R0BM0IcHAAzQhwcADNC3YWBAEQJtqYAcDcmAHQ3BAE3AIQ3AEQDdoLIA3ZCwEgzQt0JAIwBM0IcGABDc0IcFACDc4LdCSGi+aYKNDbCCAECtkIUAUK1gwEYIFc1goEYIKN1goEYAQK1woFYNkKBTDYjYIw1Y2CUAHSjYJQgVzQjYJgBArRDAJggo7TCECBjdYIEIFc2YhKxh3dqQFq2glAhJ7WCXCDfNSKc3CBatWKYXAECdWdlhBQ2QkBMNWephBQ0opzYIN8zox0YJFq4NAJYIR81AkwBArYCUCEndYMBGCBataKc2CEfNWephBQAQbXjZRA2IphMNSMc3DQjJRwgWrOjGFwg3zRCWCEntQJIIFq2JlJ0MDCDs8NxYg9zAgAxQgQCMkKAxDFCCABCsUOBTDFDQMwBQ7CCgEwCMcKASCRjTAwAw3KCHABCs0NBUAI0AoBIAMNzg0DYAXLDgUwAwgwAQrICAEgAQjBDQMwAw3FCDAFDsQKATDFCBABCscOBSDFiAjLijDFCg3OCMDmmTjQ2wkgAwnZCUCBW9YNBWCBjdYJBWCDjdaJUVADCdeLUUCBW9cLBVABCNUJA3AD0I2TUAEDMAXMjYNgBQvBDQUgDciNg2ADCcYFEAnGCwNgg43ICRAIxglAgY3LCBAIxgkQgVvPiVvGiVnCDBYMygIRxQggCMkBEMUIMATIARDFCEACDcYBEMUIEAIwCsUBEMUIEIjBIAbEARDFCBAIwA4CIAIOwgEQxQgQCMIGIAEKwQEQxQgQCMMIMAbAARDFCBAIxAwBIAQgxQgQCMYEUMUIEAjHBkDFCBAIyAoBIMUKFArJDQIQwMAe2A7CDhAG1oEDwhAE1hAEwgEQCdQEEAbCBiABVAYNwgsGRAMwC8IOAXAgC8AGcCAExA0DcBADDnAgBscNC0kGARAGEARZC9IDIAbaCSAO2gsgwHBwcHBwcHBwcHBwcOwKINsIIA3aAyAG0QwKSAYgCBADBkgKDcYMA3AQA8BwIAbEDXAwDMAIcCADwwYgA1YIDsIMCFYwCsIgCtQGEAbCEAPWEAPBDhAI1oMDwJdX4MMDIArCAzANwY6zEAXDDRADww4QA8MHEAfCCiAOwQ0gCsIDEAfCDRADwwoQB8MLEAPDDiCDfsEHMAvCByALxIuuwA==",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 43,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 34,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 63,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 35,
+ "bitmap_byte_count": 163
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 226,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 177
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 403,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 208
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 611,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 38,
+ "bitmap_byte_count": 178
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 789,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 39,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 798,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 69
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 867,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 69
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 936,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1020,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 68
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1088,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 20,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1112,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1157,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 20,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1179,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 47,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1239,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 137
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1376,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 49,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1422,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 50,
+ "bitmap_byte_count": 139
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1561,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 159
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1720,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 52,
+ "bitmap_byte_count": 124
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1844,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 53,
+ "bitmap_byte_count": 169
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2013,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 177
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2190,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 55,
+ "bitmap_byte_count": 119
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2309,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 186
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2495,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 180
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2675,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2712,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2758,
+ "width": 21,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 60,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2863,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 61,
+ "bitmap_byte_count": 122
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2985,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 62,
+ "bitmap_byte_count": 106
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3091,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 107
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3198,
+ "width": 31,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 329
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3527,
+ "width": 22,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 65,
+ "bitmap_byte_count": 131
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3658,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 66,
+ "bitmap_byte_count": 156
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3814,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 67,
+ "bitmap_byte_count": 171
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3985,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 68,
+ "bitmap_byte_count": 135
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4120,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 69,
+ "bitmap_byte_count": 134
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4254,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 70,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4359,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 71,
+ "bitmap_byte_count": 185
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4544,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 72,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4635,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 73,
+ "bitmap_byte_count": 76
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4711,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 74,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4786,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 75,
+ "bitmap_byte_count": 124
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4910,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 76,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4953,
+ "width": 29,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 77,
+ "bitmap_byte_count": 137
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5090,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 78,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5192,
+ "width": 25,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 79,
+ "bitmap_byte_count": 171
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5363,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 80,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5480,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 195
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5675,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 82,
+ "bitmap_byte_count": 134
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5809,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 184
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5993,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 84,
+ "bitmap_byte_count": 85
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6078,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 85,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6174,
+ "width": 22,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 86,
+ "bitmap_byte_count": 109
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6283,
+ "width": 31,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 87,
+ "bitmap_byte_count": 169
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6452,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 88,
+ "bitmap_byte_count": 160
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6612,
+ "width": 22,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 89,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6714,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 90,
+ "bitmap_byte_count": 153
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6867,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 59
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6926,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 92,
+ "bitmap_byte_count": 58
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6984,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7040,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 64
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7104,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 24,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7148,
+ "width": 16,
+ "x_min_offset": 4,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 24,
+ "char": 96,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7170,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 97,
+ "bitmap_byte_count": 133
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7303,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 121
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7424,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7549,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 100,
+ "bitmap_byte_count": 124
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7673,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 158
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7831,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 102,
+ "bitmap_byte_count": 70
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7901,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 177
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8078,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 104,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8149,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 105,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8190,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8243,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 107,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8340,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 108,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8376,
+ "width": 28,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 109,
+ "bitmap_byte_count": 109
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8485,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 110,
+ "bitmap_byte_count": 72
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8557,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 111,
+ "bitmap_byte_count": 124
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8681,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 126
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8807,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 130
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8937,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 114,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8986,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 139
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9125,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9196,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 117,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9271,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 118,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9351,
+ "width": 26,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 119,
+ "bitmap_byte_count": 128
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9479,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 120,
+ "bitmap_byte_count": 120
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9599,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 108
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9707,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 122,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9832,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9916,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9928,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 77
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10005,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 70
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.inc
new file mode 100644
index 00000000..8cce69da
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.inc
@@ -0,0 +1,591 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_MEDIUM_32PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x1F, 0x02, 0x33, 0x1F, 0x02, 0x33, 0x1F, 0x02,
+ 0x33,
+//ascii 0x0022
+ 0x18, 0x48, 0x48, 0xF0, 0xD8, 0x48, 0x48, 0x30,
+//ascii 0x0023
+ 0x82, 0xF0, 0x72, 0x62, 0xE2, 0x62, 0x74, 0x32,
+ 0x62, 0x7C, 0x32, 0xAF, 0x02, 0xB2, 0x2C, 0x82,
+ 0x62, 0x24, 0x82, 0x62, 0xE2, 0x62, 0x74, 0x32,
+ 0x62, 0x7C, 0x32, 0xAF, 0x02, 0xB2, 0x2C, 0x82,
+ 0x62, 0x24, 0x82, 0x62, 0xE2, 0x62, 0xF0, 0x72,
+ 0x60,
+//ascii 0x0024
+ 0xF0, 0x43, 0xF0, 0x32, 0x77, 0xF3, 0x69, 0xD4,
+ 0x63, 0x34, 0xB4, 0x63, 0x53, 0xB3, 0x73, 0x63,
+ 0x93, 0x82, 0x73, 0x93, 0x73, 0x73, 0x7F, 0x0D,
+ 0x4F, 0x0D, 0x63, 0x72, 0x83, 0x93, 0x63, 0x83,
+ 0xA3, 0x53, 0x73, 0xB4, 0x33, 0x74, 0xC9, 0x64,
+ 0xE7, 0x73, 0xF0, 0x23, 0x92, 0x10,
+//ascii 0x0025
+ 0xF7, 0x32, 0xB9, 0x23, 0x93, 0x53, 0x24, 0x72,
+ 0x72, 0x43, 0x62, 0x72, 0x54, 0x43, 0x53, 0x64,
+ 0x49, 0x94, 0x37, 0xB4, 0xF0, 0x73, 0xF0, 0x74,
+ 0xB7, 0x43, 0x99, 0x44, 0x63, 0x53, 0x53, 0x52,
+ 0x72, 0x64, 0x32, 0x72, 0x74, 0x23, 0x53, 0x93,
+ 0x29, 0xB2, 0x37, 0x60,
+//ascii 0x0026
+ 0xF0, 0x72, 0xE4, 0x33, 0xEA, 0xE9, 0xF0, 0x44,
+ 0x74, 0x86, 0x47, 0x67, 0x39, 0x34, 0x33, 0x23,
+ 0x34, 0x14, 0x43, 0x13, 0x57, 0x62, 0x13, 0x65,
+ 0x72, 0x13, 0x55, 0x82, 0x23, 0x37, 0x63, 0x29,
+ 0x14, 0x53, 0x37, 0x34, 0x33, 0x63, 0x69, 0xF0,
+ 0x17, 0xF0, 0x35, 0x30,
+//ascii 0x0027
+ 0x18, 0x48, 0x48, 0x70,
+//ascii 0x0028
+ 0x01, 0xF0, 0xC1, 0x33, 0xF0, 0x83, 0x35, 0xF0,
+ 0x45, 0x57, 0xB7, 0x9F, 0x06, 0xDF, 0x02, 0xF0,
+ 0x49, 0x50,
+//ascii 0x0029
+ 0xA9, 0xF0, 0x4F, 0x02, 0xDF, 0x06, 0x97, 0xB7,
+ 0x55, 0xF0, 0x45, 0x33, 0xF0, 0x83, 0x31, 0xF0,
+ 0xC1, 0x30,
+//ascii 0x002A
+ 0x42, 0x42, 0x83, 0x23, 0x92, 0x22, 0xB4, 0xC4,
+ 0x7D, 0x3D, 0x84, 0xC4, 0xB2, 0x22, 0x93, 0x23,
+ 0x82, 0x42, 0x40,
+//ascii 0x002B
+ 0x93, 0xF0, 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xF0,
+ 0x23, 0xF0, 0x23, 0xBF, 0x5F, 0x5F, 0xB3, 0xF0,
+ 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xF0,
+ 0x23, 0x40,
+//ascii 0x002C
+ 0x15, 0x79, 0x39, 0x84, 0x20,
+//ascii 0x002D
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
+ 0x13, 0x13,
+//ascii 0x002E
+ 0x13, 0x13, 0x13, 0x40,
+//ascii 0x002F
+ 0x04, 0xF0, 0x99, 0xF0, 0x8A, 0xF0, 0x7B, 0xF0,
+ 0x7A, 0xF0, 0x89, 0xF0, 0x94, 0x50,
+//ascii 0x0030
+ 0x7B, 0xBF, 0x7F, 0x04, 0x46, 0x96, 0x34, 0xD4,
+ 0x24, 0xF4, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x14, 0xF4,
+ 0x24, 0xD4, 0x36, 0x96, 0x4F, 0x04, 0x7F, 0xBB,
+ 0x60,
+//ascii 0x0031
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08, 0x14, 0xF0,
+ 0x63, 0xF0, 0x73, 0xF0, 0x63, 0xF0, 0x73, 0xF0,
+ 0x72, 0x10,
+//ascii 0x0032
+ 0xF0, 0x63, 0x56, 0xA3, 0x3A, 0x83, 0x2C, 0x73,
+ 0x23, 0x64, 0x63, 0x13, 0x84, 0x53, 0x13, 0x94,
+ 0x43, 0x13, 0xA4, 0x33, 0x13, 0xB4, 0x23, 0x13,
+ 0xC4, 0x13, 0x13, 0xD7, 0x23, 0xD6, 0x26, 0xB5,
+ 0x35, 0xC4, 0x53, 0xD3,
+//ascii 0x0033
+ 0xF5, 0x94, 0x58, 0x58, 0x2A, 0x3A, 0x13, 0x34,
+ 0x33, 0x46, 0x54, 0x13, 0x64, 0x73, 0x13, 0x73,
+ 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73, 0x13,
+ 0x73, 0x73, 0x13, 0xF0, 0x23, 0x23, 0xF4, 0x25,
+ 0xD3, 0x44, 0xB5, 0x53, 0xB4, 0xF0, 0x52, 0x40,
+//ascii 0x0034
+ 0xF0, 0x13, 0xF0, 0x63, 0xF0, 0x63, 0x6F, 0x08,
+ 0x1F, 0x08, 0x1F, 0x08, 0x15, 0xA3, 0x85, 0x83,
+ 0xA4, 0x73, 0xB5, 0x53, 0xD4, 0x43, 0xF4, 0x23,
+ 0xF0, 0x18, 0xF0, 0x36, 0xF0, 0x45, 0xF0, 0x63,
+ 0x50,
+//ascii 0x0035
+ 0xE5, 0xF0, 0x29, 0x43, 0x7B, 0x33, 0x64, 0x54,
+ 0x23, 0x54, 0x73, 0x23, 0x53, 0x93, 0x13, 0x52,
+ 0xA3, 0x13, 0x52, 0xB2, 0x13, 0x52, 0xB2, 0x13,
+ 0x52, 0xB2, 0x13, 0x62, 0x93, 0x17, 0x22, 0x93,
+ 0x1C, 0x73, 0x59, 0x55, 0x95, 0x54, 0xF0, 0x52,
+ 0x40,
+//ascii 0x0036
+ 0xE5, 0x93, 0x59, 0x64, 0x4B, 0x45, 0x35, 0x35,
+ 0x33, 0x53, 0x73, 0x23, 0x54, 0x74, 0x13, 0x53,
+ 0x93, 0x13, 0x53, 0x93, 0x13, 0x53, 0x93, 0x13,
+ 0x62, 0x93, 0x13, 0x63, 0x74, 0x23, 0x62, 0x73,
+ 0x36, 0x43, 0x35, 0x4F, 0x04, 0x7F, 0x01, 0xAC,
+ 0x50,
+//ascii 0x0037
+ 0x14, 0xF0, 0x56, 0xF0, 0x38, 0xF0, 0x13, 0x16,
+ 0xE3, 0x36, 0xC3, 0x56, 0xA3, 0x76, 0x83, 0x96,
+ 0x63, 0xB6, 0x43, 0xD6, 0x23, 0xF5, 0x13, 0xF0,
+ 0x23, 0x13, 0xF0, 0x41, 0x13, 0xF0, 0x63, 0x40,
+//ascii 0x0038
+ 0xE6, 0x85, 0x49, 0x57, 0x2B, 0x39, 0x13, 0x44,
+ 0x33, 0x45, 0x64, 0x13, 0x63, 0x83, 0x13, 0x63,
+ 0x83, 0x13, 0x63, 0x83, 0x13, 0x63, 0x83, 0x13,
+ 0x63, 0x83, 0x23, 0x45, 0x64, 0x29, 0x13, 0x44,
+ 0x47, 0x2B, 0x55, 0x49, 0xF0, 0x16, 0x40,
+//ascii 0x0039
+ 0x6C, 0xAF, 0x01, 0x7F, 0x04, 0x45, 0x33, 0x46,
+ 0x33, 0x72, 0x63, 0x24, 0x73, 0x63, 0x13, 0x92,
+ 0x63, 0x13, 0x93, 0x53, 0x13, 0x93, 0x53, 0x13,
+ 0x93, 0x53, 0x14, 0x74, 0x53, 0x23, 0x73, 0x53,
+ 0x35, 0x35, 0x35, 0x4B, 0x44, 0x69, 0x53, 0x95,
+ 0x50,
+//ascii 0x003A
+ 0x03, 0xA6, 0xA6, 0xA3,
+//ascii 0x003B
+ 0x03, 0xA5, 0x63, 0xA9, 0x23, 0xA9, 0xF0, 0x54,
+ 0x20,
+//ascii 0x003C
+ 0x13, 0xA3, 0x43, 0xA3, 0x53, 0x83, 0x63, 0x83,
+ 0x73, 0x63, 0x83, 0x63, 0x93, 0x43, 0xA3, 0x43,
+ 0xB3, 0x23, 0xC3, 0x23, 0xD6, 0xE6, 0xF4, 0xF0,
+ 0x14, 0x10,
+//ascii 0x003D
+ 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
+ 0x33, 0x33, 0x33, 0x33, 0x10,
+//ascii 0x003E
+ 0x74, 0xF0, 0x14, 0xF6, 0xE6, 0xD3, 0x23, 0xC3,
+ 0x23, 0xB3, 0x43, 0xA3, 0x43, 0x93, 0x63, 0x83,
+ 0x63, 0x73, 0x83, 0x63, 0x83, 0x53, 0xA3, 0x43,
+ 0xA3, 0x30,
+//ascii 0x003F
+ 0x55, 0xF0, 0x29, 0xEA, 0xE3, 0x53, 0xC3, 0x73,
+ 0xB3, 0x77, 0x33, 0x13, 0x86, 0x33, 0x13, 0x95,
+ 0x33, 0x13, 0xF0, 0x73, 0xF0, 0x65, 0xF0, 0x54,
+ 0xF0, 0x72, 0x10,
+//ascii 0x0040
+ 0xBA, 0xF0, 0x5D, 0xF0, 0x25, 0x83, 0xF4, 0xB2,
+ 0xE4, 0xC2, 0xD3, 0xE2, 0xD2, 0xE3, 0x42, 0x63,
+ 0x3E, 0x42, 0x62, 0x4D, 0x52, 0x53, 0x52, 0x82,
+ 0x53, 0x42, 0x53, 0x83, 0x52, 0x42, 0x52, 0xA2,
+ 0x52, 0x42, 0x52, 0xA2, 0x52, 0x42, 0x52, 0xA2,
+ 0x52, 0x42, 0x52, 0xA2, 0x52, 0x43, 0x43, 0x83,
+ 0x43, 0x52, 0x54, 0x44, 0x52, 0x63, 0x5A, 0x53,
+ 0x72, 0x76, 0x72, 0x83, 0xF0, 0x33, 0x94, 0xE4,
+ 0xB4, 0xC4, 0xD5, 0x85, 0xF0, 0x1E, 0xF0, 0x5A,
+ 0x30,
+//ascii 0x0041
+ 0xF0, 0x72, 0xF0, 0x45, 0xF0, 0x27, 0xE8, 0xD8,
+ 0xE9, 0xC7, 0x23, 0x98, 0x43, 0x77, 0x73, 0x74,
+ 0xA3, 0x77, 0x73, 0x97, 0x53, 0xC7, 0x23, 0xEA,
+ 0xF0, 0x28, 0xF0, 0x48, 0xF0, 0x47, 0xF0, 0x45,
+ 0xF0, 0x72,
+//ascii 0x0042
+ 0xF6, 0x85, 0x48, 0x67, 0x2A, 0x3A, 0x13, 0x34,
+ 0x34, 0x36, 0x54, 0x14, 0x54, 0x73, 0x13, 0x73,
+ 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73, 0x13,
+ 0x73, 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73,
+ 0x13, 0x73, 0x73, 0x1F, 0x08, 0x1F, 0x08, 0x1F,
+ 0x08,
+//ascii 0x0043
+ 0x62, 0x92, 0x94, 0x94, 0x65, 0x95, 0x53, 0xD3,
+ 0x43, 0xF3, 0x33, 0xF4, 0x13, 0xF0, 0x23, 0x13,
+ 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x13, 0xF0, 0x23, 0x23, 0xF4, 0x23, 0xF3, 0x43,
+ 0xD3, 0x55, 0x95, 0x6F, 0x02, 0x9D, 0xD9, 0x70,
+//ascii 0x0044
+ 0xA5, 0xF0, 0x1B, 0xCE, 0x86, 0x56, 0x64, 0xB4,
+ 0x53, 0xD3, 0x43, 0xF3, 0x33, 0xF3, 0x23, 0xF0,
+ 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13,
+ 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x13, 0xF0, 0x23, 0x1F, 0x08, 0x1F, 0x08, 0x1F,
+ 0x08,
+//ascii 0x0045
+ 0xF0, 0x63, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73,
+ 0x13, 0x73, 0x73, 0x13, 0x73, 0x73, 0x13, 0x73,
+ 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73, 0x13,
+ 0x73, 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73,
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08,
+//ascii 0x0046
+ 0x13, 0xF0, 0x63, 0x73, 0xB3, 0x73, 0xB3, 0x73,
+ 0xB3, 0x73, 0xB3, 0x73, 0xB3, 0x73, 0xB3, 0x73,
+ 0xB3, 0x73, 0xB3, 0x73, 0xBF, 0x08, 0x1F, 0x08,
+ 0x1F, 0x08,
+//ascii 0x0047
+ 0xC5, 0xD2, 0x47, 0x94, 0x49, 0x65, 0x43, 0x24,
+ 0x63, 0x63, 0x43, 0x43, 0x73, 0x53, 0x33, 0x73,
+ 0x53, 0x23, 0x83, 0x63, 0x13, 0x83, 0x63, 0x13,
+ 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x23, 0xF3, 0x33, 0xF3, 0x43, 0xD3, 0x55, 0x94,
+ 0x7F, 0x02, 0x9D, 0xD9, 0x70,
+//ascii 0x0048
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08, 0xB3, 0xF0,
+ 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0,
+ 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0,
+ 0x63, 0xF0, 0x63, 0xBF, 0x08, 0x1F, 0x08, 0x1F,
+ 0x08,
+//ascii 0x0049
+ 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0,
+ 0x23, 0x13, 0xF0, 0x23, 0x1F, 0x08, 0x1F, 0x08,
+ 0x1F, 0x08, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+//ascii 0x004A
+ 0x1F, 0x05, 0x4F, 0x06, 0x3F, 0x07, 0xF0, 0x63,
+ 0xF0, 0x73, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x63, 0xF0, 0x53, 0xF0, 0x45, 0xF0, 0x44,
+ 0xF0, 0x52, 0x40,
+//ascii 0x004B
+ 0x12, 0xF0, 0x51, 0x13, 0xF0, 0x32, 0x14, 0xF0,
+ 0x13, 0x24, 0xE4, 0x34, 0xB5, 0x54, 0x95, 0x74,
+ 0x65, 0xA4, 0x45, 0xC4, 0x24, 0xF8, 0xF0, 0x26,
+ 0xF0, 0x44, 0xF0, 0x64, 0xAF, 0x08, 0x1F, 0x08,
+ 0x1F, 0x08,
+//ascii 0x004C
+ 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x63, 0xF0, 0x63, 0x1F, 0x08, 0x1F, 0x08,
+ 0x1F, 0x08,
+//ascii 0x004D
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08, 0x36, 0xF0,
+ 0x57, 0xF0, 0x56, 0xF0, 0x57, 0xF0, 0x47, 0xF0,
+ 0x57, 0xF0, 0x47, 0xF0, 0x54, 0xF0, 0x27, 0xF7,
+ 0xE7, 0xF7, 0xF6, 0xF7, 0xF6, 0xF0, 0x1F, 0x08,
+ 0x1F, 0x08, 0x1F, 0x08,
+//ascii 0x004E
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08, 0xF0, 0x45,
+ 0xF0, 0x34, 0xF0, 0x35, 0xF0, 0x34, 0xF0, 0x35,
+ 0xF0, 0x34, 0xF0, 0x35, 0xF0, 0x34, 0xF0, 0x35,
+ 0xF0, 0x34, 0xF0, 0x35, 0xF0, 0x34, 0xF0, 0x35,
+ 0xF0, 0x4F, 0x08, 0x1F, 0x08, 0x1F, 0x08,
+//ascii 0x004F
+ 0x89, 0xDD, 0x9F, 0x02, 0x65, 0x94, 0x63, 0xD3,
+ 0x43, 0xF3, 0x33, 0xF3, 0x23, 0xF0, 0x23, 0x13,
+ 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23,
+ 0x13, 0xF0, 0x23, 0x13, 0xF0, 0x23, 0x23, 0xF3,
+ 0x33, 0xF3, 0x43, 0xD3, 0x55, 0x94, 0x7F, 0x02,
+ 0x9D, 0xD9, 0x70,
+//ascii 0x0050
+ 0x66, 0xF0, 0x19, 0xEB, 0xC4, 0x54, 0xB3, 0x73,
+ 0xA3, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93,
+ 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x9F, 0x08,
+ 0x1F, 0x08, 0x1F, 0x08,
+//ascii 0x0051
+ 0x89, 0xF0, 0x2D, 0x52, 0x6F, 0x02, 0x23, 0x55,
+ 0x94, 0x14, 0x53, 0xD5, 0x63, 0xF3, 0x73, 0xE4,
+ 0x63, 0xE6, 0x53, 0xD3, 0x13, 0x53, 0xD2, 0x23,
+ 0x53, 0xD1, 0x33, 0x53, 0xF0, 0x23, 0x53, 0xF0,
+ 0x23, 0x63, 0xF3, 0x73, 0xF3, 0x83, 0xD3, 0x95,
+ 0x94, 0xBF, 0x02, 0xDD, 0xF0, 0x29, 0x30,
+//ascii 0x0052
+ 0x64, 0xD1, 0x48, 0x93, 0x3A, 0x74, 0x24, 0x44,
+ 0x46, 0x23, 0x63, 0x26, 0x33, 0x88, 0x53, 0x86,
+ 0x73, 0x84, 0x93, 0x83, 0xA3, 0x83, 0xA3, 0x83,
+ 0xA3, 0x83, 0xA3, 0x83, 0xAF, 0x08, 0x1F, 0x08,
+ 0x1F, 0x08,
+//ascii 0x0053
+ 0xF0, 0x13, 0xA2, 0x77, 0x73, 0x69, 0x54, 0x63,
+ 0x34, 0x34, 0x63, 0x53, 0x33, 0x73, 0x63, 0x13,
+ 0x82, 0x73, 0x13, 0x73, 0x73, 0x13, 0x73, 0x73,
+ 0x13, 0x73, 0x73, 0x13, 0x72, 0x83, 0x13, 0x63,
+ 0x83, 0x23, 0x53, 0x73, 0x34, 0x33, 0x74, 0x49,
+ 0x64, 0x67, 0x73, 0x93, 0x92, 0x40,
+//ascii 0x0054
+ 0x13, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0,
+ 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x6F, 0x08,
+ 0x1F, 0x08, 0x1F, 0x08, 0x13, 0xF0, 0x63, 0xF0,
+ 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0,
+ 0x63, 0x40,
+//ascii 0x0055
+ 0x1F, 0x04, 0x5F, 0x06, 0x3F, 0x07, 0xF0, 0x54,
+ 0xF0, 0x64, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x54, 0xF0, 0x44, 0x2F, 0x07, 0x2F, 0x06,
+ 0x3F, 0x04, 0x40,
+//ascii 0x0056
+ 0x12, 0xF0, 0x74, 0xF0, 0x57, 0xF0, 0x48, 0xF0,
+ 0x47, 0xF0, 0x57, 0xF0, 0x48, 0xF0, 0x48, 0xF0,
+ 0x47, 0xF0, 0x54, 0xF0, 0x27, 0xE8, 0xD8, 0xE7,
+ 0xE7, 0xE8, 0xE7, 0xF0, 0x24, 0xF0, 0x52, 0x50,
+//ascii 0x0057
+ 0x14, 0xF0, 0x57, 0xF0, 0x2B, 0xF0, 0x2B, 0xF0,
+ 0x2A, 0xF0, 0x39, 0xF0, 0x47, 0xF0, 0x45, 0xF0,
+ 0x27, 0xCA, 0xAB, 0x9A, 0xB9, 0xF5, 0xF0, 0x49,
+ 0xF0, 0x3A, 0xF0, 0x3B, 0xF0, 0x2A, 0xF0, 0x47,
+ 0xF0, 0x45, 0xF0, 0x27, 0xD9, 0xBA, 0xAB, 0x9B,
+ 0xD7, 0xF0, 0x24, 0x30,
+//ascii 0x0058
+ 0x12, 0xF0, 0x51, 0x13, 0xF0, 0x23, 0x15, 0xE4,
+ 0x25, 0xB6, 0x45, 0x85, 0x75, 0x55, 0xB5, 0x25,
+ 0xD9, 0xF0, 0x26, 0xF0, 0x36, 0xF0, 0x19, 0xE5,
+ 0x25, 0xA5, 0x55, 0x85, 0x85, 0x45, 0xB6, 0x15,
+ 0xE4, 0x13, 0xF0, 0x23, 0x12, 0xF0, 0x51,
+//ascii 0x0059
+ 0x11, 0xF0, 0x83, 0xF0, 0x65, 0xF0, 0x56, 0xF0,
+ 0x55, 0xF0, 0x65, 0xF0, 0x56, 0xF0, 0x56, 0xF0,
+ 0x5D, 0xCC, 0xBD, 0x96, 0xF0, 0x16, 0xF0, 0x25,
+ 0xF0, 0x25, 0xF0, 0x26, 0xF0, 0x25, 0xF0, 0x43,
+ 0xF0, 0x61, 0x60,
+//ascii 0x005A
+ 0xF0, 0x63, 0x14, 0xF0, 0x13, 0x15, 0xF3, 0x17,
+ 0xD3, 0x13, 0x14, 0xC3, 0x13, 0x25, 0xA3, 0x13,
+ 0x44, 0x93, 0x13, 0x55, 0x73, 0x13, 0x74, 0x63,
+ 0x13, 0x85, 0x43, 0x13, 0xA4, 0x33, 0x13, 0xB5,
+ 0x13, 0x13, 0xD7, 0x13, 0xE6, 0x13, 0xF0, 0x14,
+ 0x13, 0xF0, 0x23,
+//ascii 0x005B
+ 0x03, 0xF0, 0x83, 0x33, 0xF0, 0x83, 0x33, 0xF0,
+ 0x83, 0x33, 0xF0, 0x83, 0x3F, 0x0E, 0x3F, 0x0E,
+ 0x3F, 0x0E, 0x30,
+//ascii 0x005C
+ 0xF0, 0x84, 0xF0, 0x49, 0xEA, 0xDB, 0xDA, 0xE9,
+ 0xF0, 0x44, 0x40,
+//ascii 0x005D
+ 0x0F, 0x0E, 0x3F, 0x0E, 0x3F, 0x0E, 0x33, 0xF0,
+ 0x83, 0x33, 0xF0, 0x83, 0x33, 0xF0, 0x83, 0x33,
+ 0xF0, 0x83, 0x30,
+//ascii 0x005E
+ 0xB1, 0x93, 0x75, 0x55, 0x55, 0x64, 0x83, 0x94,
+ 0x95, 0x95, 0x95, 0x93, 0xB1, 0x40,
+//ascii 0x005F
+ 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x60,
+//ascii 0x0060
+ 0x53, 0x35, 0x33, 0x20,
+//ascii 0x0061
+ 0x6E, 0x4F, 0x01, 0x4F, 0x01, 0x33, 0x32, 0x53,
+ 0x42, 0x52, 0x53, 0x32, 0x52, 0x62, 0x32, 0x52,
+ 0x62, 0x32, 0x52, 0x62, 0x32, 0x53, 0x52, 0x33,
+ 0x52, 0x52, 0x43, 0x43, 0x33, 0x43, 0x49, 0x52,
+ 0x57, 0xE5, 0x20,
+//ascii 0x0062
+ 0xC7, 0xFB, 0xCD, 0xA5, 0x55, 0x84, 0x94, 0x73,
+ 0xB3, 0x72, 0xD2, 0x72, 0xD2, 0x72, 0xD2, 0x72,
+ 0xD2, 0x82, 0xB3, 0x83, 0x93, 0xA4, 0x54, 0x3F,
+ 0x08, 0x1F, 0x08, 0x1F, 0x08,
+//ascii 0x0063
+ 0x52, 0x92, 0x63, 0x93, 0x53, 0x93, 0x43, 0xB3,
+ 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+ 0x33, 0xB3, 0x43, 0x93, 0x5F, 0x6D, 0x99,
+//ascii 0x0064
+ 0x1F, 0x08, 0x1F, 0x08, 0x1F, 0x08, 0x94, 0x54,
+ 0xA3, 0x93, 0x92, 0xB3, 0x72, 0xD2, 0x72, 0xD2,
+ 0x72, 0xD2, 0x72, 0xD2, 0x73, 0xB3, 0x74, 0x94,
+ 0x85, 0x55, 0xAD, 0xCB, 0xF7, 0x50,
+//ascii 0x0065
+ 0x84, 0x32, 0x96, 0x33, 0x77, 0x34, 0x54, 0x22,
+ 0x52, 0x52, 0x42, 0x62, 0x32, 0x52, 0x62, 0x32,
+ 0x52, 0x62, 0x32, 0x52, 0x62, 0x32, 0x52, 0x62,
+ 0x32, 0x52, 0x62, 0x42, 0x42, 0x52, 0x54, 0x22,
+ 0x34, 0x6D, 0x8B, 0xB7, 0x10,
+//ascii 0x0066
+ 0x03, 0x42, 0xF3, 0x42, 0xF3, 0x42, 0xF4, 0x32,
+ 0xF0, 0x1F, 0x08, 0x1F, 0x08, 0x3F, 0x06, 0x72,
+ 0xF0, 0x72, 0x70,
+//ascii 0x0067
+ 0x3F, 0x05, 0x8F, 0x06, 0x7F, 0x07, 0x84, 0x54,
+ 0x44, 0x63, 0x93, 0x43, 0x62, 0xB3, 0x42, 0x52,
+ 0xD2, 0x42, 0x52, 0xD2, 0x42, 0x52, 0xD2, 0x42,
+ 0x52, 0xD2, 0x42, 0x53, 0xB3, 0x42, 0x54, 0x94,
+ 0x33, 0x65, 0x55, 0x34, 0x7D, 0x43, 0x9B, 0x52,
+ 0xC7, 0x50,
+//ascii 0x0068
+ 0xAE, 0x9F, 0x8F, 0x01, 0x74, 0xF0, 0x53, 0xF0,
+ 0x62, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x82, 0xF0,
+ 0x72, 0xF0, 0x83, 0xDF, 0x08, 0x1F, 0x08, 0x1F,
+ 0x08,
+//ascii 0x0069
+ 0x13, 0x3F, 0x02, 0x13, 0x3F, 0x02, 0x13, 0x3F,
+ 0x02,
+//ascii 0x006A
+ 0x13, 0x3F, 0x06, 0x53, 0x3F, 0x07, 0x43, 0x3F,
+ 0x08, 0xF0, 0xE3, 0xF0, 0xE3, 0x20,
+//ascii 0x006B
+ 0x71, 0xF1, 0x72, 0xD2, 0x73, 0xB3, 0x74, 0x94,
+ 0x84, 0x65, 0xA4, 0x45, 0xC4, 0x15, 0xF8, 0xF0,
+ 0x25, 0xF0, 0x53, 0xF0, 0x73, 0x8F, 0x08, 0x1F,
+ 0x08, 0x1F, 0x08,
+//ascii 0x006C
+ 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x63, 0x1F, 0x08,
+ 0x1F, 0x08, 0x1F, 0x07, 0x10,
+//ascii 0x006D
+ 0x6E, 0x5F, 0x4F, 0x01, 0x34, 0xF0, 0x13, 0xF0,
+ 0x22, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x42, 0xF0,
+ 0x42, 0xF0, 0x4E, 0x5F, 0x4F, 0x01, 0x34, 0xF0,
+ 0x13, 0xF0, 0x22, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x42, 0xF0, 0x42, 0xF0, 0x1F, 0x02, 0x3F, 0x02,
+ 0x3F, 0x02, 0x40,
+//ascii 0x006E
+ 0x6E, 0x4F, 0x01, 0x4F, 0x01, 0x34, 0xF0, 0x13,
+ 0xF0, 0x22, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x33,
+ 0xF0, 0x32, 0xF0, 0x43, 0xFF, 0x02, 0x3F, 0x02,
+ 0x3F, 0x02,
+//ascii 0x006F
+ 0x87, 0xBB, 0x8D, 0x65, 0x55, 0x53, 0x93, 0x43,
+ 0xB3, 0x33, 0xB3, 0x33, 0xB3, 0x33, 0xB3, 0x33,
+ 0xB3, 0x33, 0xB3, 0x43, 0x93, 0x55, 0x55, 0x6D,
+ 0x8B, 0xB7, 0x50,
+//ascii 0x0070
+ 0x87, 0xF0, 0x4B, 0xF0, 0x1D, 0xE5, 0x55, 0xC4,
+ 0x93, 0xC3, 0xB3, 0xB2, 0xD2, 0xB2, 0xD2, 0xB2,
+ 0xD2, 0xB2, 0xD2, 0xB3, 0xB2, 0xD3, 0x93, 0xE4,
+ 0x54, 0xDF, 0x08, 0x5F, 0x08, 0x5F, 0x08, 0x20,
+//ascii 0x0071
+ 0x3F, 0x08, 0x5F, 0x08, 0x5F, 0x08, 0x74, 0x54,
+ 0xE3, 0x93, 0xC3, 0xB2, 0xC2, 0xD2, 0xB2, 0xD2,
+ 0xB2, 0xD2, 0xB2, 0xD2, 0xB3, 0xB3, 0xB4, 0x93,
+ 0xD5, 0x55, 0xED, 0xF0, 0x1B, 0xF0, 0x47, 0x50,
+//ascii 0x0072
+ 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x42, 0xF0, 0x42, 0xF0, 0x1F, 0x02, 0x3F, 0x02,
+ 0x3F, 0x02, 0x40,
+//ascii 0x0073
+ 0xD4, 0x82, 0x57, 0x53, 0x48, 0x44, 0x43, 0x33,
+ 0x33, 0x43, 0x52, 0x32, 0x53, 0x52, 0x32, 0x52,
+ 0x62, 0x32, 0x43, 0x62, 0x32, 0x43, 0x62, 0x33,
+ 0x23, 0x63, 0x47, 0x53, 0x56, 0x63, 0x73, 0x72,
+ 0x60,
+//ascii 0x0074
+ 0x72, 0xC3, 0x72, 0xC3, 0x72, 0xC3, 0x3F, 0x06,
+ 0x3F, 0x05, 0x4F, 0x04, 0x92, 0xF0, 0x72, 0xF0,
+ 0x72, 0x70,
+//ascii 0x0075
+ 0x3F, 0x02, 0x3F, 0x02, 0x3F, 0x02, 0xF3, 0xF0,
+ 0x42, 0xF0, 0x33, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x23, 0xF0, 0x14, 0x3F, 0x01, 0x4F,
+ 0x01, 0x4E, 0x30,
+//ascii 0x0076
+ 0x32, 0xF0, 0x35, 0xF7, 0xF0, 0x17, 0xF8, 0xF7,
+ 0xF0, 0x16, 0xF0, 0x14, 0xE6, 0xB7, 0xA8, 0xA7,
+ 0xA7, 0xD5, 0xF2, 0x30,
+//ascii 0x0077
+ 0x32, 0xF0, 0x35, 0xF8, 0xF8, 0xF9, 0xF7, 0xF0,
+ 0x14, 0xD7, 0x98, 0x98, 0x97, 0xD4, 0xF0, 0x17,
+ 0xF0, 0x18, 0xF8, 0xF0, 0x17, 0xF0, 0x14, 0xD7,
+ 0x99, 0x88, 0x98, 0xC5, 0xF2, 0x30,
+//ascii 0x0078
+ 0x31, 0xE2, 0x33, 0xA4, 0x35, 0x66, 0x46, 0x26,
+ 0x8A, 0xC6, 0xF4, 0xF6, 0xCA, 0x86, 0x26, 0x55,
+ 0x66, 0x33, 0xA4, 0x31, 0xE2, 0x40,
+//ascii 0x0079
+ 0x31, 0xF0, 0xC4, 0xF0, 0x97, 0xF0, 0x88, 0xF0,
+ 0x87, 0xF0, 0x97, 0xF0, 0x97, 0xF0, 0x87, 0xF0,
+ 0x4B, 0xE7, 0x35, 0xA7, 0x83, 0x78, 0xB2, 0x57,
+ 0xE2, 0x54, 0xF0, 0x22, 0x51, 0x40,
+//ascii 0x007A
+ 0x33, 0xB3, 0x34, 0xA3, 0x35, 0x93, 0x37, 0x73,
+ 0x33, 0x14, 0x63, 0x33, 0x24, 0x53, 0x33, 0x43,
+ 0x43, 0x33, 0x54, 0x23, 0x33, 0x64, 0x13, 0x33,
+ 0x77, 0x33, 0x95, 0x33, 0xA4, 0x33, 0xB3, 0x40,
+//ascii 0x007B
+ 0x12, 0xF0, 0x82, 0x12, 0xF0, 0x82, 0x12, 0xF0,
+ 0x82, 0x1C, 0x4B, 0x2C, 0x1C, 0x5A, 0x1A, 0xF0,
+ 0x13, 0xF0, 0xA3, 0xF0, 0xA3,
+//ascii 0x007C
+ 0x2F, 0x0F, 0x02, 0x4F, 0x0F, 0x02, 0x20,
+//ascii 0x007D
+ 0xD3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x1A, 0x1A,
+ 0x5C, 0x1C, 0x2C, 0x4B, 0x12, 0xF0, 0x82, 0x12,
+ 0xF0, 0x82, 0x12, 0xF0, 0x82, 0x40,
+//ascii 0x007E
+ 0x44, 0x85, 0xA3, 0xA2, 0xA2, 0x93, 0x83, 0x83,
+ 0x83, 0x83, 0x92, 0xA2, 0xA3, 0xA5, 0x84, 0x70,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_MEDIUM_32PX_1BPP[95] = {
+ { 0, 0, 9,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 9,3, 4, 3, 8 }, //asciii 0x0021
+ { 9, 1, 13,2, 4, 3, 20 }, //asciii 0x0022
+ { 17, 1, 20,1, 4, 1, 8 }, //asciii 0x0023
+ { 58, 1, 20,2, 0, 1, 4 }, //asciii 0x0024
+ { 104, 1, 25,3, 4, 3, 8 }, //asciii 0x0025
+ { 148, 1, 20,1, 4, 1, 8 }, //asciii 0x0026
+ { 192, 1, 7,2, 4, 2, 20 }, //asciii 0x0027
+ { 196, 1, 11,3, 4, 1, 0 }, //asciii 0x0028
+ { 214, 1, 11,1, 4, 3, 0 }, //asciii 0x0029
+ { 232, 1, 16,2, 4, 2, 16 }, //asciii 0x002A
+ { 251, 1, 20,3, 8, 2, 8 }, //asciii 0x002B
+ { 277, 1, 9,2, 24, 3, 0 }, //asciii 0x002C
+ { 282, 1, 14,2, 16, 2, 16 }, //asciii 0x002D
+ { 292, 1, 9,3, 24, 3, 8 }, //asciii 0x002E
+ { 296, 1, 9,1, 4, 1, 4 }, //asciii 0x002F
+ { 310, 1, 20,2, 4, 2, 8 }, //asciii 0x0030
+ { 343, 1, 14,2, 4, 3, 8 }, //asciii 0x0031
+ { 361, 1, 19,2, 4, 2, 8 }, //asciii 0x0032
+ { 397, 1, 20,2, 4, 2, 8 }, //asciii 0x0033
+ { 437, 1, 20,2, 4, 2, 8 }, //asciii 0x0034
+ { 470, 1, 20,2, 4, 2, 8 }, //asciii 0x0035
+ { 511, 1, 20,2, 4, 2, 8 }, //asciii 0x0036
+ { 552, 1, 18,1, 4, 2, 8 }, //asciii 0x0037
+ { 584, 1, 19,2, 4, 2, 8 }, //asciii 0x0038
+ { 623, 1, 20,2, 4, 2, 8 }, //asciii 0x0039
+ { 664, 1, 9,3, 12, 3, 8 }, //asciii 0x003A
+ { 668, 1, 9,2, 12, 3, 0 }, //asciii 0x003B
+ { 677, 1, 20,3, 12, 3, 4 }, //asciii 0x003C
+ { 703, 1, 20,3, 12, 3, 12 }, //asciii 0x003D
+ { 732, 1, 20,3, 12, 3, 4 }, //asciii 0x003E
+ { 758, 1, 16,1, 4, 2, 8 }, //asciii 0x003F
+ { 785, 1, 29,2, 4, 2, 0 }, //asciii 0x0040
+ { 858, 1, 21,1, 4, 1, 8 }, //asciii 0x0041
+ { 892, 1, 21,3, 4, 2, 8 }, //asciii 0x0042
+ { 933, 1, 23,2, 4, 3, 8 }, //asciii 0x0043
+ { 973, 1, 23,3, 4, 2, 8 }, //asciii 0x0044
+ { 1014, 1, 19,3, 4, 2, 8 }, //asciii 0x0045
+ { 1052, 1, 18,3, 4, 2, 8 }, //asciii 0x0046
+ { 1078, 1, 23,2, 4, 2, 8 }, //asciii 0x0047
+ { 1123, 1, 23,3, 4, 3, 8 }, //asciii 0x0048
+ { 1156, 1, 15,2, 4, 2, 8 }, //asciii 0x0049
+ { 1186, 1, 17,1, 4, 3, 8 }, //asciii 0x004A
+ { 1213, 1, 20,3, 4, 1, 8 }, //asciii 0x004B
+ { 1247, 1, 17,3, 4, 1, 8 }, //asciii 0x004C
+ { 1273, 1, 27,3, 4, 3, 8 }, //asciii 0x004D
+ { 1309, 1, 23,2, 4, 2, 8 }, //asciii 0x004E
+ { 1348, 1, 24,2, 4, 2, 8 }, //asciii 0x004F
+ { 1391, 1, 20,3, 4, 2, 8 }, //asciii 0x0050
+ { 1419, 1, 24,2, 4, 2, 4 }, //asciii 0x0051
+ { 1466, 1, 20,3, 4, 1, 8 }, //asciii 0x0052
+ { 1500, 1, 20,2, 4, 1, 8 }, //asciii 0x0053
+ { 1546, 1, 20,1, 4, 2, 8 }, //asciii 0x0054
+ { 1580, 1, 23,3, 4, 3, 8 }, //asciii 0x0055
+ { 1615, 1, 21,1, 4, 1, 8 }, //asciii 0x0056
+ { 1647, 1, 29,1, 4, 1, 8 }, //asciii 0x0057
+ { 1691, 1, 20,1, 4, 1, 8 }, //asciii 0x0058
+ { 1730, 1, 21,1, 4, 1, 8 }, //asciii 0x0059
+ { 1765, 1, 19,2, 4, 1, 8 }, //asciii 0x005A
+ { 1808, 1, 12,4, 4, 1, 0 }, //asciii 0x005B
+ { 1827, 1, 9,1, 4, 1, 4 }, //asciii 0x005C
+ { 1838, 1, 11,1, 4, 3, 0 }, //asciii 0x005D
+ { 1857, 1, 15,1, 4, 1, 20 }, //asciii 0x005E
+ { 1871, 1, 16,0, 28, 3, 4 }, //asciii 0x005F
+ { 1885, 1, 13,5, 0, 5, 28 }, //asciii 0x0060
+ { 1889, 1, 18,2, 8, 2, 8 }, //asciii 0x0061
+ { 1924, 1, 20,3, 4, 1, 8 }, //asciii 0x0062
+ { 1953, 1, 17,2, 8, 2, 8 }, //asciii 0x0063
+ { 1976, 1, 20,2, 4, 2, 8 }, //asciii 0x0064
+ { 2006, 1, 19,2, 8, 2, 8 }, //asciii 0x0065
+ { 2043, 1, 11,1, 4, 1, 8 }, //asciii 0x0066
+ { 2062, 1, 20,2, 8, 2, 0 }, //asciii 0x0067
+ { 2104, 1, 18,2, 4, 2, 8 }, //asciii 0x0068
+ { 2129, 1, 7,2, 4, 2, 8 }, //asciii 0x0069
+ { 2138, 1, 8,0, 4, 3, 0 }, //asciii 0x006A
+ { 2152, 1, 17,2, 4, 1, 8 }, //asciii 0x006B
+ { 2179, 1, 10,3, 4, 1, 8 }, //asciii 0x006C
+ { 2192, 1, 27,2, 8, 2, 8 }, //asciii 0x006D
+ { 2235, 1, 18,2, 8, 2, 8 }, //asciii 0x006E
+ { 2261, 1, 20,2, 8, 2, 8 }, //asciii 0x006F
+ { 2288, 1, 20,2, 8, 2, 0 }, //asciii 0x0070
+ { 2320, 1, 20,2, 8, 2, 0 }, //asciii 0x0071
+ { 2352, 1, 12,2, 8, 1, 8 }, //asciii 0x0072
+ { 2371, 1, 16,2, 8, 1, 8 }, //asciii 0x0073
+ { 2404, 1, 11,1, 4, 1, 8 }, //asciii 0x0074
+ { 2422, 1, 18,2, 8, 2, 8 }, //asciii 0x0075
+ { 2449, 1, 17,1, 8, 1, 8 }, //asciii 0x0076
+ { 2469, 1, 25,1, 8, 1, 8 }, //asciii 0x0077
+ { 2499, 1, 17,2, 8, 2, 8 }, //asciii 0x0078
+ { 2521, 1, 17,1, 8, 1, 0 }, //asciii 0x0079
+ { 2551, 1, 17,2, 8, 2, 8 }, //asciii 0x007A
+ { 2583, 1, 11,1, 4, 1, 4 }, //asciii 0x007B
+ { 2604, 1, 10,4, 0, 4, 0 }, //asciii 0x007C
+ { 2611, 1, 11,1, 4, 1, 4 }, //asciii 0x007D
+ { 2633, 1, 20,3, 12, 2, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_MEDIUM_32PX_1BPP= {
+ 2649, // bitmap len
+ BAGL_FONT_INTER_MEDIUM_32px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 40, // height of all characters in pixels
+ 40, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 4, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_MEDIUM_32PX_1BPP,
+ bitmapINTER_MEDIUM_32PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.json
new file mode 100644
index 00000000..a756d9cf
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_32_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 33,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 34,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 17,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 58,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 104,
+ "width": 25,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 37,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 148,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 38,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 192,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 39,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 196,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 214,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 232,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 251,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 277,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 24,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 282,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 45,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 292,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 24,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 46,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 296,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 310,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 48,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 343,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 361,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 397,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 51,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 437,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 470,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 53,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 511,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 54,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 552,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 584,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 56,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 623,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 57,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 664,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 58,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 668,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 677,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 60,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 703,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 61,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 732,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 62,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 758,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 63,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 785,
+ "width": 29,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 73
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 858,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 892,
+ "width": 21,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 933,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 67,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 973,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1014,
+ "width": 19,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1052,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1078,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 71,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1123,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1156,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1186,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 74,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1213,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1247,
+ "width": 17,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1273,
+ "width": 27,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1309,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1348,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 79,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1391,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1419,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1466,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1500,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 83,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1546,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1580,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 85,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1615,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1647,
+ "width": 29,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1691,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1730,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1765,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1808,
+ "width": 12,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1827,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1838,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1857,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 20,
+ "char": 94,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1871,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 28,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1885,
+ "width": 13,
+ "x_min_offset": 5,
+ "y_min_offset": 0,
+ "x_max_offset": 5,
+ "y_max_offset": 28,
+ "char": 96,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1889,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 97,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1924,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 98,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1953,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 99,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1976,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 100,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2006,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 101,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2043,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2062,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2104,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2129,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2138,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2152,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2179,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2192,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2235,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2261,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 111,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2288,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2320,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2352,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2371,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 115,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2404,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 116,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2422,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 117,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2449,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2469,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2499,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2521,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2551,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2583,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2604,
+ "width": 10,
+ "x_min_offset": 4,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2611,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2633,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 16
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.inc b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.inc
new file mode 100644
index 00000000..22005627
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.inc
@@ -0,0 +1,1727 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_MEDIUM_36PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC2, 0x2A, 0x2B, 0x3C, 0x2D, 0x3E, 0xC4, 0x98,
+ 0x35, 0xE0, 0xC4, 0x0D, 0x70, 0x70, 0x10, 0x08,
+ 0xC1, 0x08, 0x20, 0x02, 0xC4, 0x0D, 0x70, 0x70,
+ 0x10, 0x08, 0xC1, 0x03, 0x30, 0x0C, 0xC3, 0x0D,
+ 0x70, 0x70, 0x10, 0x08, 0xC1, 0x05, 0x30, 0x0E,
+ 0xC3, 0x0E, 0x13, 0x24, 0x35, 0x26, 0x37, 0x18,
+ 0x0C, 0xC1, 0x0D, 0x01, 0x10, 0x08, 0xDC, 0x0C,
+ 0x0E,
+//ascii 0x0022
+ 0xD1, 0x0D, 0x70, 0x00, 0x0E, 0xC4, 0x0D, 0x70,
+ 0x00, 0x0E, 0xC4, 0x0D, 0x70, 0x00, 0x0E, 0xC5,
+ 0x7E, 0x0E, 0xE6, 0x78, 0x08, 0xC5, 0x0D, 0x70,
+ 0x00, 0x0E, 0xC4, 0x0D, 0x70, 0x00, 0x0E, 0xC4,
+ 0x0E, 0x75, 0x05, 0x0E, 0xC0,
+//ascii 0x0023
+ 0xC9, 0x0B, 0x0E, 0xDC, 0x0D, 0x10, 0x02, 0xDB,
+ 0x0D, 0x10, 0x02, 0xC5, 0x83, 0x69, 0xCB, 0xAE,
+ 0x68, 0xBE, 0xC1, 0x0D, 0x10, 0x02, 0xC5, 0x20,
+ 0xCB, 0x0D, 0x40, 0x03, 0x04, 0x10, 0x01, 0xC5,
+ 0x20, 0xCB, 0x0D, 0x70, 0x20, 0xA3, 0x58, 0xBC,
+ 0x20, 0xCC, 0x99, 0x74, 0x10, 0x70, 0x60, 0x88,
+ 0xAD, 0xCE, 0x0C, 0x08, 0x70, 0x70, 0x82, 0x57,
+ 0xCB, 0x0D, 0x10, 0x02, 0xC0, 0xAC, 0xA7, 0x42,
+ 0x70, 0x10, 0xCB, 0x0D, 0x10, 0x02, 0xC5, 0x20,
+ 0x87, 0x52, 0x30, 0xCB, 0x0D, 0x10, 0x02, 0xC5,
+ 0x20, 0xC3, 0x8D, 0xA7, 0xCB, 0x0D, 0x10, 0x02,
+ 0xC5, 0x20, 0xCB, 0x9E, 0x9C, 0xE0, 0xC2, 0x0D,
+ 0x10, 0x02, 0xC5, 0x20, 0xCB, 0x0D, 0x20, 0x91,
+ 0x36, 0x70, 0x10, 0x02, 0xC5, 0x20, 0xCB, 0x0D,
+ 0x70, 0x10, 0xA3, 0x69, 0xBE, 0xC0, 0x20, 0xCB,
+ 0x9E, 0x63, 0x10, 0x70, 0x70, 0x0B, 0x0E, 0xCD,
+ 0x9E, 0xB9, 0x50, 0x70, 0x60, 0x93, 0x58, 0xB0,
+ 0xCB, 0x0D, 0x10, 0xB1, 0xC9, 0x64, 0x10, 0x70,
+ 0x20, 0xCB, 0x0D, 0x10, 0x02, 0xC4, 0x0D, 0x20,
+ 0x04, 0x01, 0x40, 0xCB, 0x0D, 0x10, 0x02, 0xC5,
+ 0x20, 0xC2, 0x9C, 0xA7, 0x40, 0xCC, 0x87, 0x54,
+ 0xC5, 0x20, 0xDC, 0x20, 0xDD, 0x0C, 0x0A,
+//ascii 0x0024
+ 0xD7, 0x0C, 0x1B, 0x0E, 0xD5, 0x9E, 0x73, 0x50,
+ 0xC7, 0x08, 0x01, 0x30, 0x03, 0x0B, 0xD2, 0x0A,
+ 0x01, 0x10, 0x05, 0xC6, 0x04, 0x70, 0x07, 0xD0,
+ 0x0A, 0x30, 0x05, 0xC5, 0x06, 0x70, 0x10, 0x09,
+ 0xCE, 0x0E, 0x01, 0x30, 0x06, 0xC4, 0x0C, 0x30,
+ 0x93, 0x65, 0x10, 0x30, 0x0E, 0xCD, 0x06, 0x20,
+ 0x03, 0x0D, 0xC5, 0x05, 0x20, 0x06, 0xC2, 0x0E,
+ 0x03, 0x20, 0x07, 0xCD, 0x01, 0x10, 0x02, 0xC6,
+ 0x0E, 0x20, 0x02, 0xC4, 0x0E, 0x01, 0x10, 0x01,
+ 0xCC, 0x0C, 0x20, 0x0A, 0xC6, 0x0A, 0x20, 0x0A,
+ 0xC5, 0x07, 0x20, 0x0D, 0xCB, 0x09, 0x20, 0xC7,
+ 0x05, 0x20, 0xC6, 0x0C, 0x20, 0x0B, 0xC8, 0x0B,
+ 0x15, 0x02, 0x20, 0x75, 0x01, 0x10, 0x01, 0x65,
+ 0x04, 0x20, 0x03, 0x15, 0x0D, 0xC5, 0x09, 0x70,
+ 0x70, 0x70, 0x70, 0x0C, 0xC5, 0x0D, 0x19, 0x05,
+ 0x20, 0x69, 0x04, 0x20, 0x08, 0x69, 0x08, 0x20,
+ 0x06, 0x19, 0x0E, 0xC8, 0x0B, 0x20, 0x0D, 0xC5,
+ 0x03, 0x10, 0x01, 0xC7, 0x0B, 0x20, 0x0B, 0xCB,
+ 0x0E, 0x20, 0x06, 0xC4, 0x0B, 0x20, 0x06, 0xC7,
+ 0x06, 0x20, 0x0E, 0xCC, 0x04, 0x20, 0x0A, 0xC2,
+ 0x0E, 0x02, 0x20, 0x0C, 0xC6, 0x0D, 0x20, 0x02,
+ 0xCD, 0x0B, 0x30, 0x94, 0x87, 0x10, 0x20, 0x03,
+ 0xC6, 0x0B, 0x01, 0x20, 0x08, 0xCE, 0x05, 0x70,
+ 0x10, 0x0C, 0xC4, 0x0D, 0x01, 0x30, 0x02, 0xD0,
+ 0x04, 0x70, 0x09, 0xC5, 0x0C, 0x40, 0x0C, 0xD1,
+ 0x08, 0x01, 0x30, 0x01, 0x0A, 0xC6, 0x0C, 0x20,
+ 0x01, 0x0B, 0xD4, 0x0B, 0x19, 0x0B, 0xC8, 0xAC,
+ 0x02, 0x7E,
+//ascii 0x0025
+ 0xD3, 0x09, 0x05, 0x23, 0x05, 0x0B, 0xD6, 0x0D,
+ 0x02, 0x60, 0x04, 0xC5, 0x8D, 0x3D, 0xCC, 0x02,
+ 0x70, 0x00, 0x05, 0xC4, 0x9D, 0x01, 0x90, 0xCA,
+ 0x09, 0x10, 0x03, 0x0A, 0x2D, 0x09, 0x01, 0x10,
+ 0x0D, 0xC3, 0x0D, 0x20, 0x04, 0x0E, 0xC8, 0x85,
+ 0x01, 0xC5, 0x0C, 0x10, 0x09, 0xC4, 0x0C, 0x02,
+ 0x10, 0x01, 0x0A, 0xC7, 0x84, 0x02, 0xC6, 0x10,
+ 0x08, 0xC6, 0x06, 0x20, 0x05, 0xC6, 0x06, 0x10,
+ 0xC5, 0x0C, 0x10, 0x09, 0xC7, 0x0B, 0x01, 0x10,
+ 0x01, 0x0B, 0xC4, 0x0A, 0x10, 0x03, 0x0A, 0x2D,
+ 0x09, 0x01, 0x10, 0x0D, 0xC9, 0x05, 0x20, 0x06,
+ 0xC4, 0x02, 0x70, 0x00, 0x05, 0xCB, 0x0A, 0x01,
+ 0x10, 0x02, 0x0C, 0xC2, 0x0E, 0x02, 0x60, 0x04,
+ 0xCD, 0x0E, 0x04, 0x20, 0x07, 0xC3, 0x0A, 0x05,
+ 0x23, 0x06, 0x0B, 0xD0, 0x09, 0x01, 0x10, 0x03,
+ 0x0D, 0xDA, 0x0E, 0x03, 0x20, 0x08, 0xD1, 0x0C,
+ 0x08, 0x26, 0x08, 0x0D, 0xC2, 0x08, 0x20, 0x03,
+ 0x0D, 0xCE, 0x04, 0x60, 0x06, 0xC2, 0x0D, 0x03,
+ 0x10, 0x01, 0x09, 0xCC, 0x03, 0x70, 0x00, 0x06,
+ 0xC3, 0x07, 0x20, 0x04, 0x0E, 0xC9, 0x0B, 0x10,
+ 0x01, 0x07, 0x2A, 0x06, 0x20, 0x0D, 0xC3, 0x0C,
+ 0x02, 0x10, 0x01, 0x0A, 0xC8, 0x06, 0x10, 0x0E,
+ 0xC4, 0x0B, 0x10, 0x09, 0xC5, 0x06, 0x20, 0x05,
+ 0xC7, 0x85, 0x02, 0xC6, 0x10, 0x07, 0xC6, 0x0B,
+ 0x01, 0x10, 0x01, 0x0B, 0xC5, 0x86, 0x01, 0xC5,
+ 0x0D, 0x10, 0x08, 0xC8, 0x05, 0x20, 0x06, 0xC4,
+ 0x09, 0x10, 0x04, 0x0C, 0xC2, 0x0C, 0x03, 0x10,
+ 0x0C, 0xC9, 0x0A, 0x01, 0x10, 0xC5, 0x01, 0x70,
+ 0x00, 0x03, 0xCB, 0x8E, 0x40, 0xC5, 0x0C, 0x01,
+ 0x60, 0x02, 0x0E, 0xCD, 0x09, 0xC6, 0x8E, 0x72,
+ 0x10, 0x81, 0x38,
+//ascii 0x0026
+ 0xDB, 0x06, 0xD3, 0x19, 0x0B, 0x0E, 0xC5, 0x04,
+ 0x00, 0xD3, 0x02, 0x20, 0x02, 0x08, 0xC1, 0x0D,
+ 0x02, 0x10, 0xD3, 0x02, 0x40, 0x81, 0x81, 0x20,
+ 0xD3, 0x02, 0x70, 0x10, 0x05, 0xD5, 0x8C, 0x82,
+ 0x40, 0x07, 0xC8, 0xBC, 0x52, 0x13, 0x70, 0x0E,
+ 0xC8, 0x04, 0x40, 0x0B, 0xC7, 0x09, 0x50, 0x01,
+ 0x0B, 0xC5, 0x0E, 0x02, 0x50, 0x01, 0xC6, 0x0B,
+ 0x70, 0x00, 0x0B, 0xC3, 0x0C, 0x01, 0x20, 0x02,
+ 0x08, 0x20, 0x08, 0xC5, 0x02, 0x20, 0x84, 0x74,
+ 0x20, 0x01, 0x0D, 0xC1, 0x0A, 0x30, 0x03, 0xC1,
+ 0x04, 0x10, 0x02, 0xC4, 0x0C, 0x20, 0x09, 0xC2,
+ 0x0B, 0x20, 0x03, 0xC0, 0x07, 0x30, 0x05, 0xC2,
+ 0x0B, 0x20, 0x0E, 0xC3, 0x0A, 0x10, 0x02, 0xC4,
+ 0x09, 0x20, 0x01, 0x30, 0x07, 0xC4, 0x20, 0x0B,
+ 0xC3, 0x09, 0x10, 0x04, 0xC5, 0x05, 0x50, 0x0A,
+ 0xC5, 0x02, 0x10, 0x0A, 0xC3, 0x0A, 0x10, 0x01,
+ 0xC5, 0x0A, 0x30, 0x01, 0x0C, 0xC6, 0x01, 0x10,
+ 0x0A, 0xC3, 0x0C, 0x20, 0x07, 0xC3, 0x08, 0x40,
+ 0x03, 0xC6, 0x0E, 0x20, 0x0C, 0xC4, 0x02, 0x20,
+ 0x93, 0x87, 0x20, 0x60, 0x06, 0xC5, 0x06, 0x20,
+ 0xC5, 0x0A, 0x70, 0x10, 0x06, 0x02, 0x20, 0x06,
+ 0xC3, 0x09, 0x20, 0x04, 0xC6, 0x08, 0x60, 0x01,
+ 0x0A, 0xC0, 0x0D, 0x01, 0x20, 0x91, 0x67, 0x30,
+ 0x30, 0x0B, 0xC7, 0x0C, 0x04, 0x20, 0x02, 0x07,
+ 0xC3, 0x0B, 0x70, 0x10, 0x05, 0xCB, 0x0E, 0xC7,
+ 0x0A, 0x70, 0x04, 0xD6, 0x0D, 0x04, 0x30, 0x02,
+ 0x09, 0xDA, 0x1C, 0x0E,
+//ascii 0x0027
+ 0xC2, 0x78, 0x08, 0xC5, 0x0D, 0x70, 0x00, 0x0E,
+ 0xC4, 0x0D, 0x70, 0x00, 0x0E, 0xC4, 0x0E, 0x75,
+ 0x05, 0x0E, 0xC0,
+//ascii 0x0028
+ 0xE4, 0x8D, 0x5E, 0xDC, 0x08, 0x09, 0xC1, 0x0D,
+ 0x10, 0x07, 0x0E, 0xD8, 0x99, 0x20, 0x90, 0xC1,
+ 0x0D, 0x30, 0x84, 0xAE, 0xD2, 0x8B, 0x51, 0x20,
+ 0x09, 0xC2, 0x03, 0x50, 0x93, 0x7B, 0xE0, 0xC9,
+ 0x9E, 0xB8, 0x40, 0x50, 0x01, 0x0C, 0xC3, 0x09,
+ 0x01, 0x70, 0x90, 0x24, 0x50, 0x16, 0x95, 0x43,
+ 0x10, 0x70, 0x00, 0x06, 0xC7, 0x07, 0x01, 0x70,
+ 0x70, 0x60, 0x05, 0x0D, 0xCA, 0x09, 0x03, 0x70,
+ 0x70, 0x10, 0x82, 0x8E, 0xCE, 0x9E, 0xA6, 0x30,
+ 0x70, 0x10, 0x92, 0x59, 0xD0, 0xD6, 0x8E, 0xDC,
+ 0x2B, 0x0C, 0x0E,
+//ascii 0x0029
+ 0xCA, 0xBC, 0x96, 0x43, 0x20, 0x11, 0xB2, 0x34,
+ 0x68, 0xB0, 0xD2, 0x8A, 0x41, 0x70, 0x60, 0x83,
+ 0x8E, 0xCB, 0x8E, 0x61, 0x70, 0x70, 0x40, 0x04,
+ 0x0C, 0xC7, 0x0E, 0x06, 0x70, 0x70, 0x70, 0x10,
+ 0x04, 0x0C, 0xC4, 0x09, 0x01, 0x50, 0xB1, 0x47,
+ 0xAC, 0xD0, 0x0E, 0xC2, 0xBE, 0xCA, 0x85, 0x20,
+ 0x60, 0x07, 0xC2, 0x0D, 0x40, 0x83, 0x8C, 0xCF,
+ 0x8E, 0xA5, 0x40, 0x09, 0xC1, 0x0D, 0x10, 0x81,
+ 0x7D, 0xD6, 0x09, 0x02, 0x10, 0x09, 0xC1, 0x8D,
+ 0x18, 0xDB, 0x8B, 0x29, 0xC2, 0x0E, 0xDE, 0x0D,
+ 0xC0,
+//ascii 0x002A
+ 0xC6, 0x0C, 0xC3, 0x0D, 0xCB, 0x9D, 0x40, 0xC0,
+ 0xC2, 0x83, 0x19, 0xC9, 0x0A, 0x10, 0x04, 0xC1,
+ 0x0A, 0x10, 0x05, 0xCA, 0x05, 0x10, 0x0C, 0xC0,
+ 0x92, 0x01, 0xE0, 0xCA, 0xAE, 0x10, 0x4A, 0x10,
+ 0x09, 0xCC, 0x09, 0x10, 0x81, 0x04, 0xC8, 0x0E,
+ 0x04, 0x15, 0x86, 0x71, 0x20, 0x05, 0x16, 0x85,
+ 0x49, 0xC3, 0x0D, 0x70, 0x50, 0x07, 0xC3, 0x9D,
+ 0x01, 0x20, 0x13, 0x01, 0x20, 0x13, 0x02, 0x11,
+ 0x07, 0xC8, 0x0C, 0x30, 0x06, 0xCD, 0x92, 0x02,
+ 0x80, 0x10, 0x0C, 0xCB, 0x07, 0x10, 0x0A, 0xC0,
+ 0x81, 0x02, 0xCA, 0x0D, 0x10, 0x03, 0xC1, 0x08,
+ 0x10, 0x07, 0xC9, 0x9B, 0x10, 0xB0, 0xC2, 0x81,
+ 0x06, 0xCB, 0x08, 0xC3, 0x0B, 0x0C,
+//ascii 0x002B
+ 0xC8, 0x26, 0x0C, 0xCF, 0x20, 0x09, 0xCF, 0x20,
+ 0x09, 0xCF, 0x20, 0x09, 0xCF, 0x20, 0x09, 0xCF,
+ 0x20, 0x09, 0xCF, 0x20, 0x09, 0xC8, 0x55, 0x04,
+ 0x20, 0x03, 0x55, 0x0C, 0xC1, 0x01, 0x70, 0x70,
+ 0x0A, 0xC1, 0x01, 0x70, 0x70, 0x0A, 0xC1, 0x05,
+ 0x54, 0x20, 0x02, 0x54, 0x0C, 0xC8, 0x20, 0x09,
+ 0xCF, 0x20, 0x09, 0xCF, 0x20, 0x09, 0xCF, 0x20,
+ 0x09, 0xCF, 0x20, 0x09, 0xCF, 0x20, 0x09, 0xCF,
+ 0x25, 0x0C, 0xC0,
+//ascii 0x002C
+ 0xC0, 0x8B, 0xAC, 0xC8, 0x07, 0x20, 0x83, 0x7C,
+ 0xC4, 0x07, 0x50, 0x81, 0x6B, 0xC1, 0x07, 0x70,
+ 0x00, 0x0A, 0xC0, 0xBE, 0xCB, 0x97, 0x40, 0x01,
+ 0x20, 0x0A, 0xC7, 0x9E, 0xB7, 0xC0,
+//ascii 0x002D
+ 0x2E, 0xC0, 0x04, 0x10, 0x06, 0x04, 0x10, 0x06,
+ 0x04, 0x10, 0x06, 0x04, 0x10, 0x06, 0x04, 0x10,
+ 0x06, 0x04, 0x10, 0x06, 0x04, 0x10, 0x06, 0x04,
+ 0x10, 0x06, 0x04, 0x10, 0x06, 0x04, 0x10, 0x06,
+ 0x04, 0x10, 0x06, 0x0B, 0x18, 0x0C,
+//ascii 0x002E
+ 0xC0, 0x8B, 0x68, 0xC3, 0x0A, 0x20, 0x04, 0xC2,
+ 0x03, 0x30, 0x0D, 0xC1, 0x04, 0x30, 0x0D, 0xC1,
+ 0x0C, 0x20, 0x06, 0xC3, 0x8D, 0x9B,
+//ascii 0x002F
+ 0xC0, 0x0D, 0x0B, 0xE1, 0x09, 0x10, 0x84, 0x8C,
+ 0xDD, 0x09, 0x40, 0x91, 0x59, 0xE0, 0xD9, 0x0A,
+ 0x70, 0x90, 0x26, 0xB0, 0xD7, 0x9E, 0xA5, 0x10,
+ 0x70, 0x90, 0x37, 0xC0, 0xD7, 0x8D, 0x94, 0x70,
+ 0xA0, 0x14, 0x9D, 0xD7, 0x8C, 0x73, 0x70, 0xA0,
+ 0x16, 0xAE, 0xD7, 0x8A, 0x62, 0x70, 0x90, 0x37,
+ 0xB0, 0xD7, 0x9D, 0x95, 0x10, 0x70, 0x90, 0x48,
+ 0xC0, 0xD7, 0x8C, 0x84, 0x70, 0x01, 0xDB, 0x8B,
+ 0x72, 0x30, 0x01, 0xDE, 0x8E, 0xA5, 0x11, 0xE2,
+ 0x0D, 0xC0,
+//ascii 0x0030
+ 0xCC, 0x0E, 0x3D, 0x0E, 0xD5, 0x8A, 0x62, 0x70,
+ 0x83, 0x6B, 0xCF, 0x07, 0x01, 0x70, 0x50, 0x01,
+ 0x08, 0xCB, 0x0B, 0x01, 0x70, 0x70, 0x10, 0x02,
+ 0x0C, 0xC8, 0x0A, 0x60, 0x81, 0x34, 0x15, 0x84,
+ 0x31, 0x60, 0x0C, 0xC6, 0x0D, 0x40, 0x84, 0xAE,
+ 0xC7, 0x8E, 0xA4, 0x30, 0x01, 0x0E, 0xC5, 0x04,
+ 0x20, 0x03, 0x0D, 0xCD, 0x0C, 0x02, 0x20, 0x06,
+ 0xC4, 0x0E, 0x20, 0x03, 0xD0, 0x0E, 0x01, 0x10,
+ 0x01, 0xC4, 0x0A, 0x20, 0x0C, 0xD1, 0x0A, 0x20,
+ 0x0C, 0xC3, 0x08, 0x10, 0x01, 0xD3, 0x20, 0x0A,
+ 0xC3, 0x07, 0x10, 0x03, 0xD3, 0x20, 0x09, 0xC3,
+ 0x08, 0x10, 0x01, 0xD2, 0x0E, 0x20, 0x0A, 0xC3,
+ 0x0B, 0x20, 0x0A, 0xD1, 0x08, 0x20, 0x0D, 0xC4,
+ 0x20, 0x01, 0x0D, 0xCF, 0x0C, 0x20, 0x02, 0xC5,
+ 0x07, 0x20, 0x01, 0x09, 0xCD, 0x08, 0x30, 0x08,
+ 0xC6, 0x02, 0x30, 0x91, 0x6A, 0xD0, 0xC5, 0x9C,
+ 0xA5, 0x10, 0x30, 0x03, 0xC7, 0x0D, 0x01, 0x70,
+ 0x00, 0x01, 0x70, 0x10, 0x02, 0x0E, 0xC8, 0x0E,
+ 0x04, 0x70, 0x70, 0x10, 0x05, 0xCC, 0x0B, 0x04,
+ 0x70, 0x50, 0x05, 0x0C, 0xCF, 0xAE, 0xA6, 0x42,
+ 0x31, 0x92, 0x47, 0xA0,
+//ascii 0x0031
+ 0xC2, 0x79, 0x79, 0x79, 0x19, 0xC4, 0x0D, 0x70,
+ 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0E, 0x20, 0x01, 0x78, 0x78, 0x58, 0xC5, 0x09,
+ 0x20, 0x0B, 0xDB, 0x03, 0x10, 0x01, 0xDB, 0x0D,
+ 0x20, 0x06, 0xDB, 0x08, 0x20, 0x0B, 0xDB, 0x03,
+ 0x10, 0x02, 0xDB, 0x0D, 0x21, 0x07, 0xC0,
+//ascii 0x0032
+ 0xC7, 0x0D, 0x1B, 0x0E, 0xCC, 0x0B, 0x24, 0xC8,
+ 0x08, 0x01, 0x30, 0x02, 0x09, 0xCA, 0x0A, 0x20,
+ 0xC7, 0x03, 0x70, 0x03, 0x0D, 0xC8, 0x0A, 0x20,
+ 0xC6, 0x04, 0x70, 0x20, 0x0A, 0xC7, 0x0A, 0x20,
+ 0xC5, 0x09, 0x30, 0xA5, 0x89, 0x61, 0x30, 0x08,
+ 0xC6, 0x0A, 0x20, 0xC5, 0x02, 0x10, 0x01, 0x0C,
+ 0xC4, 0x06, 0x30, 0x07, 0xC5, 0x0A, 0x20, 0xC4,
+ 0x0C, 0x20, 0x09, 0xC6, 0x09, 0x30, 0x06, 0xC4,
+ 0x0A, 0x20, 0xC4, 0x09, 0x10, 0x01, 0xC8, 0x0B,
+ 0x01, 0x20, 0x06, 0xC3, 0x0A, 0x20, 0xC4, 0x08,
+ 0x10, 0x03, 0xC9, 0x0C, 0x01, 0x20, 0x05, 0xC2,
+ 0x0A, 0x20, 0xC4, 0x08, 0x10, 0x03, 0xCA, 0x0D,
+ 0x01, 0x20, 0x04, 0xC1, 0x0A, 0x20, 0xC4, 0x09,
+ 0x10, 0x01, 0xCB, 0x0D, 0x01, 0x20, 0x04, 0xC0,
+ 0x0A, 0x20, 0xC4, 0x0C, 0x20, 0x0B, 0xCB, 0x0D,
+ 0x02, 0x20, 0x03, 0x09, 0x20, 0xC5, 0x01, 0x10,
+ 0x01, 0x0D, 0xCB, 0x0E, 0x02, 0x60, 0xC5, 0x08,
+ 0x30, 0x86, 0xAE, 0xC9, 0x0E, 0x02, 0x50, 0xC6,
+ 0x03, 0x40, 0x09, 0xCA, 0x0E, 0x02, 0x40, 0xC6,
+ 0x0E, 0x03, 0x30, 0x09, 0xCC, 0x03, 0x30, 0xC8,
+ 0x07, 0x01, 0x10, 0x09, 0xCD, 0x03, 0x20, 0xCA,
+ 0x8B, 0x9D, 0xCE, 0x28, 0xC0,
+//ascii 0x0033
+ 0xD1, 0x8E, 0x84, 0x12, 0x05, 0x0A, 0xCC, 0xBD,
+ 0x63, 0x12, 0x50, 0x0C, 0xC3, 0x0B, 0x01, 0x50,
+ 0x03, 0x0E, 0xC9, 0x08, 0x60, 0x08, 0xC1, 0x0C,
+ 0x70, 0x80, 0x2E, 0xC7, 0x07, 0x70, 0x00, 0x09,
+ 0xC0, 0x03, 0x70, 0x10, 0x04, 0xC6, 0x0B, 0x40,
+ 0x11, 0x20, 0x01, 0x0C, 0x20, 0xA5, 0xCE, 0xD7,
+ 0x30, 0x0B, 0xC5, 0x03, 0x20, 0x07, 0x0E, 0xC1,
+ 0x0C, 0x02, 0x10, 0x03, 0x10, 0x07, 0xC4, 0x0B,
+ 0x20, 0x04, 0xC4, 0x0D, 0x20, 0x07, 0xC4, 0x0E,
+ 0x01, 0x20, 0x02, 0xC6, 0x05, 0x20, 0xC4, 0x0A,
+ 0x20, 0xC6, 0x09, 0x20, 0x08, 0xC6, 0x0B, 0x20,
+ 0x0D, 0xC3, 0x08, 0x10, 0x03, 0xC6, 0x0E, 0x20,
+ 0x0B, 0xC6, 0x0E, 0x20, 0x0B, 0xC3, 0x07, 0x10,
+ 0x03, 0xC7, 0x20, 0x0C, 0xC7, 0x20, 0x0A, 0xC3,
+ 0x09, 0x10, 0x02, 0xC7, 0x20, 0x0C, 0xC6, 0x0E,
+ 0x20, 0x0B, 0xC3, 0x0B, 0x20, 0x0D, 0xC6, 0x20,
+ 0x0C, 0xC6, 0x0A, 0x20, 0x0D, 0xC4, 0x20, 0x05,
+ 0xD1, 0x03, 0x10, 0x01, 0xC5, 0x05, 0x20, 0x07,
+ 0xCF, 0x08, 0x20, 0x05, 0xC5, 0x0D, 0x30, 0x01,
+ 0x08, 0xCB, 0x0A, 0x04, 0x30, 0x0C, 0xC6, 0x09,
+ 0x30, 0x06, 0xCB, 0x03, 0x30, 0x06, 0xC8, 0x08,
+ 0x20, 0x06, 0xCB, 0x03, 0x20, 0x03, 0xCA, 0x9D,
+ 0x51, 0x60, 0xCB, 0x03, 0x10, 0x06, 0xDB, 0x88,
+ 0x9E, 0xC0,
+//ascii 0x0034
+ 0xD3, 0x0B, 0x16, 0x07, 0xDB, 0x08, 0x10, 0x02,
+ 0xDB, 0x08, 0x10, 0x02, 0xCA, 0x7D, 0x7D, 0x0D,
+ 0x07, 0x10, 0x01, 0x4D, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC4, 0x0C, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0C,
+ 0x30, 0x03, 0x76, 0x36, 0x03, 0x20, 0x46, 0xC4,
+ 0x0E, 0x40, 0x07, 0xCA, 0x08, 0x10, 0x02, 0xCA,
+ 0x0D, 0x04, 0x30, 0x02, 0x0B, 0xC8, 0x08, 0x10,
+ 0x02, 0xCC, 0x09, 0x01, 0x30, 0x05, 0x0E, 0xC6,
+ 0x08, 0x10, 0x02, 0xCD, 0x0E, 0x05, 0x30, 0x01,
+ 0x09, 0xC5, 0x08, 0x10, 0x02, 0xCF, 0x0B, 0x02,
+ 0x30, 0x03, 0x0D, 0xC3, 0x08, 0x10, 0x02, 0xD1,
+ 0x07, 0x40, 0x07, 0xC2, 0x08, 0x10, 0x02, 0xD2,
+ 0x0C, 0x03, 0x30, 0x02, 0x0C, 0xC0, 0x08, 0x10,
+ 0x02, 0xD4, 0x08, 0x40, 0x06, 0x07, 0x10, 0x02,
+ 0xD5, 0x0E, 0x04, 0x60, 0x02, 0xD7, 0x0A, 0x01,
+ 0x40, 0x02, 0xD9, 0x06, 0x30, 0x02, 0xDA, 0x0B,
+ 0x02, 0x10, 0x02,
+//ascii 0x0035
+ 0xD2, 0x8E, 0xDE, 0xD9, 0x0B, 0x04, 0x40, 0x04,
+ 0x0B, 0xC8, 0x0D, 0x21, 0x0D, 0xC6, 0x0E, 0x04,
+ 0x70, 0x80, 0x4E, 0xC6, 0x0D, 0x20, 0x0D, 0xC5,
+ 0x0E, 0x02, 0x70, 0x20, 0x02, 0x0E, 0xC5, 0x0D,
+ 0x20, 0x0D, 0xC5, 0x03, 0x40, 0x94, 0x54, 0x10,
+ 0x30, 0x04, 0xC5, 0x0D, 0x20, 0x0D, 0xC4, 0x09,
+ 0x30, 0x08, 0xC4, 0x0A, 0x01, 0x20, 0x0A, 0xC4,
+ 0x0D, 0x20, 0x0D, 0xC4, 0x03, 0x20, 0x0A, 0xC6,
+ 0x0D, 0x01, 0x10, 0x03, 0xC4, 0x0D, 0x20, 0x0D,
+ 0xC4, 0x20, 0x05, 0xC8, 0x08, 0x20, 0x0E, 0xC3,
+ 0x0D, 0x20, 0x0D, 0xC3, 0x0D, 0x20, 0x0B, 0xC8,
+ 0x0E, 0x20, 0x0C, 0xC3, 0x0D, 0x20, 0x0D, 0xC3,
+ 0x0D, 0x20, 0x0E, 0xC9, 0x20, 0x0A, 0xC3, 0x0D,
+ 0x20, 0x0D, 0xC4, 0x20, 0xCA, 0x20, 0x0B, 0xC3,
+ 0x0D, 0x20, 0x0D, 0xC4, 0x03, 0x10, 0x0C, 0xC8,
+ 0x0C, 0x20, 0x0C, 0xC3, 0x0D, 0x20, 0x0D, 0xC4,
+ 0x0A, 0x10, 0x08, 0xC8, 0x05, 0x20, 0xC4, 0x0D,
+ 0x20, 0xB3, 0x67, 0x9B, 0xD0, 0x9E, 0x40, 0x10,
+ 0xC7, 0x09, 0x20, 0x05, 0xC4, 0x0D, 0x70, 0x40,
+ 0x08, 0xC4, 0x09, 0x04, 0x30, 0x0C, 0xC4, 0x0D,
+ 0x70, 0x40, 0x0A, 0xC4, 0x03, 0x30, 0x06, 0xC5,
+ 0xAE, 0x75, 0x32, 0x70, 0x00, 0x0C, 0xC4, 0x03,
+ 0x20, 0x05, 0xCC, 0xAE, 0xCB, 0x97, 0x85, 0x32,
+ 0xC5, 0x93, 0x01, 0x90, 0xDB, 0x0B, 0x0C,
+//ascii 0x0036
+ 0xC7, 0x1B, 0xC6, 0xBB, 0x75, 0x45, 0x70, 0x0C,
+ 0xCD, 0x99, 0x10, 0x60, 0xC4, 0x0B, 0x02, 0x60,
+ 0x02, 0x0B, 0xCA, 0x04, 0x20, 0x06, 0xC3, 0x07,
+ 0x70, 0x20, 0x08, 0xC8, 0x04, 0x30, 0x06, 0xC2,
+ 0x08, 0x70, 0x40, 0x09, 0xC6, 0x09, 0x30, 0x03,
+ 0x0B, 0xC1, 0x0D, 0x30, 0xB2, 0x9D, 0xED, 0x90,
+ 0x02, 0x30, 0x0D, 0xC5, 0x02, 0x20, 0x09, 0xC3,
+ 0x06, 0x20, 0x05, 0xC6, 0x05, 0x20, 0x05, 0xC4,
+ 0x0C, 0x20, 0x07, 0xC4, 0x01, 0x10, 0x03, 0xC8,
+ 0x03, 0x10, 0x01, 0xC4, 0x09, 0x20, 0x0E, 0xC3,
+ 0x0E, 0x20, 0x0A, 0xC8, 0x0B, 0x20, 0x0C, 0xC3,
+ 0x08, 0x10, 0x01, 0xC4, 0x0E, 0x20, 0x0E, 0xC9,
+ 0x20, 0x0B, 0xC3, 0x08, 0x10, 0x01, 0xC5, 0x20,
+ 0xCA, 0x20, 0x0A, 0xC3, 0x09, 0x20, 0x0E, 0xC4,
+ 0x02, 0x10, 0x0D, 0xC8, 0x0E, 0x20, 0x0C, 0xC3,
+ 0x0D, 0x20, 0x08, 0xC4, 0x08, 0x10, 0x07, 0xC8,
+ 0x09, 0x20, 0xC5, 0x02, 0x20, 0x0C, 0xC4, 0x01,
+ 0x10, 0x0D, 0xC6, 0x0E, 0x01, 0x10, 0x03, 0xC5,
+ 0x0A, 0x30, 0x08, 0xC3, 0x0B, 0x10, 0x01, 0x0B,
+ 0xC4, 0x0C, 0x02, 0x20, 0x0A, 0xC6, 0x06, 0x30,
+ 0x91, 0x7B, 0xE0, 0xC0, 0x0B, 0x01, 0x10, 0xA3,
+ 0x8A, 0x94, 0x30, 0x03, 0xC8, 0x05, 0x70, 0x11,
+ 0x70, 0x10, 0x02, 0x0E, 0xC9, 0x0A, 0x01, 0x70,
+ 0x70, 0x80, 0x4E, 0xCC, 0x09, 0x03, 0x70, 0x40,
+ 0x03, 0x0A, 0xD0, 0xAE, 0xA7, 0x53, 0x22, 0xA3,
+ 0x46, 0x9D, 0xC0,
+//ascii 0x0037
+ 0xC1, 0x0D, 0x21, 0x03, 0x0B, 0xD9, 0x0D, 0x40,
+ 0x03, 0x0B, 0xD7, 0x0D, 0x60, 0x03, 0x0B, 0xD5,
+ 0x0D, 0x70, 0x80, 0x3B, 0xD3, 0x0D, 0x20, 0x09,
+ 0x04, 0x50, 0x03, 0x0B, 0xD1, 0x0D, 0x20, 0x0D,
+ 0xC0, 0x0C, 0x04, 0x50, 0x03, 0x0B, 0xCF, 0x0D,
+ 0x20, 0x0D, 0xC2, 0x0C, 0x04, 0x50, 0x03, 0x0B,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC4, 0x0C, 0x04, 0x50,
+ 0x03, 0x0B, 0xCB, 0x0D, 0x20, 0x0D, 0xC6, 0x0C,
+ 0x04, 0x50, 0x03, 0x0B, 0xC9, 0x0D, 0x20, 0x0D,
+ 0xC8, 0x0B, 0x03, 0x50, 0x03, 0x0B, 0xC7, 0x0D,
+ 0x20, 0x0D, 0xCA, 0x0B, 0x03, 0x50, 0x03, 0x0B,
+ 0xC5, 0x0D, 0x20, 0x0D, 0xCC, 0x0B, 0x03, 0x50,
+ 0x03, 0xC4, 0x0D, 0x20, 0x0D, 0xCE, 0x0B, 0x03,
+ 0x40, 0xC4, 0x0D, 0x20, 0x0D, 0xD0, 0x0B, 0x03,
+ 0x20, 0xC4, 0x0D, 0x20, 0x0D, 0xD2, 0x8B, 0x30,
+ 0xC4, 0x0D, 0x20, 0x0D, 0xD4, 0x0A, 0xC4, 0x0D,
+ 0x20, 0x0D, 0xDB, 0x2A,
+//ascii 0x0038
+ 0xD2, 0xBD, 0x86, 0x58, 0xD0, 0xCD, 0xA9, 0x65,
+ 0x6A, 0xC5, 0x05, 0x50, 0x05, 0xCA, 0x0B, 0x01,
+ 0x40, 0x02, 0x0C, 0xC1, 0x0E, 0x02, 0x70, 0x03,
+ 0xC8, 0x0A, 0x70, 0x00, 0x0C, 0xC0, 0x04, 0x70,
+ 0x10, 0x05, 0xC6, 0x0D, 0x70, 0x10, 0x02, 0x0C,
+ 0x20, 0xA2, 0x8B, 0xA5, 0x30, 0x0C, 0xC5, 0x05,
+ 0x20, 0x03, 0x0B, 0x1D, 0x08, 0x01, 0x10, 0x03,
+ 0x10, 0x04, 0xC4, 0x0A, 0x20, 0x05, 0xC5, 0x20,
+ 0x04, 0xC4, 0x0D, 0x01, 0x20, 0x02, 0xC6, 0x06,
+ 0x10, 0x01, 0xC4, 0x0B, 0x20, 0x0E, 0xC5, 0x08,
+ 0x20, 0x09, 0xC6, 0x0D, 0x20, 0x0D, 0xC3, 0x08,
+ 0x10, 0x03, 0xC6, 0x0D, 0x20, 0x0D, 0xC7, 0x01,
+ 0x10, 0x0B, 0xC3, 0x07, 0x10, 0x05, 0xC7, 0x20,
+ 0x0E, 0xC7, 0x02, 0x10, 0x0A, 0xC3, 0x08, 0x10,
+ 0x04, 0xC6, 0x0E, 0x20, 0x0D, 0xC7, 0x01, 0x10,
+ 0x0B, 0xC3, 0x0A, 0x10, 0x01, 0xC6, 0x0A, 0x20,
+ 0x0A, 0xC6, 0x0E, 0x20, 0x0C, 0xC3, 0x0D, 0x20,
+ 0x08, 0xC5, 0x02, 0x20, 0x04, 0xC6, 0x09, 0x20,
+ 0xC5, 0x03, 0x20, 0x08, 0xC2, 0x0D, 0x03, 0x10,
+ 0x01, 0x10, 0x08, 0xC4, 0x0E, 0x01, 0x10, 0x03,
+ 0xC5, 0x0B, 0x40, 0x02, 0x01, 0x20, 0x01, 0x09,
+ 0x20, 0x06, 0x0C, 0xC0, 0x8E, 0xA1, 0x20, 0x0A,
+ 0xC6, 0x06, 0x70, 0x00, 0x09, 0xC0, 0x02, 0x70,
+ 0x10, 0x02, 0xC8, 0x06, 0x60, 0x07, 0xC1, 0x0C,
+ 0x70, 0x80, 0x1D, 0xC9, 0xBB, 0x51, 0x02, 0x50,
+ 0x0C, 0xC3, 0x0B, 0x01, 0x50, 0x01, 0x0C, 0xD7,
+ 0x08, 0x03, 0x11, 0x03, 0x08, 0xC0,
+//ascii 0x0039
+ 0xC8, 0x9E, 0xA7, 0x50, 0x34, 0x95, 0x79, 0xD0,
+ 0xD1, 0x0B, 0x04, 0x70, 0x30, 0x81, 0x5C, 0xCC,
+ 0x0E, 0x04, 0x70, 0x70, 0x80, 0x3D, 0xC9, 0x0D,
+ 0x01, 0x70, 0x70, 0x30, 0x0A, 0xC8, 0x02, 0x30,
+ 0xA3, 0x78, 0x51, 0x10, 0x04, 0x1E, 0x8C, 0x94,
+ 0x40, 0x0A, 0xC6, 0x08, 0x20, 0x02, 0x0C, 0xC4,
+ 0x06, 0x10, 0x02, 0xC3, 0x0D, 0x05, 0x30, 0x0E,
+ 0xC5, 0x01, 0x10, 0x02, 0xC7, 0x07, 0x10, 0x05,
+ 0xC4, 0x07, 0x20, 0x06, 0xC4, 0x0C, 0x20, 0x0B,
+ 0xC8, 0x02, 0x10, 0x0C, 0xC4, 0x04, 0x10, 0x01,
+ 0xC4, 0x09, 0x10, 0x01, 0xC9, 0x08, 0x10, 0x06,
+ 0xC4, 0x0B, 0x20, 0x0C, 0xC3, 0x07, 0x10, 0x03,
+ 0xC9, 0x0B, 0x10, 0x03, 0xC4, 0x0E, 0x20, 0x0B,
+ 0xC3, 0x08, 0x10, 0x02, 0xC9, 0x0A, 0x10, 0x01,
+ 0xC4, 0x0E, 0x20, 0x0B, 0xC3, 0x09, 0x20, 0xC9,
+ 0x07, 0x10, 0x02, 0xC4, 0x0C, 0x20, 0x0C, 0xC3,
+ 0x0C, 0x20, 0x07, 0xC8, 0x01, 0x10, 0x04, 0xC4,
+ 0x05, 0x20, 0xC5, 0x02, 0x20, 0x0A, 0xC6, 0x04,
+ 0x20, 0x09, 0xC3, 0x08, 0x20, 0x04, 0xC5, 0x09,
+ 0x30, 0x05, 0x0C, 0xC1, 0x8E, 0x92, 0x20, 0x01,
+ 0xC2, 0x0B, 0x04, 0x30, 0x0B, 0xC6, 0x04, 0x70,
+ 0x40, 0x0B, 0xC2, 0x02, 0x30, 0x06, 0xC8, 0x04,
+ 0x70, 0x20, 0x09, 0xC3, 0x02, 0x20, 0x05, 0xCA,
+ 0x08, 0x70, 0x02, 0x0B, 0xC4, 0x92, 0x01, 0x90,
+ 0xCD, 0xB9, 0x53, 0x23, 0x60, 0x0B, 0xC6, 0x08,
+ 0x0B,
+//ascii 0x003A
+ 0xC2, 0x89, 0x6A, 0xCA, 0x8B, 0x68, 0xC5, 0x05,
+ 0x20, 0x08, 0xC8, 0x0A, 0x20, 0x04, 0xC3, 0x0E,
+ 0x30, 0x02, 0xC8, 0x03, 0x30, 0x0D, 0xC3, 0x30,
+ 0x02, 0xC8, 0x04, 0x30, 0x0D, 0xC3, 0x07, 0x20,
+ 0x0A, 0xC8, 0x0C, 0x20, 0x06, 0xC5, 0x8B, 0x9D,
+ 0xCA, 0x8D, 0x9B,
+//ascii 0x003B
+ 0xDD, 0xAC, 0x10, 0x3E, 0xC9, 0x8B, 0xAC, 0xC9,
+ 0x01, 0x20, 0x04, 0xC9, 0x07, 0x20, 0x83, 0x7C,
+ 0xC4, 0x0E, 0x30, 0x01, 0xC9, 0x07, 0x50, 0x81,
+ 0x6B, 0xC2, 0x02, 0x20, 0x05, 0xC9, 0x07, 0x70,
+ 0x00, 0x0A, 0xC1, 0xAD, 0x30, 0x4E, 0xC9, 0xBE,
+ 0xCB, 0x97, 0x40, 0x01, 0x20, 0x0A, 0xD7, 0x9E,
+ 0xB7, 0xC0,
+//ascii 0x003C
+ 0xC0, 0x09, 0x28, 0xCA, 0x0B, 0x28, 0x0E, 0xC3,
+ 0x08, 0x20, 0x0A, 0xC9, 0x01, 0x10, 0x02, 0xC5,
+ 0x01, 0x10, 0x03, 0xC8, 0x09, 0x20, 0x0A, 0xC5,
+ 0x08, 0x20, 0x0B, 0xC7, 0x02, 0x10, 0x02, 0xC7,
+ 0x01, 0x10, 0x04, 0xC6, 0x0A, 0x20, 0x09, 0xC7,
+ 0x07, 0x20, 0x0D, 0xC5, 0x03, 0x10, 0x01, 0xC8,
+ 0x0E, 0x20, 0x05, 0xC4, 0x0C, 0x20, 0x09, 0xC9,
+ 0x07, 0x20, 0x0E, 0xC3, 0x04, 0x10, 0x01, 0xCA,
+ 0x0E, 0x20, 0x07, 0xC2, 0x0D, 0x20, 0x08, 0xCB,
+ 0x06, 0x10, 0x01, 0xC2, 0x06, 0x10, 0x01, 0xCC,
+ 0x0E, 0x20, 0x08, 0xC0, 0x0E, 0x20, 0x08, 0xCD,
+ 0x06, 0x10, 0x01, 0xC0, 0x07, 0x10, 0x01, 0xCE,
+ 0x0D, 0x20, 0x08, 0x01, 0x10, 0x07, 0xCF, 0x05,
+ 0x50, 0x0E, 0xCF, 0x0D, 0x40, 0x07, 0xD1, 0x05,
+ 0x30, 0x0E, 0xD1, 0x0C, 0x20, 0x06, 0xD3, 0x09,
+ 0x18, 0x0E, 0xC0,
+//ascii 0x003D
+ 0xC0, 0x2D, 0xC4, 0x2D, 0xC4, 0x01, 0x10, 0x09,
+ 0xC3, 0x20, 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3,
+ 0x20, 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20,
+ 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B,
+ 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3,
+ 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x01,
+ 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x01, 0x10,
+ 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x01, 0x10, 0x09,
+ 0xC3, 0x20, 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3,
+ 0x20, 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20,
+ 0x0B, 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B,
+ 0xC3, 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3,
+ 0x01, 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x01,
+ 0x10, 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x01, 0x10,
+ 0x09, 0xC3, 0x20, 0x0B, 0xC3, 0x2D, 0xC4, 0x2D,
+//ascii 0x003E
+ 0xC8, 0x09, 0x18, 0x0E, 0xD2, 0x0D, 0x20, 0x06,
+ 0xD2, 0x05, 0x30, 0x0E, 0xD0, 0x0D, 0x40, 0x07,
+ 0xD0, 0x05, 0x40, 0x01, 0x0E, 0xCE, 0x0D, 0x20,
+ 0x08, 0x01, 0x10, 0x07, 0xCE, 0x06, 0x10, 0x01,
+ 0xC0, 0x07, 0x10, 0x01, 0xCD, 0x0E, 0x20, 0x08,
+ 0xC0, 0x0E, 0x20, 0x08, 0xCC, 0x06, 0x10, 0x01,
+ 0xC2, 0x06, 0x10, 0x01, 0xCB, 0x0E, 0x20, 0x07,
+ 0xC2, 0x0D, 0x20, 0x08, 0xCA, 0x07, 0x20, 0x0E,
+ 0xC3, 0x04, 0x10, 0x01, 0xC9, 0x0E, 0x01, 0x10,
+ 0x05, 0xC4, 0x0C, 0x20, 0x09, 0xC8, 0x07, 0x20,
+ 0x0C, 0xC5, 0x03, 0x10, 0x02, 0xC8, 0x01, 0x10,
+ 0x04, 0xC6, 0x0A, 0x20, 0x09, 0xC6, 0x08, 0x20,
+ 0x0B, 0xC7, 0x02, 0x10, 0x02, 0xC6, 0x01, 0x10,
+ 0x02, 0xC8, 0x09, 0x20, 0x0A, 0xC4, 0x08, 0x20,
+ 0x0A, 0xC9, 0x01, 0x10, 0x02, 0xC4, 0x09, 0x28,
+ 0xCA, 0x0B, 0x28, 0x0E, 0xC0,
+//ascii 0x003F
+ 0xC7, 0x8E, 0xDE, 0xDA, 0x07, 0x01, 0x20, 0x02,
+ 0x08, 0xD6, 0x0D, 0x01, 0x60, 0x02, 0x0E, 0xD3,
+ 0x0E, 0x01, 0x70, 0x00, 0x02, 0xD3, 0x06, 0x30,
+ 0x82, 0x42, 0x30, 0x06, 0xD2, 0x20, 0x01, 0x0C,
+ 0xC2, 0x0B, 0x01, 0x20, 0x0B, 0xD0, 0x0B, 0x20,
+ 0x0C, 0xC4, 0x0D, 0x01, 0x20, 0x0A, 0xC7, 0x0D,
+ 0x0E, 0xC5, 0x08, 0x10, 0x02, 0xC6, 0x0A, 0x30,
+ 0x92, 0x79, 0xD0, 0xC1, 0x0E, 0x02, 0x10, 0x09,
+ 0xC4, 0x07, 0x10, 0x05, 0xC7, 0x05, 0x50, 0x08,
+ 0xC1, 0x05, 0x30, 0x0E, 0xC3, 0x08, 0x10, 0x03,
+ 0xC8, 0x04, 0x40, 0x08, 0xC1, 0x03, 0x30, 0x0C,
+ 0xC3, 0x0A, 0x20, 0x0E, 0xC8, 0x0A, 0x04, 0x20,
+ 0x08, 0xC1, 0x07, 0x20, 0x02, 0xC4, 0x0E, 0x20,
+ 0x04, 0xCB, 0x8E, 0xCE, 0xC2, 0x97, 0x24, 0xD0,
+ 0xC5, 0x04, 0x20, 0x82, 0x8D, 0xD8, 0x0D, 0x40,
+ 0x07, 0xD9, 0x09, 0x30, 0x07, 0xDA, 0x0B, 0x02,
+ 0x10, 0x07, 0xDC, 0x8C, 0x8B,
+//ascii 0x0040
+ 0xCF, 0x0E, 0x1D, 0x0E, 0xDF, 0x8C, 0x73, 0x50,
+ 0x91, 0x36, 0xB0, 0xD8, 0x0B, 0x03, 0x70, 0x40,
+ 0x02, 0x0B, 0xD5, 0x05, 0x70, 0x70, 0x00, 0x0A,
+ 0xD2, 0x0E, 0x02, 0x30, 0x94, 0x9C, 0xE0, 0xC2,
+ 0xAE, 0xCA, 0x71, 0x20, 0x0E, 0xD1, 0x02, 0x20,
+ 0x04, 0x0D, 0xCB, 0x04, 0x10, 0x08, 0xD0, 0x04,
+ 0x20, 0x08, 0xCD, 0x0C, 0x10, 0x05, 0xCF, 0x0A,
+ 0x20, 0x09, 0xCE, 0x0C, 0x10, 0x04, 0xC4, 0x0E,
+ 0xC9, 0x02, 0x10, 0x06, 0xCE, 0x0E, 0x04, 0x10,
+ 0x05, 0xC2, 0x86, 0x12, 0xC8, 0x0A, 0x10, 0x01,
+ 0xC2, 0x09, 0x72, 0x32, 0x30, 0x08, 0xC2, 0x01,
+ 0x10, 0x0D, 0xC7, 0x04, 0x10, 0x08, 0xC2, 0x08,
+ 0x70, 0x60, 0x01, 0xC3, 0x06, 0x10, 0x09, 0xC7,
+ 0x20, 0x0E, 0xC2, 0x08, 0x70, 0x50, 0x02, 0x0C,
+ 0xC3, 0x0A, 0x10, 0x05, 0xC6, 0x0D, 0x10, 0x02,
+ 0xC3, 0x0E, 0x07, 0x20, 0x85, 0x9B, 0x1C, 0x8A,
+ 0x61, 0x10, 0x09, 0xC4, 0x0D, 0x10, 0x02, 0xC6,
+ 0x0A, 0x10, 0x05, 0xC3, 0x0E, 0x20, 0x0B, 0xC7,
+ 0x04, 0x10, 0x08, 0xC4, 0x20, 0xC6, 0x09, 0x10,
+ 0x07, 0xC3, 0x07, 0x10, 0x06, 0xC9, 0x01, 0x10,
+ 0x0E, 0xC3, 0x01, 0x10, 0xC6, 0x08, 0x10, 0x08,
+ 0xC3, 0x03, 0x10, 0x0A, 0xC9, 0x05, 0x10, 0x09,
+ 0xC3, 0x01, 0x10, 0x0E, 0xC5, 0x08, 0x10, 0x08,
+ 0xC3, 0x02, 0x10, 0x0C, 0xC9, 0x07, 0x10, 0x06,
+ 0xC3, 0x01, 0x10, 0x0E, 0xC5, 0x09, 0x10, 0x07,
+ 0xC3, 0x02, 0x10, 0x0B, 0xC9, 0x07, 0x10, 0x06,
+ 0xC3, 0x20, 0xC6, 0x0B, 0x10, 0x05, 0xC3, 0x05,
+ 0x10, 0x07, 0xC9, 0x03, 0x10, 0x08, 0xC2, 0x0E,
+ 0x10, 0x01, 0xC6, 0x0D, 0x10, 0x02, 0xC3, 0x0A,
+ 0x20, 0x0D, 0xC7, 0x09, 0x20, 0x0C, 0xC2, 0x0B,
+ 0x10, 0x03, 0xC7, 0x20, 0x0E, 0xC3, 0x02, 0x10,
+ 0x01, 0x0A, 0xC4, 0x0E, 0x07, 0x20, 0x02, 0xC3,
+ 0x07, 0x10, 0x06, 0xC7, 0x04, 0x10, 0x09, 0xC3,
+ 0x0B, 0x30, 0xA1, 0x45, 0x42, 0x40, 0x0C, 0xC3,
+ 0x02, 0x10, 0x09, 0xC7, 0x09, 0x10, 0x02, 0xC4,
+ 0x0A, 0x70, 0x20, 0x01, 0x0B, 0xC3, 0x0A, 0x20,
+ 0x0E, 0xC8, 0x01, 0x10, 0x08, 0xC4, 0x0D, 0x05,
+ 0x60, 0x81, 0x6E, 0xC4, 0x02, 0x10, 0x05, 0xC9,
+ 0x07, 0x20, 0x0B, 0xC5, 0x8E, 0xA8, 0x17, 0x09,
+ 0x0B, 0xC6, 0x06, 0x20, 0x0C, 0xCA, 0x02, 0x10,
+ 0x01, 0x0B, 0xD1, 0x07, 0x20, 0x05, 0xCB, 0x0C,
+ 0x30, 0x08, 0xCE, 0x0E, 0x05, 0x20, 0x01, 0x0E,
+ 0xCC, 0x0A, 0x30, 0x02, 0x09, 0xCA, 0x8E, 0x71,
+ 0x20, 0x01, 0x0C, 0xCE, 0x0A, 0x50, 0x83, 0x79,
+ 0x2B, 0x9A, 0x96, 0x20, 0x40, 0x01, 0x0C, 0xD0,
+ 0x0D, 0x03, 0x70, 0x70, 0x10, 0x05, 0x0E, 0xD3,
+ 0x0A, 0x03, 0x70, 0x50, 0x04, 0x0B, 0xD7, 0x9D,
+ 0x85, 0x20, 0x50, 0x92, 0x59, 0xE0, 0xDF, 0x1E,
+ 0xC0,
+//ascii 0x0041
+ 0xDB, 0x0E, 0xDC, 0x8A, 0x40, 0xD9, 0x0B, 0x05,
+ 0x30, 0xD6, 0x8C, 0x61, 0x50, 0xD3, 0x8D, 0x82,
+ 0x70, 0x00, 0xD0, 0x8E, 0x93, 0x70, 0x80, 0x49,
+ 0xCF, 0x0A, 0x04, 0x70, 0x90, 0x39, 0xE0, 0xCE,
+ 0x8B, 0x61, 0x70, 0x10, 0x0D, 0xCE, 0x8D, 0x71,
+ 0x70, 0x02, 0x05, 0x20, 0xCC, 0x8E, 0x83, 0x70,
+ 0x82, 0x7D, 0xC0, 0x0C, 0x20, 0xCB, 0x0D, 0x70,
+ 0x81, 0x6C, 0xC3, 0x0C, 0x20, 0xCB, 0x0D, 0x40,
+ 0x81, 0x6B, 0xC6, 0x0C, 0x20, 0xCB, 0x0D, 0x30,
+ 0x02, 0x0D, 0xC8, 0x0C, 0x20, 0xCB, 0x0D, 0x50,
+ 0x83, 0x8E, 0xC5, 0x0C, 0x20, 0xCB, 0x0E, 0x01,
+ 0x70, 0x83, 0x9E, 0xC2, 0x0C, 0x20, 0xCD, 0x8B,
+ 0x51, 0x70, 0x04, 0x09, 0xC0, 0x0C, 0x20, 0xD0,
+ 0x0A, 0x04, 0x70, 0x00, 0x03, 0x20, 0xD2, 0x8E,
+ 0x93, 0x70, 0x10, 0x0A, 0xD4, 0x8D, 0x72, 0x70,
+ 0x81, 0x6B, 0xD4, 0x8C, 0x61, 0x70, 0x81, 0x6C,
+ 0xD4, 0x0B, 0x05, 0x70, 0x00, 0xD7, 0x09, 0x04,
+ 0x50, 0xD9, 0x8E, 0x82, 0x20, 0xDC, 0x8D, 0x71,
+ 0xC0,
+//ascii 0x0042
+ 0xD2, 0xBA, 0x64, 0x57, 0xB0, 0xCD, 0x0A, 0x06,
+ 0x15, 0x08, 0x0E, 0xC3, 0x0C, 0x02, 0x50, 0x03,
+ 0x0E, 0xC9, 0x0B, 0x01, 0x40, 0x01, 0x0A, 0xC1,
+ 0x0C, 0x70, 0x80, 0x1E, 0xC7, 0x0B, 0x70, 0x00,
+ 0x0C, 0xC0, 0x02, 0x70, 0x10, 0x04, 0xC7, 0x01,
+ 0x70, 0x80, 0x3B, 0x20, 0xA3, 0xAD, 0xC6, 0x30,
+ 0x0C, 0xC5, 0x08, 0x20, 0x01, 0x09, 0x1D, 0x09,
+ 0x01, 0x10, 0x04, 0x10, 0x06, 0xC4, 0x09, 0x20,
+ 0x07, 0xC5, 0x03, 0x10, 0x01, 0x0D, 0xC3, 0x0E,
+ 0x01, 0x20, 0x02, 0xC6, 0x02, 0x10, 0x03, 0xC5,
+ 0x20, 0x07, 0xC5, 0x0A, 0x20, 0x08, 0xC6, 0x07,
+ 0x10, 0x01, 0xC4, 0x0E, 0x20, 0x0B, 0xC6, 0x20,
+ 0x0B, 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0D,
+ 0xC6, 0x02, 0x10, 0x0C, 0xC6, 0x0A, 0x20, 0xC4,
+ 0x0D, 0x20, 0x0D, 0xC6, 0x02, 0x10, 0x0C, 0xC6,
+ 0x0A, 0x20, 0xC4, 0x0D, 0x20, 0x0D, 0xC6, 0x02,
+ 0x10, 0x0C, 0xC6, 0x0A, 0x20, 0xC4, 0x0D, 0x20,
+ 0x0D, 0xC6, 0x02, 0x10, 0x0C, 0xC6, 0x0A, 0x20,
+ 0xC4, 0x0D, 0x20, 0x0D, 0xC6, 0x02, 0x10, 0x0C,
+ 0xC6, 0x0A, 0x20, 0xC4, 0x0D, 0x20, 0x0D, 0xC6,
+ 0x02, 0x10, 0x0C, 0xC6, 0x0A, 0x20, 0xC4, 0x0D,
+ 0x20, 0x02, 0x63, 0x20, 0x02, 0x63, 0x02, 0x20,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0043
+ 0xC8, 0x8D, 0x9D, 0xC7, 0x8C, 0x9E, 0xCF, 0x0B,
+ 0x03, 0x10, 0x0B, 0xC7, 0x09, 0x10, 0x05, 0x0D,
+ 0xCC, 0x06, 0x30, 0x0B, 0xC7, 0x09, 0x30, 0x09,
+ 0xCA, 0x05, 0x40, 0x0B, 0xC7, 0x09, 0x40, 0x08,
+ 0xC8, 0x07, 0x30, 0x81, 0x7E, 0xC7, 0x8D, 0x61,
+ 0x30, 0x0B, 0xC6, 0x0D, 0x30, 0x06, 0xCC, 0x0E,
+ 0x04, 0x20, 0x02, 0xC6, 0x06, 0x20, 0x06, 0xCF,
+ 0x03, 0x20, 0x09, 0xC5, 0x01, 0x10, 0x01, 0xD0,
+ 0x0D, 0x20, 0x03, 0xC4, 0x0C, 0x20, 0x08, 0xD1,
+ 0x05, 0x20, 0xC4, 0x09, 0x20, 0x0C, 0xD1, 0x09,
+ 0x20, 0x0C, 0xC3, 0x08, 0x20, 0x0E, 0xD1, 0x0B,
+ 0x20, 0x0B, 0xC3, 0x07, 0x20, 0xD2, 0x0C, 0x20,
+ 0x0A, 0xC3, 0x08, 0x20, 0x0D, 0xD1, 0x0A, 0x20,
+ 0x0B, 0xC3, 0x0B, 0x20, 0x09, 0xD1, 0x06, 0x20,
+ 0x0E, 0xC3, 0x0E, 0x20, 0x03, 0xD1, 0x01, 0x10,
+ 0x01, 0xC5, 0x04, 0x20, 0x09, 0xCF, 0x06, 0x20,
+ 0x06, 0xC5, 0x0B, 0x30, 0x0B, 0xCD, 0x08, 0x30,
+ 0x0D, 0xC6, 0x04, 0x30, 0x07, 0xCA, 0x0E, 0x05,
+ 0x30, 0x07, 0xC7, 0x0E, 0x01, 0x30, 0x91, 0x6B,
+ 0xE0, 0xC3, 0x8E, 0xA5, 0x40, 0x03, 0xC9, 0x0D,
+ 0x02, 0x70, 0x01, 0x70, 0x00, 0x03, 0xCB, 0x0E,
+ 0x04, 0x70, 0x70, 0x06, 0xCE, 0x0B, 0x03, 0x70,
+ 0x30, 0x05, 0x0C, 0xD1, 0x9D, 0x95, 0x30, 0x21,
+ 0xA2, 0x36, 0x9E,
+//ascii 0x0044
+ 0xC9, 0xAE, 0x96, 0x32, 0x11, 0x92, 0x46, 0xA0,
+ 0xD2, 0x0C, 0x04, 0x70, 0x30, 0x06, 0x0E, 0xCE,
+ 0x06, 0x70, 0x70, 0x09, 0xCC, 0x03, 0x70, 0x11,
+ 0x70, 0x06, 0xCA, 0x04, 0x30, 0x91, 0x6B, 0xE0,
+ 0xC3, 0x8D, 0xA5, 0x40, 0x08, 0xC8, 0x09, 0x30,
+ 0x07, 0xCA, 0x0E, 0x04, 0x30, 0x0C, 0xC7, 0x01,
+ 0x20, 0x0A, 0xCD, 0x06, 0x20, 0x04, 0xC6, 0x0A,
+ 0x20, 0x06, 0xCF, 0x03, 0x20, 0x0D, 0xC5, 0x05,
+ 0x20, 0xD0, 0x0B, 0x20, 0x08, 0xC5, 0x01, 0x10,
+ 0x05, 0xD1, 0x02, 0x10, 0x05, 0xC5, 0x20, 0x09,
+ 0xD1, 0x05, 0x10, 0x02, 0xC4, 0x0D, 0x20, 0x0B,
+ 0xD1, 0x08, 0x10, 0x01, 0xC4, 0x0D, 0x20, 0x0C,
+ 0xD1, 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xD1,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xD1, 0x09,
+ 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xD1, 0x09, 0x20,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xD1, 0x09, 0x20, 0xC4,
+ 0x0D, 0x20, 0x02, 0x73, 0x73, 0x13, 0x01, 0x20,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0045
+ 0xC2, 0x2B, 0xD2, 0x0D, 0x29, 0xC4, 0x0D, 0x20,
+ 0x0C, 0xC6, 0x0A, 0x19, 0x0C, 0xC6, 0x09, 0x20,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07,
+ 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC6,
+ 0x03, 0x10, 0x07, 0xC6, 0x09, 0x20, 0xC4, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xC6, 0x09,
+ 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC6, 0x03, 0x10,
+ 0x07, 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C,
+ 0xC6, 0x03, 0x10, 0x07, 0xC6, 0x09, 0x20, 0xC4,
+ 0x0D, 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xC6,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC6, 0x03,
+ 0x10, 0x07, 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20,
+ 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xC6, 0x09, 0x20,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07,
+ 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC6,
+ 0x03, 0x10, 0x07, 0xC6, 0x09, 0x20, 0xC4, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xC6, 0x09,
+ 0x20, 0xC4, 0x0D, 0x20, 0x02, 0x63, 0x01, 0x10,
+ 0x01, 0x63, 0x02, 0x20, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E,
+ 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0046
+ 0xC2, 0x2E, 0xDB, 0x0D, 0x20, 0x0C, 0xDA, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x04, 0x11, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x0C, 0xC6, 0x03, 0x10, 0x07, 0xCF, 0x0D,
+ 0x20, 0x02, 0x63, 0x01, 0x10, 0x01, 0x73, 0x23,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0047
+ 0xC8, 0x0C, 0x08, 0xC3, 0x0B, 0x33, 0x85, 0x8C,
+ 0xCF, 0x0B, 0x03, 0x10, 0x0E, 0xC2, 0x0A, 0x60,
+ 0x03, 0x0B, 0xCC, 0x06, 0x30, 0x0E, 0xC2, 0x0A,
+ 0x70, 0x00, 0x06, 0xCA, 0x05, 0x40, 0x0E, 0xC2,
+ 0x0A, 0x70, 0x10, 0x05, 0xC8, 0x08, 0x40, 0x06,
+ 0xC3, 0x0A, 0x10, 0x02, 0xC0, 0x8D, 0x82, 0x30,
+ 0x09, 0xC6, 0x0E, 0x30, 0x04, 0x0E, 0xC4, 0x0A,
+ 0x10, 0x02, 0xC3, 0x06, 0x20, 0x01, 0x0E, 0xC5,
+ 0x06, 0x20, 0x04, 0xC6, 0x0A, 0x10, 0x02, 0xC4,
+ 0x05, 0x20, 0x08, 0xC5, 0x01, 0x10, 0x01, 0xC7,
+ 0x0A, 0x10, 0x02, 0xC4, 0x0E, 0x01, 0x10, 0x02,
+ 0xC4, 0x0C, 0x20, 0x08, 0xC7, 0x0A, 0x10, 0x02,
+ 0xC5, 0x06, 0x20, 0x0E, 0xC3, 0x09, 0x20, 0x0C,
+ 0xC7, 0x0A, 0x10, 0x02, 0xC5, 0x0A, 0x20, 0x0C,
+ 0xC3, 0x08, 0x20, 0x0E, 0xC7, 0x0D, 0x18, 0x0A,
+ 0xC5, 0x0C, 0x20, 0x0A, 0xC3, 0x07, 0x20, 0xD2,
+ 0x0C, 0x20, 0x0A, 0xC3, 0x08, 0x20, 0x0D, 0xD1,
+ 0x0A, 0x20, 0x0C, 0xC3, 0x0B, 0x20, 0x09, 0xD1,
+ 0x06, 0x20, 0x0E, 0xC3, 0x0E, 0x20, 0x03, 0xD1,
+ 0x01, 0x10, 0x01, 0xC5, 0x04, 0x20, 0x09, 0xCF,
+ 0x06, 0x20, 0x06, 0xC5, 0x0B, 0x30, 0x0B, 0xCD,
+ 0x08, 0x30, 0x0D, 0xC6, 0x04, 0x30, 0x07, 0xCA,
+ 0x0E, 0x05, 0x30, 0x07, 0xC7, 0x0E, 0x01, 0x30,
+ 0x91, 0x6B, 0xE0, 0xC3, 0x8D, 0xA5, 0x40, 0x03,
+ 0xC9, 0x0D, 0x01, 0x70, 0x01, 0x70, 0x00, 0x03,
+ 0xCB, 0x0E, 0x04, 0x70, 0x70, 0x06, 0xCE, 0x0B,
+ 0x03, 0x70, 0x30, 0x04, 0x0C, 0xD1, 0x9D, 0x95,
+ 0x30, 0x31, 0x93, 0x69, 0xE0,
+//ascii 0x0048
+ 0xC1, 0x0D, 0x72, 0x72, 0x72, 0x12, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC5, 0x7E, 0x2E, 0x03, 0x10, 0x06, 0x7E, 0x2E,
+ 0xD0, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xDB, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xDB, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xDB, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xDB, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xDB, 0x03, 0x10, 0x07, 0xDB, 0x03, 0x10, 0x07,
+ 0xCF, 0x0D, 0x73, 0x23, 0x01, 0x10, 0x01, 0x73,
+ 0x23, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70,
+ 0x70, 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E, 0x1E,
+ 0xC0,
+//ascii 0x0049
+ 0xC1, 0x0D, 0x73, 0x73, 0x73, 0x13, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x004A
+ 0xC1, 0x0D, 0x70, 0x70, 0x20, 0x91, 0x48, 0xE0,
+ 0xC7, 0x0D, 0x70, 0x70, 0x60, 0x09, 0xC6, 0x0D,
+ 0x70, 0x70, 0x70, 0x08, 0xC5, 0x0D, 0x71, 0x71,
+ 0x21, 0x50, 0x0C, 0xD9, 0x0C, 0x04, 0x20, 0x04,
+ 0xDB, 0x05, 0x20, 0xDB, 0x0D, 0x20, 0x0C, 0xDB,
+ 0x20, 0x0B, 0xDB, 0x20, 0x0B, 0xDA, 0x0C, 0x20,
+ 0x0C, 0xDA, 0x03, 0x20, 0xD8, 0x8E, 0xB3, 0x20,
+ 0x04, 0xD8, 0x07, 0x40, 0x0C, 0xD8, 0x07, 0x30,
+ 0x07, 0xD9, 0x07, 0x20, 0x08, 0xDA, 0x9A, 0x58,
+ 0xE0,
+//ascii 0x004B
+ 0xE1, 0x0D, 0x08, 0xD6, 0x0E, 0x04, 0xC4, 0x8D,
+ 0x07, 0xD4, 0x8B, 0x10, 0xC4, 0x0D, 0x10, 0x05,
+ 0xD2, 0x07, 0x20, 0xC4, 0x0D, 0x20, 0x04, 0xCF,
+ 0x0E, 0x03, 0x30, 0xC4, 0x0D, 0x30, 0x03, 0x0E,
+ 0xCC, 0x0A, 0x01, 0x30, 0x02, 0xC5, 0x08, 0x30,
+ 0x02, 0x0D, 0xCA, 0x06, 0x40, 0x05, 0xC7, 0x0A,
+ 0x30, 0x01, 0x0C, 0xC7, 0x0D, 0x02, 0x40, 0x09,
+ 0xC9, 0x0C, 0x01, 0x30, 0x0B, 0xC5, 0x09, 0x40,
+ 0x03, 0x0D, 0xCB, 0x0D, 0x02, 0x30, 0x09, 0xC3,
+ 0x05, 0x40, 0x07, 0xCE, 0x0E, 0x03, 0x30, 0x07,
+ 0xC0, 0x0C, 0x02, 0x30, 0x01, 0x0B, 0xD1, 0x04,
+ 0x30, 0x04, 0x40, 0x04, 0x0E, 0xD3, 0x06, 0x70,
+ 0x08, 0xD6, 0x08, 0x40, 0x02, 0x0C, 0xD8, 0x0A,
+ 0x30, 0x04, 0xDA, 0x0C, 0x01, 0x20, 0x03, 0x0E,
+ 0xD9, 0x0D, 0x01, 0x20, 0x02, 0x0D, 0xCC, 0x0D,
+ 0x73, 0x33, 0x01, 0x30, 0x01, 0x73, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x004C
+ 0xD8, 0x0B, 0x25, 0xDB, 0x09, 0x20, 0xDB, 0x09,
+ 0x20, 0xDB, 0x09, 0x20, 0xDB, 0x09, 0x20, 0xDB,
+ 0x09, 0x20, 0xDB, 0x09, 0x20, 0xDB, 0x09, 0x20,
+ 0xDB, 0x09, 0x20, 0xDB, 0x09, 0x20, 0xDB, 0x09,
+ 0x20, 0xDB, 0x09, 0x20, 0xC4, 0x0D, 0x73, 0x73,
+ 0x53, 0x02, 0x20, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E, 0x7E,
+ 0x7E, 0x1E, 0xC0,
+//ascii 0x004D
+ 0xC2, 0x79, 0x79, 0x79, 0x19, 0xC4, 0x0D, 0x70,
+ 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x60, 0x07, 0x7B, 0x7B, 0x1B, 0xC5, 0x06,
+ 0x60, 0x03, 0x09, 0xD7, 0x09, 0x02, 0x50, 0x81,
+ 0x6D, 0xD6, 0x0C, 0x05, 0x60, 0x03, 0x0A, 0xD6,
+ 0x8E, 0x82, 0x50, 0x81, 0x7D, 0xD6, 0x0B, 0x04,
+ 0x60, 0x04, 0x0A, 0xD6, 0x8E, 0x71, 0x50, 0x81,
+ 0x7E, 0xD6, 0x0A, 0x04, 0x60, 0x04, 0x0B, 0xD6,
+ 0x8D, 0x61, 0x50, 0x02, 0xD8, 0x09, 0x01, 0x40,
+ 0xD7, 0x0B, 0x04, 0x50, 0xD4, 0x8E, 0x82, 0x50,
+ 0x01, 0x07, 0xD2, 0x0C, 0x05, 0x60, 0x03, 0x09,
+ 0xD2, 0x09, 0x02, 0x60, 0x06, 0x0C, 0xD1, 0x0C,
+ 0x06, 0x60, 0x02, 0x09, 0xD2, 0x09, 0x03, 0x60,
+ 0x05, 0x0C, 0xD1, 0x8D, 0x71, 0x50, 0x82, 0x8E,
+ 0xD1, 0x0A, 0x04, 0x60, 0x04, 0x0B, 0xD2, 0x0E,
+ 0x01, 0x50, 0x81, 0x8E, 0xD4, 0x0D, 0x60, 0x05,
+ 0x76, 0x76, 0x16, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E, 0x7E,
+ 0x7E, 0x1E, 0xC0,
+//ascii 0x004E
+ 0xE1, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x71, 0x71, 0x21, 0x50,
+ 0x02, 0xD7, 0x08, 0x40, 0x05, 0xD6, 0x0E, 0x04,
+ 0x30, 0x01, 0x0A, 0xD6, 0x0A, 0x01, 0x30, 0x04,
+ 0x0E, 0xD5, 0x0E, 0x05, 0x40, 0x09, 0xD6, 0x0B,
+ 0x01, 0x30, 0x03, 0x0D, 0xD6, 0x06, 0x40, 0x08,
+ 0xD6, 0x0C, 0x02, 0x30, 0x02, 0x0C, 0xD6, 0x07,
+ 0x40, 0x06, 0xD6, 0x0D, 0x03, 0x30, 0x01, 0x0B,
+ 0xD6, 0x08, 0x40, 0x05, 0xD6, 0x0E, 0x04, 0x30,
+ 0x01, 0x0A, 0xD6, 0x0A, 0x01, 0x30, 0x04, 0x0E,
+ 0xD6, 0x05, 0x40, 0x09, 0xD6, 0x0E, 0x01, 0x40,
+ 0x01, 0x73, 0x73, 0x23, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E,
+ 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x004F
+ 0xCA, 0x9E, 0xB8, 0x70, 0x16, 0x87, 0x9B, 0xD4,
+ 0x09, 0x03, 0x70, 0x10, 0x04, 0x0A, 0xCF, 0x0A,
+ 0x01, 0x70, 0x50, 0x02, 0x0C, 0xCC, 0x06, 0x70,
+ 0x70, 0x10, 0x08, 0xCA, 0x05, 0x40, 0x91, 0x58,
+ 0xA0, 0x1B, 0x9A, 0x85, 0x10, 0x40, 0x08, 0xC8,
+ 0x08, 0x30, 0x02, 0x0A, 0xC9, 0x09, 0x01, 0x30,
+ 0x0B, 0xC6, 0x0D, 0x30, 0x06, 0xCD, 0x04, 0x20,
+ 0x01, 0xC6, 0x06, 0x20, 0x05, 0xCF, 0x03, 0x20,
+ 0x09, 0xC5, 0x01, 0x10, 0x01, 0xD0, 0x0D, 0x20,
+ 0x03, 0xC4, 0x0C, 0x20, 0x07, 0xD1, 0x05, 0x20,
+ 0xC4, 0x09, 0x20, 0x0C, 0xD1, 0x09, 0x20, 0x0C,
+ 0xC3, 0x08, 0x20, 0x0E, 0xD1, 0x0B, 0x20, 0x0B,
+ 0xC3, 0x07, 0x20, 0xD2, 0x0C, 0x20, 0x0A, 0xC3,
+ 0x08, 0x20, 0x0D, 0xD1, 0x0A, 0x20, 0x0B, 0xC3,
+ 0x0B, 0x20, 0x09, 0xD1, 0x06, 0x20, 0x0E, 0xC3,
+ 0x0E, 0x20, 0x03, 0xD1, 0x01, 0x10, 0x01, 0xC5,
+ 0x04, 0x20, 0x09, 0xCF, 0x07, 0x20, 0x07, 0xC5,
+ 0x0B, 0x30, 0x0B, 0xCD, 0x08, 0x30, 0x0E, 0xC6,
+ 0x04, 0x30, 0x07, 0xCA, 0x0E, 0x05, 0x30, 0x07,
+ 0xC7, 0x0E, 0x01, 0x30, 0x91, 0x6B, 0xE0, 0xC3,
+ 0x8E, 0xA5, 0x40, 0x03, 0xC9, 0x0D, 0x02, 0x70,
+ 0x01, 0x70, 0x00, 0x03, 0xCB, 0x0E, 0x04, 0x70,
+ 0x70, 0x06, 0xCE, 0x0B, 0x03, 0x70, 0x30, 0x05,
+ 0x0C, 0xD1, 0x9D, 0x95, 0x30, 0x21, 0xA2, 0x36,
+ 0x9E,
+//ascii 0x0050
+ 0xC8, 0x0E, 0x1C, 0x0D, 0xD9, 0x08, 0x02, 0x40,
+ 0x04, 0x0B, 0xD4, 0x0C, 0x01, 0x70, 0x00, 0x05,
+ 0xD2, 0x0C, 0x70, 0x30, 0x03, 0xD1, 0x02, 0x30,
+ 0x01, 0x14, 0x03, 0x40, 0x08, 0xCF, 0x09, 0x20,
+ 0x01, 0x0A, 0xC3, 0x0E, 0x06, 0x20, 0x01, 0xCF,
+ 0x04, 0x20, 0x0C, 0xC6, 0x06, 0x20, 0x0A, 0xCE,
+ 0x20, 0x05, 0xC8, 0x01, 0x10, 0x06, 0xCD, 0x0E,
+ 0x20, 0x0A, 0xC8, 0x05, 0x10, 0x04, 0xCD, 0x0D,
+ 0x20, 0x0C, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x0D, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x0D, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x0D, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x0D, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x0D, 0xC8, 0x07, 0x10, 0x03, 0xCD, 0x0D,
+ 0x20, 0x02, 0x73, 0x03, 0x01, 0x20, 0x73, 0x03,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0051
+ 0xCA, 0x9E, 0xB8, 0x70, 0x16, 0x87, 0x9B, 0xD4,
+ 0x09, 0x03, 0x70, 0x10, 0x04, 0x0A, 0xC6, 0x0D,
+ 0x0C, 0xC6, 0x0A, 0x01, 0x70, 0x50, 0x02, 0x0C,
+ 0xC3, 0x8A, 0x1A, 0xC5, 0x06, 0x70, 0x70, 0x10,
+ 0x08, 0xC1, 0x06, 0x10, 0x0A, 0xC4, 0x05, 0x40,
+ 0x91, 0x58, 0xA0, 0x1B, 0x9A, 0x85, 0x10, 0x40,
+ 0x07, 0x03, 0x20, 0x0A, 0xC3, 0x08, 0x30, 0x02,
+ 0x0A, 0xC9, 0x09, 0x01, 0x60, 0x02, 0x0E, 0xC2,
+ 0x0D, 0x30, 0x06, 0xCD, 0x04, 0x40, 0x05, 0xC4,
+ 0x06, 0x20, 0x05, 0xCE, 0x05, 0x30, 0x05, 0xC5,
+ 0x01, 0x10, 0x01, 0xCD, 0x0D, 0x02, 0x40, 0x03,
+ 0xC4, 0x0C, 0x20, 0x07, 0xCC, 0x0B, 0x01, 0x20,
+ 0x01, 0x20, 0xC4, 0x09, 0x20, 0x0C, 0xCC, 0x08,
+ 0x20, 0x19, 0x20, 0x0C, 0xC3, 0x08, 0x20, 0x0E,
+ 0xCC, 0x98, 0x02, 0xC0, 0xC0, 0x0B, 0x20, 0x0B,
+ 0xC3, 0x07, 0x20, 0xCD, 0x08, 0x04, 0xC2, 0x0C,
+ 0x20, 0x0A, 0xC3, 0x08, 0x20, 0x0D, 0xCC, 0x0D,
+ 0xC3, 0x0A, 0x20, 0x0B, 0xC3, 0x0B, 0x20, 0x09,
+ 0xD1, 0x06, 0x20, 0x0E, 0xC3, 0x0E, 0x20, 0x03,
+ 0xD1, 0x01, 0x10, 0x01, 0xC5, 0x04, 0x20, 0x09,
+ 0xCF, 0x07, 0x20, 0x07, 0xC5, 0x0B, 0x30, 0x0B,
+ 0xCD, 0x08, 0x30, 0x0E, 0xC6, 0x04, 0x30, 0x07,
+ 0xCA, 0x0E, 0x05, 0x30, 0x07, 0xC7, 0x0E, 0x01,
+ 0x30, 0x91, 0x6B, 0xE0, 0xC3, 0x8E, 0xA5, 0x40,
+ 0x03, 0xC9, 0x0D, 0x02, 0x70, 0x01, 0x70, 0x00,
+ 0x03, 0xCB, 0x0E, 0x04, 0x70, 0x70, 0x06, 0xCE,
+ 0x0B, 0x03, 0x70, 0x30, 0x05, 0x0C, 0xD1, 0x9D,
+ 0x95, 0x30, 0x21, 0xA2, 0x36, 0x9E,
+//ascii 0x0052
+ 0xE8, 0x0E, 0x1C, 0x0E, 0xCD, 0x09, 0x01, 0xC8,
+ 0x8E, 0x61, 0x30, 0x81, 0x6E, 0xC8, 0x0A, 0x02,
+ 0x10, 0xC7, 0x0A, 0x70, 0x10, 0x0A, 0xC5, 0x0C,
+ 0x03, 0x30, 0xC6, 0x0B, 0x70, 0x30, 0x0B, 0xC2,
+ 0x0D, 0x05, 0x50, 0xC6, 0x01, 0x30, 0x02, 0x14,
+ 0x02, 0x30, 0x02, 0xC0, 0x0E, 0x06, 0x50, 0x01,
+ 0x08, 0xC5, 0x08, 0x20, 0x02, 0x0C, 0xC3, 0x0C,
+ 0x02, 0x20, 0x04, 0x01, 0x50, 0x07, 0xC7, 0x03,
+ 0x20, 0x0D, 0xC5, 0x0D, 0x70, 0x80, 0x6E, 0xC8,
+ 0x20, 0x06, 0xC7, 0x05, 0x50, 0x04, 0x0D, 0xC9,
+ 0x0E, 0x20, 0x0A, 0xC7, 0x09, 0x30, 0x03, 0x0C,
+ 0xCB, 0x0D, 0x20, 0x0C, 0xC7, 0x0B, 0x20, 0x0A,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC7, 0x0B, 0x20, 0x0E,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC7, 0x0B, 0x20, 0x0E,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC7, 0x0B, 0x20, 0x0E,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC7, 0x0B, 0x20, 0x0E,
+ 0xCD, 0x0D, 0x20, 0x0D, 0xC7, 0x0B, 0x20, 0x0E,
+ 0xCD, 0x0D, 0x20, 0x02, 0x73, 0x02, 0x20, 0x02,
+ 0x73, 0x03, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E, 0x7E, 0x7E,
+ 0x1E, 0xC0,
+//ascii 0x0053
+ 0xD3, 0x0C, 0x1B, 0x0E, 0xCD, 0x9E, 0x73, 0x50,
+ 0xC7, 0x08, 0x01, 0x30, 0x03, 0x0B, 0xCA, 0x0A,
+ 0x01, 0x10, 0x05, 0xC6, 0x04, 0x70, 0x07, 0xC8,
+ 0x0A, 0x30, 0x05, 0xC5, 0x06, 0x70, 0x10, 0x09,
+ 0xC6, 0x0E, 0x01, 0x30, 0x06, 0xC4, 0x0C, 0x30,
+ 0x93, 0x65, 0x10, 0x30, 0x0E, 0xC5, 0x06, 0x20,
+ 0x03, 0x0D, 0xC5, 0x05, 0x20, 0x06, 0xC2, 0x0E,
+ 0x03, 0x20, 0x07, 0xC5, 0x01, 0x10, 0x02, 0xC6,
+ 0x0E, 0x20, 0x02, 0xC4, 0x0E, 0x01, 0x10, 0x01,
+ 0xC4, 0x0C, 0x20, 0x0A, 0xC6, 0x0A, 0x20, 0x0A,
+ 0xC5, 0x07, 0x20, 0x0D, 0xC3, 0x09, 0x20, 0xC7,
+ 0x05, 0x20, 0xC6, 0x0C, 0x20, 0x0B, 0xC3, 0x08,
+ 0x10, 0x01, 0xC7, 0x01, 0x10, 0x04, 0xC7, 0x20,
+ 0x0A, 0xC3, 0x07, 0x10, 0x02, 0xC6, 0x0D, 0x20,
+ 0x08, 0xC7, 0x20, 0x09, 0xC3, 0x08, 0x10, 0x01,
+ 0xC6, 0x08, 0x20, 0x0D, 0xC6, 0x0E, 0x20, 0x0A,
+ 0xC3, 0x0B, 0x20, 0x0D, 0xC5, 0x03, 0x10, 0x01,
+ 0xC7, 0x0B, 0x20, 0x0B, 0xC3, 0x0E, 0x20, 0x06,
+ 0xC4, 0x0B, 0x20, 0x06, 0xC7, 0x06, 0x20, 0x0E,
+ 0xC4, 0x04, 0x20, 0x0A, 0xC2, 0x0E, 0x02, 0x20,
+ 0x0C, 0xC6, 0x0D, 0x20, 0x02, 0xC5, 0x0B, 0x30,
+ 0x94, 0x87, 0x10, 0x20, 0x03, 0xC6, 0x0B, 0x01,
+ 0x20, 0x08, 0xC6, 0x05, 0x70, 0x10, 0x0C, 0xC4,
+ 0x0D, 0x01, 0x30, 0x02, 0xC8, 0x04, 0x70, 0x09,
+ 0xC5, 0x0C, 0x40, 0x0C, 0xC9, 0x08, 0x01, 0x30,
+ 0x01, 0x0A, 0xC6, 0x0C, 0x20, 0x01, 0x0B, 0xCC,
+ 0x0B, 0x19, 0x0B, 0xC8, 0xAC, 0x02, 0x7E,
+//ascii 0x0054
+ 0xC1, 0x0D, 0x22, 0x0D, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x04, 0x75, 0x75, 0x55, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70,
+ 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x20, 0x09, 0x7C, 0x7C, 0x5C,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDA, 0x0D, 0x20, 0x0C,
+ 0xDA, 0x0D, 0x20, 0x0C, 0xDB, 0x29, 0x0E, 0xC0,
+//ascii 0x0055
+ 0xC1, 0x0E, 0x75, 0x75, 0x15, 0x07, 0x0A, 0xCA,
+ 0x0D, 0x70, 0x70, 0x40, 0x06, 0xC8, 0x0D, 0x70,
+ 0x70, 0x50, 0x02, 0x0D, 0xC6, 0x0D, 0x70, 0x70,
+ 0x60, 0x01, 0x0E, 0xC6, 0x7B, 0x7B, 0x1B, 0x08,
+ 0x02, 0x30, 0x03, 0xDA, 0x08, 0x30, 0x0A, 0xDA,
+ 0x08, 0x20, 0x04, 0xDB, 0x02, 0x20, 0xDB, 0x08,
+ 0x20, 0x0C, 0xDA, 0x0C, 0x20, 0x0A, 0xDA, 0x0D,
+ 0x20, 0x09, 0xDA, 0x0D, 0x20, 0x09, 0xDA, 0x0A,
+ 0x20, 0x0B, 0xDA, 0x05, 0x20, 0x0D, 0xD9, 0x0D,
+ 0x20, 0x01, 0xD9, 0x0E, 0x02, 0x20, 0x07, 0xD8,
+ 0x09, 0x01, 0x20, 0x01, 0x0E, 0xC4, 0x0D, 0x73,
+ 0x73, 0x03, 0x02, 0x50, 0x09, 0xC5, 0x0D, 0x70,
+ 0x70, 0x60, 0x07, 0xC6, 0x0D, 0x70, 0x70, 0x40,
+ 0x01, 0x09, 0xC7, 0x0D, 0x70, 0x70, 0x20, 0x83,
+ 0x8E, 0xC9, 0x7E, 0x7E, 0x1E, 0xC0,
+//ascii 0x0056
+ 0xE1, 0x9D, 0x05, 0xB0, 0xDB, 0x0D, 0x20, 0x81,
+ 0x6C, 0xD8, 0x0D, 0x50, 0x82, 0x7D, 0xD5, 0x0D,
+ 0x70, 0x90, 0x39, 0xE0, 0xD3, 0x8D, 0x72, 0x70,
+ 0x80, 0x4A, 0xD4, 0x8C, 0x72, 0x70, 0x81, 0x6B,
+ 0xD4, 0x8C, 0x61, 0x70, 0x81, 0x7D, 0xD4, 0x8C,
+ 0x61, 0x70, 0x82, 0x8E, 0xD4, 0x8B, 0x61, 0x70,
+ 0x04, 0x09, 0xD5, 0x8B, 0x51, 0x70, 0xD7, 0x0A,
+ 0x05, 0x50, 0xD9, 0x0B, 0x01, 0x30, 0xD6, 0x8D,
+ 0x72, 0x50, 0xD3, 0x8D, 0x82, 0x70, 0x02, 0xD0,
+ 0x8D, 0x82, 0x70, 0x81, 0x7C, 0xCE, 0x8E, 0x83,
+ 0x70, 0x80, 0x5B, 0xCE, 0x8E, 0x93, 0x70, 0x80,
+ 0x4A, 0xCE, 0x8E, 0x94, 0x70, 0x90, 0x39, 0xE0,
+ 0xCE, 0x09, 0x04, 0x70, 0x90, 0x27, 0xD0, 0xD0,
+ 0x0D, 0x70, 0x81, 0x6C, 0xD3, 0x0D, 0x50, 0x05,
+ 0x0B, 0xD6, 0x0D, 0x20, 0x03, 0x09, 0xD9, 0x9D,
+ 0x28, 0xE0,
+//ascii 0x0057
+ 0xC2, 0x0C, 0xDD, 0xBD, 0x01, 0x49, 0xD0, 0xD9,
+ 0x0D, 0x40, 0x82, 0x6B, 0xD6, 0x0D, 0x70, 0x90,
+ 0x48, 0xC0, 0xD2, 0x0E, 0x02, 0x70, 0x20, 0x91,
+ 0x5A, 0xE0, 0xD0, 0x9E, 0xA6, 0x20, 0x70, 0x20,
+ 0x83, 0x7C, 0xD1, 0x9E, 0xA6, 0x20, 0x70, 0x10,
+ 0x91, 0x49, 0xD0, 0xD1, 0x9E, 0xA6, 0x20, 0x70,
+ 0x10, 0x82, 0x6B, 0xD2, 0x9E, 0xA6, 0x20, 0x70,
+ 0x00, 0xD6, 0x8E, 0xA6, 0x50, 0xD6, 0x8B, 0x73,
+ 0x50, 0xD2, 0x8C, 0x84, 0x70, 0x00, 0x01, 0xCE,
+ 0x9D, 0x95, 0x10, 0x70, 0x90, 0x48, 0xD0, 0xCB,
+ 0x9E, 0x95, 0x10, 0x70, 0x90, 0x26, 0xB0, 0xCB,
+ 0x9E, 0xA6, 0x20, 0x70, 0x10, 0x84, 0x9D, 0xCC,
+ 0x0E, 0x03, 0x70, 0x10, 0x82, 0x7B, 0xD0, 0x0D,
+ 0x60, 0x91, 0x59, 0xE0, 0xD3, 0x0D, 0x50, 0x04,
+ 0x0D, 0xD6, 0x0D, 0x70, 0x82, 0x6A, 0xD4, 0x06,
+ 0x02, 0x70, 0x10, 0x84, 0x8C, 0xD2, 0x9D, 0x95,
+ 0x10, 0x70, 0xA0, 0x15, 0xAE, 0xD2, 0x9D, 0x84,
+ 0x10, 0x70, 0x90, 0x38, 0xC0, 0xD3, 0x8C, 0x84,
+ 0x70, 0xA0, 0x15, 0x9E, 0xD3, 0x8B, 0x73, 0x70,
+ 0x00, 0xD7, 0x0A, 0x06, 0x50, 0xD5, 0x9E, 0xA6,
+ 0x20, 0x50, 0xD1, 0x9E, 0xB7, 0x30, 0x70, 0x10,
+ 0xCE, 0x8B, 0x73, 0x70, 0x10, 0x91, 0x59, 0xE0,
+ 0xCA, 0x8B, 0x73, 0x70, 0x20, 0x83, 0x8C, 0xCA,
+ 0x8B, 0x73, 0x70, 0x20, 0x81, 0x6A, 0xCC, 0x0D,
+ 0x70, 0x30, 0x84, 0x8D, 0xCF, 0x0D, 0x70, 0x82,
+ 0x7B, 0xD3, 0x0D, 0x30, 0x91, 0x59, 0xE0, 0xD6,
+ 0xAD, 0x03, 0x8C, 0xC0,
+//ascii 0x0058
+ 0xC1, 0x0D, 0x08, 0xD6, 0x0E, 0x05, 0xC4, 0x9D,
+ 0x02, 0xC0, 0xD3, 0x89, 0x10, 0xC4, 0x0D, 0x20,
+ 0x06, 0xD0, 0x0D, 0x03, 0x20, 0xC4, 0x0D, 0x30,
+ 0x01, 0x0A, 0xCD, 0x07, 0x40, 0xC4, 0x0E, 0x01,
+ 0x40, 0x04, 0x0D, 0xC9, 0x0B, 0x02, 0x40, 0x02,
+ 0xC5, 0x0E, 0x05, 0x50, 0x07, 0xC6, 0x0E, 0x05,
+ 0x50, 0x07, 0xC8, 0x0B, 0x02, 0x40, 0x02, 0x0B,
+ 0xC3, 0x09, 0x01, 0x40, 0x03, 0x0D, 0xCB, 0x08,
+ 0x50, 0x95, 0xED, 0x40, 0x40, 0x01, 0x09, 0xCE,
+ 0x0E, 0x04, 0x40, 0x01, 0x50, 0x05, 0x0E, 0xD1,
+ 0x0B, 0x02, 0x70, 0x02, 0x0B, 0xD5, 0x07, 0x50,
+ 0x07, 0xD7, 0x07, 0x50, 0x08, 0xD5, 0x0B, 0x02,
+ 0x70, 0x02, 0x0C, 0xD1, 0x0E, 0x05, 0x40, 0x02,
+ 0x01, 0x40, 0x06, 0x0E, 0xCE, 0x08, 0x01, 0x40,
+ 0x07, 0xC0, 0x0E, 0x05, 0x40, 0x01, 0x09, 0xCB,
+ 0x0C, 0x02, 0x40, 0x03, 0x0D, 0xC3, 0x0B, 0x02,
+ 0x40, 0x04, 0x0D, 0xC7, 0x0E, 0x05, 0x40, 0x01,
+ 0x09, 0xC7, 0x07, 0x50, 0x07, 0xC5, 0x0E, 0x01,
+ 0x40, 0x04, 0x0E, 0xC9, 0x0C, 0x03, 0x40, 0x02,
+ 0xC4, 0x0D, 0x30, 0x01, 0x0A, 0xCD, 0x08, 0x40,
+ 0xC4, 0x0D, 0x20, 0x06, 0xD0, 0x0D, 0x04, 0x20,
+ 0xC4, 0x9D, 0x02, 0xC0, 0xD3, 0x89, 0x10, 0xC4,
+ 0x0D, 0x08, 0xD6, 0x0E, 0x05, 0xC0,
+//ascii 0x0059
+ 0xC1, 0x0E, 0x0A, 0xDD, 0x9D, 0x04, 0xD0, 0xDB,
+ 0x0D, 0x20, 0x06, 0xDA, 0x0D, 0x30, 0x01, 0x0A,
+ 0xD8, 0x0E, 0x50, 0x03, 0x0D, 0xD7, 0x0E, 0x05,
+ 0x50, 0x06, 0xD8, 0x0C, 0x03, 0x40, 0x01, 0x09,
+ 0xD8, 0x0A, 0x01, 0x40, 0x03, 0x0C, 0xD8, 0x07,
+ 0x50, 0x06, 0xD8, 0x0E, 0x05, 0x40, 0x01, 0x09,
+ 0x7B, 0x1B, 0xCE, 0x0C, 0x03, 0x70, 0x60, 0xD0,
+ 0x07, 0x70, 0x50, 0xCF, 0x08, 0x01, 0x70, 0x50,
+ 0xCD, 0x0B, 0x02, 0x40, 0x03, 0x76, 0x16, 0xCB,
+ 0x0D, 0x04, 0x40, 0x01, 0x0A, 0xD5, 0x06, 0x50,
+ 0x07, 0xD5, 0x09, 0x01, 0x40, 0x04, 0x0D, 0xD4,
+ 0x0B, 0x02, 0x40, 0x02, 0x0A, 0xD5, 0x04, 0x50,
+ 0x07, 0xD6, 0x0D, 0x40, 0x04, 0x0D, 0xD7, 0x0D,
+ 0x20, 0x02, 0x0A, 0xD9, 0x0D, 0x10, 0x07, 0xDB,
+ 0x8D, 0x4D, 0xC0,
+//ascii 0x005A
+ 0xC1, 0x0E, 0x13, 0x05, 0x0E, 0xD1, 0x0A, 0x21,
+ 0xC4, 0x0D, 0x20, 0x01, 0x0A, 0xD0, 0x09, 0x20,
+ 0xC4, 0x0D, 0x40, 0x05, 0x0E, 0xCE, 0x09, 0x20,
+ 0xC4, 0x0D, 0x50, 0x01, 0x0A, 0xCD, 0x09, 0x20,
+ 0xC4, 0x0D, 0x70, 0x05, 0xCC, 0x09, 0x20, 0xC4,
+ 0x0D, 0x20, 0x09, 0x02, 0x30, 0x01, 0x0B, 0xCA,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC0, 0x07,
+ 0x40, 0x06, 0xC9, 0x09, 0x20, 0xC4, 0x0D, 0x20,
+ 0x0C, 0xC1, 0x0C, 0x02, 0x30, 0x02, 0x0C, 0xC7,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC3, 0x06,
+ 0x40, 0x07, 0xC6, 0x09, 0x20, 0xC4, 0x0D, 0x20,
+ 0x0C, 0xC4, 0x0B, 0x01, 0x30, 0x02, 0x0D, 0xC4,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC6, 0x05,
+ 0x40, 0x08, 0xC3, 0x09, 0x20, 0xC4, 0x0D, 0x20,
+ 0x0C, 0xC7, 0x0A, 0x01, 0x30, 0x03, 0x0D, 0xC1,
+ 0x09, 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xC8, 0x0E,
+ 0x04, 0x40, 0x09, 0xC0, 0x09, 0x20, 0xC4, 0x0D,
+ 0x20, 0x0C, 0xCA, 0x09, 0x01, 0x30, 0x04, 0x07,
+ 0x20, 0xC4, 0x0D, 0x20, 0x0C, 0xCB, 0x0E, 0x03,
+ 0x70, 0xC4, 0x0D, 0x20, 0x0C, 0xCD, 0x08, 0x60,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xCE, 0x0D, 0x03, 0x40,
+ 0xC4, 0x0D, 0x20, 0x0C, 0xD0, 0x08, 0x30, 0xC4,
+ 0x0D, 0x21, 0x0D, 0xD1, 0x0C, 0x04, 0x13, 0xC0,
+//ascii 0x005B
+ 0xC1, 0x18, 0x09, 0xD9, 0x0B, 0x18, 0x0C, 0xC1,
+ 0x0D, 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1,
+ 0x0D, 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1,
+ 0x0D, 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1,
+ 0x0D, 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1,
+ 0x0D, 0x20, 0x74, 0x74, 0x74, 0x14, 0x02, 0x10,
+ 0x09, 0xC1, 0x0D, 0x70, 0x70, 0x70, 0x70, 0x09,
+ 0xC1, 0x0D, 0x70, 0x70, 0x70, 0x70, 0x09, 0xC1,
+ 0x0E, 0x72, 0x72, 0x72, 0x72, 0x0A, 0xC0,
+//ascii 0x005C
+ 0xDE, 0x0D, 0x0A, 0xDE, 0xAA, 0x62, 0x01, 0xDA,
+ 0x8C, 0x73, 0x40, 0x01, 0xD6, 0x8D, 0x84, 0x70,
+ 0x00, 0x01, 0xD2, 0x9E, 0xA5, 0x10, 0x70, 0x90,
+ 0x38, 0xC0, 0xD0, 0x8B, 0x72, 0x70, 0x90, 0x26,
+ 0xB0, 0xD0, 0x8C, 0x84, 0x70, 0xA0, 0x15, 0x9E,
+ 0xCF, 0x9D, 0x95, 0x10, 0x70, 0x90, 0x48, 0xC0,
+ 0xD0, 0x8A, 0x62, 0x70, 0x90, 0x37, 0xB0, 0xD3,
+ 0x09, 0x70, 0x91, 0x6A, 0xE0, 0xD6, 0x09, 0x30,
+ 0x91, 0x49, 0xD0, 0xDA, 0xA9, 0x03, 0x8C, 0xDE,
+ 0x0E,
+//ascii 0x005D
+ 0xC1, 0x78, 0x78, 0x78, 0x78, 0x0C, 0xC1, 0x0D,
+ 0x70, 0x70, 0x70, 0x70, 0x09, 0xC1, 0x0D, 0x70,
+ 0x70, 0x70, 0x70, 0x09, 0xC1, 0x0D, 0x70, 0x70,
+ 0x70, 0x70, 0x09, 0xC1, 0x0D, 0x10, 0x02, 0x7D,
+ 0x7D, 0x7D, 0x1D, 0x06, 0x10, 0x09, 0xC1, 0x0D,
+ 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1, 0x0D,
+ 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1, 0x0D,
+ 0x10, 0x02, 0xD9, 0x07, 0x10, 0x09, 0xC1, 0x0D,
+ 0x11, 0x04, 0xD9, 0x08, 0x11, 0x09, 0xC0,
+//ascii 0x005E
+ 0xCC, 0x0D, 0x0A, 0xCB, 0x9C, 0x50, 0x50, 0xC9,
+ 0x0C, 0x04, 0x20, 0x05, 0xC7, 0x0B, 0x03, 0x40,
+ 0x07, 0xC5, 0x0A, 0x03, 0x40, 0x06, 0x0D, 0xC4,
+ 0x0C, 0x02, 0x30, 0x81, 0x7E, 0xC6, 0x09, 0x20,
+ 0x02, 0x08, 0xC9, 0x09, 0x10, 0x02, 0x0E, 0xCA,
+ 0x09, 0x20, 0x81, 0x7E, 0xC8, 0x0D, 0x03, 0x40,
+ 0x05, 0x0C, 0xC8, 0x0C, 0x04, 0x40, 0x04, 0x0B,
+ 0xC8, 0x0C, 0x05, 0x40, 0x06, 0xC9, 0x0D, 0x06,
+ 0x20, 0x05, 0xCB, 0x9E, 0x60, 0x50, 0xCD, 0x0E,
+ 0x0B, 0xC0,
+//ascii 0x005F
+ 0xC0, 0x26, 0x0E, 0xC3, 0x20, 0x0C, 0xC3, 0x20,
+ 0x0C, 0xC3, 0x20, 0x0C, 0xC3, 0x20, 0x0C, 0xC3,
+ 0x20, 0x0C, 0xC3, 0x20, 0x0C, 0xC3, 0x20, 0x0C,
+ 0xC3, 0x20, 0x0C, 0xC3, 0x20, 0x0C, 0xC3, 0x20,
+ 0x0C, 0xC3, 0x20, 0x0C, 0xC3, 0x20, 0x0C, 0xC3,
+ 0x20, 0x0C, 0xC3, 0x20, 0x0C, 0xC3, 0x20, 0x0C,
+ 0xC3, 0x20, 0x0C, 0xC0,
+//ascii 0x0060
+ 0xC5, 0x0D, 0xC4, 0x8B, 0x34, 0xC2, 0x0B, 0x03,
+ 0x10, 0x04, 0xC1, 0x03, 0x30, 0x06, 0xC0, 0x0D,
+ 0x20, 0x01, 0x09, 0xC1, 0x0D, 0x10, 0x04, 0x0E,
+ 0xC2, 0x8D, 0x19, 0xC5, 0x0E,
+//ascii 0x0061
+ 0xC3, 0x9C, 0x62, 0x10, 0x70, 0x40, 0xC5, 0x07,
+ 0x70, 0x70, 0x00, 0xC4, 0x08, 0x70, 0x70, 0x10,
+ 0xC4, 0x01, 0x30, 0x02, 0x01, 0x10, 0x01, 0x22,
+ 0x20, 0x02, 0x14, 0xC3, 0x09, 0x20, 0x08, 0xC1,
+ 0x0D, 0x10, 0x05, 0xC2, 0xAD, 0x40, 0x1C, 0xC4,
+ 0x05, 0x10, 0x05, 0xC3, 0x83, 0x01, 0xC4, 0x95,
+ 0x01, 0xD0, 0xC3, 0x03, 0x10, 0x0B, 0xC3, 0x05,
+ 0x10, 0x0E, 0xC3, 0x0E, 0x10, 0x04, 0xC3, 0x02,
+ 0x10, 0x0C, 0xC3, 0x07, 0x10, 0x0B, 0xC4, 0x03,
+ 0x10, 0x0E, 0xC2, 0x02, 0x10, 0x0C, 0xC3, 0x09,
+ 0x10, 0x09, 0xC4, 0x05, 0x10, 0x0A, 0xC2, 0x04,
+ 0x10, 0x08, 0xC3, 0x0B, 0x10, 0x06, 0xC4, 0x05,
+ 0x10, 0x09, 0xC2, 0x08, 0x10, 0x01, 0xC3, 0x0E,
+ 0x10, 0x02, 0xC4, 0x02, 0x10, 0x0A, 0xC2, 0x0D,
+ 0x20, 0x03, 0x0E, 0xC2, 0x01, 0x10, 0x0A, 0xC2,
+ 0x0A, 0x20, 0x0C, 0xC3, 0x04, 0x20, 0x03, 0xC2,
+ 0x06, 0x20, 0x87, 0x97, 0x20, 0x01, 0xC4, 0x0E,
+ 0x01, 0x10, 0x06, 0xC2, 0x0C, 0x70, 0x00, 0x08,
+ 0xC5, 0x9D, 0x20, 0x90, 0xC3, 0x06, 0x60, 0x04,
+ 0xC8, 0x08, 0x0E, 0xC4, 0x07, 0x40, 0x07, 0xD2,
+ 0x8C, 0xBC, 0xC0,
+//ascii 0x0062
+ 0xCE, 0x8A, 0x74, 0x13, 0x94, 0x68, 0xD0, 0xD4,
+ 0x06, 0x70, 0x10, 0x03, 0x0B, 0xD0, 0x0C, 0x01,
+ 0x70, 0x40, 0x06, 0xCE, 0x0D, 0x01, 0x70, 0x60,
+ 0x06, 0xCD, 0x02, 0x30, 0x84, 0xAD, 0xC1, 0x9E,
+ 0xB7, 0x10, 0x30, 0x0A, 0xCB, 0x0A, 0x20, 0x01,
+ 0x0C, 0xC8, 0x05, 0x20, 0x02, 0xCB, 0x05, 0x20,
+ 0x0D, 0xCA, 0x04, 0x20, 0x0D, 0xCA, 0x03, 0x10,
+ 0x05, 0xCB, 0x0D, 0x20, 0x0B, 0xCA, 0x02, 0x10,
+ 0x09, 0xCC, 0x01, 0x10, 0x0A, 0xCA, 0x03, 0x10,
+ 0x0A, 0xCC, 0x02, 0x10, 0x0B, 0xCA, 0x06, 0x10,
+ 0x08, 0xCC, 0x20, 0x0E, 0xCA, 0x0D, 0x10, 0x02,
+ 0xCB, 0x09, 0x10, 0x05, 0xCC, 0x08, 0x10, 0x06,
+ 0xC9, 0xAC, 0x10, 0x2E, 0xCD, 0xAA, 0x10, 0x4C,
+ 0xC5, 0x0E, 0x07, 0x10, 0x04, 0x0E, 0xC5, 0x0E,
+ 0x75, 0x05, 0x02, 0x20, 0x01, 0x04, 0x16, 0x05,
+ 0x02, 0x30, 0x26, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x7E, 0x7E,
+ 0x7E, 0x1E, 0xC0,
+//ascii 0x0063
+ 0xC4, 0x8B, 0x56, 0xC5, 0x9D, 0x38, 0xE0, 0xC8,
+ 0x0E, 0x04, 0x10, 0x05, 0xC5, 0x0C, 0x10, 0x01,
+ 0x09, 0xC7, 0x02, 0x20, 0x05, 0xC5, 0x0C, 0x30,
+ 0x09, 0xC5, 0x05, 0x30, 0x06, 0xC5, 0x0D, 0x40,
+ 0x0D, 0xC3, 0x0D, 0x20, 0x01, 0x0B, 0xC8, 0x06,
+ 0x20, 0x05, 0xC3, 0x08, 0x10, 0x01, 0x0D, 0xCA,
+ 0x06, 0x20, 0xC3, 0x04, 0x10, 0x06, 0xCB, 0x0E,
+ 0x20, 0x0C, 0xC2, 0x02, 0x10, 0x0A, 0xCC, 0x02,
+ 0x10, 0x0A, 0xC2, 0x02, 0x10, 0x0A, 0xCC, 0x02,
+ 0x10, 0x0A, 0xC2, 0x03, 0x10, 0x08, 0xCC, 0x20,
+ 0x0B, 0xC2, 0x06, 0x10, 0x02, 0xCB, 0x09, 0x20,
+ 0x0E, 0xC2, 0x0B, 0x20, 0x06, 0xC9, 0x0C, 0x01,
+ 0x10, 0x03, 0xC4, 0x02, 0x20, 0x03, 0x0C, 0xC6,
+ 0x08, 0x30, 0x0A, 0xC4, 0x0C, 0x40, 0x02, 0x05,
+ 0x17, 0x06, 0x03, 0x40, 0x04, 0xC6, 0x0A, 0x70,
+ 0x50, 0x03, 0xC8, 0x0C, 0x02, 0x70, 0x20, 0x06,
+ 0xCB, 0x09, 0x04, 0x50, 0x81, 0x6D, 0xCF, 0x0D,
+ 0x1B, 0x0C, 0x0E,
+//ascii 0x0064
+ 0xC1, 0x0E, 0x75, 0x75, 0x75, 0x15, 0xC4, 0x0D,
+ 0x70, 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC5, 0x7D, 0x0C, 0x04, 0x10, 0x84, 0x9C, 0x1E,
+ 0x9D, 0xB6, 0x10, 0x10, 0x0B, 0xCE, 0xAE, 0x20,
+ 0x1C, 0xC8, 0x05, 0x10, 0x08, 0xCD, 0x02, 0x10,
+ 0x0D, 0xCA, 0x04, 0x10, 0x0A, 0xCB, 0x09, 0x10,
+ 0x05, 0xCB, 0x0D, 0x10, 0x02, 0xCB, 0x04, 0x10,
+ 0x09, 0xCC, 0x01, 0x10, 0x0C, 0xCA, 0x02, 0x10,
+ 0x0A, 0xCC, 0x02, 0x10, 0x0A, 0xCA, 0x02, 0x10,
+ 0x08, 0xCC, 0x20, 0x0A, 0xCA, 0x04, 0x10, 0x02,
+ 0xCB, 0x09, 0x20, 0x0C, 0xCA, 0x08, 0x20, 0x06,
+ 0xC9, 0x0C, 0x01, 0x20, 0xCB, 0x0E, 0x30, 0x04,
+ 0x0C, 0xC5, 0x0E, 0x08, 0x30, 0x06, 0xCC, 0x07,
+ 0x40, 0xB1, 0x56, 0x75, 0x30, 0x40, 0x01, 0x0E,
+ 0xCD, 0x05, 0x70, 0x50, 0x01, 0x0C, 0xCF, 0x08,
+ 0x01, 0x70, 0x20, 0x03, 0x0D, 0xD1, 0x8E, 0x83,
+ 0x50, 0x81, 0x5B, 0xD7, 0x0D, 0x2C, 0x0E,
+//ascii 0x0065
+ 0xC7, 0x0C, 0x0A, 0x19, 0x0E, 0xCF, 0x0B, 0x04,
+ 0x40, 0x0B, 0xC2, 0x00, 0x06, 0xC9, 0x04, 0x60,
+ 0x0B, 0xC1, 0x0D, 0x10, 0x02, 0x0E, 0xC6, 0x03,
+ 0x70, 0x0B, 0xC1, 0x0A, 0x20, 0x03, 0xC5, 0x06,
+ 0x20, 0x91, 0x6A, 0x50, 0x10, 0x0B, 0xC1, 0x0B,
+ 0x01, 0x20, 0x09, 0xC3, 0x0E, 0x20, 0x03, 0x0E,
+ 0xC1, 0x07, 0x10, 0x0B, 0xC2, 0x0E, 0x02, 0x10,
+ 0x02, 0xC3, 0x08, 0x10, 0x01, 0x0E, 0xC2, 0x07,
+ 0x10, 0x0B, 0xC3, 0x0C, 0x20, 0x0E, 0xC2, 0x04,
+ 0x10, 0x07, 0xC3, 0x07, 0x10, 0x0B, 0xC4, 0x01,
+ 0x10, 0x0B, 0xC2, 0x02, 0x10, 0x0B, 0xC3, 0x07,
+ 0x10, 0x0B, 0xC4, 0x03, 0x10, 0x0A, 0xC2, 0x02,
+ 0x10, 0x0B, 0xC3, 0x07, 0x10, 0x0B, 0xC4, 0x03,
+ 0x10, 0x0A, 0xC2, 0x03, 0x10, 0x09, 0xC3, 0x07,
+ 0x10, 0x0B, 0xC4, 0x01, 0x10, 0x0B, 0xC2, 0x06,
+ 0x10, 0x04, 0xC3, 0x07, 0x10, 0x0B, 0xC3, 0x0B,
+ 0x20, 0x0E, 0xC2, 0x0B, 0x20, 0x09, 0xC2, 0x07,
+ 0x10, 0x0B, 0xC3, 0x02, 0x10, 0x03, 0xC4, 0x02,
+ 0x20, 0x08, 0xC1, 0x07, 0x10, 0x0B, 0xC1, 0x0C,
+ 0x02, 0x20, 0x0A, 0xC4, 0x0C, 0x30, 0x81, 0x63,
+ 0x10, 0x85, 0x62, 0x30, 0x04, 0xC6, 0x0A, 0x70,
+ 0x50, 0x02, 0x0E, 0xC7, 0x0C, 0x02, 0x70, 0x20,
+ 0x05, 0xCB, 0x09, 0x04, 0x50, 0x81, 0x6C, 0xCF,
+ 0x0D, 0x1B, 0x0C, 0x0E,
+//ascii 0x0066
+ 0xC1, 0x84, 0x8D, 0xDB, 0x0C, 0x20, 0xC3, 0x07,
+ 0x11, 0x0A, 0xD3, 0x0A, 0x10, 0x01, 0xC3, 0x06,
+ 0x10, 0x09, 0xD3, 0x0A, 0x20, 0xC3, 0x06, 0x10,
+ 0x09, 0xD3, 0x0B, 0x20, 0x08, 0xC2, 0x06, 0x10,
+ 0x09, 0xD4, 0x30, 0x03, 0x15, 0x02, 0x10, 0x03,
+ 0x75, 0x75, 0xC4, 0x06, 0x70, 0x70, 0x70, 0x10,
+ 0xC5, 0x02, 0x70, 0x70, 0x70, 0x00, 0xC6, 0x07,
+ 0x01, 0x70, 0x70, 0x60, 0xC8, 0x2E, 0x05, 0x10,
+ 0x08, 0x7E, 0x7E, 0xCB, 0x06, 0x10, 0x09, 0xDB,
+ 0x06, 0x10, 0x09, 0xDB, 0x0E, 0x1D,
+//ascii 0x0067
+ 0xC0, 0x09, 0x75, 0x75, 0x25, 0x96, 0x79, 0xE0,
+ 0xC7, 0x06, 0x70, 0x70, 0x60, 0x08, 0xC6, 0x06,
+ 0x70, 0x70, 0x70, 0x06, 0xC5, 0x06, 0x70, 0x70,
+ 0x70, 0x00, 0x0A, 0xC6, 0x0E, 0x04, 0x10, 0x84,
+ 0x9C, 0x1E, 0x8D, 0xA5, 0x10, 0x04, 0x0D, 0x2E,
+ 0x0C, 0x06, 0x20, 0x02, 0xC5, 0xAE, 0x20, 0x1C,
+ 0xC7, 0xAC, 0x10, 0x3E, 0xC3, 0x09, 0x20, 0x0C,
+ 0xC4, 0x02, 0x10, 0x0D, 0xC9, 0x0C, 0x10, 0x04,
+ 0xC4, 0x03, 0x10, 0x08, 0xC3, 0x09, 0x10, 0x05,
+ 0xCB, 0x04, 0x10, 0x0C, 0xC3, 0x08, 0x10, 0x05,
+ 0xC3, 0x04, 0x10, 0x09, 0xCB, 0x08, 0x10, 0x07,
+ 0xC3, 0x0A, 0x10, 0x04, 0xC3, 0x02, 0x10, 0x0A,
+ 0xCB, 0x08, 0x10, 0x05, 0xC3, 0x0B, 0x10, 0x04,
+ 0xC3, 0x02, 0x10, 0x08, 0xCB, 0x06, 0x10, 0x05,
+ 0xC3, 0x09, 0x10, 0x05, 0xC3, 0x04, 0x10, 0x02,
+ 0xCB, 0x01, 0x10, 0x07, 0xC3, 0x05, 0x10, 0x07,
+ 0xC3, 0x08, 0x20, 0x06, 0xC9, 0x06, 0x20, 0x0A,
+ 0xC2, 0x0D, 0x20, 0x0A, 0xC3, 0x0E, 0x30, 0x04,
+ 0x0C, 0xC5, 0x0D, 0x04, 0x20, 0x01, 0xC2, 0x0D,
+ 0x02, 0x20, 0xC5, 0x07, 0x40, 0x02, 0x05, 0x16,
+ 0x05, 0x02, 0x40, 0x09, 0xC2, 0x02, 0x20, 0x07,
+ 0xC6, 0x05, 0x70, 0x50, 0x05, 0xC3, 0x08, 0x10,
+ 0x02, 0xC8, 0x08, 0x70, 0x30, 0x08, 0xC4, 0x9E,
+ 0x03, 0xE0, 0xC9, 0x8E, 0x72, 0x50, 0x82, 0x7E,
+ 0xC6, 0x0B, 0xCF, 0x0D, 0x2C, 0x0E,
+//ascii 0x0068
+ 0xCF, 0x7E, 0x4E, 0xCE, 0x8B, 0x51, 0x70, 0x50,
+ 0xCD, 0x05, 0x70, 0x70, 0x00, 0xCC, 0x05, 0x70,
+ 0x70, 0x10, 0xCB, 0x0C, 0x40, 0x02, 0x04, 0x75,
+ 0x35, 0xCB, 0x06, 0x20, 0x02, 0x0C, 0xD9, 0x03,
+ 0x10, 0x01, 0x0E, 0xDA, 0x02, 0x10, 0x06, 0xDB,
+ 0x03, 0x10, 0x09, 0xDB, 0x05, 0x10, 0x08, 0xDB,
+ 0x0A, 0x10, 0x05, 0xDC, 0x03, 0x10, 0x0E, 0xDC,
+ 0x93, 0x02, 0xE0, 0xD3, 0x7A, 0x0A, 0x03, 0x10,
+ 0x05, 0x09, 0x7A, 0x3A, 0xC4, 0x0D, 0x70, 0x70,
+ 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10,
+ 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x79,
+ 0x79, 0x79, 0x19, 0xC0,
+//ascii 0x0069
+ 0xC1, 0x9C, 0x32, 0xB0, 0xC2, 0x0C, 0x7A, 0x7A,
+ 0x2A, 0xC4, 0x01, 0x20, 0x0E, 0xC1, 0x06, 0x70,
+ 0x70, 0x20, 0xC3, 0x0D, 0x30, 0x0B, 0xC1, 0x06,
+ 0x70, 0x70, 0x20, 0xC4, 0x01, 0x20, 0x0E, 0xC1,
+ 0x06, 0x70, 0x70, 0x20, 0xC4, 0x9C, 0x32, 0xB0,
+ 0xC2, 0x0B, 0x79, 0x79, 0x29, 0xC0,
+//ascii 0x006A
+ 0xC1, 0x9C, 0x43, 0xB0, 0xC2, 0x0C, 0x7A, 0x7A,
+ 0x4A, 0x0B, 0x0E, 0xC8, 0x01, 0x20, 0x0E, 0xC1,
+ 0x06, 0x70, 0x70, 0x60, 0x05, 0x0E, 0xC5, 0x0D,
+ 0x30, 0x0B, 0xC1, 0x06, 0x70, 0x70, 0x70, 0x01,
+ 0x0E, 0xC5, 0x01, 0x20, 0x0E, 0xC1, 0x06, 0x70,
+ 0x70, 0x70, 0x00, 0x05, 0xC5, 0x0B, 0x12, 0x0A,
+ 0xC2, 0x0B, 0x79, 0x79, 0x49, 0x06, 0x30, 0xE3,
+ 0x0B, 0x20, 0x0C, 0xE3, 0x20, 0x0A, 0xE3, 0x07,
+ 0x16, 0x0C, 0xC0,
+//ascii 0x006B
+ 0xDB, 0x0B, 0xCB, 0x08, 0x0E, 0xCF, 0x08, 0x00,
+ 0xCB, 0x86, 0x1D, 0xCC, 0x0E, 0x04, 0x10, 0xCB,
+ 0x96, 0x01, 0xC0, 0xCA, 0x0C, 0x01, 0x20, 0xCB,
+ 0x06, 0x10, 0x01, 0x0C, 0xC8, 0x08, 0x40, 0xCB,
+ 0x08, 0x30, 0x0B, 0xC6, 0x04, 0x40, 0x09, 0xCC,
+ 0x08, 0x30, 0x0A, 0xC3, 0x0C, 0x02, 0x30, 0x02,
+ 0x0D, 0xCE, 0x08, 0x30, 0x0A, 0xC1, 0x08, 0x40,
+ 0x05, 0xD1, 0x09, 0x30, 0x08, 0x05, 0x40, 0x09,
+ 0xD3, 0x0A, 0x70, 0x02, 0x0D, 0xD5, 0x0B, 0x50,
+ 0x05, 0xD8, 0x0C, 0x01, 0x20, 0x08, 0xDA, 0x0C,
+ 0x01, 0x10, 0x03, 0xCD, 0x7A, 0x5A, 0x06, 0x20,
+ 0x03, 0x09, 0x5A, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC4,
+ 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5, 0x79, 0x79,
+ 0x79, 0x19, 0xC0,
+//ascii 0x006C
+ 0xC2, 0x7A, 0x7A, 0x7A, 0x1A, 0xC4, 0x0D, 0x70,
+ 0x70, 0x70, 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70,
+ 0x10, 0xC4, 0x0D, 0x70, 0x70, 0x70, 0x10, 0xC5,
+ 0x79, 0x79, 0x79, 0x19, 0xC0,
+//ascii 0x006D
+ 0xC5, 0x0D, 0x7C, 0x5C, 0xC5, 0x0D, 0x05, 0x70,
+ 0x70, 0xC4, 0x0B, 0x70, 0x70, 0x10, 0xC4, 0x01,
+ 0x70, 0x70, 0x10, 0xC3, 0x08, 0x30, 0x03, 0x06,
+ 0x77, 0x47, 0xC3, 0x04, 0x20, 0x08, 0xD2, 0x02,
+ 0x10, 0x03, 0xD3, 0x02, 0x10, 0x08, 0xD3, 0x05,
+ 0x10, 0x09, 0xD3, 0x0A, 0x10, 0x07, 0xD4, 0x92,
+ 0x01, 0xE0, 0xD3, 0xAD, 0x10, 0x3C, 0xD3, 0x0E,
+ 0x04, 0x10, 0x01, 0x73, 0x43, 0xC5, 0x07, 0x70,
+ 0x70, 0x00, 0xC4, 0x05, 0x70, 0x70, 0x10, 0xC3,
+ 0x0B, 0x70, 0x70, 0x20, 0xC3, 0x05, 0x20, 0x03,
+ 0x0C, 0xD1, 0x02, 0x10, 0x01, 0xD3, 0x02, 0x10,
+ 0x07, 0xD3, 0x04, 0x10, 0x09, 0xD3, 0x08, 0x10,
+ 0x07, 0xD4, 0x82, 0x02, 0xD4, 0x9D, 0x20, 0x40,
+ 0xD2, 0xAE, 0xCB, 0x30, 0x81, 0x79, 0x7A, 0x3A,
+ 0xC3, 0x06, 0x70, 0x70, 0x20, 0xC3, 0x06, 0x70,
+ 0x70, 0x20, 0xC3, 0x06, 0x70, 0x70, 0x20, 0xC3,
+ 0x0B, 0x79, 0x79, 0x29, 0xC0,
+//ascii 0x006E
+ 0xC3, 0x9E, 0x74, 0x20, 0x71, 0x41, 0xC5, 0x08,
+ 0x70, 0x70, 0x00, 0xC4, 0x07, 0x70, 0x70, 0x10,
+ 0xC3, 0x0D, 0x50, 0x72, 0x42, 0xC3, 0x07, 0x20,
+ 0x01, 0x0A, 0xD1, 0x03, 0x20, 0x0D, 0xD2, 0x02,
+ 0x10, 0x05, 0xD3, 0x02, 0x10, 0x09, 0xD3, 0x05,
+ 0x10, 0x09, 0xD3, 0x0A, 0x10, 0x06, 0xD4, 0x93,
+ 0x01, 0xE0, 0xD3, 0xAE, 0x20, 0x3E, 0xD1, 0x0E,
+ 0x1C, 0x03, 0x10, 0x05, 0x09, 0x7A, 0x3A, 0xC3,
+ 0x06, 0x70, 0x70, 0x20, 0xC3, 0x06, 0x70, 0x70,
+ 0x20, 0xC3, 0x06, 0x70, 0x70, 0x20, 0xC3, 0x0B,
+ 0x79, 0x79, 0x29, 0xC0,
+//ascii 0x006F
+ 0xC5, 0x9E, 0x84, 0x20, 0x10, 0x91, 0x36, 0xB0,
+ 0xCC, 0x06, 0x70, 0x10, 0x02, 0x0B, 0xC8, 0x0D,
+ 0x02, 0x70, 0x40, 0x07, 0xC6, 0x0E, 0x01, 0x50,
+ 0x12, 0x01, 0x50, 0x08, 0xC5, 0x05, 0x20, 0x81,
+ 0x7C, 0xC3, 0x8E, 0xA3, 0x30, 0x0C, 0xC3, 0x0D,
+ 0x20, 0x03, 0x0E, 0xC8, 0x09, 0x20, 0x05, 0xC3,
+ 0x07, 0x10, 0x01, 0x0E, 0xCA, 0x07, 0x20, 0xC3,
+ 0x04, 0x10, 0x07, 0xCC, 0x20, 0x0C, 0xC2, 0x02,
+ 0x10, 0x0A, 0xCC, 0x02, 0x10, 0x0A, 0xC2, 0x02,
+ 0x10, 0x0B, 0xCC, 0x03, 0x10, 0x0A, 0xC2, 0x03,
+ 0x10, 0x08, 0xCC, 0x01, 0x10, 0x0B, 0xC2, 0x06,
+ 0x10, 0x02, 0xCB, 0x0A, 0x20, 0x0E, 0xC2, 0x0B,
+ 0x20, 0x06, 0xC9, 0x0D, 0x01, 0x10, 0x03, 0xC4,
+ 0x02, 0x20, 0x04, 0x0C, 0xC6, 0x08, 0x01, 0x20,
+ 0x0A, 0xC4, 0x0C, 0x40, 0x02, 0x05, 0x17, 0x06,
+ 0x03, 0x40, 0x04, 0xC6, 0x09, 0x70, 0x50, 0x03,
+ 0xC8, 0x0B, 0x02, 0x70, 0x20, 0x06, 0xCB, 0x09,
+ 0x03, 0x50, 0x81, 0x6D, 0xCF, 0x0D, 0x1B, 0x0C,
+ 0x0E,
+//ascii 0x0070
+ 0xC7, 0x0C, 0x09, 0x18, 0x89, 0xBD, 0xD5, 0x0B,
+ 0x04, 0x70, 0x02, 0x08, 0xD2, 0x05, 0x70, 0x30,
+ 0x01, 0x0B, 0xCF, 0x03, 0x70, 0x60, 0x0A, 0xCD,
+ 0x05, 0x30, 0x81, 0x58, 0x1A, 0x89, 0x62, 0x40,
+ 0x0D, 0xCB, 0x0C, 0x30, 0x07, 0xC7, 0x0B, 0x02,
+ 0x20, 0x04, 0xCB, 0x07, 0x20, 0x09, 0xC9, 0x0E,
+ 0x02, 0x20, 0x0E, 0xCA, 0x03, 0x10, 0x03, 0xCB,
+ 0x0B, 0x20, 0x0B, 0xCA, 0x02, 0x10, 0x08, 0xCC,
+ 0x20, 0x0A, 0xCA, 0x02, 0x10, 0x0A, 0xCC, 0x02,
+ 0x10, 0x0A, 0xCA, 0x05, 0x10, 0x09, 0xCC, 0x01,
+ 0x10, 0x0D, 0xCA, 0x0A, 0x10, 0x04, 0xCB, 0x0C,
+ 0x10, 0x03, 0xCC, 0x04, 0x10, 0x0A, 0xCA, 0x03,
+ 0x10, 0x0C, 0xCD, 0x05, 0x10, 0x08, 0xC7, 0xAC,
+ 0x30, 0x1B, 0xCC, 0x0D, 0x1B, 0x04, 0x10, 0x81,
+ 0x69, 0x1B, 0x8A, 0x73, 0x20, 0x08, 0x7A, 0x0A,
+ 0x0E, 0xC3, 0x06, 0x70, 0x70, 0x70, 0x10, 0x0A,
+ 0xC3, 0x06, 0x70, 0x70, 0x70, 0x10, 0x0A, 0xC3,
+ 0x06, 0x70, 0x70, 0x70, 0x10, 0x0A, 0xC3, 0x0B,
+ 0x79, 0x79, 0x79, 0x19, 0x0D, 0xC0,
+//ascii 0x0071
+ 0xC0, 0x09, 0x75, 0x75, 0x75, 0x15, 0x0C, 0xC3,
+ 0x06, 0x70, 0x70, 0x70, 0x10, 0x0A, 0xC3, 0x06,
+ 0x70, 0x70, 0x70, 0x10, 0x0A, 0xC3, 0x06, 0x70,
+ 0x70, 0x70, 0x10, 0x0A, 0xC5, 0x0E, 0x04, 0x10,
+ 0x84, 0x9C, 0x1E, 0x9D, 0xB6, 0x10, 0x10, 0x09,
+ 0x7D, 0x0D, 0xC5, 0xAE, 0x20, 0x1C, 0xC8, 0x05,
+ 0x10, 0x08, 0xCD, 0x02, 0x10, 0x0D, 0xCA, 0x04,
+ 0x10, 0x0A, 0xCB, 0x09, 0x10, 0x05, 0xCB, 0x0D,
+ 0x10, 0x02, 0xCB, 0x04, 0x10, 0x09, 0xCC, 0x01,
+ 0x10, 0x0C, 0xCA, 0x02, 0x10, 0x0A, 0xCC, 0x02,
+ 0x10, 0x0A, 0xCA, 0x02, 0x10, 0x08, 0xCC, 0x20,
+ 0x0A, 0xCA, 0x04, 0x10, 0x02, 0xCB, 0x09, 0x20,
+ 0x0C, 0xCA, 0x08, 0x20, 0x06, 0xC9, 0x0C, 0x01,
+ 0x20, 0xCB, 0x0E, 0x30, 0x04, 0x0C, 0xC5, 0x0E,
+ 0x08, 0x30, 0x06, 0xCC, 0x07, 0x40, 0xB1, 0x56,
+ 0x75, 0x30, 0x40, 0x01, 0x0E, 0xCD, 0x05, 0x70,
+ 0x50, 0x01, 0x0C, 0xCF, 0x08, 0x01, 0x70, 0x20,
+ 0x03, 0x0D, 0xD1, 0x8E, 0x83, 0x50, 0x81, 0x5B,
+ 0xD7, 0x0D, 0x2C, 0x0E,
+//ascii 0x0072
+ 0xD8, 0x02, 0x10, 0x05, 0xD3, 0x01, 0x10, 0x06,
+ 0xD3, 0x02, 0x10, 0x06, 0xD3, 0x07, 0x10, 0x03,
+ 0xD3, 0x0E, 0x01, 0x10, 0x0C, 0xD3, 0xAB, 0x10,
+ 0x1D, 0xD1, 0x9D, 0xCA, 0x20, 0x10, 0x05, 0x09,
+ 0x7A, 0x3A, 0xC3, 0x06, 0x70, 0x70, 0x20, 0xC3,
+ 0x06, 0x70, 0x70, 0x20, 0xC3, 0x06, 0x70, 0x70,
+ 0x20, 0xC3, 0x0B, 0x79, 0x79, 0x29, 0xC0,
+//ascii 0x0073
+ 0xCC, 0xAA, 0x65, 0x7D, 0xC9, 0x86, 0x0B, 0xC4,
+ 0x03, 0x40, 0x06, 0xC6, 0x0E, 0x02, 0x10, 0x08,
+ 0xC3, 0x04, 0x60, 0x06, 0xC5, 0x04, 0x20, 0x06,
+ 0xC2, 0x0C, 0x70, 0x00, 0x0C, 0xC3, 0x0C, 0x20,
+ 0x03, 0x0C, 0xC2, 0x05, 0x20, 0x86, 0xC8, 0x20,
+ 0x04, 0xC3, 0x07, 0x10, 0x02, 0xC4, 0x01, 0x10,
+ 0x05, 0xC2, 0x09, 0x20, 0xC3, 0x04, 0x10, 0x0A,
+ 0xC3, 0x0D, 0x20, 0x0C, 0xC3, 0x01, 0x10, 0x0C,
+ 0xC2, 0x02, 0x10, 0x0D, 0xC3, 0x0A, 0x20, 0xC4,
+ 0x04, 0x10, 0x0A, 0xC2, 0x02, 0x10, 0x0D, 0xC3,
+ 0x06, 0x10, 0x03, 0xC4, 0x05, 0x10, 0x0A, 0xC2,
+ 0x03, 0x10, 0x0B, 0xC3, 0x02, 0x10, 0x07, 0xC4,
+ 0x03, 0x10, 0x0A, 0xC2, 0x06, 0x10, 0x05, 0xC2,
+ 0x0B, 0x20, 0x0A, 0xC3, 0x0E, 0x20, 0x0D, 0xC2,
+ 0x0A, 0x20, 0x97, 0xEC, 0x20, 0x20, 0xC4, 0x05,
+ 0x10, 0x01, 0xC4, 0x02, 0x70, 0x05, 0xC2, 0x0C,
+ 0x03, 0x20, 0x06, 0xC4, 0x0B, 0x60, 0x01, 0x0E,
+ 0xC2, 0x09, 0x30, 0x0D, 0xC5, 0x09, 0x40, 0x01,
+ 0x0B, 0xC3, 0x0B, 0x20, 0x0A, 0xC7, 0x0E, 0x08,
+ 0x15, 0x08, 0x0E, 0xC4, 0x9E, 0x03, 0xC0, 0xD4,
+ 0x0D, 0xC0,
+//ascii 0x0074
+ 0xE0, 0x08, 0x14, 0x0B, 0xCB, 0x9E, 0x73, 0x10,
+ 0xC7, 0x06, 0x10, 0x09, 0xCB, 0x0D, 0x20, 0x0D,
+ 0xC6, 0x06, 0x10, 0x09, 0xCB, 0x0D, 0x20, 0x0C,
+ 0xC6, 0x06, 0x10, 0x09, 0xCB, 0x06, 0x20, 0x0D,
+ 0xC1, 0x0C, 0x35, 0x02, 0x10, 0x03, 0x75, 0x25,
+ 0x02, 0x20, 0x01, 0xC2, 0x0A, 0x70, 0x70, 0x60,
+ 0x07, 0xC2, 0x0A, 0x70, 0x70, 0x50, 0x03, 0xC3,
+ 0x0A, 0x70, 0x70, 0x30, 0x01, 0x07, 0xC5, 0x3E,
+ 0x05, 0x10, 0x08, 0x7E, 0x2E, 0xCC, 0x06, 0x10,
+ 0x09, 0xD7, 0x06, 0x10, 0x09, 0xC0,
+//ascii 0x0075
+ 0xC0, 0x07, 0x72, 0x72, 0x22, 0xC3, 0x06, 0x70,
+ 0x70, 0x20, 0xC3, 0x06, 0x70, 0x70, 0x20, 0xC3,
+ 0x06, 0x70, 0x70, 0x21, 0xD0, 0xAD, 0x60, 0x2A,
+ 0xD4, 0x09, 0x10, 0x07, 0xD4, 0x04, 0x10, 0x0B,
+ 0xD3, 0x0A, 0x10, 0x03, 0xD3, 0x0C, 0x20, 0x0E,
+ 0xD2, 0x0B, 0x20, 0x0C, 0xD2, 0x05, 0x20, 0x0C,
+ 0xD1, 0x09, 0x30, 0xC3, 0x0C, 0x7A, 0x3A, 0x08,
+ 0x03, 0x30, 0x03, 0xC3, 0x06, 0x70, 0x70, 0x10,
+ 0x0B, 0xC3, 0x06, 0x70, 0x70, 0x00, 0x08, 0xC4,
+ 0x06, 0x70, 0x60, 0x03, 0x0C, 0xC5, 0x0B, 0x79,
+ 0x49, 0x0B, 0x0E, 0xC0,
+//ascii 0x0076
+ 0xC0, 0x0D, 0xD6, 0x96, 0x16, 0xC0, 0xD3, 0x06,
+ 0x20, 0x82, 0x8E, 0xD0, 0x06, 0x50, 0x03, 0x09,
+ 0xCE, 0x07, 0x70, 0x80, 0x5B, 0xCC, 0x8E, 0x94,
+ 0x70, 0x81, 0x6C, 0xCC, 0x8E, 0x94, 0x70, 0x82,
+ 0x8D, 0xCC, 0x8E, 0x94, 0x70, 0x03, 0x09, 0xCE,
+ 0x0A, 0x04, 0x60, 0xD1, 0x0A, 0x03, 0x30, 0xCF,
+ 0x8E, 0x94, 0x40, 0xCC, 0x8E, 0x93, 0x70, 0xC9,
+ 0x8E, 0x83, 0x70, 0x04, 0x0A, 0xC7, 0x8D, 0x83,
+ 0x70, 0x83, 0x8E, 0xC6, 0x8E, 0x83, 0x70, 0x81,
+ 0x7D, 0xC9, 0x06, 0x60, 0x81, 0x5B, 0xCC, 0x06,
+ 0x40, 0x04, 0x0A, 0xCF, 0x06, 0x10, 0x83, 0x8E,
+ 0xD1, 0x17, 0x0D,
+//ascii 0x0077
+ 0xC0, 0x0A, 0x0B, 0xD5, 0x06, 0x10, 0x84, 0x9E,
+ 0xD1, 0x06, 0x40, 0x82, 0x7C, 0xCE, 0x06, 0x70,
+ 0x91, 0x5A, 0xE0, 0xCA, 0x8C, 0x62, 0x70, 0x10,
+ 0x83, 0x8D, 0xCA, 0x9E, 0xA5, 0x10, 0x70, 0x90,
+ 0x16, 0xB0, 0xCB, 0x8D, 0x84, 0x70, 0x10, 0xCE,
+ 0x8C, 0x73, 0x50, 0xCF, 0x8E, 0xA4, 0x40, 0xCC,
+ 0x8B, 0x73, 0x70, 0xC8, 0x8C, 0x84, 0x70, 0x91,
+ 0x49, 0xD0, 0xC4, 0x9E, 0x95, 0x10, 0x70, 0x82,
+ 0x7C, 0xC7, 0x06, 0x70, 0x91, 0x59, 0xE0, 0xCA,
+ 0x06, 0x40, 0x83, 0x8C, 0xCE, 0x06, 0x30, 0x81,
+ 0x8C, 0xCF, 0x06, 0x60, 0x91, 0x5A, 0xE0, 0xCB,
+ 0x9E, 0xA5, 0x10, 0x70, 0x83, 0x7C, 0xCC, 0x8D,
+ 0x84, 0x70, 0x91, 0x59, 0xE0, 0xCC, 0x8C, 0x73,
+ 0x70, 0x02, 0xCF, 0x8A, 0x62, 0x40, 0xCF, 0x8C,
+ 0x83, 0x40, 0xCB, 0x9D, 0x95, 0x10, 0x70, 0xC7,
+ 0x9E, 0xA6, 0x20, 0x70, 0x90, 0x26, 0xB0, 0xC4,
+ 0x8B, 0x73, 0x70, 0x10, 0x83, 0x8D, 0xC6, 0x06,
+ 0x70, 0xA0, 0x15, 0xAE, 0xC9, 0x06, 0x50, 0x82,
+ 0x7C, 0xCD, 0x06, 0x20, 0x84, 0x9E, 0xD0, 0x87,
+ 0x6B,
+//ascii 0x0078
+ 0xC0, 0x0D, 0xD1, 0x0C, 0xC3, 0x86, 0x4D, 0xCE,
+ 0x07, 0x00, 0xC3, 0x06, 0x10, 0x08, 0xCB, 0x0B,
+ 0x02, 0x10, 0xC3, 0x06, 0x20, 0x02, 0x0C, 0xC7,
+ 0x0E, 0x05, 0x30, 0xC3, 0x07, 0x40, 0x06, 0xC5,
+ 0x09, 0x01, 0x30, 0x01, 0xC4, 0x0A, 0x02, 0x30,
+ 0x01, 0x0A, 0xC1, 0x0D, 0x03, 0x40, 0x07, 0xC7,
+ 0x08, 0x01, 0x30, 0x04, 0x07, 0x40, 0x04, 0x0D,
+ 0xC9, 0x0E, 0x06, 0x70, 0x01, 0x0A, 0xCD, 0x0D,
+ 0x04, 0x40, 0x07, 0xCF, 0x0E, 0x06, 0x30, 0x01,
+ 0x09, 0xCE, 0x08, 0x01, 0x60, 0x03, 0x0C, 0xCA,
+ 0x0A, 0x02, 0x30, 0x01, 0x03, 0x40, 0x06, 0xC7,
+ 0x0C, 0x03, 0x40, 0x06, 0xC1, 0x0A, 0x01, 0x30,
+ 0x01, 0x09, 0xC4, 0x08, 0x40, 0x03, 0x0C, 0xC4,
+ 0x06, 0x40, 0x03, 0xC3, 0x06, 0x20, 0x01, 0x09,
+ 0xC7, 0x0C, 0x02, 0x30, 0xC3, 0x06, 0x10, 0x05,
+ 0x0E, 0xCA, 0x08, 0x20, 0xC3, 0x86, 0x2B, 0xCD,
+ 0x8D, 0x40, 0xC3, 0x0C, 0xD1, 0x0A, 0xC0,
+//ascii 0x0079
+ 0xC0, 0x0D, 0xDE, 0x96, 0x16, 0xC0, 0xDB, 0x06,
+ 0x20, 0x82, 0x8E, 0xD8, 0x06, 0x50, 0x03, 0x09,
+ 0xD6, 0x07, 0x70, 0x80, 0x5B, 0xD4, 0x8E, 0x94,
+ 0x70, 0x81, 0x6C, 0xD4, 0x8E, 0x94, 0x70, 0x82,
+ 0x8E, 0xD5, 0x0A, 0x05, 0x70, 0x03, 0x09, 0xD6,
+ 0x8A, 0x51, 0x60, 0x05, 0x0B, 0xD6, 0x0A, 0x04,
+ 0x60, 0x02, 0x0A, 0xD3, 0x0A, 0x04, 0x70, 0x10,
+ 0x07, 0xCE, 0x8E, 0x94, 0x70, 0x01, 0x40, 0x09,
+ 0xCA, 0x8E, 0x94, 0x70, 0x03, 0x09, 0xC1, 0x0C,
+ 0x05, 0x20, 0x01, 0xC7, 0x8E, 0x93, 0x70, 0x82,
+ 0x8E, 0xC5, 0x08, 0x20, 0x0D, 0xC3, 0x8E, 0x83,
+ 0x70, 0x81, 0x6C, 0xC9, 0x20, 0x0B, 0xC3, 0x06,
+ 0x70, 0x05, 0x0B, 0xCC, 0x20, 0x0B, 0xC3, 0x06,
+ 0x40, 0x04, 0x09, 0xCF, 0x02, 0x10, 0x0C, 0xC3,
+ 0x06, 0x10, 0x82, 0x8E, 0xD2, 0x0D, 0x08, 0xC4,
+ 0x17, 0x0D,
+//ascii 0x007A
+ 0xC0, 0x0A, 0x17, 0x0B, 0xCB, 0x0B, 0x21, 0xC3,
+ 0x06, 0x20, 0x07, 0xCA, 0x0B, 0x20, 0xC3, 0x06,
+ 0x30, 0x04, 0x0E, 0xC8, 0x0B, 0x20, 0xC3, 0x06,
+ 0x40, 0x01, 0x0C, 0xC7, 0x0B, 0x20, 0xC3, 0x06,
+ 0x60, 0x08, 0xC6, 0x0B, 0x20, 0xC3, 0x06, 0x10,
+ 0x04, 0x05, 0x30, 0x05, 0xC5, 0x0B, 0x20, 0xC3,
+ 0x06, 0x10, 0x05, 0xC0, 0x08, 0x30, 0x02, 0x0D,
+ 0xC3, 0x0B, 0x20, 0xC3, 0x06, 0x10, 0x05, 0xC1,
+ 0x0B, 0x01, 0x30, 0x09, 0xC2, 0x0B, 0x20, 0xC3,
+ 0x06, 0x10, 0x05, 0xC2, 0x0E, 0x03, 0x30, 0x06,
+ 0xC1, 0x0B, 0x20, 0xC3, 0x06, 0x10, 0x05, 0xC4,
+ 0x06, 0x30, 0x83, 0xDB, 0x20, 0xC3, 0x06, 0x10,
+ 0x05, 0xC5, 0x09, 0x30, 0x01, 0x06, 0x20, 0xC3,
+ 0x06, 0x10, 0x05, 0xC6, 0x0C, 0x01, 0x60, 0xC3,
+ 0x06, 0x10, 0x05, 0xC7, 0x0E, 0x04, 0x50, 0xC3,
+ 0x06, 0x10, 0x05, 0xC9, 0x07, 0x40, 0xC3, 0x06,
+ 0x10, 0x05, 0xCA, 0x0A, 0x01, 0x20, 0xC3, 0x0B,
+ 0x18, 0x0A, 0xCB, 0x0D, 0x03, 0x12, 0xC0,
+//ascii 0x007B
+ 0xC1, 0x18, 0x09, 0xD9, 0x0B, 0x18, 0x0C, 0xC1,
+ 0x0E, 0x10, 0x01, 0xD9, 0x06, 0x10, 0x09, 0xC2,
+ 0x20, 0x0D, 0xD8, 0x02, 0x10, 0x0B, 0xC2, 0x02,
+ 0x10, 0x03, 0x0E, 0xD6, 0x06, 0x20, 0x0E, 0xC2,
+ 0x07, 0x30, 0x03, 0x04, 0x45, 0x06, 0x0A, 0xC3,
+ 0x0C, 0x07, 0x55, 0x03, 0x01, 0x20, 0x02, 0xC3,
+ 0x0E, 0x01, 0x70, 0x30, 0x04, 0xC1, 0x09, 0x70,
+ 0x40, 0x0A, 0xC4, 0x0C, 0x01, 0x70, 0x30, 0x0A,
+ 0x0E, 0x70, 0x40, 0x09, 0xC7, 0x89, 0x53, 0x42,
+ 0x01, 0x20, 0x04, 0x08, 0x30, 0x42, 0x93, 0x48,
+ 0xE0, 0xD1, 0x0D, 0x03, 0x10, 0x91, 0x01, 0xB0,
+ 0xDC, 0x0E, 0x30, 0x0A, 0xDE, 0x03, 0x20, 0xDF,
+ 0x07, 0x24,
+//ascii 0x007C
+ 0xC1, 0x07, 0x72, 0x72, 0x72, 0x72, 0x72, 0x12,
+ 0x0A, 0xC3, 0x06, 0x70, 0x70, 0x70, 0x70, 0x70,
+ 0x10, 0x09, 0xC3, 0x06, 0x70, 0x70, 0x70, 0x70,
+ 0x70, 0x10, 0x09, 0xC3, 0x0A, 0x77, 0x77, 0x77,
+ 0x77, 0x77, 0x17, 0x0C,
+//ascii 0x007D
+ 0xCF, 0x0B, 0x29, 0xDF, 0x04, 0x20, 0xDF, 0x01,
+ 0x20, 0x0D, 0xDD, 0x08, 0x30, 0x04, 0xD4, 0x0C,
+ 0x19, 0x38, 0x07, 0x03, 0x10, 0x02, 0x06, 0x10,
+ 0x02, 0x07, 0x38, 0x19, 0x0B, 0x0E, 0xC8, 0x07,
+ 0x70, 0x30, 0x07, 0x0C, 0x70, 0x30, 0x04, 0x0E,
+ 0xC5, 0x04, 0x70, 0x30, 0x01, 0x0E, 0xC0, 0x04,
+ 0x70, 0x30, 0x01, 0x0E, 0xC3, 0x0A, 0x70, 0x30,
+ 0x03, 0x0D, 0xC2, 0x06, 0x70, 0x30, 0x05, 0xC3,
+ 0x04, 0x20, 0x08, 0x0C, 0x5E, 0xC7, 0x5E, 0x8D,
+ 0x92, 0x20, 0xC3, 0x20, 0x0A, 0xD7, 0x0E, 0x20,
+ 0x0C, 0xC1, 0x0E, 0x20, 0xD9, 0x04, 0x10, 0x0A,
+ 0xC1, 0x0E, 0x11, 0x03, 0xD9, 0x07, 0x11, 0x0A,
+ 0xC0,
+//ascii 0x007E
+ 0xCE, 0xAB, 0x01, 0x4B, 0xC6, 0x0B, 0x30, 0x06,
+ 0xC5, 0x0B, 0x40, 0x09, 0xC5, 0x8D, 0x81, 0x10,
+ 0x02, 0xC7, 0x09, 0x20, 0x0E, 0xC6, 0x0C, 0x20,
+ 0x0E, 0xC6, 0x08, 0x10, 0x01, 0xC6, 0x0D, 0x20,
+ 0x07, 0xC5, 0x0E, 0x01, 0x10, 0x02, 0xC6, 0x04,
+ 0x20, 0x0C, 0xC5, 0x0A, 0x20, 0x0A, 0xC6, 0x04,
+ 0x10, 0x05, 0xC7, 0x01, 0x10, 0x09, 0xC7, 0x01,
+ 0x10, 0x06, 0xC7, 0x05, 0x20, 0x08, 0x0D, 0xC5,
+ 0x0C, 0x40, 0x09, 0xC5, 0x08, 0x30, 0x09, 0xC6,
+ 0xAC, 0x51, 0x09,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_MEDIUM_36PX[95] = {
+ { 0, 0, 10,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 11,2, 8, 3, 8 }, //asciii 0x0021
+ { 57, 1, 14,2, 8, 1, 24 }, //asciii 0x0022
+ { 94, 1, 23,0, 8, 0, 8 }, //asciii 0x0023
+ { 269, 1, 23,1, 4, 1, 4 }, //asciii 0x0024
+ { 487, 1, 30,3, 8, 3, 8 }, //asciii 0x0025
+ { 730, 1, 24,1, 8, 1, 8 }, //asciii 0x0026
+ { 942, 1, 8,2, 8, 2, 24 }, //asciii 0x0027
+ { 961, 1, 14,3, 8, 1, 4 }, //asciii 0x0028
+ { 1044, 1, 14,1, 8, 4, 4 }, //asciii 0x0029
+ { 1125, 1, 19,2, 8, 2, 20 }, //asciii 0x002A
+ { 1227, 1, 24,3, 16, 3, 12 }, //asciii 0x002B
+ { 1294, 1, 10,2, 32, 2, 4 }, //asciii 0x002C
+ { 1324, 1, 17,2, 24, 2, 20 }, //asciii 0x002D
+ { 1362, 1, 10,2, 32, 2, 8 }, //asciii 0x002E
+ { 1384, 1, 13,0, 8, 0, 4 }, //asciii 0x002F
+ { 1458, 1, 23,2, 8, 1, 8 }, //asciii 0x0030
+ { 1622, 1, 17,2, 8, 4, 8 }, //asciii 0x0031
+ { 1677, 1, 22,2, 8, 2, 8 }, //asciii 0x0032
+ { 1850, 1, 23,2, 8, 2, 8 }, //asciii 0x0033
+ { 2036, 1, 24,1, 8, 2, 8 }, //asciii 0x0034
+ { 2175, 1, 22,2, 8, 1, 8 }, //asciii 0x0035
+ { 2366, 1, 23,2, 8, 2, 8 }, //asciii 0x0036
+ { 2569, 1, 21,1, 8, 2, 8 }, //asciii 0x0037
+ { 2701, 1, 23,2, 8, 2, 8 }, //asciii 0x0038
+ { 2915, 1, 23,2, 8, 2, 8 }, //asciii 0x0039
+ { 3116, 1, 10,2, 16, 2, 8 }, //asciii 0x003A
+ { 3159, 1, 10,2, 16, 1, 4 }, //asciii 0x003B
+ { 3209, 1, 24,3, 16, 3, 8 }, //asciii 0x003C
+ { 3332, 1, 24,3, 20, 3, 12 }, //asciii 0x003D
+ { 3452, 1, 24,3, 16, 3, 8 }, //asciii 0x003E
+ { 3577, 1, 19,1, 8, 1, 8 }, //asciii 0x003F
+ { 3710, 1, 35,1, 8, 1, 0 }, //asciii 0x0040
+ { 4095, 1, 25,0, 8, 0, 8 }, //asciii 0x0041
+ { 4240, 1, 24,2, 8, 2, 8 }, //asciii 0x0042
+ { 4440, 1, 26,2, 8, 1, 8 }, //asciii 0x0043
+ { 4627, 1, 26,2, 8, 2, 8 }, //asciii 0x0044
+ { 4787, 1, 22,2, 8, 2, 8 }, //asciii 0x0045
+ { 4959, 1, 21,2, 8, 1, 8 }, //asciii 0x0046
+ { 5087, 1, 27,2, 8, 2, 8 }, //asciii 0x0047
+ { 5308, 1, 27,2, 8, 3, 8 }, //asciii 0x0048
+ { 5421, 1, 10,2, 8, 3, 8 }, //asciii 0x0049
+ { 5451, 1, 20,1, 8, 3, 8 }, //asciii 0x004A
+ { 5524, 1, 24,2, 8, 0, 8 }, //asciii 0x004B
+ { 5674, 1, 20,2, 8, 1, 8 }, //asciii 0x004C
+ { 5741, 1, 32,2, 8, 2, 8 }, //asciii 0x004D
+ { 5904, 1, 27,2, 8, 2, 8 }, //asciii 0x004E
+ { 6028, 1, 28,2, 8, 2, 8 }, //asciii 0x004F
+ { 6221, 1, 23,2, 8, 1, 8 }, //asciii 0x0050
+ { 6365, 1, 28,2, 8, 2, 8 }, //asciii 0x0051
+ { 6587, 1, 23,2, 8, 0, 8 }, //asciii 0x0052
+ { 6757, 1, 23,1, 8, 1, 8 }, //asciii 0x0053
+ { 6972, 1, 23,1, 8, 1, 8 }, //asciii 0x0054
+ { 7068, 1, 27,2, 8, 3, 8 }, //asciii 0x0055
+ { 7186, 1, 25,0, 8, 0, 8 }, //asciii 0x0056
+ { 7308, 1, 35,0, 8, 0, 8 }, //asciii 0x0057
+ { 7520, 1, 24,1, 8, 1, 8 }, //asciii 0x0058
+ { 7702, 1, 25,0, 8, 1, 8 }, //asciii 0x0059
+ { 7817, 1, 23,2, 8, 2, 8 }, //asciii 0x005A
+ { 8001, 1, 14,4, 8, 1, 4 }, //asciii 0x005B
+ { 8072, 1, 13,0, 8, 0, 4 }, //asciii 0x005C
+ { 8145, 1, 14,1, 8, 4, 4 }, //asciii 0x005D
+ { 8216, 1, 17,1, 8, 1, 24 }, //asciii 0x005E
+ { 8290, 1, 18,0, 36, 0, 4 }, //asciii 0x005F
+ { 8342, 1, 18,5, 8, 5, 32 }, //asciii 0x0060
+ { 8371, 1, 21,1, 16, 3, 8 }, //asciii 0x0061
+ { 8534, 1, 23,2, 8, 2, 8 }, //asciii 0x0062
+ { 8681, 1, 20,1, 16, 1, 8 }, //asciii 0x0063
+ { 8820, 1, 23,1, 8, 3, 8 }, //asciii 0x0064
+ { 8963, 1, 21,1, 16, 1, 8 }, //asciii 0x0065
+ { 9151, 1, 13,0, 8, 0, 8 }, //asciii 0x0066
+ { 9229, 1, 22,1, 16, 2, 0 }, //asciii 0x0067
+ { 9427, 1, 22,2, 8, 2, 8 }, //asciii 0x0068
+ { 9519, 1, 9,2, 8, 2, 8 }, //asciii 0x0069
+ { 9565, 1, 10,0, 8, 2, 0 }, //asciii 0x006A
+ { 9632, 1, 20,2, 8, 0, 8 }, //asciii 0x006B
+ { 9747, 1, 9,2, 8, 2, 8 }, //asciii 0x006C
+ { 9776, 1, 32,2, 16, 2, 8 }, //asciii 0x006D
+ { 9909, 1, 22,2, 16, 3, 8 }, //asciii 0x006E
+ { 9993, 1, 22,1, 16, 2, 8 }, //asciii 0x006F
+ { 10138, 1, 22,2, 16, 1, 0 }, //asciii 0x0070
+ { 10288, 1, 22,1, 16, 2, 0 }, //asciii 0x0071
+ { 10436, 1, 14,2, 16, 0, 8 }, //asciii 0x0072
+ { 10491, 1, 19,1, 16, 1, 8 }, //asciii 0x0073
+ { 10653, 1, 13,1, 12, 0, 8 }, //asciii 0x0074
+ { 10731, 1, 21,2, 16, 2, 8 }, //asciii 0x0075
+ { 10815, 1, 20,1, 16, 0, 8 }, //asciii 0x0076
+ { 10906, 1, 30,1, 16, 1, 8 }, //asciii 0x0077
+ { 11059, 1, 20,1, 16, 1, 8 }, //asciii 0x0078
+ { 11194, 1, 20,1, 16, 0, 0 }, //asciii 0x0079
+ { 11316, 1, 20,2, 16, 2, 8 }, //asciii 0x007A
+ { 11459, 1, 14,1, 8, 1, 4 }, //asciii 0x007B
+ { 11557, 1, 12,4, 0, 4, 0 }, //asciii 0x007C
+ { 11593, 1, 14,1, 8, 1, 4 }, //asciii 0x007D
+ { 11690, 1, 24,2, 20, 2, 16 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_MEDIUM_36PX= {
+ 11765, // bitmap len
+ BAGL_FONT_INTER_MEDIUM_36px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 48, // height of all characters in pixels
+ 44, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_MEDIUM_36PX,
+ bitmapINTER_MEDIUM_36PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.json b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.json
new file mode 100644
index 00000000..eb4514ab
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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DSANyAcQA80NIA3IBxADzQ0gDcgHEAPNDSANyAcQA80NIAJzAwEgcwPEDXBwcBDEDXBwcBDEDXBwcBDFfn5+HsDKnrhwFoeb1AkDcBAECsYNDMYKAXBQAgzDihrFBnBwEAjBBhAKxAVAkVigG5qFEEAHAyAKwwgwAgrJCQFgAg7CDTAGzQRABcQGIAXOBTAFxQEQAc0NAkADxAwgB8wLASABIMQJIAzMCCAZIAzDCCAOzJgCwMALIAvDByDNCATCDCAKwwggDcwNwwogC8MLIAnRBiAOww4gA9EBEAHFBCAJzwcgB8ULMAvNCDAOxgQwB8oOBTAHxw4BMJFr4MOOpUADyQ0CcAFwAAPLDgRwcAbOCwNwMAUM0Z2VMCGiNp7oDhwOzQkByI5hMIFuyAoCEMcKcBAKxQwDMMYLcDALwg0FUMYBMAIUAjACwA4GUAEIxQggAgzDDAIgBAFQB8cDIA3FDXCAbsggBscFUAQNyQ4gCscJMAMMyw0gDMcLIArNDSANxwsgDs0NIA3HCyAOzQ0gDccLIA7NDSANxwsgDs0NIA3HCyAOzQ0gAnMCIAJzA8QNcHBwEMQNcHBwEMQNcHBwEMV+fn4ewNMMGw7NnnNQxwgBMAMLygoBEAXGBHAHyAowBcUGcBAJxg4BMAbEDDCTZRAwDsUGIAMNxQUgBsIOAyAHxQEQAsYOIALEDgEQAcQMIArGCiAKxQcgDcMJIMcFIMYMIAvDCBABxwEQBMcgCsMHEALGDSAIxyAJwwgQAcYIIA3GDiAKwwsgDcUDEAHHCyALww4gBsQLIAbHBiAOxAQgCsIOAiAMxg0gAsULMJSHECADxgsBIAjGBXAQDMQNATACyARwCcUMQAzJCAEwAQrGDCABC8wLGQvIrAJ+wQ0iDdoNIAzaDSAM2g0gDNoNIAzaDSAM2g0gDNoNIAzaDSAEdXVVxA1wcHAQxA1wcHAQxA1wcHAQxA0gCXx8XMQNIAzaDSAM2g0gDNoNIAzaDSAM2g0gDNoNIAzbKQ7AwQ51dRUHCsoNcHBABsgNcHBQAg3GDXBwYAEOxnt7GwgCMAPaCDAK2gggBNsCINsIIAzaDCAK2g0gCdoNIAnaCiAL2gUgDdkNIAHZDgIgB9gJASABDsQNc3MDAlAJxQ1wcGAHxg1wcEABCccNcHAgg47Jfn4ewOGdBbDbDSCBbNgNUIJ9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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 33,
+ "bitmap_byte_count": 57
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 57,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 24,
+ "char": 34,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 94,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 175
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 269,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 218
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 487,
+ "width": 30,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 37,
+ "bitmap_byte_count": 243
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 730,
+ "width": 24,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 38,
+ "bitmap_byte_count": 212
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 942,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 24,
+ "char": 39,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 961,
+ "width": 14,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 40,
+ "bitmap_byte_count": 83
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1044,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 4,
+ "y_max_offset": 4,
+ "char": 41,
+ "bitmap_byte_count": 81
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1125,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 42,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1227,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 43,
+ "bitmap_byte_count": 67
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1294,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 32,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 44,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1324,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 24,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 45,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1362,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 32,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 46,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1384,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 74
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1458,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 48,
+ "bitmap_byte_count": 164
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1622,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 4,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 55
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1677,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 173
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1850,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 51,
+ "bitmap_byte_count": 186
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2036,
+ "width": 24,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 139
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2175,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 53,
+ "bitmap_byte_count": 191
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2366,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 54,
+ "bitmap_byte_count": 203
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2569,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 132
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2701,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 56,
+ "bitmap_byte_count": 214
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2915,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 57,
+ "bitmap_byte_count": 201
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3116,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 58,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3159,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 59,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3209,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 123
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3332,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 20,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 61,
+ "bitmap_byte_count": 120
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3452,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 62,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3577,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 63,
+ "bitmap_byte_count": 133
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3710,
+ "width": 35,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 385
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4095,
+ "width": 25,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 145
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4240,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 200
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4440,
+ "width": 26,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 67,
+ "bitmap_byte_count": 187
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4627,
+ "width": 26,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 160
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4787,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 172
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4959,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 128
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5087,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 71,
+ "bitmap_byte_count": 221
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5308,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 113
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5421,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5451,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 74,
+ "bitmap_byte_count": 73
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5524,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 150
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5674,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 67
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5741,
+ "width": 32,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 163
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5904,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 124
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6028,
+ "width": 28,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 79,
+ "bitmap_byte_count": 193
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6221,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 144
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6365,
+ "width": 28,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 81,
+ "bitmap_byte_count": 222
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6587,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 170
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6757,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 83,
+ "bitmap_byte_count": 215
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6972,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7068,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 85,
+ "bitmap_byte_count": 118
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7186,
+ "width": 25,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 122
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7308,
+ "width": 35,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 212
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7520,
+ "width": 24,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 182
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7702,
+ "width": 25,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 115
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7817,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 184
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8001,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8072,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 73
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8145,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 4,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8216,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 24,
+ "char": 94,
+ "bitmap_byte_count": 74
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8290,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 36,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8342,
+ "width": 18,
+ "x_min_offset": 5,
+ "y_min_offset": 8,
+ "x_max_offset": 5,
+ "y_max_offset": 32,
+ "char": 96,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8371,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 97,
+ "bitmap_byte_count": 163
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8534,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 98,
+ "bitmap_byte_count": 147
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8681,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 99,
+ "bitmap_byte_count": 139
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8820,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 100,
+ "bitmap_byte_count": 143
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8963,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 101,
+ "bitmap_byte_count": 188
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9151,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9229,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 198
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9427,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 92
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9519,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9565,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 67
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9632,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 115
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9747,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9776,
+ "width": 32,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 133
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9909,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9993,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 111,
+ "bitmap_byte_count": 145
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10138,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 150
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10288,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 148
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10436,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 55
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10491,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 115,
+ "bitmap_byte_count": 162
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10653,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 116,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10731,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 117,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10815,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10906,
+ "width": 30,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 153
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11059,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 135
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11194,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 122
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11316,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 143
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11459,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 98
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11557,
+ "width": 12,
+ "x_min_offset": 4,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11593,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 11690,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 20,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 126,
+ "bitmap_byte_count": 75
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.inc
new file mode 100644
index 00000000..d83d88db
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.inc
@@ -0,0 +1,666 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_MEDIUM_36PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xF0, 0x93, 0x3F, 0x03, 0x35, 0x2F, 0x03, 0x35,
+ 0x2F, 0x03, 0x35, 0x2F, 0x03, 0x44, 0x40,
+//ascii 0x0022
+ 0x29, 0x39, 0x39, 0xF0, 0xF0, 0xF0, 0x69, 0x39,
+ 0x39, 0x10,
+//ascii 0x0023
+ 0x93, 0xF0, 0xA3, 0x62, 0xA1, 0x63, 0x63, 0x9A,
+ 0x63, 0x9E, 0x23, 0xAF, 0x04, 0xFF, 0x04, 0x93,
+ 0x3D, 0x93, 0x6A, 0x93, 0x63, 0x61, 0x93, 0x63,
+ 0x91, 0x63, 0x63, 0x96, 0x13, 0x63, 0x9C, 0x43,
+ 0x9F, 0x04, 0xFF, 0x04, 0xA3, 0x2E, 0x93, 0x6A,
+ 0x93, 0x63, 0x52, 0x93, 0x63, 0xF0, 0xA3, 0x30,
+//ascii 0x0024
+ 0xA3, 0x96, 0xF0, 0x24, 0x7A, 0xE5, 0x6B, 0xD6,
+ 0x6C, 0xB5, 0x75, 0x45, 0xA4, 0x84, 0x64, 0xA3,
+ 0x93, 0x74, 0xA3, 0x84, 0x83, 0x7F, 0x0F, 0x02,
+ 0x4F, 0x0F, 0x02, 0x73, 0x83, 0x93, 0xA3, 0x74,
+ 0x93, 0xA4, 0x64, 0x84, 0xA4, 0x54, 0x94, 0xB5,
+ 0x16, 0x85, 0xBB, 0x76, 0xD9, 0x85, 0xF7, 0x94,
+ 0xF0, 0xF0, 0x23, 0x40,
+//ascii 0x0025
+ 0xF0, 0x65, 0xF0, 0xA9, 0x71, 0xEB, 0x62, 0xD3,
+ 0x53, 0x64, 0xA3, 0x72, 0x74, 0x93, 0x73, 0x75,
+ 0x73, 0x72, 0xA4, 0x73, 0x53, 0xB5, 0x5B, 0xD4,
+ 0x59, 0xF5, 0x55, 0xF0, 0x44, 0xF0, 0xE5, 0xF0,
+ 0x45, 0x45, 0xF0, 0x19, 0x44, 0xEB, 0x45, 0xC4,
+ 0x34, 0x64, 0xA3, 0x72, 0x75, 0x83, 0x73, 0x84,
+ 0x73, 0x72, 0xA5, 0x63, 0x53, 0xC3, 0x6B, 0xD2,
+ 0x79, 0xF1, 0x87, 0x40,
+//ascii 0x0026
+ 0xF0, 0xC1, 0xF0, 0xB2, 0xF0, 0x15, 0x43, 0xF0,
+ 0x17, 0x14, 0xF0, 0x1C, 0xF0, 0x48, 0x65, 0xA6,
+ 0x67, 0x88, 0x49, 0x65, 0x13, 0x3B, 0x45, 0x24,
+ 0x23, 0x54, 0x16, 0x43, 0x23, 0x69, 0x53, 0x23,
+ 0x67, 0x73, 0x23, 0x75, 0x83, 0x24, 0x47, 0x83,
+ 0x25, 0x1A, 0x64, 0x3F, 0x01, 0x54, 0x39, 0x3C,
+ 0x66, 0x5B, 0xF0, 0x39, 0xF0, 0x56,
+//ascii 0x0027
+ 0x29, 0x39, 0x39, 0x50,
+//ascii 0x0028
+ 0x11, 0xF0, 0xF1, 0x43, 0xF0, 0xC2, 0x45, 0xF0,
+ 0x75, 0x49, 0xF8, 0x6F, 0x0E, 0x8F, 0x0B, 0xDF,
+ 0x06, 0xF0, 0x3E, 0x40,
+//ascii 0x0029
+ 0xCA, 0xF0, 0x7F, 0x03, 0xFF, 0x09, 0xAF, 0x0D,
+ 0x7A, 0xAB, 0x47, 0xF0, 0x46, 0x44, 0xF0, 0xA3,
+ 0x42, 0xF0, 0xE1, 0x41, 0xF0, 0xF1, 0x70,
+//ascii 0x002A
+ 0x52, 0x42, 0xB4, 0x33, 0xB3, 0x23, 0xD3, 0x12,
+ 0xF5, 0xAF, 0x5F, 0x5F, 0xA5, 0xE3, 0x12, 0xD3,
+ 0x23, 0xC3, 0x33, 0xA3, 0x43, 0xC1, 0x41,
+//ascii 0x002B
+ 0x93, 0xF0, 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xF0,
+ 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xAF, 0x02, 0x3F,
+ 0x02, 0x3F, 0x02, 0x3F, 0x02, 0xA3, 0xF0, 0x23,
+ 0xF0, 0x23, 0xF0, 0x23, 0xF0, 0x23, 0xF0, 0x23,
+ 0xF0, 0x23,
+//ascii 0x002C
+ 0x11, 0xB6, 0x69, 0x3A, 0x66, 0xB1, 0x10,
+//ascii 0x002D
+ 0x0F, 0x0F, 0x0E, 0x40,
+//ascii 0x002E
+ 0x22, 0x54, 0x35, 0x35, 0x44, 0x30,
+//ascii 0x002F
+ 0x11, 0xF0, 0xF0, 0x14, 0xF0, 0xD7, 0xF0, 0xAB,
+ 0xF0, 0x8D, 0xF0, 0x8C, 0xF0, 0x8D, 0xF0, 0x8D,
+ 0xF0, 0x8D, 0xF0, 0x7B, 0xF0, 0xA7, 0xF0, 0xE3,
+//ascii 0x0030
+ 0xAC, 0xF0, 0x2F, 0x03, 0xDF, 0x05, 0xBF, 0x07,
+ 0x96, 0xC6, 0x75, 0xF0, 0x15, 0x64, 0xF0, 0x34,
+ 0x63, 0xF0, 0x53, 0x54, 0xF0, 0x53, 0x54, 0xF0,
+ 0x53, 0x63, 0xF0, 0x53, 0x63, 0xF0, 0x44, 0x64,
+ 0xF0, 0x34, 0x65, 0xF6, 0x77, 0xA7, 0x9F, 0x07,
+ 0xBF, 0x05, 0xEF, 0x01, 0xF0, 0x4A, 0x30,
+//ascii 0x0031
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x33, 0xF0, 0xA4, 0xF0, 0xA4, 0xF0, 0x94, 0xF0,
+ 0xA4, 0xF0, 0xA4, 0x20,
+//ascii 0x0032
+ 0xF0, 0xB3, 0xA6, 0xD3, 0x8A, 0xB3, 0x7C, 0xA3,
+ 0x75, 0x26, 0x93, 0x64, 0x66, 0x73, 0x63, 0x95,
+ 0x63, 0x63, 0xA5, 0x53, 0x63, 0xB5, 0x43, 0x54,
+ 0xC5, 0x33, 0x63, 0xD5, 0x23, 0x63, 0xE5, 0x13,
+ 0x64, 0xE8, 0x75, 0xD7, 0x76, 0xD6, 0x85, 0xE5,
+ 0x94, 0xF4, 0xD1, 0x50,
+//ascii 0x0033
+ 0xF0, 0x45, 0xF5, 0x68, 0xB9, 0x3A, 0x9A, 0x2C,
+ 0x8B, 0x14, 0x35, 0x75, 0x43, 0x13, 0x64, 0x64,
+ 0x65, 0x74, 0x63, 0x84, 0x83, 0x63, 0x83, 0x93,
+ 0x54, 0x83, 0x93, 0x63, 0x83, 0x93, 0x63, 0x83,
+ 0x93, 0x64, 0xF0, 0x34, 0x65, 0xF0, 0x24, 0x76,
+ 0xD5, 0x95, 0xC6, 0x95, 0xC5, 0xC3, 0xC4, 0xF0,
+ 0xD1, 0x10,
+//ascii 0x0034
+ 0xF0, 0x53, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0x7F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x26, 0xC3, 0x86, 0xB3, 0xA6, 0x93, 0xB6, 0x83,
+ 0xD6, 0x63, 0xE7, 0x43, 0xF0, 0x16, 0x33, 0xF0,
+ 0x36, 0x13, 0xF0, 0x49, 0xF0, 0x67, 0xF0, 0x76,
+ 0xF0, 0x94, 0x50,
+//ascii 0x0035
+ 0xF0, 0x17, 0x73, 0x9B, 0x53, 0x8D, 0x43, 0x7F,
+ 0x33, 0x75, 0x64, 0x33, 0x64, 0x94, 0x23, 0x64,
+ 0xA3, 0x23, 0x63, 0xB3, 0x23, 0x63, 0xB3, 0x23,
+ 0x63, 0xB3, 0x23, 0x63, 0xB3, 0x23, 0x73, 0x94,
+ 0x26, 0x43, 0x94, 0x2E, 0x65, 0x3D, 0x66, 0x3D,
+ 0x65, 0xD4, 0x63,
+//ascii 0x0036
+ 0x91, 0x85, 0xF0, 0x13, 0x69, 0xC5, 0x4D, 0x96,
+ 0x3E, 0x95, 0x45, 0x55, 0x74, 0x55, 0x75, 0x64,
+ 0x54, 0x94, 0x63, 0x63, 0xB3, 0x54, 0x63, 0xB3,
+ 0x63, 0x63, 0xB3, 0x63, 0x63, 0xB3, 0x64, 0x54,
+ 0xA3, 0x64, 0x63, 0x94, 0x74, 0x63, 0x74, 0x87,
+ 0x44, 0x36, 0x9F, 0x07, 0xCF, 0x04, 0xFF, 0xF0,
+ 0x59, 0x30,
+//ascii 0x0037
+ 0x24, 0xF0, 0x96, 0xF0, 0x78, 0xF0, 0x5A, 0xF0,
+ 0x33, 0x18, 0xF0, 0x13, 0x38, 0xE3, 0x58, 0xC3,
+ 0x78, 0xA3, 0x98, 0x83, 0xB8, 0x63, 0xD8, 0x43,
+ 0xF8, 0x23, 0xF0, 0x26, 0x23, 0xF0, 0x44, 0x23,
+ 0xF0, 0x62, 0x23, 0xF0, 0x71, 0x23, 0x30,
+//ascii 0x0038
+ 0xF0, 0x54, 0xF0, 0x13, 0x78, 0xC7, 0x4A, 0xA9,
+ 0x2C, 0x8B, 0x14, 0x35, 0x75, 0x38, 0x64, 0x64,
+ 0x65, 0x74, 0x63, 0x74, 0x93, 0x54, 0x83, 0x93,
+ 0x54, 0x83, 0x93, 0x54, 0x83, 0x93, 0x63, 0x83,
+ 0x93, 0x64, 0x65, 0x83, 0x65, 0x46, 0x74, 0x7B,
+ 0x14, 0x44, 0x8A, 0x2C, 0x99, 0x3A, 0xC5, 0x68,
+ 0xF0, 0xA6, 0x70,
+//ascii 0x0039
+ 0xB8, 0xF0, 0x6F, 0xFF, 0x04, 0xCF, 0x06, 0xAD,
+ 0x46, 0x85, 0x64, 0x55, 0x74, 0x84, 0x55, 0x63,
+ 0xA3, 0x64, 0x63, 0xA4, 0x63, 0x54, 0xB3, 0x63,
+ 0x54, 0xB3, 0x63, 0x63, 0xA4, 0x63, 0x64, 0x94,
+ 0x54, 0x64, 0x84, 0x64, 0x75, 0x55, 0x45, 0x8E,
+ 0x46, 0x9C, 0x55, 0xBA, 0x63, 0xF0, 0x15, 0x81,
+ 0x10,
+//ascii 0x003A
+ 0x31, 0xD2, 0x25, 0xA4, 0x15, 0x95, 0x15, 0x95,
+ 0x14, 0xB4, 0x40,
+//ascii 0x003B
+ 0x23, 0xB1, 0xC5, 0xA6, 0x75, 0xA9, 0x45, 0xAA,
+ 0x43, 0xF6, 0xF0, 0xC1, 0x20,
+//ascii 0x003C
+ 0x14, 0xB4, 0x24, 0xA3, 0x34, 0x94, 0x44, 0x83,
+ 0x54, 0x74, 0x64, 0x63, 0x74, 0x54, 0x84, 0x43,
+ 0x94, 0x34, 0xA3, 0x34, 0xA4, 0x14, 0xC3, 0x14,
+ 0xC7, 0xE6, 0xE5, 0xF0, 0x14, 0xF0, 0x13, 0x40,
+//ascii 0x003D
+ 0x13, 0x53, 0x13, 0x53, 0x13, 0x53, 0x13, 0x53,
+ 0x13, 0x53, 0x13, 0x53, 0x13, 0x53, 0x13, 0x53,
+ 0x13, 0x53, 0x13, 0x53, 0x13, 0x53, 0x13, 0x53,
+ 0x13, 0x53, 0x13, 0x53, 0x13, 0x53, 0x13, 0x53,
+//ascii 0x003E
+ 0x94, 0xF5, 0xF6, 0xD7, 0xD3, 0x14, 0xB4, 0x14,
+ 0xB4, 0x24, 0x94, 0x34, 0x94, 0x43, 0x84, 0x54,
+ 0x74, 0x63, 0x64, 0x74, 0x54, 0x83, 0x44, 0x94,
+ 0x34, 0xA3, 0x33, 0xB4, 0x14, 0xB4, 0x40,
+//ascii 0x003F
+ 0x67, 0xF0, 0x99, 0xF0, 0x7B, 0xF0, 0x5D, 0xF0,
+ 0x44, 0x54, 0xF0, 0x43, 0x74, 0xF0, 0x33, 0x86,
+ 0x53, 0x64, 0x87, 0x35, 0x63, 0x96, 0x35, 0x63,
+ 0xB4, 0x35, 0x64, 0xF0, 0x33, 0x75, 0xF0, 0xD6,
+ 0xF0, 0xC5, 0xF0, 0xD4, 0xF0, 0xF2, 0x60,
+//ascii 0x0040
+ 0xCB, 0xF0, 0x8F, 0xF0, 0x4F, 0x03, 0xF0, 0x26,
+ 0x95, 0xF5, 0xD4, 0xD4, 0xF0, 0x13, 0xD3, 0xF0,
+ 0x23, 0xC4, 0xF0, 0x14, 0x33, 0x63, 0x4F, 0x02,
+ 0x33, 0x54, 0x4F, 0x01, 0x43, 0x53, 0x5F, 0x63,
+ 0x43, 0x64, 0x54, 0x73, 0x43, 0x53, 0x94, 0x53,
+ 0x43, 0x44, 0xA3, 0x53, 0x42, 0x53, 0xB3, 0x53,
+ 0x43, 0x43, 0xB4, 0x43, 0x43, 0x43, 0xB4, 0x43,
+ 0x43, 0x44, 0xA3, 0x53, 0x43, 0x53, 0xA3, 0x53,
+ 0x43, 0x54, 0x75, 0x44, 0x43, 0x6E, 0x53, 0x63,
+ 0x6C, 0x63, 0x64, 0x6A, 0x64, 0x64, 0x93, 0x94,
+ 0x84, 0xF0, 0x45, 0x94, 0xF0, 0x25, 0xB5, 0xD6,
+ 0xD8, 0x68, 0xFF, 0x05, 0xF0, 0x3F, 0x01, 0xF0,
+ 0x7B,
+//ascii 0x0041
+ 0xF0, 0xB2, 0xF0, 0x85, 0xF0, 0x58, 0xF0, 0x2B,
+ 0xFB, 0xEB, 0xEC, 0xDF, 0xBB, 0x33, 0x9A, 0x63,
+ 0x97, 0x93, 0x95, 0xB3, 0x98, 0x83, 0x9A, 0x63,
+ 0xBB, 0x33, 0xEE, 0xF0, 0x2B, 0xF0, 0x4C, 0xF0,
+ 0x4C, 0xF0, 0x4A, 0xF0, 0x67, 0xF0, 0x94, 0xF0,
+ 0xB2, 0x40,
+//ascii 0x0042
+ 0xF0, 0x44, 0xC3, 0x78, 0x87, 0x4A, 0x69, 0x2C,
+ 0x4B, 0x14, 0x35, 0x35, 0x43, 0x13, 0x64, 0x24,
+ 0x65, 0x74, 0x24, 0x74, 0x74, 0x23, 0x83, 0x93,
+ 0x23, 0x83, 0x93, 0x23, 0x83, 0x93, 0x23, 0x83,
+ 0x93, 0x23, 0x83, 0x93, 0x23, 0x83, 0x93, 0x23,
+ 0x83, 0x93, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x2F, 0x0B, 0x40,
+//ascii 0x0043
+ 0xB1, 0x81, 0xF0, 0x43, 0xA3, 0xE5, 0xA4, 0xC6,
+ 0xA5, 0xA7, 0xA6, 0x95, 0xE5, 0x75, 0xF0, 0x14,
+ 0x74, 0xF0, 0x34, 0x64, 0xF0, 0x34, 0x63, 0xF0,
+ 0x53, 0x63, 0xF0, 0x53, 0x54, 0xF0, 0x53, 0x63,
+ 0xF0, 0x53, 0x63, 0xF0, 0x44, 0x64, 0xF0, 0x34,
+ 0x64, 0xF0, 0x25, 0x74, 0xF0, 0x14, 0x86, 0xC6,
+ 0x97, 0x87, 0xBF, 0x05, 0xDF, 0x03, 0xF0, 0x1E,
+ 0xF0, 0x68, 0x40,
+//ascii 0x0044
+ 0xB8, 0xF0, 0x2E, 0xCF, 0x02, 0xAF, 0x05, 0x77,
+ 0x87, 0x65, 0xC5, 0x54, 0xF5, 0x44, 0xF0, 0x14,
+ 0x34, 0xF0, 0x34, 0x24, 0xF0, 0x34, 0x23, 0xF0,
+ 0x44, 0x23, 0xF0, 0x44, 0x23, 0xF0, 0x53, 0x23,
+ 0xF0, 0x53, 0x23, 0xF0, 0x53, 0x23, 0xF0, 0x53,
+ 0x23, 0xF0, 0x53, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F,
+ 0x0B, 0x2F, 0x0B, 0x40,
+//ascii 0x0045
+ 0x23, 0xF0, 0x53, 0x23, 0x84, 0x83, 0x23, 0x84,
+ 0x83, 0x23, 0x84, 0x83, 0x23, 0x84, 0x83, 0x23,
+ 0x84, 0x83, 0x23, 0x84, 0x83, 0x23, 0x84, 0x83,
+ 0x23, 0x84, 0x83, 0x23, 0x84, 0x83, 0x23, 0x84,
+ 0x83, 0x23, 0x84, 0x83, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x0046
+ 0x23, 0xF0, 0xA3, 0x84, 0xD3, 0x84, 0xD3, 0x84,
+ 0xD3, 0x84, 0xD3, 0x84, 0xD3, 0x84, 0xD3, 0x84,
+ 0xD3, 0x84, 0xD3, 0x84, 0xD3, 0x84, 0xD3, 0x84,
+ 0xDF, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x0047
+ 0xA1, 0x56, 0xF0, 0x33, 0x58, 0xE5, 0x5A, 0xB6,
+ 0x5B, 0xA6, 0x53, 0x36, 0x85, 0x73, 0x45, 0x75,
+ 0x83, 0x55, 0x64, 0x93, 0x64, 0x64, 0x93, 0x64,
+ 0x63, 0xA3, 0x73, 0x63, 0xF0, 0x53, 0x54, 0xF0,
+ 0x53, 0x63, 0xF0, 0x53, 0x63, 0xF0, 0x44, 0x64,
+ 0xF0, 0x34, 0x64, 0xF0, 0x25, 0x74, 0xF0, 0x14,
+ 0x86, 0xC6, 0x97, 0x87, 0xBF, 0x05, 0xDF, 0x03,
+ 0xF0, 0x1E, 0xF0, 0x68, 0x40,
+//ascii 0x0048
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0xD4, 0xF0, 0x94, 0xF0, 0x94, 0xF0, 0x94, 0xF0,
+ 0x94, 0xF0, 0x94, 0xF0, 0x94, 0xF0, 0x94, 0xF0,
+ 0x94, 0xF0, 0x94, 0xF0, 0x94, 0xF0, 0x94, 0xF0,
+ 0x94, 0xDF, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F,
+ 0x0B, 0x40,
+//ascii 0x0049
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x004A
+ 0x2F, 0x07, 0x6F, 0x09, 0x4F, 0x0A, 0x3F, 0x0A,
+ 0xF0, 0x95, 0xF0, 0x94, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0x94, 0xF0, 0x85,
+ 0xF0, 0x66, 0xF0, 0x76, 0xF0, 0x75, 0xF0, 0x82,
+ 0x50,
+//ascii 0x004B
+ 0x21, 0xF0, 0x91, 0x22, 0xF0, 0x72, 0x23, 0xF0,
+ 0x44, 0x24, 0xF0, 0x25, 0x25, 0xF6, 0x35, 0xC7,
+ 0x55, 0xA6, 0x85, 0x86, 0xA5, 0x57, 0xC6, 0x26,
+ 0xFC, 0xF0, 0x29, 0xF0, 0x57, 0xF0, 0x85, 0xF0,
+ 0x95, 0xF0, 0x95, 0xBF, 0x0B, 0x2F, 0x0B, 0x2F,
+ 0x0B, 0x2F, 0x0B,
+//ascii 0x004C
+ 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x004D
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x27, 0xF0,
+ 0x69, 0xF0, 0x79, 0xF0, 0x69, 0xF0, 0x6A, 0xF0,
+ 0x69, 0xF0, 0x6A, 0xF0, 0x69, 0xF0, 0x69, 0xF0,
+ 0x76, 0xF0, 0x67, 0xF0, 0x3A, 0xF0, 0x19, 0xF0,
+ 0x29, 0xF0, 0x19, 0xF0, 0x29, 0xF0, 0x19, 0xF0,
+ 0x29, 0xF0, 0x29, 0xF0, 0x4F, 0x0B, 0x2F, 0x0B,
+ 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x004E
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0xF0, 0x66, 0xF0, 0x56, 0xF0, 0x66, 0xF0, 0x56,
+ 0xF0, 0x66, 0xF0, 0x57, 0xF0, 0x56, 0xF0, 0x57,
+ 0xF0, 0x56, 0xF0, 0x66, 0xF0, 0x56, 0xF0, 0x66,
+ 0xF0, 0x56, 0xF0, 0x6F, 0x0B, 0x2F, 0x0B, 0x2F,
+ 0x0B, 0x2F, 0x0B, 0x40,
+//ascii 0x004F
+ 0xE4, 0xF0, 0x9C, 0xF0, 0x3F, 0x01, 0xEF, 0x04,
+ 0xC8, 0x59, 0x96, 0xC5, 0x95, 0xE5, 0x75, 0xF0,
+ 0x14, 0x74, 0xF0, 0x34, 0x64, 0xF0, 0x34, 0x63,
+ 0xF0, 0x53, 0x63, 0xF0, 0x53, 0x54, 0xF0, 0x53,
+ 0x63, 0xF0, 0x53, 0x63, 0xF0, 0x44, 0x64, 0xF0,
+ 0x34, 0x64, 0xF0, 0x25, 0x74, 0xF0, 0x14, 0x86,
+ 0xC6, 0x97, 0x87, 0xBF, 0x05, 0xDF, 0x03, 0xF0,
+ 0x1E, 0xF0, 0x68, 0x40,
+//ascii 0x0050
+ 0x68, 0xF0, 0x4B, 0xF0, 0x1D, 0xEF, 0xD4, 0x65,
+ 0xC4, 0x84, 0xC4, 0x94, 0xB3, 0xA4, 0xB3, 0xA4,
+ 0xB3, 0xA4, 0xB3, 0xA4, 0xB3, 0xA4, 0xB3, 0xA4,
+ 0xB3, 0xA4, 0xBF, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x2F, 0x0B,
+//ascii 0x0051
+ 0xE4, 0xF0, 0x9C, 0x81, 0x9F, 0x01, 0x61, 0x7F,
+ 0x04, 0x33, 0x68, 0x5D, 0x56, 0xC9, 0x55, 0xE7,
+ 0x55, 0xF5, 0x74, 0xF7, 0x64, 0xE8, 0x63, 0xF3,
+ 0x23, 0x63, 0xF2, 0x33, 0x54, 0xF1, 0x43, 0x63,
+ 0xE1, 0x53, 0x63, 0xF0, 0x44, 0x64, 0xF0, 0x34,
+ 0x64, 0xF0, 0x25, 0x74, 0xF0, 0x14, 0x86, 0xC6,
+ 0x97, 0x87, 0xBF, 0x05, 0xDF, 0x03, 0xF0, 0x1E,
+ 0xF0, 0x68, 0x40,
+//ascii 0x0052
+ 0xF0, 0xC1, 0x68, 0xB3, 0x5A, 0x85, 0x4C, 0x57,
+ 0x3E, 0x29, 0x34, 0x6D, 0x44, 0x8A, 0x64, 0x88,
+ 0x83, 0xA5, 0xA3, 0xA3, 0xC3, 0xA3, 0xC3, 0xA3,
+ 0xC3, 0xA3, 0xC3, 0xA3, 0xC3, 0xA3, 0xCF, 0x0B,
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x40,
+//ascii 0x0053
+ 0x73, 0x96, 0xD4, 0x7A, 0xA5, 0x6B, 0x96, 0x6C,
+ 0x75, 0x75, 0x45, 0x64, 0x84, 0x64, 0x63, 0x93,
+ 0x74, 0x63, 0x84, 0x83, 0x63, 0x84, 0x83, 0x54,
+ 0x83, 0x93, 0x63, 0x83, 0x93, 0x63, 0x74, 0x93,
+ 0x64, 0x64, 0x84, 0x64, 0x54, 0x94, 0x75, 0x16,
+ 0x85, 0x7B, 0x76, 0x99, 0x85, 0xB7, 0x94, 0xF0,
+ 0xD3, 0x70,
+//ascii 0x0054
+ 0x23, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+ 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+ 0xAF, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x23, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0,
+ 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0x70,
+//ascii 0x0055
+ 0x2F, 0x04, 0x9F, 0x07, 0x6F, 0x08, 0x5F, 0x09,
+ 0xF0, 0x77, 0xF0, 0x94, 0xF0, 0xA4, 0xF0, 0x94,
+ 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3, 0xF0, 0xA3,
+ 0xF0, 0xA3, 0xF0, 0x94, 0xF0, 0x94, 0xF0, 0x85,
+ 0xF0, 0x75, 0x3F, 0x09, 0x4F, 0x09, 0x4F, 0x07,
+ 0x6F, 0x06, 0x10,
+//ascii 0x0056
+ 0x22, 0xF0, 0xB5, 0xF0, 0x88, 0xF0, 0x5A, 0xF0,
+ 0x4C, 0xF0, 0x4C, 0xF0, 0x4C, 0xF0, 0x4C, 0xF0,
+ 0x4B, 0xF0, 0x5A, 0xF0, 0x67, 0xF0, 0x85, 0xF0,
+ 0x58, 0xF0, 0x2B, 0xEC, 0xEB, 0xEB, 0xEB, 0xEC,
+ 0xFA, 0xF0, 0x37, 0xF0, 0x64, 0xF0, 0x92, 0x40,
+//ascii 0x0057
+ 0x23, 0xF0, 0xA7, 0xF0, 0x6B, 0xF0, 0x2E, 0xF0,
+ 0x2F, 0xF0, 0x2E, 0xF0, 0x3E, 0xF0, 0x3B, 0xF0,
+ 0x67, 0xF0, 0x58, 0xF0, 0x1C, 0xDC, 0xCD, 0xBD,
+ 0xCD, 0xF9, 0xF0, 0x46, 0xF0, 0x7A, 0xF0, 0x3E,
+ 0xF0, 0x3D, 0xF0, 0x4D, 0xF0, 0x3D, 0xF0, 0x4B,
+ 0xF0, 0x67, 0xF0, 0x58, 0xF0, 0x1C, 0xCE, 0xAF,
+ 0x9F, 0xBD, 0xFA, 0xF0, 0x36, 0xF0, 0x73, 0x30,
+//ascii 0x0058
+ 0x21, 0xF0, 0x91, 0x22, 0xF0, 0x72, 0x24, 0xF0,
+ 0x34, 0x25, 0xF6, 0x27, 0xC7, 0x38, 0x88, 0x67,
+ 0x67, 0x98, 0x27, 0xDE, 0xF0, 0x1A, 0xF0, 0x48,
+ 0xF0, 0x58, 0xF0, 0x4A, 0xF0, 0x1E, 0xD7, 0x27,
+ 0xA7, 0x67, 0x67, 0x98, 0x37, 0xC7, 0x25, 0xF6,
+ 0x24, 0xF0, 0x34, 0x22, 0xF0, 0x72, 0x21, 0xF0,
+ 0x91,
+//ascii 0x0059
+ 0x21, 0xF0, 0xC2, 0xF0, 0xB4, 0xF0, 0x95, 0xF0,
+ 0x87, 0xF0, 0x78, 0xF0, 0x77, 0xF0, 0x87, 0xF0,
+ 0x78, 0xF0, 0x77, 0xF0, 0x8F, 0x01, 0xEE, 0xDF,
+ 0xBF, 0x02, 0x97, 0xF0, 0x48, 0xF0, 0x47, 0xF0,
+ 0x47, 0xF0, 0x48, 0xF0, 0x56, 0xF0, 0x74, 0xF0,
+ 0x93, 0xF0, 0xA1, 0x50,
+//ascii 0x005A
+ 0x23, 0xF0, 0x53, 0x24, 0xF0, 0x43, 0x26, 0xF0,
+ 0x23, 0x27, 0xF0, 0x13, 0x29, 0xE3, 0x23, 0x16,
+ 0xD3, 0x23, 0x27, 0xB3, 0x23, 0x46, 0xA3, 0x23,
+ 0x57, 0x83, 0x23, 0x76, 0x73, 0x23, 0x87, 0x53,
+ 0x23, 0xA6, 0x43, 0x23, 0xB6, 0x33, 0x23, 0xD6,
+ 0x13, 0x23, 0xE9, 0x23, 0xF0, 0x17, 0x23, 0xF0,
+ 0x26, 0x23, 0xF0, 0x35, 0x23, 0xF0, 0x53, 0x40,
+//ascii 0x005B
+ 0x13, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0,
+ 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x4F,
+ 0x0F, 0x02, 0x4F, 0x0F, 0x02, 0x4F, 0x0F, 0x02,
+ 0x4F, 0x0F, 0x02, 0x70,
+//ascii 0x005C
+ 0xF0, 0xF0, 0x11, 0xF0, 0xD4, 0xF0, 0x98, 0xF0,
+ 0x6B, 0xF0, 0x2D, 0xFD, 0xFD, 0xF0, 0x1C, 0xF0,
+ 0x1D, 0xF0, 0x3A, 0xF0, 0x76, 0xF0, 0xB3, 0x40,
+//ascii 0x005D
+ 0x1F, 0x0F, 0x02, 0x4F, 0x0F, 0x02, 0x4F, 0x0F,
+ 0x02, 0x4F, 0x0F, 0x02, 0x43, 0xF0, 0xB3, 0x43,
+ 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3,
+ 0x43, 0xF0, 0xB3, 0x70,
+//ascii 0x005E
+ 0xD1, 0xD3, 0xB5, 0x97, 0x77, 0x77, 0x94, 0xC3,
+ 0xD5, 0xB7, 0xB7, 0xB7, 0xB5, 0xD3, 0xF1, 0x20,
+//ascii 0x005F
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
+ 0x13, 0x40,
+//ascii 0x0060
+ 0x42, 0x44, 0x26, 0x24, 0x43, 0x51, 0x71, 0x70,
+//ascii 0x0061
+ 0x5F, 0x01, 0x6F, 0x03, 0x6F, 0x03, 0x5F, 0x04,
+ 0x54, 0x33, 0x43, 0x64, 0x43, 0x53, 0x53, 0x53,
+ 0x63, 0x43, 0x53, 0x63, 0x43, 0x62, 0x63, 0x43,
+ 0x63, 0x53, 0x53, 0x53, 0x53, 0x54, 0x43, 0x53,
+ 0x55, 0x35, 0x15, 0x64, 0x4A, 0x72, 0x59, 0x91,
+ 0x67, 0x50,
+//ascii 0x0062
+ 0xF6, 0xF0, 0x4C, 0xFF, 0xCF, 0x02, 0xA6, 0x66,
+ 0xA4, 0xA5, 0x84, 0xC4, 0x84, 0xD3, 0x83, 0xE3,
+ 0x83, 0xE3, 0x84, 0xD3, 0x93, 0xD3, 0x94, 0xB3,
+ 0xC3, 0x84, 0x4F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0x2F, 0x0B,
+//ascii 0x0063
+ 0x62, 0x72, 0xB4, 0x73, 0x95, 0x74, 0x76, 0x75,
+ 0x64, 0xA5, 0x44, 0xC4, 0x44, 0xD3, 0x43, 0xE3,
+ 0x43, 0xE3, 0x44, 0xD3, 0x44, 0xD3, 0x54, 0xB4,
+ 0x55, 0x85, 0x7F, 0x02, 0x8F, 0xAD, 0xD9,
+//ascii 0x0064
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+ 0xB4, 0x64, 0xD3, 0xA4, 0xA3, 0xC3, 0xA3, 0xD3,
+ 0x83, 0xE3, 0x83, 0xE3, 0x84, 0xD3, 0x84, 0xD3,
+ 0x85, 0xB4, 0x95, 0x86, 0x9F, 0x03, 0xBF, 0x01,
+ 0xDE, 0xF0, 0x1A, 0x50,
+//ascii 0x0065
+ 0x66, 0x42, 0xA8, 0x43, 0x89, 0x44, 0x66, 0x13,
+ 0x35, 0x64, 0x33, 0x54, 0x53, 0x43, 0x63, 0x44,
+ 0x43, 0x63, 0x43, 0x53, 0x63, 0x43, 0x53, 0x63,
+ 0x43, 0x53, 0x63, 0x44, 0x43, 0x63, 0x53, 0x43,
+ 0x54, 0x54, 0x33, 0x44, 0x7F, 0x02, 0x8F, 0xAD,
+ 0xD9,
+//ascii 0x0066
+ 0x11, 0xF0, 0xC3, 0x43, 0xF0, 0x33, 0x43, 0xF0,
+ 0x33, 0x43, 0xF0, 0x33, 0x43, 0xF0, 0x3F, 0x0C,
+ 0x1F, 0x0C, 0x2F, 0x0B, 0x3F, 0x0A, 0x83, 0xF0,
+ 0xA3, 0xF0, 0xA3, 0x10,
+//ascii 0x0067
+ 0x1F, 0x07, 0xAF, 0x0A, 0x7F, 0x0B, 0x6F, 0x0B,
+ 0x94, 0x64, 0x55, 0x73, 0xA3, 0x63, 0x63, 0xC3,
+ 0x53, 0x63, 0xC3, 0x54, 0x43, 0xD4, 0x53, 0x43,
+ 0xD4, 0x53, 0x44, 0xC4, 0x44, 0x44, 0xC4, 0x44,
+ 0x45, 0xA4, 0x53, 0x65, 0x85, 0x44, 0x6F, 0x02,
+ 0x45, 0x7F, 0x01, 0x44, 0x9E, 0x62, 0xCA, 0x81,
+ 0x70,
+//ascii 0x0068
+ 0xCF, 0x01, 0xAF, 0x03, 0x9F, 0x04, 0x9F, 0x04,
+ 0x85, 0xF0, 0x84, 0xF0, 0x94, 0xF0, 0x93, 0xF0,
+ 0xA3, 0xF0, 0xB3, 0xF0, 0xA3, 0xF0, 0xB3, 0xF0,
+ 0xC3, 0xFF, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B,
+//ascii 0x0069
+ 0x22, 0xF0, 0xA4, 0x3F, 0x05, 0x14, 0x3F, 0x05,
+ 0x14, 0x3F, 0x05, 0x22, 0x40,
+//ascii 0x006A
+ 0x22, 0xF0, 0xF0, 0x34, 0x3F, 0x0A, 0x44, 0x3F,
+ 0x0B, 0x34, 0x3F, 0x0C, 0x32, 0xF0, 0xB5, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0x10,
+//ascii 0x006B
+ 0xF0, 0xC1, 0x81, 0xF0, 0x22, 0x82, 0xF3, 0x83,
+ 0xD4, 0x84, 0xA6, 0x85, 0x86, 0xA5, 0x66, 0xD4,
+ 0x46, 0xF4, 0x16, 0xF0, 0x39, 0xF0, 0x57, 0xF0,
+ 0x74, 0xF0, 0xA4, 0xF0, 0xA4, 0x9F, 0x0B, 0x2F,
+ 0x0B, 0x2F, 0x0B, 0x40,
+//ascii 0x006C
+ 0x2F, 0x0B, 0x2F, 0x0B, 0x2F, 0x0B, 0x40,
+//ascii 0x006D
+ 0x4F, 0x02, 0x6F, 0x03, 0x5F, 0x04, 0x4F, 0x05,
+ 0x44, 0xF0, 0x54, 0xF0, 0x54, 0xF0, 0x53, 0xF0,
+ 0x73, 0xF0, 0x63, 0xF0, 0x73, 0xF0, 0x7F, 0x02,
+ 0x6F, 0x03, 0x5F, 0x04, 0x5F, 0x04, 0x45, 0xF0,
+ 0x44, 0xF0, 0x54, 0xF0, 0x53, 0xF0, 0x73, 0xF0,
+ 0x63, 0xF0, 0x73, 0xF0, 0x74, 0xF0, 0x2F, 0x05,
+ 0x4F, 0x05, 0x4F, 0x05, 0x30,
+//ascii 0x006E
+ 0x5F, 0x01, 0x6F, 0x03, 0x5F, 0x04, 0x5F, 0x04,
+ 0x45, 0xF0, 0x44, 0xF0, 0x54, 0xF0, 0x54, 0xF0,
+ 0x53, 0xF0, 0x73, 0xF0, 0x63, 0xF0, 0x73, 0xF0,
+ 0x74, 0xF0, 0x2F, 0x05, 0x4F, 0x05, 0x4F, 0x05,
+ 0x30,
+//ascii 0x006F
+ 0x87, 0xEC, 0xBF, 0x8F, 0x02, 0x66, 0x75, 0x64,
+ 0xB4, 0x44, 0xC4, 0x44, 0xD3, 0x43, 0xE3, 0x43,
+ 0xE3, 0x43, 0xE3, 0x44, 0xD3, 0x54, 0xB4, 0x55,
+ 0x94, 0x7F, 0x02, 0x8F, 0xAD, 0xD9,
+//ascii 0x0070
+ 0xB1, 0xF0, 0x7B, 0xFE, 0xDF, 0x01, 0xB7, 0x47,
+ 0xA5, 0x95, 0x84, 0xC4, 0x84, 0xD3, 0x84, 0xD3,
+ 0x83, 0xE3, 0x83, 0xE3, 0x93, 0xD3, 0x93, 0xC3,
+ 0xB3, 0xA3, 0xE4, 0x45, 0xBF, 0x0C, 0x1F, 0x0C,
+ 0x1F, 0x0C,
+//ascii 0x0071
+ 0x1F, 0x0C, 0x1F, 0x0C, 0x1F, 0x0C, 0x1F, 0x0C,
+ 0x44, 0x64, 0xD3, 0xA4, 0xA3, 0xC3, 0xA3, 0xD3,
+ 0x83, 0xE3, 0x83, 0xE3, 0x84, 0xD3, 0x84, 0xD3,
+ 0x85, 0xB4, 0x95, 0x86, 0x9F, 0x03, 0xBF, 0x01,
+ 0xDE, 0xF0, 0x1A, 0x40,
+//ascii 0x0072
+ 0x14, 0xF0, 0x54, 0xF0, 0x54, 0xF0, 0x54, 0xF0,
+ 0x63, 0xF0, 0x73, 0xF0, 0x74, 0xF0, 0x2F, 0x05,
+ 0x4F, 0x05, 0x4F, 0x05, 0x30,
+//ascii 0x0073
+ 0xE3, 0xB2, 0x67, 0x83, 0x59, 0x65, 0x49, 0x64,
+ 0x45, 0x24, 0x44, 0x54, 0x43, 0x43, 0x63, 0x53,
+ 0x43, 0x63, 0x53, 0x43, 0x54, 0x53, 0x43, 0x54,
+ 0x53, 0x44, 0x43, 0x63, 0x54, 0x24, 0x54, 0x5A,
+ 0x36, 0x68, 0x54, 0x86, 0x63, 0xA4, 0x72, 0x60,
+//ascii 0x0074
+ 0x43, 0xE3, 0x43, 0xE3, 0x43, 0xE3, 0x43, 0xDF,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x1F, 0x07, 0x63, 0xF0,
+ 0x63, 0xF0, 0x63, 0x10,
+//ascii 0x0075
+ 0x1F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x4F, 0x05,
+ 0xF0, 0x33, 0xF0, 0x83, 0xF0, 0x63, 0xF0, 0x73,
+ 0xF0, 0x63, 0xF0, 0x63, 0xF0, 0x54, 0xF0, 0x54,
+ 0xF0, 0x36, 0x4F, 0x04, 0x5F, 0x04, 0x5F, 0x02,
+ 0x60,
+//ascii 0x0076
+ 0x13, 0xF0, 0x66, 0xF0, 0x38, 0xF0, 0x1B, 0xF0,
+ 0x1B, 0xF0, 0x1B, 0xF0, 0x1A, 0xF0, 0x28, 0xF0,
+ 0x45, 0xF0, 0x36, 0xF9, 0xCA, 0xBA, 0xAC, 0xBA,
+ 0xE7, 0xF0, 0x24, 0xF0, 0x52, 0x50,
+//ascii 0x0077
+ 0x11, 0xF0, 0x84, 0xF0, 0x58, 0xF0, 0x1B, 0xEE,
+ 0xED, 0xFB, 0xF0, 0x18, 0xF0, 0x36, 0xEA, 0xBB,
+ 0x9C, 0x9B, 0xD8, 0xF0, 0x17, 0xF0, 0x2A, 0xF0,
+ 0x1C, 0xF0, 0x1B, 0xF0, 0x1B, 0xF0, 0x27, 0xF0,
+ 0x36, 0xEA, 0xAD, 0x7E, 0x8C, 0xC9, 0xF5, 0xF0,
+ 0x42, 0x50,
+//ascii 0x0078
+ 0xF0, 0x51, 0x42, 0xF0, 0x12, 0x44, 0xD3, 0x45,
+ 0xA5, 0x47, 0x76, 0x66, 0x47, 0x8E, 0xCA, 0xF0,
+ 0x17, 0xF0, 0x26, 0xF0, 0x1A, 0xDD, 0x97, 0x36,
+ 0x67, 0x67, 0x45, 0xA5, 0x44, 0xC4, 0x42, 0xF0,
+ 0x12, 0x41, 0xF0, 0x31, 0x30,
+//ascii 0x0079
+ 0x13, 0xF0, 0xA6, 0xF0, 0x78, 0xF0, 0x5B, 0xF0,
+ 0x5B, 0xF0, 0x5B, 0xF0, 0x5A, 0xF0, 0x6A, 0xF0,
+ 0x69, 0xF0, 0x3C, 0xDF, 0xAA, 0x45, 0x6B, 0x74,
+ 0x3B, 0xB3, 0x1A, 0xE3, 0x17, 0xF0, 0x23, 0x14,
+ 0xF0, 0x71, 0x12, 0x10,
+//ascii 0x007A
+ 0x13, 0xE3, 0x45, 0xC3, 0x46, 0xB3, 0x47, 0xA3,
+ 0x48, 0x93, 0x4A, 0x73, 0x44, 0x16, 0x63, 0x44,
+ 0x35, 0x53, 0x44, 0x46, 0x33, 0x44, 0x56, 0x23,
+ 0x44, 0x75, 0x13, 0x44, 0x88, 0x44, 0x97, 0x44,
+ 0xA6, 0x44, 0xC4, 0x44, 0xD3, 0x30,
+//ascii 0x007B
+ 0x13, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0,
+ 0xB3, 0x44, 0xF0, 0x94, 0x4D, 0x6D, 0x5E, 0x3D,
+ 0x7D, 0x2E, 0x9C, 0x1C, 0xF0, 0x56, 0xF0, 0xF0,
+ 0x14, 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x24, 0x10,
+//ascii 0x007C
+ 0x2F, 0x0F, 0x0D, 0x5F, 0x0F, 0x0D, 0x5F, 0x0F,
+ 0x0D, 0x5F, 0x0F, 0x0D, 0x30,
+//ascii 0x007D
+ 0xF4, 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x25, 0xF0,
+ 0xDA, 0xF0, 0x2E, 0x1D, 0x7E, 0x2E, 0x6D, 0x4E,
+ 0x45, 0xF0, 0x84, 0x43, 0xF0, 0xB3, 0x43, 0xF0,
+ 0xB3, 0x43, 0xF0, 0xB3, 0x70,
+//ascii 0x007E
+ 0x43, 0x95, 0x75, 0x85, 0x93, 0x93, 0x84, 0x84,
+ 0x74, 0x74, 0x83, 0x84, 0x83, 0x94, 0x84, 0x95,
+ 0x75, 0x93, 0x30,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_MEDIUM_36PX_1BPP[95] = {
+ { 0, 0, 10,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 11,3, 8, 3, 12 }, //asciii 0x0021
+ { 15, 1, 14,2, 8, 2, 28 }, //asciii 0x0022
+ { 25, 1, 23,1, 8, 1, 12 }, //asciii 0x0023
+ { 73, 1, 23,2, 4, 2, 8 }, //asciii 0x0024
+ { 125, 1, 30,3, 8, 3, 8 }, //asciii 0x0025
+ { 185, 1, 24,2, 8, 1, 12 }, //asciii 0x0026
+ { 239, 1, 8,2, 8, 3, 28 }, //asciii 0x0027
+ { 243, 1, 14,4, 8, 2, 4 }, //asciii 0x0028
+ { 263, 1, 14,1, 8, 4, 4 }, //asciii 0x0029
+ { 286, 1, 19,2, 8, 3, 20 }, //asciii 0x002A
+ { 309, 1, 24,3, 16, 3, 12 }, //asciii 0x002B
+ { 343, 1, 10,2, 32, 2, 4 }, //asciii 0x002C
+ { 350, 1, 17,3, 24, 3, 20 }, //asciii 0x002D
+ { 354, 1, 10,3, 32, 2, 8 }, //asciii 0x002E
+ { 360, 1, 13,1, 8, 0, 8 }, //asciii 0x002F
+ { 384, 1, 23,2, 8, 2, 8 }, //asciii 0x0030
+ { 431, 1, 17,2, 8, 5, 12 }, //asciii 0x0031
+ { 451, 1, 22,2, 8, 2, 8 }, //asciii 0x0032
+ { 495, 1, 23,2, 8, 2, 8 }, //asciii 0x0033
+ { 545, 1, 24,2, 8, 2, 12 }, //asciii 0x0034
+ { 588, 1, 22,3, 8, 2, 12 }, //asciii 0x0035
+ { 631, 1, 23,2, 8, 2, 8 }, //asciii 0x0036
+ { 681, 1, 21,2, 8, 2, 12 }, //asciii 0x0037
+ { 720, 1, 23,2, 8, 2, 8 }, //asciii 0x0038
+ { 771, 1, 23,2, 8, 2, 8 }, //asciii 0x0039
+ { 820, 1, 10,3, 16, 2, 12 }, //asciii 0x003A
+ { 831, 1, 10,2, 16, 2, 4 }, //asciii 0x003B
+ { 844, 1, 24,3, 16, 4, 12 }, //asciii 0x003C
+ { 876, 1, 24,4, 20, 4, 16 }, //asciii 0x003D
+ { 908, 1, 24,3, 16, 4, 12 }, //asciii 0x003E
+ { 939, 1, 19,1, 8, 2, 8 }, //asciii 0x003F
+ { 978, 1, 35,2, 8, 2, 4 }, //asciii 0x0040
+ { 1075, 1, 25,1, 8, 1, 12 }, //asciii 0x0041
+ { 1117, 1, 24,3, 8, 2, 12 }, //asciii 0x0042
+ { 1168, 1, 26,2, 8, 1, 8 }, //asciii 0x0043
+ { 1227, 1, 26,3, 8, 2, 12 }, //asciii 0x0044
+ { 1279, 1, 22,3, 8, 3, 12 }, //asciii 0x0045
+ { 1323, 1, 21,3, 8, 2, 12 }, //asciii 0x0046
+ { 1355, 1, 27,2, 8, 2, 8 }, //asciii 0x0047
+ { 1416, 1, 27,3, 8, 3, 12 }, //asciii 0x0048
+ { 1458, 1, 10,3, 8, 3, 12 }, //asciii 0x0049
+ { 1466, 1, 20,1, 8, 3, 12 }, //asciii 0x004A
+ { 1499, 1, 24,3, 8, 1, 12 }, //asciii 0x004B
+ { 1542, 1, 20,3, 8, 1, 12 }, //asciii 0x004C
+ { 1574, 1, 32,3, 8, 3, 12 }, //asciii 0x004D
+ { 1626, 1, 27,3, 8, 3, 12 }, //asciii 0x004E
+ { 1670, 1, 28,2, 8, 2, 8 }, //asciii 0x004F
+ { 1730, 1, 23,3, 8, 2, 12 }, //asciii 0x0050
+ { 1764, 1, 28,2, 8, 2, 8 }, //asciii 0x0051
+ { 1823, 1, 23,3, 8, 1, 12 }, //asciii 0x0052
+ { 1862, 1, 23,2, 8, 2, 8 }, //asciii 0x0053
+ { 1912, 1, 23,2, 8, 1, 12 }, //asciii 0x0054
+ { 1952, 1, 27,3, 8, 3, 12 }, //asciii 0x0055
+ { 1995, 1, 25,1, 8, 1, 12 }, //asciii 0x0056
+ { 2035, 1, 35,1, 8, 1, 12 }, //asciii 0x0057
+ { 2091, 1, 24,1, 8, 1, 12 }, //asciii 0x0058
+ { 2140, 1, 25,1, 8, 1, 12 }, //asciii 0x0059
+ { 2184, 1, 23,2, 8, 2, 12 }, //asciii 0x005A
+ { 2240, 1, 14,4, 8, 1, 4 }, //asciii 0x005B
+ { 2268, 1, 13,1, 8, 0, 8 }, //asciii 0x005C
+ { 2292, 1, 14,1, 8, 4, 4 }, //asciii 0x005D
+ { 2320, 1, 17,1, 8, 1, 24 }, //asciii 0x005E
+ { 2336, 1, 18,0, 36, 1, 8 }, //asciii 0x005F
+ { 2354, 1, 18,5, 8, 6, 32 }, //asciii 0x0060
+ { 2362, 1, 21,2, 16, 3, 8 }, //asciii 0x0061
+ { 2404, 1, 23,3, 8, 2, 12 }, //asciii 0x0062
+ { 2438, 1, 20,2, 16, 1, 8 }, //asciii 0x0063
+ { 2469, 1, 23,2, 8, 3, 12 }, //asciii 0x0064
+ { 2505, 1, 21,2, 16, 2, 8 }, //asciii 0x0065
+ { 2546, 1, 13,1, 8, 0, 12 }, //asciii 0x0066
+ { 2574, 1, 22,2, 16, 2, 0 }, //asciii 0x0067
+ { 2623, 1, 22,3, 8, 3, 12 }, //asciii 0x0068
+ { 2654, 1, 9,2, 8, 2, 12 }, //asciii 0x0069
+ { 2667, 1, 10,0, 8, 2, 4 }, //asciii 0x006A
+ { 2692, 1, 20,3, 8, 0, 12 }, //asciii 0x006B
+ { 2728, 1, 9,3, 8, 3, 12 }, //asciii 0x006C
+ { 2735, 1, 32,3, 16, 3, 8 }, //asciii 0x006D
+ { 2788, 1, 22,3, 16, 3, 8 }, //asciii 0x006E
+ { 2821, 1, 22,2, 16, 2, 8 }, //asciii 0x006F
+ { 2851, 1, 22,3, 16, 1, 4 }, //asciii 0x0070
+ { 2885, 1, 22,2, 16, 2, 4 }, //asciii 0x0071
+ { 2921, 1, 14,3, 16, 1, 8 }, //asciii 0x0072
+ { 2942, 1, 19,2, 16, 1, 8 }, //asciii 0x0073
+ { 2982, 1, 13,1, 12, 1, 12 }, //asciii 0x0074
+ { 3002, 1, 21,3, 16, 2, 8 }, //asciii 0x0075
+ { 3035, 1, 20,1, 16, 1, 8 }, //asciii 0x0076
+ { 3065, 1, 30,1, 16, 1, 8 }, //asciii 0x0077
+ { 3107, 1, 20,1, 16, 1, 8 }, //asciii 0x0078
+ { 3144, 1, 20,1, 16, 1, 4 }, //asciii 0x0079
+ { 3180, 1, 20,2, 16, 2, 8 }, //asciii 0x007A
+ { 3218, 1, 14,1, 8, 1, 4 }, //asciii 0x007B
+ { 3250, 1, 12,4, 0, 4, 0 }, //asciii 0x007C
+ { 3263, 1, 14,1, 8, 2, 4 }, //asciii 0x007D
+ { 3292, 1, 24,3, 20, 3, 16 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_MEDIUM_36PX_1BPP= {
+ 3311, // bitmap len
+ BAGL_FONT_INTER_MEDIUM_36px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 48, // height of all characters in pixels
+ 44, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_MEDIUM_36PX_1BPP,
+ bitmapINTER_MEDIUM_36PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.json
new file mode 100644
index 00000000..0d1cc5c0
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_medium_36_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 33,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 15,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 28,
+ "char": 34,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 25,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 35,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 73,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 36,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 125,
+ "width": 30,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 37,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 185,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 38,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 239,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 28,
+ "char": 39,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 243,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 40,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 263,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 4,
+ "y_max_offset": 4,
+ "char": 41,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 286,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 42,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 309,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 43,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 343,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 32,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 44,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 350,
+ "width": 17,
+ "x_min_offset": 3,
+ "y_min_offset": 24,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 45,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 354,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 32,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 46,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 360,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 47,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 384,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 48,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 431,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 5,
+ "y_max_offset": 12,
+ "char": 49,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 451,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 495,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 51,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 545,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 52,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 588,
+ "width": 22,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 53,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 631,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 54,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 681,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 55,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 720,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 56,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 771,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 57,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 820,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 58,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 831,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 59,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 844,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 4,
+ "y_max_offset": 12,
+ "char": 60,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 876,
+ "width": 24,
+ "x_min_offset": 4,
+ "y_min_offset": 20,
+ "x_max_offset": 4,
+ "y_max_offset": 16,
+ "char": 61,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 908,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 4,
+ "y_max_offset": 12,
+ "char": 62,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 939,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 63,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 978,
+ "width": 35,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 64,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1075,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 65,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1117,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 66,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1168,
+ "width": 26,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 67,
+ "bitmap_byte_count": 59
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1227,
+ "width": 26,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 68,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1279,
+ "width": 22,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 69,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1323,
+ "width": 21,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 70,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1355,
+ "width": 27,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 71,
+ "bitmap_byte_count": 61
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1416,
+ "width": 27,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 72,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1458,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 73,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1466,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 74,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1499,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 75,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1542,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 76,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1574,
+ "width": 32,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 77,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1626,
+ "width": 27,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 78,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1670,
+ "width": 28,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 79,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1730,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 80,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1764,
+ "width": 28,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 81,
+ "bitmap_byte_count": 59
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1823,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 82,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1862,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 83,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1912,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 84,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1952,
+ "width": 27,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 85,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1995,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 86,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2035,
+ "width": 35,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 87,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2091,
+ "width": 24,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 88,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2140,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 89,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2184,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 90,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2240,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2268,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 92,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2292,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 4,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2320,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 24,
+ "char": 94,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2336,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 36,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 95,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2354,
+ "width": 18,
+ "x_min_offset": 5,
+ "y_min_offset": 8,
+ "x_max_offset": 6,
+ "y_max_offset": 32,
+ "char": 96,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2362,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 97,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2404,
+ "width": 23,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 98,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2438,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 99,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2469,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 100,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2505,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 101,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2546,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 12,
+ "char": 102,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2574,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2623,
+ "width": 22,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 104,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2654,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 105,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2667,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 106,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2692,
+ "width": 20,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 12,
+ "char": 107,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2728,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 108,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2735,
+ "width": 32,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2788,
+ "width": 22,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2821,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 111,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2851,
+ "width": 22,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 112,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2885,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 113,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2921,
+ "width": 14,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2942,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 115,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2982,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 116,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3002,
+ "width": 21,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 117,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3035,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3065,
+ "width": 30,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3107,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3144,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 121,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3180,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3218,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3250,
+ "width": 12,
+ "x_min_offset": 4,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3263,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3292,
+ "width": 24,
+ "x_min_offset": 3,
+ "y_min_offset": 20,
+ "x_max_offset": 3,
+ "y_max_offset": 16,
+ "char": 126,
+ "bitmap_byte_count": 19
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.inc b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.inc
new file mode 100644
index 00000000..0dca382c
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.inc
@@ -0,0 +1,1080 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_REGULAR_24PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC1, 0x0D, 0x59, 0x5A, 0xC1, 0x8A, 0x28, 0xC5,
+ 0x09, 0x70, 0x30, 0xC1, 0x02, 0x10, 0xC5, 0x0A,
+ 0x43, 0x45, 0x16, 0xC1, 0x86, 0x03, 0xD5, 0x0D,
+ 0xC0,
+//ascii 0x0022
+ 0xC1, 0x09, 0x41, 0x07, 0xC4, 0x09, 0x41, 0x07,
+ 0xDC, 0x0C, 0x47, 0x0B, 0xC4, 0x09, 0x41, 0x07,
+ 0xC4, 0x0E, 0x4B, 0x0D, 0xC0,
+//ascii 0x0023
+ 0xC6, 0x09, 0x07, 0xD1, 0x86, 0x0E, 0xC2, 0x0A,
+ 0x07, 0xC6, 0xAA, 0x36, 0x9B, 0x86, 0x0E, 0xC2,
+ 0x87, 0x0D, 0xC5, 0x0A, 0x01, 0x40, 0xB3, 0x69,
+ 0xB6, 0x00, 0x0D, 0xC7, 0xBE, 0xB9, 0x30, 0x10,
+ 0x40, 0xA3, 0x69, 0xBD, 0xC6, 0x06, 0x00, 0x1E,
+ 0xAC, 0x93, 0x01, 0x30, 0xC6, 0x86, 0x0E, 0xC2,
+ 0x87, 0x0D, 0xC0, 0x8C, 0xA7, 0xC6, 0x86, 0x0E,
+ 0xC2, 0x87, 0x0D, 0xC5, 0xAA, 0x69, 0xBD, 0x86,
+ 0x0E, 0xC2, 0x87, 0x0D, 0xC5, 0x09, 0x50, 0xB6,
+ 0x9B, 0xD7, 0x00, 0x0D, 0xC6, 0xAE, 0xCA, 0x73,
+ 0x60, 0x96, 0x9A, 0xD0, 0xC7, 0xB6, 0x0D, 0xCA,
+ 0x70, 0x03, 0x50, 0xC6, 0x86, 0x0E, 0xC2, 0x07,
+ 0x00, 0x1C, 0x8A, 0x76, 0xC6, 0x0C, 0x09, 0xC3,
+ 0x87, 0x0D, 0xD0, 0x8C, 0x9E,
+//ascii 0x0024
+ 0xE0, 0x0A, 0x06, 0xC5, 0xA6, 0x21, 0x3A, 0xCD,
+ 0x83, 0x02, 0xC4, 0x02, 0x40, 0x06, 0xCB, 0x96,
+ 0x02, 0xA0, 0xC3, 0xB6, 0x03, 0xCE, 0x80, 0x81,
+ 0x0A, 0xC9, 0x8D, 0x02, 0xC5, 0x10, 0x0E, 0xC2,
+ 0x8A, 0x02, 0xC9, 0x88, 0x08, 0xC4, 0x8A, 0x06,
+ 0xC4, 0x82, 0x0E, 0xC7, 0x9A, 0x30, 0x80, 0x4A,
+ 0x83, 0x06, 0x4A, 0x93, 0x08, 0xA0, 0xC6, 0x70,
+ 0x70, 0x40, 0x0D, 0xC6, 0x86, 0x0A, 0xC3, 0x8B,
+ 0x03, 0xC5, 0x83, 0x0C, 0xC8, 0x8B, 0x06, 0xC3,
+ 0x86, 0x08, 0xC5, 0x01, 0x00, 0xCA, 0x82, 0x08,
+ 0xC1, 0x88, 0x01, 0xC5, 0x86, 0x03, 0xCA, 0x0C,
+ 0x10, 0x11, 0x10, 0x0A, 0xC3, 0x0B, 0x03, 0x10,
+ 0x0D, 0xCB, 0x0C, 0x03, 0x10, 0x01, 0x08, 0xC4,
+ 0x98, 0x01, 0xB0, 0xCF, 0x0E, 0xC6, 0x0B, 0x08,
+ 0xC0,
+//ascii 0x0025
+ 0xFF, 0xC5, 0x0C, 0x29, 0x0E, 0xCA, 0x0D, 0xC9,
+ 0x05, 0x40, 0x0A, 0xC9, 0x89, 0x2C, 0xC6, 0x89,
+ 0x07, 0x1C, 0x8A, 0x20, 0xC9, 0x9D, 0x20, 0x70,
+ 0xC5, 0x05, 0x03, 0xC3, 0x8C, 0x0D, 0xC9, 0xAE,
+ 0x50, 0x2D, 0xC3, 0x05, 0x02, 0xC3, 0x8A, 0x0D,
+ 0xCB, 0x0A, 0x10, 0x07, 0xC2, 0x8A, 0x03, 0x19,
+ 0x87, 0x02, 0xCD, 0xAE, 0x30, 0x3D, 0xC1, 0x07,
+ 0x30, 0x02, 0x0D, 0xCF, 0x09, 0x10, 0x09, 0xC1,
+ 0x0E, 0x1C, 0x0D, 0xD2, 0xAD, 0x30, 0x3D, 0xD0,
+ 0x0E, 0x07, 0x13, 0x05, 0x0A, 0xC1, 0x07, 0x10,
+ 0x09, 0xCE, 0x0E, 0x02, 0x40, 0x07, 0xC1, 0xAD,
+ 0x20, 0x5E, 0xCC, 0x87, 0x0C, 0xC2, 0x85, 0x0E,
+ 0xC2, 0x97, 0x02, 0xA0, 0xCB, 0x05, 0x03, 0xC3,
+ 0x8C, 0x0D, 0xC3, 0x9C, 0x20, 0x50, 0xCA, 0x87,
+ 0x0D, 0xC2, 0x87, 0x0D, 0xC5, 0x85, 0x02, 0xC9,
+ 0x0D, 0x10, 0x13, 0x82, 0x05, 0xC7, 0x0A, 0x02,
+ 0xCA, 0x0D, 0x03, 0x10, 0x02, 0x07, 0xC9, 0x0E,
+//ascii 0x0026
+ 0xD2, 0x07, 0xD3, 0x96, 0x24, 0x90, 0xC1, 0x04,
+ 0x00, 0xD3, 0x06, 0x20, 0x12, 0x00, 0x02, 0xD4,
+ 0x8E, 0xA2, 0x10, 0x04, 0xCB, 0x0E, 0x04, 0x10,
+ 0x04, 0x0C, 0xC4, 0x09, 0x30, 0x0D, 0xCA, 0x02,
+ 0x40, 0x0B, 0xC2, 0x06, 0x10, 0x9A, 0x90, 0x40,
+ 0xC9, 0x9A, 0x04, 0xE0, 0xC0, 0x09, 0x10, 0xBD,
+ 0xE4, 0x02, 0xC0, 0xC1, 0x02, 0x00, 0xC9, 0x87,
+ 0x0C, 0xC2, 0x07, 0x00, 0x12, 0x80, 0x4E, 0xC2,
+ 0x86, 0x0D, 0xC8, 0x86, 0x0D, 0xC3, 0x02, 0x10,
+ 0x06, 0xC4, 0x87, 0x0C, 0xC8, 0x89, 0x06, 0xC2,
+ 0x07, 0x20, 0x0A, 0xC4, 0x84, 0x0E, 0xC9, 0x10,
+ 0x82, 0x42, 0x10, 0x06, 0x10, 0x0C, 0xC2, 0x8B,
+ 0x02, 0xCA, 0x0B, 0x02, 0x20, 0x04, 0x0D, 0xC0,
+ 0x07, 0x10, 0x87, 0xB7, 0x10, 0x09, 0xCC, 0x8B,
+ 0xAC, 0xC3, 0x06, 0x40, 0x06, 0xD5, 0xAA, 0x64,
+ 0x6B,
+//ascii 0x0027
+ 0xC1, 0x0C, 0x47, 0x0B, 0xC4, 0x07, 0x40, 0x07,
+ 0xC4, 0x0E, 0x4B, 0x0E, 0xC0,
+//ascii 0x0028
+ 0xDC, 0x1E, 0xD3, 0x0D, 0xC4, 0x9B, 0x05, 0xD0,
+ 0xCF, 0x89, 0x29, 0xC5, 0x05, 0x10, 0x84, 0x9B,
+ 0xC8, 0x8D, 0x95, 0x10, 0x02, 0x0D, 0xC6, 0x0B,
+ 0x04, 0x30, 0x02, 0x04, 0x25, 0x04, 0x02, 0x30,
+ 0x02, 0x09, 0xCA, 0x8D, 0x94, 0x70, 0x90, 0x25,
+ 0xB0, 0xD0, 0x0D, 0x0B, 0x29, 0x1B,
+//ascii 0x0029
+ 0xFF, 0xC2, 0x2E, 0xD3, 0x9C, 0x84, 0x20, 0x50,
+ 0x84, 0x7B, 0xCC, 0x08, 0x02, 0x70, 0x50, 0x07,
+ 0x0E, 0xC7, 0x0A, 0x02, 0x10, 0x94, 0x7A, 0xE0,
+ 0xC4, 0x9E, 0xB8, 0x40, 0x20, 0x07, 0xC5, 0xAC,
+ 0x02, 0x8E, 0xCD, 0x9A, 0x40, 0x70, 0xC4, 0x0C,
+ 0x0A, 0xD2, 0x0C, 0x0A,
+//ascii 0x002A
+ 0xC4, 0x09, 0xC2, 0x09, 0xC9, 0x89, 0x0B, 0xC0,
+ 0x89, 0x09, 0xC9, 0x13, 0xC0, 0x01, 0x04, 0xCA,
+ 0xAB, 0x04, 0x0E, 0xC7, 0x09, 0x03, 0x14, 0x81,
+ 0x01, 0x14, 0x03, 0x0B, 0xC4, 0x09, 0x03, 0x14,
+ 0x81, 0x01, 0x14, 0x03, 0x0B, 0xC7, 0xAB, 0x04,
+ 0x0E, 0xCA, 0x13, 0xC0, 0x01, 0x04, 0xC9, 0x89,
+ 0x0B, 0xC0, 0x89, 0x09, 0xC9, 0x09, 0xC2, 0x09,
+//ascii 0x002B
+ 0xC7, 0x09, 0x07, 0xCD, 0x84, 0x0E, 0xCC, 0x84,
+ 0x0E, 0xCC, 0x84, 0x0E, 0xCC, 0x84, 0x0E, 0xC7,
+ 0x09, 0x32, 0x10, 0x32, 0x04, 0xC3, 0x09, 0x70,
+ 0x10, 0x02, 0xC8, 0x84, 0x0D, 0xCC, 0x84, 0x0E,
+ 0xCC, 0x84, 0x0E, 0xCC, 0x84, 0x0E, 0xCC, 0x87,
+ 0x4E, 0xC0,
+//ascii 0x002C
+ 0xC0, 0x9C, 0x57, 0xC0, 0xC7, 0x09, 0x30, 0x05,
+ 0x09, 0xC4, 0x9E, 0x97, 0x50, 0x20, 0x0C, 0xC9,
+ 0x0C, 0x0E, 0xC0,
+//ascii 0x002D
+ 0xC2, 0x8E, 0xBE, 0xC4, 0x89, 0x09, 0xC4, 0x89,
+ 0x09, 0xC4, 0x89, 0x09, 0xC4, 0x89, 0x09, 0xC4,
+ 0x89, 0x09, 0xC4, 0x89, 0x09, 0xC4, 0x89, 0x09,
+ 0xC4, 0x8E, 0xBE,
+//ascii 0x002E
+ 0xC0, 0x8B, 0x28, 0xC4, 0x02, 0x10, 0x0E, 0xC3,
+ 0x85, 0x02, 0xC5, 0x0D, 0xC0,
+//ascii 0x002F
+ 0xDC, 0x9C, 0x38, 0xC0, 0xD7, 0x0C, 0x20, 0x91,
+ 0x38, 0xD0, 0xD5, 0x8C, 0x63, 0x20, 0x91, 0x6A,
+ 0xE0, 0xD4, 0x9E, 0xA6, 0x10, 0x20, 0x83, 0x6C,
+ 0xD5, 0x9D, 0x83, 0x10, 0x20, 0x83, 0x8C, 0xD5,
+ 0x8C, 0x83, 0x20, 0x81, 0x6C, 0xD6, 0xAA, 0x61,
+ 0x06, 0xD9, 0x0D, 0x0C, 0xC0,
+//ascii 0x0030
+ 0xC6, 0x8D, 0xB8, 0x17, 0x18, 0x0B, 0xCD, 0x08,
+ 0x03, 0x70, 0x80, 0x5D, 0xC9, 0x03, 0x20, 0x05,
+ 0x07, 0x28, 0x07, 0x03, 0x20, 0x08, 0xC7, 0x93,
+ 0x03, 0xB0, 0xC8, 0x07, 0x10, 0x0B, 0xC5, 0x8B,
+ 0x03, 0xCB, 0x8B, 0x03, 0xC5, 0x87, 0x0B, 0xCC,
+ 0x83, 0x0D, 0xC4, 0x85, 0x0D, 0xCC, 0x85, 0x0D,
+ 0xC4, 0x87, 0x0B, 0xCC, 0x83, 0x0D, 0xC4, 0x8B,
+ 0x03, 0xCB, 0x8B, 0x03, 0xC6, 0x93, 0x03, 0xB0,
+ 0xC8, 0x07, 0x10, 0x0B, 0xC7, 0x03, 0x20, 0x05,
+ 0x07, 0x28, 0x07, 0x03, 0x20, 0x08, 0xC9, 0x08,
+ 0x03, 0x70, 0x80, 0x5D, 0xCC, 0x8D, 0xB8, 0x17,
+ 0x18, 0x0B, 0xC0,
+//ascii 0x0031
+ 0xC1, 0x09, 0x71, 0x71, 0x01, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x9C, 0x01, 0xC0, 0x7D, 0x5D,
+ 0xC2, 0x87, 0x07, 0xD1, 0x81, 0x0C, 0xD0, 0x8C,
+ 0x01, 0xD1, 0x89, 0x7C,
+//ascii 0x0032
+ 0xC4, 0x0C, 0x18, 0x0B, 0xC8, 0x04, 0x03, 0xC3,
+ 0x05, 0x30, 0x02, 0x0A, 0xC6, 0x02, 0x00, 0xC2,
+ 0xB4, 0x02, 0x78, 0x40, 0x10, 0x05, 0xC5, 0x02,
+ 0x00, 0xC1, 0x9C, 0x02, 0xE0, 0xC2, 0xAC, 0x20,
+ 0x4E, 0xC3, 0x02, 0x00, 0xC1, 0x87, 0x0A, 0xC4,
+ 0xAE, 0x30, 0x3E, 0xC2, 0x02, 0x00, 0xC1, 0x85,
+ 0x0D, 0xC6, 0x94, 0x02, 0xE0, 0xC1, 0x02, 0x00,
+ 0xC1, 0x85, 0x0C, 0xC7, 0x95, 0x02, 0xD0, 0xC0,
+ 0x02, 0x00, 0xC1, 0x88, 0x07, 0xC8, 0xB7, 0x02,
+ 0xC2, 0x00, 0xC1, 0x9E, 0x20, 0x80, 0xC8, 0x08,
+ 0x30, 0xC2, 0x0B, 0x20, 0x0A, 0xC7, 0x0A, 0x20,
+ 0xC3, 0x9C, 0x40, 0x80, 0xC8, 0x0B, 0x10, 0xD1,
+ 0x0E, 0x0D,
+//ascii 0x0033
+ 0xE8, 0x0C, 0x17, 0x09, 0xCE, 0x0D, 0x04, 0x10,
+ 0x04, 0x0D, 0xC1, 0x04, 0x40, 0x0C, 0xCB, 0x0A,
+ 0x50, 0x0D, 0x09, 0x10, 0x87, 0x94, 0x10, 0x0E,
+ 0xC9, 0x0E, 0x10, 0x07, 0x1E, 0x09, 0x00, 0x14,
+ 0x00, 0x0E, 0xC2, 0x87, 0x04, 0xC9, 0x89, 0x07,
+ 0xC3, 0x09, 0x10, 0x0A, 0xC4, 0x10, 0xC9, 0x87,
+ 0x0D, 0xC4, 0x10, 0xC5, 0x84, 0x0D, 0xC8, 0x84,
+ 0x0E, 0xC4, 0x10, 0xC5, 0x87, 0x0D, 0xC8, 0x87,
+ 0x0A, 0xC4, 0x10, 0xC5, 0x84, 0x0E, 0xC8, 0x8B,
+ 0x04, 0xCB, 0x0E, 0x10, 0xCA, 0x94, 0x04, 0xC0,
+ 0xC8, 0x9E, 0x40, 0x70, 0xCA, 0x0E, 0x20, 0xC7,
+ 0x0A, 0x10, 0x04, 0xCC, 0x8E, 0x74, 0xC7, 0x9A,
+ 0x04, 0xE0, 0xD8, 0x0E, 0xC0,
+//ascii 0x0034
+ 0xE9, 0x89, 0x09, 0xD8, 0x89, 0x09, 0xCC, 0x0C,
+ 0x76, 0x26, 0x83, 0x03, 0x26, 0xC9, 0x09, 0x70,
+ 0x70, 0x00, 0xC9, 0x09, 0x10, 0x06, 0x7A, 0x86,
+ 0x06, 0x2A, 0xCA, 0x07, 0x10, 0x06, 0x0E, 0xC5,
+ 0x89, 0x09, 0xCE, 0x0D, 0x03, 0x10, 0x09, 0xC4,
+ 0x89, 0x09, 0xD0, 0x09, 0x10, 0x03, 0x0D, 0xC2,
+ 0x89, 0x09, 0xD1, 0x0E, 0x06, 0x10, 0x07, 0xC1,
+ 0x89, 0x09, 0xD3, 0x0B, 0x10, 0xA3, 0xC9, 0x09,
+ 0xD5, 0x06, 0x10, 0x83, 0x09, 0xD6, 0x0C, 0x03,
+ 0x10, 0x09, 0xD8, 0x89, 0x6C, 0xC0,
+//ascii 0x0035
+ 0xF9, 0x8E, 0xDE, 0xC5, 0x0B, 0x04, 0x20, 0x05,
+ 0x0D, 0xCB, 0x89, 0x09, 0xC4, 0x06, 0x60, 0x09,
+ 0xCA, 0x89, 0x09, 0xC3, 0x08, 0x10, 0x08, 0x0E,
+ 0xC0, 0x0E, 0x08, 0x10, 0x0B, 0xC9, 0x89, 0x09,
+ 0xC3, 0x10, 0x0B, 0xC4, 0x89, 0x03, 0xC9, 0x89,
+ 0x09, 0xC2, 0x8B, 0x04, 0xC6, 0x83, 0x0E, 0xC8,
+ 0x89, 0x09, 0xC2, 0x89, 0x08, 0xC6, 0x85, 0x0D,
+ 0xC8, 0x89, 0x09, 0xC2, 0x8B, 0x08, 0xC6, 0x84,
+ 0x0D, 0xC8, 0x89, 0x09, 0xC3, 0x00, 0x04, 0xC5,
+ 0x0E, 0x10, 0xC9, 0x09, 0x10, 0xB3, 0x57, 0x94,
+ 0x00, 0x0E, 0xC3, 0x9E, 0x30, 0x70, 0xC9, 0x09,
+ 0x70, 0x0B, 0xC2, 0x0B, 0x10, 0x03, 0xCD, 0xBD,
+ 0xB9, 0x75, 0x30, 0x0E, 0xC2, 0x9B, 0x06, 0xE0,
+ 0xC0,
+//ascii 0x0036
+ 0xE1, 0x0D, 0xC4, 0x9D, 0xA9, 0xA0, 0xCF, 0x0A,
+ 0x10, 0xC2, 0x0E, 0x04, 0x40, 0x06, 0xCC, 0x09,
+ 0x10, 0x04, 0xC1, 0x0E, 0x20, 0x84, 0x64, 0x10,
+ 0x04, 0xCA, 0x0E, 0x10, 0x08, 0xC2, 0x94, 0x04,
+ 0xE0, 0xC2, 0x0D, 0x10, 0x08, 0xC9, 0x88, 0x06,
+ 0xC2, 0x0D, 0x10, 0xC5, 0x0D, 0x10, 0xC9, 0x86,
+ 0x0C, 0xC2, 0x8A, 0x06, 0xC6, 0x84, 0x0D, 0xC8,
+ 0x86, 0x0C, 0xC2, 0x89, 0x08, 0xC6, 0x86, 0x0C,
+ 0xC8, 0x88, 0x09, 0xC2, 0x8C, 0x06, 0xC6, 0x84,
+ 0x0E, 0xC8, 0x0D, 0x10, 0x0E, 0xC2, 0x84, 0x0C,
+ 0xC4, 0x8A, 0x04, 0xCA, 0x06, 0x10, 0x0A, 0xC1,
+ 0x0D, 0x10, 0x0A, 0xC2, 0x09, 0x10, 0x0A, 0xCB,
+ 0x08, 0x20, 0x04, 0x16, 0x20, 0x04, 0x20, 0x08,
+ 0xCD, 0x0D, 0x06, 0x70, 0x80, 0x4C, 0xD1, 0x8D,
+ 0xA9, 0x18, 0x09, 0x0C, 0xC0,
+//ascii 0x0037
+ 0xC1, 0x8D, 0xAB, 0xD0, 0x09, 0x10, 0x02, 0x0A,
+ 0xCE, 0x09, 0x30, 0x02, 0x0A, 0xCC, 0xA9, 0x09,
+ 0xB3, 0x10, 0x02, 0x0A, 0xCA, 0x89, 0x09, 0xC1,
+ 0x0B, 0x03, 0x10, 0x03, 0x0A, 0xC8, 0x89, 0x09,
+ 0xC3, 0x0A, 0x02, 0x10, 0x03, 0x0B, 0xC6, 0x89,
+ 0x09, 0xC5, 0x0A, 0x02, 0x10, 0x03, 0x0B, 0xC4,
+ 0x89, 0x09, 0xC7, 0x0A, 0x02, 0x10, 0x03, 0x0B,
+ 0xC2, 0x89, 0x09, 0xC9, 0x0A, 0x02, 0x10, 0x03,
+ 0xC1, 0x89, 0x09, 0xCB, 0x8A, 0x20, 0xC1, 0x89,
+ 0x09, 0xCD, 0x0A, 0xC1, 0x8A, 0x2A, 0xC0,
+//ascii 0x0038
+ 0xCD, 0x8C, 0xBD, 0xCB, 0x0A, 0x16, 0x0A, 0xC2,
+ 0x0A, 0x30, 0x03, 0x0E, 0xC7, 0x0E, 0x03, 0x30,
+ 0x03, 0xC0, 0x0A, 0x10, 0x13, 0x10, 0x03, 0xC7,
+ 0xB3, 0x03, 0x8A, 0x30, 0xA0, 0x63, 0x0B, 0xC2,
+ 0x83, 0x06, 0xC5, 0x8B, 0x03, 0xC3, 0x06, 0x10,
+ 0x0A, 0xC3, 0x0E, 0x10, 0xC5, 0x86, 0x0B, 0xC3,
+ 0x0E, 0x10, 0xC5, 0x83, 0x0D, 0xC4, 0x86, 0x0D,
+ 0xC4, 0x10, 0xC5, 0x86, 0x0C, 0xC4, 0x86, 0x0C,
+ 0xC4, 0x10, 0xC5, 0x86, 0x0D, 0xC4, 0x8A, 0x06,
+ 0xC3, 0x08, 0x10, 0x0B, 0xC4, 0x10, 0xC6, 0x10,
+ 0xB6, 0xCD, 0x80, 0x30, 0x80, 0x3E, 0xC2, 0x86,
+ 0x06, 0xC6, 0x0B, 0x50, 0x0D, 0x08, 0x10, 0x16,
+ 0x03, 0x10, 0x0D, 0xC7, 0x0D, 0x06, 0x13, 0x06,
+ 0x0E, 0xC1, 0x06, 0x40, 0x0B, 0xD1, 0x0D, 0x18,
+ 0x0A, 0xC0,
+//ascii 0x0039
+ 0xE2, 0xBD, 0xBA, 0x9A, 0xB0, 0x0D, 0xD2, 0x09,
+ 0x02, 0x70, 0x03, 0x0A, 0xCE, 0x03, 0x10, 0x12,
+ 0x10, 0x92, 0x75, 0x20, 0x10, 0x03, 0x0D, 0xCB,
+ 0x93, 0x03, 0xD0, 0xC1, 0x9D, 0x50, 0x70, 0xC1,
+ 0xAD, 0x50, 0x2E, 0xC9, 0x8B, 0x02, 0xC5, 0x85,
+ 0x0B, 0xC2, 0x87, 0x05, 0xC9, 0x87, 0x0A, 0xC5,
+ 0x8D, 0x05, 0xC3, 0x02, 0x00, 0xC9, 0x85, 0x0D,
+ 0xC6, 0x00, 0x02, 0xC3, 0x85, 0x0D, 0xC8, 0x85,
+ 0x0B, 0xC6, 0x00, 0x02, 0xC3, 0x85, 0x0D, 0xC8,
+ 0x89, 0x05, 0xC5, 0x8A, 0x05, 0xC3, 0x02, 0x00,
+ 0xCA, 0x10, 0x07, 0xC3, 0x0B, 0x10, 0x0B, 0xC1,
+ 0x9E, 0x30, 0x50, 0xCA, 0x0B, 0x10, 0x92, 0x57,
+ 0x30, 0x10, 0x07, 0xC1, 0x0B, 0x10, 0x02, 0x0E,
+ 0xCB, 0x0B, 0x02, 0x40, 0x09, 0xC2, 0x9A, 0x05,
+ 0xE0, 0xCE, 0x0D, 0x19, 0x0B, 0xC4, 0x1E, 0xC0,
+//ascii 0x003A
+ 0xC2, 0x8D, 0x36, 0xC6, 0x8A, 0x38, 0xC6, 0x06,
+ 0x10, 0x0A, 0xC5, 0x20, 0x0E, 0xC5, 0x0A, 0x10,
+ 0x0D, 0xC5, 0x86, 0x03, 0xC7, 0x0D, 0x0E, 0xC7,
+ 0x0D, 0xC0,
+//ascii 0x003B
+ 0xDA, 0x0B, 0x10, 0x0D, 0xC5, 0x9B, 0x47, 0xB0,
+ 0xC9, 0x06, 0x10, 0x09, 0xC5, 0x09, 0x30, 0x04,
+ 0x09, 0xC6, 0x8D, 0x24, 0xC6, 0xAD, 0x97, 0x42,
+ 0x10, 0x0B, 0xD5, 0x0B,
+//ascii 0x003C
+ 0xFE, 0x1A, 0xC7, 0x1A, 0x0E, 0xCE, 0x86, 0x08,
+ 0xC5, 0x8D, 0x01, 0xCF, 0x8E, 0x01, 0xC5, 0x86,
+ 0x08, 0xD0, 0x86, 0x08, 0xC3, 0x8E, 0x01, 0xD1,
+ 0x8E, 0x01, 0xC3, 0x86, 0x09, 0xD2, 0x86, 0x09,
+ 0xC1, 0x8E, 0x01, 0xD3, 0x8E, 0x01, 0xC1, 0x86,
+ 0x09, 0xD4, 0xB6, 0x0A, 0xE0, 0x10, 0xD5, 0xBE,
+ 0x01, 0x60, 0x90, 0xD6, 0x06, 0x10, 0x01, 0xD7,
+ 0x0E, 0x10, 0x0A, 0xD8, 0x0A, 0x06,
+//ascii 0x003D
+ 0xC1, 0x0D, 0xC3, 0x0D, 0xC4, 0x8C, 0x07, 0xC1,
+ 0x8C, 0x06, 0xC3, 0x8C, 0x07, 0xC1, 0x8C, 0x06,
+ 0xC3, 0x8C, 0x07, 0xC1, 0x8C, 0x06, 0xC3, 0x8C,
+ 0x07, 0xC1, 0x8C, 0x06, 0xC3, 0x8C, 0x07, 0xC1,
+ 0x8C, 0x06, 0xC3, 0x8C, 0x07, 0xC1, 0x8C, 0x06,
+ 0xC3, 0x8C, 0x07, 0xC1, 0x8C, 0x06, 0xC3, 0x8C,
+ 0x07, 0xC1, 0x8C, 0x06, 0xC3, 0x8C, 0x07, 0xC1,
+ 0x8C, 0x06, 0xC3, 0x8C, 0x07, 0xC1, 0x8C, 0x06,
+ 0xC4, 0x0A, 0x0C, 0xC2, 0x0A, 0x0C, 0xC0,
+//ascii 0x003E
+ 0xFF, 0xC3, 0x0D, 0x0A, 0xD9, 0x81, 0x0A, 0xD7,
+ 0x08, 0x10, 0x02, 0xD7, 0x11, 0x85, 0x0A, 0xD5,
+ 0xB8, 0x08, 0xE0, 0x20, 0xD5, 0x11, 0xC1, 0x85,
+ 0x0A, 0xD3, 0x88, 0x08, 0xC1, 0x8D, 0x02, 0xD3,
+ 0x11, 0xC3, 0x85, 0x0A, 0xD1, 0x88, 0x07, 0xC3,
+ 0x8D, 0x02, 0xD1, 0x81, 0x0E, 0xC4, 0x85, 0x0A,
+ 0xCF, 0x88, 0x07, 0xC5, 0x8D, 0x02, 0xCF, 0x88,
+ 0x7E, 0xC6, 0x88, 0x7D,
+//ascii 0x003F
+ 0xC3, 0x0B, 0x03, 0x10, 0x04, 0x0C, 0xD0, 0x08,
+ 0x50, 0x0B, 0xCE, 0x0E, 0x10, 0x09, 0x1E, 0x08,
+ 0x10, 0x0E, 0xCD, 0x88, 0x09, 0xC3, 0x98, 0x03,
+ 0xE0, 0xCC, 0x85, 0x0E, 0xC4, 0x03, 0x10, 0x05,
+ 0x08, 0xC1, 0x88, 0x04, 0xC5, 0x85, 0x0E, 0xC4,
+ 0x0E, 0x04, 0x20, 0x0E, 0xC0, 0x20, 0x0E, 0xC4,
+ 0x88, 0x08, 0xC6, 0x8C, 0x98, 0xC1, 0x89, 0x05,
+ 0xC5, 0x0E, 0x10, 0x08, 0x0E, 0xD3, 0x09, 0x20,
+ 0xD4, 0x8B, 0x30, 0xC0,
+//ascii 0x0040
+ 0xC9, 0x8E, 0xCB, 0x1C, 0x0E, 0xD3, 0x08, 0x03,
+ 0x50, 0x81, 0x7E, 0xCE, 0x0C, 0x01, 0x10, 0x04,
+ 0x07, 0x18, 0xB7, 0x63, 0x01, 0xE0, 0xCC, 0x0B,
+ 0x10, 0x08, 0xC7, 0x89, 0x08, 0xCB, 0x9D, 0x01,
+ 0xD0, 0xC9, 0x00, 0x06, 0xCB, 0x84, 0x0C, 0xC9,
+ 0x8C, 0x07, 0xC1, 0x08, 0x06, 0xC6, 0x8D, 0x06,
+ 0xC1, 0x0B, 0x73, 0x10, 0x0C, 0xC1, 0x86, 0x0E,
+ 0xC5, 0x88, 0x0C, 0xC1, 0x09, 0x30, 0x11, 0x20,
+ 0x07, 0xC2, 0x8B, 0x0B, 0xC5, 0x06, 0x00, 0xC2,
+ 0x9E, 0x13, 0xC0, 0xC2, 0x9E, 0x80, 0x80, 0xC2,
+ 0x8D, 0x08, 0xC5, 0x04, 0x03, 0xC2, 0x87, 0x0D,
+ 0xC5, 0x87, 0x0C, 0xC2, 0x00, 0x07, 0xC5, 0x13,
+ 0xC2, 0x04, 0x00, 0xC6, 0x8C, 0x07, 0xC2, 0x00,
+ 0x07, 0xC5, 0x04, 0x03, 0xC2, 0x04, 0x00, 0xC6,
+ 0x8C, 0x07, 0xC1, 0x8E, 0x07, 0xC5, 0x06, 0x00,
+ 0xC2, 0x88, 0x0B, 0xC5, 0x87, 0x0B, 0xC1, 0x8C,
+ 0x09, 0xC5, 0x89, 0x0C, 0xC2, 0x81, 0x09, 0xC2,
+ 0x9D, 0x70, 0x10, 0xC2, 0x87, 0x0C, 0xC5, 0x8D,
+ 0x06, 0xC2, 0x0D, 0x01, 0x10, 0x01, 0x20, 0x01,
+ 0x0D, 0xC2, 0x11, 0xC7, 0x84, 0x0D, 0xC3, 0x08,
+ 0x04, 0x13, 0x06, 0x09, 0xC3, 0x89, 0x07, 0xC7,
+ 0x9C, 0x01, 0xE0, 0xCB, 0x9C, 0x01, 0xE0, 0xC8,
+ 0x98, 0x01, 0xB0, 0xC9, 0x08, 0x10, 0x0B, 0xCA,
+ 0x08, 0x10, 0x93, 0x8C, 0xE0, 0xC1, 0x9E, 0xC7,
+ 0x10, 0x10, 0x0B, 0xCC, 0x0C, 0x04, 0x70, 0x10,
+ 0x06, 0x0E, 0xCF, 0x8D, 0x86, 0x23, 0x94, 0x69,
+ 0xE0, 0xC0,
+//ascii 0x0041
+ 0xD2, 0x09, 0xCF, 0x0A, 0x05, 0x10, 0xCC, 0x0D,
+ 0x07, 0x30, 0x03, 0xC9, 0x8E, 0x83, 0x20, 0x83,
+ 0x8E, 0xC8, 0x0A, 0x03, 0x40, 0x0C, 0xC8, 0x0C,
+ 0x05, 0x30, 0x95, 0xC3, 0x00, 0xC6, 0x0E, 0x07,
+ 0x30, 0x05, 0x0A, 0xC2, 0x03, 0x00, 0xC6, 0x09,
+ 0x10, 0x03, 0x0A, 0xC5, 0x03, 0x00, 0xC6, 0x09,
+ 0x20, 0x05, 0x0C, 0xC4, 0x03, 0x00, 0xC7, 0x0A,
+ 0x05, 0x20, 0x83, 0x7D, 0xC1, 0x03, 0x00, 0xCA,
+ 0x09, 0x03, 0x20, 0x93, 0x83, 0x00, 0xCC, 0x8E,
+ 0x73, 0x30, 0x09, 0xCE, 0x0C, 0x05, 0x30, 0x05,
+ 0x0A, 0xCE, 0x0A, 0x05, 0x30, 0xCF, 0x9E, 0x83,
+ 0x00, 0xD2, 0x0D,
+//ascii 0x0042
+ 0xE9, 0x8D, 0xCE, 0xCF, 0x0C, 0x17, 0x0A, 0xC2,
+ 0x0A, 0x02, 0x20, 0x04, 0x0E, 0xCC, 0x04, 0x30,
+ 0x03, 0xC0, 0x0A, 0x10, 0xA2, 0x31, 0x02, 0xCB,
+ 0xB7, 0x01, 0x79, 0x40, 0xA0, 0x73, 0x09, 0xC2,
+ 0x83, 0x09, 0xC9, 0x9E, 0x01, 0xE0, 0xC2, 0x97,
+ 0x10, 0x70, 0xC3, 0x8D, 0x03, 0xC9, 0x8A, 0x07,
+ 0xC4, 0x81, 0x0D, 0xC4, 0x11, 0xC9, 0x89, 0x09,
+ 0xC4, 0x03, 0x00, 0xC5, 0x02, 0x00, 0xC9, 0x89,
+ 0x09, 0xC4, 0x04, 0x00, 0xC5, 0x02, 0x00, 0xC9,
+ 0x89, 0x09, 0xC4, 0x04, 0x00, 0xC5, 0x02, 0x00,
+ 0xC9, 0x89, 0x09, 0xC4, 0x04, 0x00, 0xC5, 0x02,
+ 0x00, 0xC9, 0x89, 0x07, 0x4C, 0x03, 0x00, 0x5C,
+ 0x02, 0x00, 0xC9, 0x09, 0x70, 0x70, 0x00, 0xC9,
+ 0x09, 0x72, 0x72, 0x02,
+//ascii 0x0043
+ 0xE0, 0x8C, 0x50, 0xC5, 0x89, 0x27, 0xCE, 0x09,
+ 0x20, 0xC5, 0x09, 0x10, 0x02, 0x0E, 0xCB, 0x0B,
+ 0x10, 0x07, 0x0E, 0xC6, 0x9C, 0x30, 0x30, 0xCB,
+ 0x82, 0x09, 0xCA, 0x83, 0x09, 0xC9, 0x8B, 0x03,
+ 0xCB, 0x8C, 0x02, 0xC9, 0x87, 0x09, 0xCC, 0x82,
+ 0x0E, 0xC8, 0x85, 0x0B, 0xCC, 0x83, 0x0C, 0xC8,
+ 0x85, 0x0B, 0xCC, 0x83, 0x0C, 0xC8, 0x87, 0x07,
+ 0xCC, 0x10, 0xC9, 0x8C, 0x02, 0xCB, 0x89, 0x03,
+ 0xCA, 0x83, 0x05, 0xC9, 0x0C, 0x10, 0x0B, 0xCA,
+ 0xAD, 0x20, 0x3C, 0xC6, 0x09, 0x10, 0x05, 0xCC,
+ 0x0C, 0x02, 0x10, 0xB2, 0x57, 0x97, 0x50, 0x20,
+ 0x05, 0xCF, 0x07, 0x02, 0x60, 0x03, 0x0B, 0xD2,
+ 0x0C, 0x09, 0x17, 0x89, 0xBE, 0xC0,
+//ascii 0x0044
+ 0xC6, 0x0C, 0x09, 0x34, 0x06, 0x0A, 0xC9, 0x0C,
+ 0x04, 0x70, 0x00, 0x09, 0xC6, 0x0A, 0x10, 0x82,
+ 0x6A, 0x1C, 0x8A, 0x94, 0x10, 0x04, 0xC4, 0x0E,
+ 0x10, 0x06, 0xC7, 0x9C, 0x20, 0x60, 0xC3, 0x84,
+ 0x06, 0xC9, 0x0E, 0x10, 0x0C, 0xC2, 0x00, 0x02,
+ 0xCB, 0x89, 0x06, 0xC1, 0x8A, 0x06, 0xCB, 0x8E,
+ 0x02, 0xC1, 0x89, 0x09, 0xCC, 0x10, 0xC1, 0x89,
+ 0x09, 0xCC, 0x02, 0x00, 0xC1, 0x89, 0x09, 0xCC,
+ 0x02, 0x00, 0xC1, 0x89, 0x09, 0xCC, 0x02, 0x00,
+ 0xC1, 0x89, 0x06, 0x7C, 0x4C, 0x02, 0x00, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x0A, 0x72, 0x72,
+ 0x02,
+//ascii 0x0045
+ 0xC1, 0x8B, 0x5B, 0xC5, 0x0E, 0xC5, 0x05, 0x04,
+ 0xC1, 0x89, 0x09, 0xC4, 0x85, 0x0C, 0xC4, 0x02,
+ 0x00, 0xC1, 0x89, 0x09, 0xC4, 0x85, 0x0C, 0xC4,
+ 0x02, 0x00, 0xC1, 0x89, 0x09, 0xC4, 0x85, 0x0C,
+ 0xC4, 0x02, 0x00, 0xC1, 0x89, 0x09, 0xC4, 0x85,
+ 0x0C, 0xC4, 0x02, 0x00, 0xC1, 0x89, 0x09, 0xC4,
+ 0x85, 0x0C, 0xC4, 0x02, 0x00, 0xC1, 0x89, 0x09,
+ 0xC4, 0x85, 0x0C, 0xC4, 0x02, 0x00, 0xC1, 0x89,
+ 0x09, 0xC4, 0x85, 0x0C, 0xC4, 0x02, 0x00, 0xC1,
+ 0x89, 0x05, 0x4C, 0x84, 0x09, 0x4C, 0x02, 0x00,
+ 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x72,
+ 0x72, 0x02,
+//ascii 0x0046
+ 0xC1, 0x8C, 0x7C, 0xD0, 0x89, 0x09, 0xC4, 0x87,
+ 0x5D, 0xC8, 0x89, 0x09, 0xC4, 0x85, 0x0D, 0xC8,
+ 0x89, 0x09, 0xC4, 0x85, 0x0D, 0xC8, 0x89, 0x09,
+ 0xC4, 0x85, 0x0D, 0xC8, 0x89, 0x09, 0xC4, 0x85,
+ 0x0D, 0xC8, 0x89, 0x09, 0xC4, 0x85, 0x0D, 0xC8,
+ 0x89, 0x09, 0xC4, 0x85, 0x0D, 0xC8, 0x89, 0x07,
+ 0x4C, 0x85, 0x09, 0x6C, 0xC1, 0x09, 0x70, 0x70,
+ 0x00, 0xC1, 0x09, 0x72, 0x72, 0x02,
+//ascii 0x0047
+ 0xC6, 0x0E, 0xC2, 0x0C, 0x1B, 0x0C, 0xCD, 0x8C,
+ 0x40, 0xC2, 0x04, 0x30, 0x07, 0xCA, 0x09, 0x20,
+ 0xC2, 0x94, 0x04, 0x20, 0x10, 0x02, 0x0C, 0xC7,
+ 0x0B, 0x10, 0x05, 0x0E, 0xC2, 0x84, 0x0E, 0xC0,
+ 0x9C, 0x40, 0x20, 0xC7, 0x82, 0x08, 0xC4, 0x84,
+ 0x0E, 0xC2, 0x84, 0x08, 0xC5, 0x8B, 0x02, 0xC5,
+ 0x84, 0x0E, 0xC2, 0x8C, 0x02, 0xC5, 0x87, 0x09,
+ 0xC5, 0x84, 0x0E, 0xC3, 0x82, 0x0E, 0xC4, 0x85,
+ 0x0B, 0xC5, 0x0C, 0x0B, 0xC4, 0x84, 0x0C, 0xC4,
+ 0x85, 0x0B, 0xCC, 0x84, 0x0C, 0xC4, 0x88, 0x08,
+ 0xCC, 0x10, 0xC5, 0x8C, 0x02, 0xCB, 0x89, 0x04,
+ 0xC6, 0x84, 0x05, 0xC9, 0x0C, 0x10, 0x0B, 0xC6,
+ 0x0C, 0x10, 0x04, 0x0C, 0xC6, 0x09, 0x10, 0x05,
+ 0xC8, 0x0C, 0x02, 0x10, 0x02, 0x05, 0x18, 0x07,
+ 0x05, 0x20, 0x05, 0xCB, 0x07, 0x70, 0x04, 0x0B,
+ 0xCE, 0xBC, 0x98, 0x78, 0xB0, 0x0E, 0xC0,
+//ascii 0x0048
+ 0xC1, 0x0C, 0x76, 0x76, 0x06, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x0C, 0x69, 0x83, 0x06, 0x69,
+ 0xC9, 0x86, 0x0D, 0xD0, 0x86, 0x0D, 0xD0, 0x86,
+ 0x0D, 0xD0, 0x86, 0x0D, 0xD0, 0x86, 0x0D, 0xD0,
+ 0x86, 0x0D, 0xD0, 0x86, 0x0D, 0xD0, 0x86, 0x0D,
+ 0xC8, 0x0D, 0x6C, 0x83, 0x09, 0x6C, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC1, 0x09, 0x72, 0x72, 0x02,
+//ascii 0x0049
+ 0xC1, 0x8C, 0x8D, 0xCC, 0x09, 0x08, 0xC1, 0x89,
+ 0x09, 0xCC, 0x02, 0x00, 0xC1, 0x89, 0x09, 0xCC,
+ 0x02, 0x00, 0xC1, 0x88, 0x06, 0x7A, 0x4A, 0x10,
+ 0xC1, 0x08, 0x70, 0x70, 0x00, 0xC1, 0x88, 0x02,
+ 0x74, 0x44, 0x10, 0xC1, 0x89, 0x09, 0xCC, 0x02,
+ 0x00, 0xC1, 0x89, 0x09, 0xCC, 0x02, 0x00, 0xC1,
+ 0x8A, 0x2A, 0xCC, 0x04, 0x02,
+//ascii 0x004A
+ 0xC1, 0x09, 0x72, 0x42, 0x04, 0x09, 0xC7, 0x09,
+ 0x70, 0x60, 0x02, 0xC7, 0x7D, 0x3D, 0xAC, 0x92,
+ 0x05, 0xD4, 0x8E, 0x10, 0xD5, 0x85, 0x0D, 0xD4,
+ 0x85, 0x0D, 0xD4, 0x02, 0x00, 0xD3, 0x9E, 0x50,
+ 0x40, 0xD3, 0x10, 0x01, 0x0D, 0xD3, 0x81, 0x4D,
+ 0xC0,
+//ascii 0x004B
+ 0xC1, 0x0B, 0x0D, 0xCE, 0x06, 0xC1, 0x89, 0x1C,
+ 0xCB, 0x8D, 0x30, 0xC1, 0x99, 0x01, 0xB0, 0xC9,
+ 0x9B, 0x10, 0x30, 0xC2, 0x06, 0x10, 0x0B, 0xC7,
+ 0x06, 0x10, 0x06, 0xC4, 0x09, 0x10, 0x09, 0xC4,
+ 0xAE, 0x30, 0x19, 0xC6, 0x09, 0x10, 0x09, 0xC2,
+ 0xAB, 0x10, 0x3D, 0xC8, 0x9B, 0x10, 0x60, 0xC0,
+ 0x06, 0x10, 0x06, 0xCB, 0xBC, 0x10, 0x20, 0x10,
+ 0x09, 0xCD, 0x0D, 0x02, 0x10, 0x0C, 0xCF, 0xAE,
+ 0x30, 0x3E, 0xC7, 0x0E, 0x6C, 0xAB, 0x10, 0x2B,
+ 0x4C, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09,
+ 0x72, 0x72, 0x02,
+//ascii 0x004C
+ 0xD1, 0x1B, 0xD1, 0x02, 0x00, 0xD1, 0x02, 0x00,
+ 0xD1, 0x02, 0x00, 0xD1, 0x02, 0x00, 0xD1, 0x02,
+ 0x00, 0xD1, 0x02, 0x00, 0xD1, 0x02, 0x00, 0xC1,
+ 0x0E, 0x7C, 0x6C, 0x02, 0x00, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x0A, 0x72, 0x72, 0x02,
+//ascii 0x004D
+ 0xDD, 0x0E, 0x7C, 0x7C, 0x0C, 0xC9, 0x09, 0x70,
+ 0x70, 0x00, 0xC9, 0x09, 0x20, 0x02, 0x74, 0x44,
+ 0xC9, 0x0D, 0x04, 0x20, 0x04, 0x09, 0xD6, 0x8E,
+ 0x72, 0x10, 0x82, 0x7E, 0xD6, 0x0C, 0x04, 0x20,
+ 0x04, 0x0C, 0xD6, 0x8E, 0x72, 0x10, 0x82, 0x7E,
+ 0xD6, 0x09, 0x04, 0x20, 0x04, 0x0C, 0xD6, 0x0D,
+ 0x07, 0x20, 0x02, 0xD7, 0x09, 0x20, 0xD4, 0x8E,
+ 0x72, 0x10, 0x02, 0x07, 0xD2, 0x0C, 0x04, 0x20,
+ 0x04, 0x0C, 0xD1, 0x8E, 0x72, 0x10, 0x82, 0x7E,
+ 0xD1, 0x0C, 0x04, 0x20, 0x04, 0x09, 0xD2, 0x09,
+ 0x02, 0x20, 0x07, 0x0D, 0xD2, 0x09, 0x20, 0x02,
+ 0x07, 0x7E, 0x3E, 0xC9, 0x09, 0x70, 0x70, 0x00,
+ 0xC9, 0x09, 0x72, 0x72, 0x02,
+//ascii 0x004E
+ 0xF9, 0x09, 0x70, 0x70, 0x00, 0xC9, 0x09, 0x70,
+ 0x70, 0x00, 0xCA, 0x7E, 0x3E, 0x0C, 0x02, 0x10,
+ 0x09, 0xD5, 0x09, 0x10, 0x02, 0x0E, 0xD4, 0x0E,
+ 0x05, 0x10, 0x09, 0xD5, 0x09, 0x10, 0x02, 0x0C,
+ 0xD5, 0x05, 0x10, 0x05, 0xD5, 0xAC, 0x20, 0x2C,
+ 0xD5, 0x05, 0x10, 0x05, 0xD5, 0x0C, 0x02, 0x10,
+ 0x09, 0xD5, 0x09, 0x10, 0x05, 0x0E, 0xD4, 0x0E,
+ 0x02, 0x10, 0x05, 0x7C, 0x4C, 0xC9, 0x09, 0x70,
+ 0x70, 0x00, 0xC9, 0x09, 0x72, 0x72, 0x02,
+//ascii 0x004F
+ 0xC6, 0x8C, 0x75, 0x23, 0x85, 0x9E, 0xCC, 0x0C,
+ 0x03, 0x70, 0x00, 0x07, 0xCA, 0x09, 0x10, 0x81,
+ 0x7B, 0x1C, 0x8B, 0x95, 0x10, 0x03, 0x0E, 0xC7,
+ 0x0B, 0x10, 0x07, 0xC7, 0x9D, 0x30, 0x30, 0xC7,
+ 0x81, 0x09, 0xCA, 0x83, 0x09, 0xC5, 0x8B, 0x03,
+ 0xCB, 0x8B, 0x01, 0xC5, 0x87, 0x09, 0xCC, 0x81,
+ 0x0E, 0xC4, 0x85, 0x0B, 0xCC, 0x83, 0x0C, 0xC4,
+ 0x85, 0x0B, 0xCC, 0x83, 0x0C, 0xC4, 0x87, 0x07,
+ 0xCC, 0x01, 0x00, 0xC5, 0x8C, 0x01, 0xCB, 0x89,
+ 0x03, 0xC6, 0x83, 0x05, 0xC9, 0x9C, 0x10, 0xB0,
+ 0xC6, 0xAD, 0x10, 0x3C, 0xC6, 0x09, 0x10, 0x05,
+ 0xC8, 0x0C, 0x01, 0x10, 0x03, 0x05, 0x27, 0x05,
+ 0x01, 0x10, 0x05, 0xCB, 0x07, 0x01, 0x60, 0x03,
+ 0x0B, 0xCE, 0x0C, 0x09, 0x27, 0x0B, 0x0E, 0xC0,
+//ascii 0x0050
+ 0xC4, 0x09, 0x04, 0x12, 0x04, 0x09, 0xCC, 0x04,
+ 0x50, 0x02, 0x0E, 0xC9, 0x96, 0x02, 0x90, 0x1E,
+ 0x99, 0x20, 0x40, 0xC8, 0x0E, 0x10, 0x0E, 0xC4,
+ 0x82, 0x0C, 0xC7, 0x8B, 0x06, 0xC5, 0x89, 0x09,
+ 0xC7, 0x89, 0x09, 0xC5, 0x8B, 0x06, 0xC7, 0x89,
+ 0x09, 0xC5, 0x8C, 0x06, 0xC7, 0x89, 0x09, 0xC5,
+ 0x8C, 0x06, 0xC7, 0x89, 0x09, 0xC5, 0x8C, 0x06,
+ 0xC7, 0x89, 0x06, 0x5C, 0x89, 0x04, 0x5C, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x72, 0x72,
+ 0x02,
+//ascii 0x0051
+ 0xC6, 0x8C, 0x75, 0x23, 0x85, 0x9E, 0xCC, 0x0C,
+ 0x03, 0x70, 0x00, 0x07, 0xC2, 0x0C, 0x07, 0xC5,
+ 0x09, 0x20, 0x07, 0x0B, 0x2C, 0x09, 0x05, 0x10,
+ 0xA3, 0xE7, 0x05, 0xC4, 0x0B, 0x10, 0x07, 0xC7,
+ 0x0D, 0x03, 0x30, 0x0C, 0xC4, 0x10, 0x09, 0xC9,
+ 0x0B, 0x10, 0x03, 0x0E, 0xC4, 0x8B, 0x03, 0xC9,
+ 0x07, 0x20, 0x03, 0xC5, 0x87, 0x09, 0xC8, 0x09,
+ 0x10, 0x0C, 0x10, 0x0E, 0xC4, 0x85, 0x0B, 0xC8,
+ 0x89, 0x3E, 0xC0, 0x83, 0x0C, 0xC4, 0x85, 0x0B,
+ 0xC8, 0x0D, 0xC2, 0x83, 0x0C, 0xC4, 0x87, 0x07,
+ 0xCC, 0x10, 0xC5, 0x0C, 0x10, 0xCB, 0x89, 0x03,
+ 0xC6, 0x83, 0x05, 0xC9, 0x0C, 0x10, 0x0B, 0xC6,
+ 0x0D, 0x10, 0x03, 0x0C, 0xC6, 0x09, 0x10, 0x05,
+ 0xC8, 0x0C, 0x20, 0x03, 0x05, 0x27, 0x05, 0x20,
+ 0x05, 0xCB, 0x07, 0x70, 0x03, 0x0B, 0xCE, 0x0C,
+ 0x09, 0x27, 0x0B, 0x0E, 0xC0,
+//ascii 0x0052
+ 0xD2, 0x09, 0xC4, 0x09, 0x03, 0x12, 0x04, 0x09,
+ 0xC5, 0x8C, 0x30, 0xC2, 0x0E, 0x03, 0x50, 0x06,
+ 0xC2, 0x0D, 0x04, 0x20, 0xC2, 0x96, 0x02, 0x90,
+ 0x1D, 0xB9, 0x10, 0x9E, 0x60, 0x20, 0x06, 0x0E,
+ 0xC1, 0x9E, 0x01, 0xE0, 0xC3, 0x0C, 0x00, 0x11,
+ 0x10, 0x04, 0x0D, 0xC3, 0x89, 0x06, 0xC5, 0x02,
+ 0x10, 0x03, 0x0C, 0xC5, 0x89, 0x09, 0xC5, 0x84,
+ 0x09, 0xC7, 0x89, 0x09, 0xC5, 0x84, 0x0D, 0xC7,
+ 0x89, 0x09, 0xC5, 0x84, 0x0D, 0xC7, 0x89, 0x09,
+ 0xC5, 0x84, 0x0D, 0xC7, 0x89, 0x06, 0x5C, 0x83,
+ 0x09, 0x5C, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x09, 0x72, 0x72, 0x02,
+//ascii 0x0053
+ 0xC4, 0x0A, 0x06, 0xC5, 0x06, 0x12, 0x05, 0x0A,
+ 0xC9, 0x82, 0x02, 0xC4, 0x02, 0x40, 0x06, 0xC7,
+ 0x95, 0x02, 0x90, 0xC3, 0xB6, 0x02, 0xCE, 0x90,
+ 0x10, 0x0A, 0xC5, 0x9D, 0x02, 0xE0, 0xC3, 0x0E,
+ 0x10, 0x0E, 0xC2, 0x8A, 0x02, 0xC5, 0x89, 0x09,
+ 0xC4, 0x8A, 0x05, 0xC4, 0x82, 0x0E, 0xC4, 0x86,
+ 0x0C, 0xC4, 0x85, 0x0A, 0xC4, 0x85, 0x0C, 0xC4,
+ 0x85, 0x0D, 0xC4, 0x10, 0xC5, 0x86, 0x0C, 0xC4,
+ 0x86, 0x0A, 0xC3, 0x8C, 0x02, 0xC5, 0x85, 0x0C,
+ 0xC4, 0x8A, 0x05, 0xC3, 0x85, 0x09, 0xC5, 0x10,
+ 0xC6, 0x82, 0x09, 0xC1, 0x09, 0x10, 0xC5, 0x86,
+ 0x05, 0xC6, 0x0C, 0x50, 0x0A, 0xC3, 0x0C, 0x02,
+ 0x10, 0x0D, 0xC7, 0x0C, 0x02, 0x20, 0x09, 0xC4,
+ 0x09, 0x10, 0x0A, 0xCA, 0x1E, 0xC6, 0x8C, 0x9E,
+//ascii 0x0054
+ 0xC1, 0x8E, 0xAE, 0xD0, 0x89, 0x09, 0xD0, 0x89,
+ 0x09, 0xD0, 0x89, 0x09, 0xD0, 0x89, 0x09, 0xD0,
+ 0x89, 0x09, 0xD0, 0x09, 0x00, 0x74, 0x74, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x89, 0x06, 0x7A,
+ 0x6A, 0xC1, 0x89, 0x09, 0xD0, 0x89, 0x09, 0xD0,
+ 0x89, 0x09, 0xD0, 0x89, 0x09, 0xD0, 0x8A, 0x4A,
+ 0xC0,
+//ascii 0x0055
+ 0xC1, 0x0B, 0x75, 0x35, 0x08, 0x0C, 0xC8, 0x09,
+ 0x70, 0x50, 0x05, 0xC7, 0x0C, 0x79, 0x29, 0x08,
+ 0x05, 0x10, 0x05, 0xD4, 0x9C, 0x20, 0x80, 0xD4,
+ 0x8B, 0x02, 0xD5, 0x82, 0x0C, 0xD4, 0x85, 0x0B,
+ 0xD4, 0x85, 0x0B, 0xD4, 0x82, 0x0C, 0xD3, 0x0C,
+ 0x10, 0xD4, 0x82, 0x07, 0xC6, 0x7C, 0x2C, 0xAB,
+ 0x82, 0x02, 0xC6, 0x09, 0x70, 0x50, 0x02, 0x0C,
+ 0xC6, 0x09, 0x72, 0x32, 0x05, 0x09, 0xC0,
+//ascii 0x0056
+ 0xC1, 0x1C, 0xD9, 0xA9, 0x02, 0x8D, 0xD6, 0x0B,
+ 0x02, 0x20, 0x04, 0x09, 0xD6, 0x0B, 0x05, 0x30,
+ 0x05, 0x0B, 0xD6, 0x0B, 0x05, 0x20, 0x82, 0x7C,
+ 0xD6, 0x09, 0x04, 0x20, 0x82, 0x8E, 0xD5, 0x8E,
+ 0x94, 0x20, 0x04, 0x09, 0xD6, 0x0D, 0x08, 0x20,
+ 0xD6, 0x09, 0x04, 0x20, 0xD3, 0x0B, 0x05, 0x20,
+ 0x82, 0x8D, 0xD0, 0x0B, 0x05, 0x30, 0x05, 0x0C,
+ 0xD0, 0x8C, 0x72, 0x20, 0x04, 0x09, 0xD0, 0x8D,
+ 0x82, 0x20, 0x82, 0x9E, 0xD1, 0x09, 0x20, 0x82,
+ 0x7C, 0xD4, 0x99, 0x05, 0xB0, 0xD7, 0x0E, 0xC0,
+//ascii 0x0057
+ 0xC1, 0x0E, 0xDA, 0xA9, 0x05, 0x9D, 0xD6, 0x09,
+ 0x30, 0x92, 0x6A, 0xE0, 0xD3, 0x9E, 0xA6, 0x20,
+ 0x30, 0x82, 0x6C, 0xD4, 0x9D, 0x95, 0x20, 0x30,
+ 0x85, 0x9D, 0xD4, 0x8D, 0x95, 0x30, 0x02, 0x06,
+ 0xD6, 0x0C, 0x05, 0x20, 0xD3, 0x8D, 0x95, 0x30,
+ 0x02, 0xCF, 0x9E, 0xA5, 0x20, 0x20, 0x92, 0x5A,
+ 0xE0, 0xCC, 0x9E, 0xA6, 0x20, 0x30, 0x85, 0x9C,
+ 0xCE, 0x0C, 0x02, 0x30, 0x82, 0x6A, 0xD2, 0x09,
+ 0x20, 0x05, 0x0D, 0xD5, 0x09, 0x30, 0x92, 0x5A,
+ 0xE0, 0xD4, 0x8A, 0x62, 0x30, 0x82, 0x6C, 0xD4,
+ 0x9E, 0xA6, 0x20, 0x30, 0x85, 0x9D, 0xD4, 0x9E,
+ 0x95, 0x20, 0x20, 0x02, 0x06, 0xD6, 0x0C, 0x05,
+ 0x20, 0xD3, 0x8C, 0x95, 0x30, 0x02, 0xCF, 0x8D,
+ 0x95, 0x40, 0x85, 0x9E, 0xCC, 0x9D, 0x95, 0x20,
+ 0x30, 0x85, 0x9C, 0xCE, 0x0A, 0x02, 0x30, 0x82,
+ 0x6A, 0xD2, 0x09, 0x10, 0x85, 0x9E, 0xD5, 0x0D,
+ 0x0C,
+//ascii 0x0058
+ 0xC1, 0x0B, 0x0D, 0xCE, 0x08, 0xC1, 0x88, 0x08,
+ 0xCB, 0x8D, 0x20, 0xC1, 0x0A, 0x10, 0x02, 0x0B,
+ 0xC8, 0x08, 0x20, 0xC2, 0x0B, 0x02, 0x10, 0x05,
+ 0x0E, 0xC4, 0x0B, 0x02, 0x10, 0x05, 0x0E, 0xC4,
+ 0x08, 0x20, 0x0A, 0xC1, 0x0E, 0x05, 0x10, 0x02,
+ 0x0B, 0xC7, 0x0D, 0x02, 0x10, 0x05, 0x08, 0x20,
+ 0x08, 0xCB, 0x0A, 0x30, 0x02, 0x0D, 0xCD, 0x08,
+ 0x20, 0x0B, 0xCC, 0x0D, 0x02, 0x10, 0x02, 0x10,
+ 0x05, 0xCA, 0x08, 0x10, 0x02, 0x0D, 0xC0, 0x08,
+ 0x10, 0x02, 0x0A, 0xC6, 0x0A, 0x02, 0x10, 0x08,
+ 0xC3, 0x0D, 0x02, 0x10, 0x05, 0x0E, 0xC2, 0x0E,
+ 0x05, 0x10, 0x02, 0x0D, 0xC6, 0x08, 0x20, 0x08,
+ 0xC1, 0x08, 0x10, 0x08, 0xC9, 0x0E, 0x05, 0x10,
+ 0xC1, 0x88, 0x5E, 0xCC, 0x0A, 0x00, 0xC1, 0x0E,
+ 0xCF, 0x0E,
+//ascii 0x0059
+ 0xDD, 0x89, 0x4E, 0xD8, 0x09, 0x10, 0x07, 0xD8,
+ 0x06, 0x10, 0x02, 0x0C, 0xD7, 0x0C, 0x02, 0x10,
+ 0x06, 0x0E, 0xD7, 0x09, 0x20, 0x09, 0xD8, 0x06,
+ 0x10, 0x02, 0x0C, 0xD7, 0x0C, 0x04, 0x70, 0x00,
+ 0xD0, 0x0C, 0x04, 0x70, 0x00, 0xCF, 0x07, 0x10,
+ 0x02, 0x0C, 0xD4, 0x09, 0x02, 0x10, 0x07, 0xD4,
+ 0x0C, 0x04, 0x10, 0x04, 0x0E, 0xD4, 0x07, 0x10,
+ 0x02, 0x09, 0xD5, 0x09, 0x10, 0x07, 0xD7, 0x89,
+ 0x4C, 0xD8, 0x0E, 0xC0,
+//ascii 0x005A
+ 0xC1, 0x8D, 0x8D, 0xCC, 0x08, 0x07, 0xC1, 0x09,
+ 0x10, 0x08, 0xCB, 0x02, 0x00, 0xC1, 0x09, 0x20,
+ 0x03, 0x0D, 0xC9, 0x02, 0x00, 0xC1, 0x99, 0x07,
+ 0x30, 0x10, 0x08, 0xC8, 0x02, 0x00, 0xC1, 0x89,
+ 0x09, 0xC0, 0x09, 0x10, 0x03, 0x0D, 0xC6, 0x02,
+ 0x00, 0xC1, 0x89, 0x09, 0xC1, 0x0D, 0x03, 0x10,
+ 0x08, 0xC5, 0x02, 0x00, 0xC1, 0x89, 0x09, 0xC3,
+ 0x09, 0x10, 0x03, 0x0D, 0xC3, 0x02, 0x00, 0xC1,
+ 0x89, 0x09, 0xC4, 0x0D, 0x03, 0x10, 0x08, 0xC2,
+ 0x02, 0x00, 0xC1, 0x89, 0x09, 0xC6, 0x08, 0x10,
+ 0x03, 0x0D, 0xC0, 0x02, 0x00, 0xC1, 0x89, 0x09,
+ 0xC7, 0x0D, 0x03, 0x10, 0x88, 0x20, 0xC1, 0x89,
+ 0x09, 0xC9, 0x08, 0x30, 0xC1, 0x89, 0x09, 0xCA,
+ 0x0D, 0x03, 0x10, 0xC1, 0x8C, 0x7C, 0xCC, 0x09,
+ 0x08,
+//ascii 0x005B
+ 0xC0, 0x8D, 0x2B, 0xD0, 0x8E, 0x28, 0xC0, 0x8B,
+ 0x0B, 0xD0, 0x8E, 0x07, 0xC0, 0x8B, 0x0B, 0xD0,
+ 0x8E, 0x07, 0xC0, 0x8B, 0x02, 0x74, 0x74, 0x14,
+ 0x00, 0x07, 0xC0, 0x0B, 0x70, 0x70, 0x40, 0x07,
+ 0xC1, 0x7D, 0x7D, 0x4D, 0x0E,
+//ascii 0x005C
+ 0xD2, 0x9D, 0x95, 0x70, 0xCF, 0x9E, 0x95, 0x20,
+ 0x20, 0x07, 0xCC, 0x8C, 0x72, 0x20, 0x92, 0x59,
+ 0xE0, 0xC9, 0x8D, 0x75, 0x30, 0x85, 0x7D, 0xC9,
+ 0x9E, 0x95, 0x20, 0x20, 0x82, 0x7C, 0xCA, 0x8E,
+ 0x72, 0x20, 0x92, 0x59, 0xE0, 0xCD, 0x0C, 0x10,
+ 0x85, 0x9D, 0xD1, 0x0E, 0x0C, 0xC0,
+//ascii 0x005D
+ 0xC0, 0x0C, 0x72, 0x72, 0x42, 0x08, 0xC0, 0x0C,
+ 0x70, 0x70, 0x40, 0x07, 0xC0, 0x8C, 0x0A, 0xD0,
+ 0x8D, 0x07, 0xC0, 0x8C, 0x0A, 0xD0, 0x8D, 0x07,
+ 0xC0, 0x8C, 0x0A, 0xD0, 0x8D, 0x07, 0xC1, 0x0D,
+ 0xD2, 0x0D, 0xC0,
+//ascii 0x005E
+ 0xD3, 0x8A, 0x39, 0xC6, 0x0A, 0x02, 0x10, 0x0A,
+ 0xC4, 0x09, 0x02, 0x10, 0x05, 0x0D, 0xC4, 0x02,
+ 0x10, 0x07, 0x0E, 0xC6, 0x82, 0x0A, 0xC8, 0x05,
+ 0x10, 0x03, 0x0A, 0xC7, 0x0D, 0x05, 0x10, 0x02,
+ 0x09, 0xC7, 0x0D, 0x05, 0x10, 0x09, 0xC8, 0x8E,
+ 0x79, 0xC0,
+//ascii 0x005F
+ 0x02, 0x04, 0xC1, 0x00, 0x02, 0xC1, 0x00, 0x02,
+ 0xC1, 0x00, 0x02, 0xC1, 0x00, 0x02, 0xC1, 0x00,
+ 0x02, 0xC1, 0x00, 0x02, 0xC1, 0x00, 0x02, 0xC1,
+ 0x00, 0x02, 0xC1, 0x00, 0x02, 0xC1, 0x00, 0x02,
+//ascii 0x0060
+ 0xCA, 0x8B, 0x3E, 0xC2, 0x0B, 0x03, 0x10, 0xC3,
+ 0x93, 0x05, 0xE0, 0xC3, 0x03, 0x0B, 0xC0,
+//ascii 0x0061
+ 0xC4, 0x09, 0x06, 0x75, 0x05, 0xC6, 0x0E, 0x02,
+ 0x70, 0x20, 0xC6, 0x85, 0x03, 0x19, 0x00, 0x04,
+ 0x1B, 0x96, 0x04, 0xB0, 0xC6, 0x00, 0x02, 0xC2,
+ 0x12, 0xC2, 0x8B, 0x09, 0xC5, 0x8D, 0x06, 0xC2,
+ 0x04, 0x00, 0xC3, 0x04, 0x00, 0xC5, 0x8C, 0x07,
+ 0xC2, 0x86, 0x0E, 0xC2, 0x87, 0x0C, 0xC4, 0x8E,
+ 0x04, 0xC2, 0x89, 0x0B, 0xC2, 0x87, 0x0B, 0xC5,
+ 0x82, 0x0B, 0xC1, 0x8C, 0x06, 0xC2, 0x83, 0x0D,
+ 0xC5, 0x09, 0x10, 0x0C, 0xC1, 0xB2, 0x09, 0xC6,
+ 0x00, 0x02, 0xC7, 0x86, 0x0E, 0xC1, 0x09, 0x40,
+ 0x0C, 0xC8, 0x0D, 0xC3, 0xAB, 0x54, 0x6E, 0xC0,
+//ascii 0x0062
+ 0xC9, 0xBD, 0x96, 0x56, 0x90, 0x0D, 0xCE, 0x0E,
+ 0x05, 0x60, 0x05, 0x0E, 0xCB, 0xAE, 0x20, 0x16,
+ 0x29, 0xA6, 0x10, 0x2E, 0xCA, 0x85, 0x05, 0xC6,
+ 0x85, 0x05, 0xCA, 0x00, 0x02, 0xC8, 0x02, 0x00,
+ 0xC9, 0x8C, 0x06, 0xC8, 0x86, 0x0C, 0xC8, 0x8C,
+ 0x06, 0xC8, 0x86, 0x0C, 0xC9, 0x01, 0x03, 0xC8,
+ 0x03, 0x01, 0xCA, 0x89, 0x09, 0xC6, 0x89, 0x09,
+ 0xC6, 0x4E, 0xA9, 0x05, 0x9D, 0xC0, 0xAD, 0x95,
+ 0x09, 0xC6, 0x09, 0x70, 0x70, 0x00, 0xC5, 0x09,
+ 0x72, 0x72, 0x02,
+//ascii 0x0063
+ 0xC9, 0x0D, 0xC4, 0x0D, 0xD2, 0x8C, 0x23, 0xC4,
+ 0x83, 0x2C, 0xCF, 0x0C, 0x10, 0x05, 0xC4, 0x05,
+ 0x10, 0x0C, 0xCE, 0x83, 0x07, 0xC6, 0x87, 0x03,
+ 0xCD, 0x8E, 0x03, 0xC8, 0x83, 0x0E, 0xCC, 0x8C,
+ 0x07, 0xC8, 0x87, 0x0C, 0xCC, 0x8C, 0x05, 0xC8,
+ 0x87, 0x0C, 0xCD, 0x00, 0x02, 0xC8, 0x02, 0x00,
+ 0xCE, 0x85, 0x05, 0xC6, 0x85, 0x05, 0xCE, 0xAE,
+ 0x20, 0x27, 0x2C, 0xA7, 0x20, 0x2E, 0xCF, 0x0E,
+ 0x03, 0x60, 0x03, 0x0E, 0xD2, 0xBC, 0x75, 0x35,
+ 0x70, 0x0C, 0xC0,
+//ascii 0x0064
+ 0xC1, 0x09, 0x73, 0x73, 0x03, 0xC5, 0x09, 0x70,
+ 0x70, 0x00, 0xC5, 0x0E, 0x4C, 0xB7, 0x03, 0x9C,
+ 0xD0, 0xBC, 0x92, 0x09, 0xD0, 0xCA, 0x89, 0x07,
+ 0xC6, 0x87, 0x09, 0xCA, 0x01, 0x02, 0xC8, 0x02,
+ 0x01, 0xC9, 0x8C, 0x07, 0xC8, 0x87, 0x0C, 0xC8,
+ 0x8C, 0x07, 0xC8, 0x87, 0x0C, 0xC8, 0x8E, 0x02,
+ 0xC8, 0x82, 0x0E, 0xC9, 0x84, 0x07, 0xC6, 0x87,
+ 0x04, 0xCA, 0xAD, 0x10, 0x27, 0x2C, 0xA7, 0x20,
+ 0x1D, 0xCB, 0x0D, 0x02, 0x60, 0x02, 0x0D, 0xCE,
+ 0x0C, 0x07, 0x24, 0x07, 0x0C, 0xC0,
+//ascii 0x0065
+ 0xC5, 0x0B, 0x06, 0x14, 0x0E, 0xC1, 0x0B, 0xC9,
+ 0x0C, 0x02, 0x30, 0x0E, 0xC0, 0x8B, 0x06, 0xC7,
+ 0x0D, 0x10, 0xA4, 0x94, 0x0E, 0xC0, 0x9B, 0x20,
+ 0x70, 0xC6, 0x84, 0x09, 0xC1, 0x86, 0x0E, 0xC1,
+ 0x8D, 0x02, 0xC5, 0x8E, 0x04, 0xC2, 0x86, 0x0E,
+ 0xC2, 0x84, 0x0D, 0xC4, 0x8C, 0x06, 0xC2, 0x86,
+ 0x0E, 0xC2, 0x87, 0x0C, 0xC4, 0x8C, 0x06, 0xC2,
+ 0x86, 0x0E, 0xC2, 0x86, 0x0D, 0xC5, 0x00, 0x02,
+ 0xC2, 0x86, 0x0E, 0xC2, 0x02, 0x00, 0xC6, 0x86,
+ 0x06, 0xC1, 0x86, 0x0E, 0xC1, 0x86, 0x06, 0xC6,
+ 0xBE, 0x20, 0x49, 0x40, 0x00, 0x19, 0x94, 0x02,
+ 0xE0, 0xC7, 0x0E, 0x04, 0x60, 0x04, 0x0E, 0xCA,
+ 0x0C, 0x07, 0x24, 0x07, 0x0C, 0xC0,
+//ascii 0x0066
+ 0xC1, 0x0E, 0xD1, 0x8E, 0x06, 0xC2, 0x06, 0x0A,
+ 0xCB, 0x8C, 0x06, 0xC1, 0x8E, 0x06, 0xCB, 0x8E,
+ 0x02, 0xC1, 0x8E, 0x06, 0xCC, 0x82, 0x01, 0x14,
+ 0x00, 0x01, 0x74, 0x24, 0xC1, 0x0E, 0x02, 0x70,
+ 0x70, 0xC3, 0x1C, 0x8B, 0x04, 0x7C, 0x2C, 0xC5,
+ 0x8E, 0x06, 0xD1, 0x0A, 0x0C, 0xC0,
+//ascii 0x0067
+ 0xC2, 0x73, 0x53, 0x06, 0x0A, 0xC6, 0x0E, 0x70,
+ 0x70, 0x06, 0xC6, 0xAD, 0x80, 0x38, 0x1C, 0xAB,
+ 0x80, 0x3B, 0x1C, 0x08, 0x10, 0x08, 0xC5, 0x8A,
+ 0x08, 0xC5, 0x0E, 0x13, 0xC2, 0x8C, 0x03, 0xC5,
+ 0x00, 0x03, 0xC7, 0x8B, 0x08, 0xC2, 0x03, 0x00,
+ 0xC4, 0x8C, 0x06, 0xC8, 0x00, 0x03, 0xC2, 0x06,
+ 0x00, 0xC4, 0x8C, 0x06, 0xC8, 0x00, 0x03, 0xC2,
+ 0x06, 0x00, 0xC4, 0x8E, 0x03, 0xC7, 0x8A, 0x06,
+ 0xC2, 0x03, 0x00, 0xC5, 0x83, 0x06, 0xC5, 0x9D,
+ 0x30, 0xB0, 0xC1, 0x8A, 0x03, 0xC5, 0x0D, 0x10,
+ 0xB3, 0x8B, 0xCA, 0x60, 0x10, 0x03, 0xC1, 0x0B,
+ 0x10, 0x0B, 0xC6, 0x0C, 0x03, 0x60, 0x06, 0xC3,
+ 0x03, 0x08, 0xC9, 0x0B, 0x06, 0x13, 0x86, 0x8C,
+ 0xC0,
+//ascii 0x0068
+ 0xC9, 0x0D, 0x7A, 0x0A, 0xC7, 0x07, 0x70, 0x20,
+ 0xC6, 0x07, 0x10, 0x02, 0x75, 0x05, 0xC6, 0x10,
+ 0x09, 0xCF, 0x8D, 0x04, 0xD0, 0x8D, 0x07, 0xD1,
+ 0x00, 0x06, 0xD1, 0x05, 0x01, 0xD2, 0x85, 0x4D,
+ 0xCA, 0x09, 0x52, 0x10, 0x01, 0x72, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC2, 0x7D, 0x7D, 0x0D,
+//ascii 0x0069
+ 0xC2, 0x0C, 0xD1, 0x82, 0x07, 0xC0, 0x0E, 0x72,
+ 0x42, 0xC1, 0x82, 0x06, 0xC0, 0x0E, 0x70, 0x40,
+ 0xC1, 0x8C, 0x7E, 0xC1, 0x7D, 0x4D,
+//ascii 0x006A
+ 0xC2, 0x0C, 0xD9, 0x83, 0x07, 0xC1, 0x72, 0x52,
+ 0x83, 0x5C, 0xC5, 0x10, 0x05, 0xC1, 0x70, 0x70,
+ 0x00, 0x0C, 0xC4, 0x8C, 0x7D, 0xC1, 0x7D, 0x5D,
+ 0x9C, 0x50, 0x50, 0xD9, 0x00, 0x02, 0xC0,
+//ascii 0x006B
+ 0xD2, 0x0B, 0xC6, 0x04, 0xC9, 0x07, 0x00, 0xC6,
+ 0x00, 0x04, 0xC7, 0x04, 0x10, 0xC6, 0x84, 0x04,
+ 0xC4, 0xAD, 0x20, 0x2C, 0xC7, 0x84, 0x04, 0xC2,
+ 0x0A, 0x10, 0x04, 0xCA, 0x84, 0x04, 0xC0, 0x07,
+ 0x10, 0x06, 0xCC, 0x04, 0x30, 0x0A, 0xCE, 0x04,
+ 0x10, 0x0D, 0xD0, 0x86, 0x07, 0xC6, 0x0A, 0x72,
+ 0x12, 0x10, 0x42, 0xC1, 0x09, 0x70, 0x70, 0x00,
+ 0xC2, 0x7D, 0x7D, 0x0D,
+//ascii 0x006C
+ 0xD1, 0x05, 0x00, 0xD9, 0x03, 0x00, 0xC9, 0x09,
+ 0x72, 0x52, 0x10, 0x02, 0xC9, 0x09, 0x70, 0x60,
+ 0x02, 0x0C, 0xCA, 0x7D, 0x6D,
+//ascii 0x006D
+ 0xD3, 0x09, 0x03, 0x70, 0x10, 0xC2, 0x09, 0x70,
+ 0x30, 0xC2, 0x10, 0x09, 0xCB, 0x8D, 0x03, 0xCC,
+ 0x8D, 0x06, 0xCD, 0x00, 0x05, 0xCD, 0x86, 0x0D,
+ 0xCD, 0x86, 0x06, 0x79, 0x09, 0xC3, 0x05, 0x70,
+ 0x20, 0xC2, 0x05, 0x10, 0x05, 0x76, 0x06, 0xC1,
+ 0x0D, 0x10, 0x0D, 0xCB, 0x8D, 0x06, 0xCC, 0x8D,
+ 0x06, 0xCD, 0x03, 0x02, 0xCD, 0x9E, 0x35, 0xE0,
+ 0xCB, 0x13, 0x10, 0x72, 0x02, 0xC1, 0x0E, 0x70,
+ 0x40, 0xC2, 0x7D, 0x4D,
+//ascii 0x006E
+ 0xC5, 0x0E, 0x7D, 0x0D, 0xC3, 0x0A, 0x03, 0x70,
+ 0x10, 0xC2, 0x09, 0x20, 0x73, 0x03, 0xC2, 0x10,
+ 0x07, 0xCB, 0x8D, 0x03, 0xCC, 0x8D, 0x07, 0xCC,
+ 0x8E, 0x05, 0xCD, 0x05, 0x00, 0xCD, 0x0E, 0x13,
+ 0x0D, 0xCA, 0x0E, 0x13, 0x10, 0x73, 0x03, 0xC1,
+ 0x0E, 0x70, 0x40, 0xC2, 0x7D, 0x4D,
+//ascii 0x006F
+ 0xC8, 0x0E, 0xCE, 0x8E, 0x72, 0x20, 0x82, 0x7E,
+ 0xC9, 0x0A, 0x30, 0x02, 0x30, 0x0A, 0xC7, 0x0C,
+ 0x10, 0x07, 0x0D, 0xC2, 0x0D, 0x07, 0x10, 0x0C,
+ 0xC6, 0x84, 0x0A, 0xC6, 0x8A, 0x04, 0xC5, 0x8E,
+ 0x04, 0xC8, 0x84, 0x0E, 0xC4, 0x8C, 0x07, 0xC8,
+ 0x87, 0x0C, 0xC4, 0x8D, 0x07, 0xC8, 0x87, 0x0D,
+ 0xC5, 0x00, 0x02, 0xC8, 0x02, 0x00, 0xC6, 0x85,
+ 0x05, 0xC6, 0x85, 0x05, 0xC6, 0xBE, 0x20, 0x27,
+ 0xA0, 0xBC, 0xA7, 0x20, 0x20, 0x0E, 0xC7, 0x0E,
+ 0x04, 0x60, 0x04, 0x0E, 0xCA, 0xBC, 0x75, 0x45,
+ 0x70, 0x0C, 0xC0,
+//ascii 0x0070
+ 0xE6, 0x0D, 0x29, 0x0D, 0xD4, 0x09, 0x02, 0x40,
+ 0x02, 0x09, 0xD1, 0x04, 0x10, 0x02, 0x26, 0x02,
+ 0x10, 0x04, 0xCF, 0x97, 0x02, 0xC0, 0xC4, 0x9C,
+ 0x20, 0x70, 0xCE, 0x10, 0x0D, 0xC6, 0x0D, 0x10,
+ 0xCD, 0x8C, 0x06, 0xC8, 0x86, 0x0C, 0xCC, 0x8C,
+ 0x07, 0xC8, 0x87, 0x0C, 0xCC, 0x8E, 0x04, 0xC8,
+ 0x84, 0x0E, 0xCD, 0x86, 0x0C, 0xC6, 0x8C, 0x06,
+ 0xCF, 0x86, 0x09, 0xC3, 0x9E, 0x90, 0x60, 0xCF,
+ 0x14, 0x20, 0x22, 0x20, 0x52, 0x04, 0xC8, 0x0E,
+ 0x70, 0x70, 0x00, 0x02, 0xC9, 0x7D, 0x7D, 0x1D,
+ 0xC0,
+//ascii 0x0071
+ 0xC2, 0x74, 0x74, 0x14, 0xC4, 0x0E, 0x70, 0x70,
+ 0x00, 0x02, 0xC5, 0xBD, 0x80, 0x48, 0xC0, 0xBD,
+ 0xC8, 0x20, 0x80, 0x5C, 0xC5, 0x8B, 0x07, 0xC6,
+ 0x87, 0x0B, 0xCA, 0x00, 0x02, 0xC8, 0x02, 0x00,
+ 0xC9, 0x8C, 0x07, 0xC8, 0x87, 0x0C, 0xC8, 0x8C,
+ 0x07, 0xC8, 0x87, 0x0C, 0xC8, 0x8E, 0x02, 0xC8,
+ 0x82, 0x0E, 0xC9, 0x84, 0x07, 0xC6, 0x87, 0x04,
+ 0xCA, 0x0D, 0x10, 0xB2, 0x8B, 0xCB, 0x80, 0x02,
+ 0x10, 0x0D, 0xCB, 0x0D, 0x02, 0x60, 0x02, 0x0D,
+ 0xCE, 0x0B, 0x07, 0x24, 0x07, 0x0B, 0xC0,
+//ascii 0x0072
+ 0xC1, 0x0E, 0x1B, 0xCC, 0x8B, 0x05, 0xCC, 0x8D,
+ 0x05, 0xCD, 0x02, 0x00, 0xCD, 0x9D, 0x23, 0xE0,
+ 0xCB, 0x13, 0x10, 0x72, 0x02, 0xC2, 0x70, 0x40,
+ 0xC2, 0x7D, 0x4D,
+//ascii 0x0073
+ 0xEA, 0x8C, 0xBD, 0xD1, 0x09, 0x01, 0xC3, 0x04,
+ 0x20, 0x07, 0xCF, 0x09, 0x10, 0x0D, 0xC1, 0x97,
+ 0x01, 0x40, 0x10, 0x09, 0xCE, 0x81, 0x0C, 0xC2,
+ 0x10, 0x0D, 0xC0, 0x8D, 0x01, 0xCD, 0x8D, 0x07,
+ 0xC2, 0x8C, 0x04, 0xC2, 0x84, 0x0D, 0xCC, 0x8C,
+ 0x07, 0xC2, 0x87, 0x09, 0xC2, 0x87, 0x0C, 0xCC,
+ 0x8D, 0x07, 0xC2, 0x84, 0x0D, 0xC2, 0x87, 0x0D,
+ 0xCD, 0x11, 0x0E, 0xC0, 0x8C, 0x01, 0xC3, 0x01,
+ 0x00, 0xCE, 0x97, 0x01, 0x40, 0x10, 0x07, 0xC1,
+ 0x9D, 0x40, 0x40, 0xCF, 0x07, 0x20, 0x04, 0xC2,
+ 0x99, 0x01, 0xE0, 0xD0, 0x8D, 0xBD, 0xC3, 0x0D,
+ 0x07,
+//ascii 0x0074
+ 0xC6, 0x07, 0x0A, 0xC8, 0x0A, 0x05, 0xCA, 0x00,
+ 0x07, 0xC8, 0x83, 0x0D, 0xC9, 0x00, 0x07, 0xC8,
+ 0x01, 0x00, 0xC6, 0x0D, 0x24, 0x00, 0x01, 0x74,
+ 0x81, 0x04, 0xC6, 0x0C, 0x70, 0x50, 0x03, 0x0E,
+ 0xC7, 0x1C, 0x8A, 0x04, 0x7C, 0x0D, 0xCC, 0x00,
+ 0x07, 0xD5, 0x0C, 0x0D, 0xC0,
+//ascii 0x0075
+ 0xC2, 0x7E, 0x4E, 0xC5, 0x0E, 0x70, 0x40, 0xC5,
+ 0x0E, 0x72, 0x20, 0x12, 0xCF, 0x8B, 0x28, 0xD1,
+ 0x8B, 0x08, 0xD1, 0x12, 0xD1, 0x83, 0x0D, 0xCF,
+ 0x0E, 0x10, 0x0E, 0xCE, 0x9E, 0x30, 0x20, 0xC5,
+ 0x0E, 0x72, 0x02, 0x20, 0x0B, 0xC5, 0x0E, 0x70,
+ 0x10, 0x03, 0x0B, 0xC7, 0x7D, 0x0D,
+//ascii 0x0076
+ 0xC6, 0x0A, 0xD9, 0xAE, 0x02, 0x6C, 0xD7, 0x02,
+ 0x20, 0x82, 0x8E, 0xD5, 0x8C, 0x82, 0x20, 0x04,
+ 0x0A, 0xD6, 0x8C, 0x62, 0x20, 0x06, 0x0C, 0xD6,
+ 0x8C, 0x62, 0x10, 0x02, 0xD7, 0x0A, 0x02, 0x10,
+ 0xD4, 0x8C, 0x62, 0x10, 0x02, 0x08, 0xD1, 0x8C,
+ 0x62, 0x20, 0x06, 0x0C, 0xD0, 0x8C, 0x62, 0x20,
+ 0x04, 0x0A, 0xD2, 0x0E, 0x20, 0x82, 0x8E, 0xD4,
+ 0x9E, 0x26, 0xC0,
+//ascii 0x0077
+ 0xE2, 0x07, 0x0D, 0xD8, 0x0E, 0x10, 0x81, 0x7B,
+ 0xD6, 0x07, 0x01, 0x30, 0x85, 0xAE, 0xD4, 0x8D,
+ 0x93, 0x30, 0x83, 0x9E, 0xD5, 0x8B, 0x71, 0x20,
+ 0x03, 0xD6, 0x0C, 0x05, 0x20, 0xD2, 0x9E, 0xA5,
+ 0x10, 0x20, 0x05, 0x09, 0xCF, 0x8B, 0x73, 0x20,
+ 0x83, 0x7B, 0xD0, 0x0E, 0x30, 0x85, 0x9E, 0xD3,
+ 0x0E, 0x20, 0x07, 0x0D, 0xD6, 0x09, 0x03, 0x20,
+ 0x91, 0x5A, 0xE0, 0xD5, 0x8B, 0x71, 0x20, 0x83,
+ 0x9D, 0xD5, 0x8E, 0x95, 0x20, 0x01, 0xD5, 0x8E,
+ 0xA5, 0x20, 0xD2, 0x8C, 0x73, 0x20, 0x81, 0x5B,
+ 0xCE, 0x9E, 0xA5, 0x10, 0x20, 0x81, 0x7C, 0xD0,
+ 0x0E, 0x30, 0x83, 0x9D, 0xD3, 0xAE, 0x05, 0xAE,
+ 0xC0,
+//ascii 0x0078
+ 0xC1, 0x0E, 0x08, 0xCA, 0x05, 0xC1, 0x9E, 0x02,
+ 0xC0, 0xC6, 0x8B, 0x20, 0xC2, 0x05, 0x10, 0x05,
+ 0xC3, 0x0E, 0x05, 0x10, 0x05, 0xC3, 0xAB, 0x20,
+ 0x2B, 0xC0, 0xA9, 0x20, 0x2B, 0xC6, 0x08, 0x10,
+ 0x02, 0x10, 0x08, 0xC9, 0x0D, 0x20, 0x0B, 0xC9,
+ 0x99, 0x20, 0x20, 0x10, 0x08, 0xC6, 0xAC, 0x20,
+ 0x29, 0xC0, 0x08, 0x10, 0x02, 0x0C, 0xC3, 0x05,
+ 0x10, 0x05, 0x0E, 0xC2, 0x0D, 0x05, 0x10, 0x05,
+ 0xC1, 0x9E, 0x02, 0xB0, 0xC6, 0x89, 0x20, 0xC1,
+ 0x0E, 0x05, 0xC9, 0x0E, 0x05,
+//ascii 0x0079
+ 0xC6, 0x0A, 0xD9, 0xAE, 0x02, 0x6D, 0xD7, 0x02,
+ 0x20, 0x82, 0x8E, 0xD5, 0x8D, 0x82, 0x20, 0x05,
+ 0x0A, 0xD6, 0x8C, 0x62, 0x20, 0x06, 0x0C, 0xD6,
+ 0x8C, 0x62, 0x10, 0x82, 0x8D, 0xD5, 0x0A, 0x02,
+ 0x30, 0x05, 0x0D, 0xD0, 0x0C, 0x06, 0x20, 0x02,
+ 0x18, 0x02, 0x10, 0x0D, 0xCC, 0x8C, 0x62, 0x20,
+ 0x05, 0x0C, 0xC3, 0x88, 0x05, 0xC9, 0x8D, 0x62,
+ 0x20, 0x05, 0x0A, 0xC7, 0x00, 0x02, 0xC8, 0x0E,
+ 0x20, 0x82, 0x8D, 0xC9, 0x00, 0x02, 0xC8, 0x9E,
+ 0x06, 0xC0, 0xCD, 0x0D, 0xC0,
+//ascii 0x007A
+ 0xC2, 0x08, 0x0A, 0xC8, 0x05, 0x04, 0xC1, 0x0E,
+ 0x10, 0x04, 0x0E, 0xC6, 0x02, 0x00, 0xC1, 0x0E,
+ 0x20, 0x02, 0x0D, 0xC5, 0x02, 0x00, 0xC1, 0x9E,
+ 0x03, 0x80, 0x10, 0x08, 0xC4, 0x02, 0x00, 0xC1,
+ 0x8E, 0x04, 0xC0, 0x0A, 0x10, 0x05, 0xC3, 0x02,
+ 0x00, 0xC1, 0x8E, 0x04, 0xC1, 0xAD, 0x30, 0x2D,
+ 0xC1, 0x02, 0x00, 0xC1, 0x8E, 0x04, 0xC3, 0x05,
+ 0x10, 0x0A, 0xC0, 0x02, 0x00, 0xC1, 0x8E, 0x04,
+ 0xC4, 0x08, 0x10, 0x85, 0x20, 0xC1, 0x8E, 0x04,
+ 0xC5, 0x0D, 0x02, 0x20, 0xC1, 0x8E, 0x04, 0xC6,
+ 0x0E, 0x04, 0x10, 0xC2, 0x0A, 0x0D, 0xC8, 0x18,
+//ascii 0x007B
+ 0xC0, 0x8C, 0x2A, 0xD0, 0x8D, 0x27, 0xC0, 0x8D,
+ 0x06, 0xD0, 0x8A, 0x0A, 0xC1, 0x92, 0x06, 0xA0,
+ 0x3C, 0x0D, 0xC2, 0x0D, 0x4C, 0x07, 0x10, 0x0D,
+ 0xC1, 0x0C, 0x70, 0x04, 0xC0, 0x07, 0x70, 0x07,
+ 0xC4, 0x0A, 0x37, 0xB6, 0x20, 0xA0, 0x20, 0x06,
+ 0x37, 0x0A, 0x0D, 0xCC, 0x04, 0x10, 0xD4, 0x87,
+ 0x04, 0xD5, 0x0C, 0x0D,
+//ascii 0x007C
+ 0xC0, 0x74, 0x74, 0x74, 0xC3, 0x71, 0x71, 0x71,
+ 0xC0,
+//ascii 0x007D
+ 0xCA, 0x89, 0x26, 0xD4, 0x86, 0x02, 0xCE, 0x4C,
+ 0xA9, 0x06, 0x04, 0x4C, 0x0E, 0xC4, 0x0E, 0x04,
+ 0x60, 0x01, 0xC0, 0x04, 0x60, 0x02, 0x0C, 0xC2,
+ 0x84, 0x01, 0x46, 0x09, 0x0E, 0xC1, 0x09, 0x46,
+ 0x83, 0x01, 0xC1, 0x8E, 0x03, 0xD0, 0x86, 0x09,
+ 0xC0, 0x8C, 0x09, 0xD0, 0x8C, 0x09, 0xC1, 0x0C,
+ 0xD2, 0x0C, 0x0E,
+//ascii 0x007E
+ 0xFF, 0xC2, 0x88, 0x48, 0xD8, 0x06, 0x10, 0x06,
+ 0xD8, 0x9D, 0x20, 0xE0, 0xD8, 0x86, 0x0B, 0xD8,
+ 0x83, 0x0E, 0xD7, 0x86, 0x06, 0xD7, 0x8B, 0x02,
+ 0xD8, 0x82, 0x0D, 0xD8, 0x00, 0x04, 0xD9, 0x80,
+ 0x2E, 0xD8, 0x06, 0x10, 0x06, 0xD8, 0x88, 0x23,
+ 0xC0,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_REGULAR_24PX[95] = {
+ { 0, 0, 7,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 7,1, 0, 2, 4 }, //asciii 0x0021
+ { 25, 1, 10,1, 0, 2, 16 }, //asciii 0x0022
+ { 46, 1, 15,0, 0, 0, 8 }, //asciii 0x0023
+ { 155, 1, 15,0, 0, 0, 0 }, //asciii 0x0024
+ { 268, 1, 20,0, 0, 0, 0 }, //asciii 0x0025
+ { 404, 1, 15,0, 0, 0, 0 }, //asciii 0x0026
+ { 525, 1, 5,1, 0, 1, 16 }, //asciii 0x0027
+ { 538, 1, 9,0, 0, 0, 0 }, //asciii 0x0028
+ { 584, 1, 9,0, 0, 0, 0 }, //asciii 0x0029
+ { 628, 1, 12,1, 0, 1, 12 }, //asciii 0x002A
+ { 684, 1, 16,2, 4, 2, 8 }, //asciii 0x002B
+ { 726, 1, 7,1, 16, 2, 0 }, //asciii 0x002C
+ { 745, 1, 11,1, 8, 1, 12 }, //asciii 0x002D
+ { 772, 1, 7,1, 16, 2, 4 }, //asciii 0x002E
+ { 785, 1, 9,0, 0, 0, 0 }, //asciii 0x002F
+ { 830, 1, 15,1, 0, 1, 4 }, //asciii 0x0030
+ { 921, 1, 11,1, 0, 3, 8 }, //asciii 0x0031
+ { 949, 1, 15,1, 0, 2, 8 }, //asciii 0x0032
+ { 1047, 1, 15,0, 0, 0, 0 }, //asciii 0x0033
+ { 1148, 1, 15,0, 0, 0, 0 }, //asciii 0x0034
+ { 1226, 1, 15,0, 0, 0, 0 }, //asciii 0x0035
+ { 1331, 1, 15,0, 0, 0, 0 }, //asciii 0x0036
+ { 1448, 1, 14,1, 0, 1, 8 }, //asciii 0x0037
+ { 1527, 1, 15,1, 0, 1, 4 }, //asciii 0x0038
+ { 1641, 1, 15,0, 0, 0, 0 }, //asciii 0x0039
+ { 1761, 1, 7,1, 4, 2, 4 }, //asciii 0x003A
+ { 1787, 1, 7,1, 4, 1, 0 }, //asciii 0x003B
+ { 1815, 1, 16,0, 0, 0, 0 }, //asciii 0x003C
+ { 1877, 1, 16,2, 8, 2, 8 }, //asciii 0x003D
+ { 1948, 1, 16,0, 0, 0, 0 }, //asciii 0x003E
+ { 2008, 1, 12,0, 0, 1, 4 }, //asciii 0x003F
+ { 2076, 1, 22,0, 0, 0, 0 }, //asciii 0x0040
+ { 2286, 1, 16,0, 0, 0, 8 }, //asciii 0x0041
+ { 2377, 1, 16,0, 0, 0, 0 }, //asciii 0x0042
+ { 2485, 1, 17,0, 0, 0, 0 }, //asciii 0x0043
+ { 2587, 1, 17,2, 0, 1, 8 }, //asciii 0x0044
+ { 2676, 1, 14,2, 0, 1, 8 }, //asciii 0x0045
+ { 2766, 1, 14,2, 0, 1, 8 }, //asciii 0x0046
+ { 2828, 1, 18,1, 0, 1, 4 }, //asciii 0x0047
+ { 2955, 1, 18,2, 0, 2, 8 }, //asciii 0x0048
+ { 3011, 1, 11,1, 0, 1, 8 }, //asciii 0x0049
+ { 3064, 1, 13,1, 0, 2, 4 }, //asciii 0x004A
+ { 3105, 1, 16,2, 0, 1, 8 }, //asciii 0x004B
+ { 3188, 1, 14,2, 0, 1, 8 }, //asciii 0x004C
+ { 3227, 1, 21,0, 0, 0, 0 }, //asciii 0x004D
+ { 3328, 1, 18,0, 0, 0, 0 }, //asciii 0x004E
+ { 3399, 1, 18,1, 0, 1, 4 }, //asciii 0x004F
+ { 3511, 1, 15,2, 0, 1, 8 }, //asciii 0x0050
+ { 3584, 1, 18,1, 0, 1, 4 }, //asciii 0x0051
+ { 3709, 1, 15,2, 0, 0, 8 }, //asciii 0x0052
+ { 3801, 1, 15,1, 0, 1, 4 }, //asciii 0x0053
+ { 3913, 1, 15,1, 0, 0, 8 }, //asciii 0x0054
+ { 3962, 1, 18,2, 0, 2, 4 }, //asciii 0x0055
+ { 4025, 1, 16,0, 0, 0, 0 }, //asciii 0x0056
+ { 4105, 1, 23,0, 0, 0, 0 }, //asciii 0x0057
+ { 4234, 1, 15,0, 0, 0, 8 }, //asciii 0x0058
+ { 4348, 1, 16,0, 0, 0, 0 }, //asciii 0x0059
+ { 4416, 1, 15,1, 0, 1, 8 }, //asciii 0x005A
+ { 4529, 1, 9,2, 0, 1, 4 }, //asciii 0x005B
+ { 4566, 1, 9,0, 0, 1, 4 }, //asciii 0x005C
+ { 4612, 1, 9,0, 0, 3, 4 }, //asciii 0x005D
+ { 4647, 1, 11,0, 0, 0, 16 }, //asciii 0x005E
+ { 4689, 1, 11,0, 20, 0, 4 }, //asciii 0x005F
+ { 4721, 1, 12,3, 0, 3, 20 }, //asciii 0x0060
+ { 4736, 1, 14,1, 4, 2, 4 }, //asciii 0x0061
+ { 4824, 1, 15,2, 0, 1, 4 }, //asciii 0x0062
+ { 4899, 1, 13,0, 0, 0, 0 }, //asciii 0x0063
+ { 4974, 1, 15,1, 0, 2, 4 }, //asciii 0x0064
+ { 5052, 1, 14,1, 4, 1, 4 }, //asciii 0x0065
+ { 5154, 1, 9,0, 0, 0, 8 }, //asciii 0x0066
+ { 5200, 1, 15,1, 4, 2, 0 }, //asciii 0x0067
+ { 5305, 1, 14,1, 0, 1, 8 }, //asciii 0x0068
+ { 5352, 1, 6,1, 0, 1, 8 }, //asciii 0x0069
+ { 5374, 1, 6,0, 0, 1, 0 }, //asciii 0x006A
+ { 5405, 1, 13,1, 0, 0, 8 }, //asciii 0x006B
+ { 5465, 1, 6,0, 0, 0, 0 }, //asciii 0x006C
+ { 5486, 1, 21,1, 4, 1, 8 }, //asciii 0x006D
+ { 5554, 1, 14,1, 4, 1, 8 }, //asciii 0x006E
+ { 5600, 1, 14,1, 4, 0, 4 }, //asciii 0x006F
+ { 5683, 1, 15,0, 0, 0, 0 }, //asciii 0x0070
+ { 5764, 1, 15,1, 4, 2, 0 }, //asciii 0x0071
+ { 5843, 1, 9,1, 4, 0, 8 }, //asciii 0x0072
+ { 5870, 1, 13,0, 0, 0, 0 }, //asciii 0x0073
+ { 5959, 1, 9,0, 0, 1, 4 }, //asciii 0x0074
+ { 6004, 1, 14,1, 4, 1, 4 }, //asciii 0x0075
+ { 6050, 1, 13,0, 0, 0, 0 }, //asciii 0x0076
+ { 6109, 1, 20,0, 0, 0, 0 }, //asciii 0x0077
+ { 6206, 1, 13,1, 4, 1, 8 }, //asciii 0x0078
+ { 6283, 1, 13,0, 0, 0, 0 }, //asciii 0x0079
+ { 6360, 1, 13,1, 4, 1, 8 }, //asciii 0x007A
+ { 6448, 1, 9,0, 0, 1, 4 }, //asciii 0x007B
+ { 6500, 1, 8,3, 0, 3, 0 }, //asciii 0x007C
+ { 6509, 1, 9,0, 0, 1, 4 }, //asciii 0x007D
+ { 6560, 1, 16,0, 0, 0, 0 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_REGULAR_24PX= {
+ 6601, // bitmap len
+ BAGL_FONT_INTER_REGULAR_24px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 32, // height of all characters in pixels
+ 32, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 4, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_REGULAR_24PX,
+ bitmapINTER_REGULAR_24PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.json b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.json
new file mode 100644
index 00000000..5492e85a
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 25,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 34,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 46,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 109
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 155,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 113
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 268,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 37,
+ "bitmap_byte_count": 136
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 404,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 38,
+ "bitmap_byte_count": 121
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 525,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 39,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 538,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 584,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 628,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 42,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 684,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 726,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 745,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 772,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 785,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 47,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 830,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 921,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 949,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 98
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1047,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 51,
+ "bitmap_byte_count": 101
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1148,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 52,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1226,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 53,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1331,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 54,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1448,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 79
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1527,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 114
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1641,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 57,
+ "bitmap_byte_count": 120
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1761,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1787,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1815,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 60,
+ "bitmap_byte_count": 62
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1877,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1948,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 62,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2008,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 68
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2076,
+ "width": 22,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 210
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2286,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2377,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 66,
+ "bitmap_byte_count": 108
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2485,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 67,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2587,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2676,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 90
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2766,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 62
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2828,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 127
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2955,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3011,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3064,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 74,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3105,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 83
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3188,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3227,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 77,
+ "bitmap_byte_count": 101
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3328,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 78,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3399,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 112
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3511,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 73
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3584,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3709,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 92
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3801,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 112
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3913,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3962,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 63
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4025,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 86,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4105,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 87,
+ "bitmap_byte_count": 129
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4234,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 114
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4348,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 89,
+ "bitmap_byte_count": 68
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4416,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 113
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4529,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4566,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4612,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4647,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4689,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 20,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4721,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 96,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4736,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4824,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4899,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 99,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4974,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5052,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5154,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5200,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5305,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5352,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5374,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5405,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5465,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 108,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5486,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 68
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5554,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5600,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 83
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5683,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 81
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5764,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 79
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5843,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5870,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 115,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5959,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6004,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6050,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 118,
+ "bitmap_byte_count": 59
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6109,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 119,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6206,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 77
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6283,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 77
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6360,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6448,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6500,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6509,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6560,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 126,
+ "bitmap_byte_count": 41
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.inc
new file mode 100644
index 00000000..79bde778
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.inc
@@ -0,0 +1,482 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_REGULAR_24PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x3C, 0x32, 0x3C, 0x32,
+//ascii 0x0022
+ 0x36, 0x66, 0xF0, 0xF6, 0x66, 0x30,
+//ascii 0x0023
+ 0x72, 0xF0, 0x32, 0x42, 0xC2, 0x42, 0x77, 0x42,
+ 0xAA, 0xC2, 0x29, 0x72, 0x42, 0x23, 0x72, 0x42,
+ 0x77, 0x42, 0xAA, 0xC2, 0x29, 0x72, 0x42, 0x23,
+ 0x72, 0x42, 0xC2, 0x42, 0xF0, 0x32, 0x10,
+//ascii 0x0024
+ 0x52, 0x65, 0xA3, 0x57, 0x92, 0x53, 0x33, 0x72,
+ 0x62, 0x52, 0x72, 0x62, 0x52, 0x6F, 0x05, 0x4F,
+ 0x05, 0x52, 0x52, 0x62, 0x72, 0x52, 0x62, 0x82,
+ 0x33, 0x53, 0x87, 0x53, 0xA5, 0x62, 0x60,
+//ascii 0x0025
+ 0xE4, 0x51, 0x96, 0x42, 0x72, 0x42, 0x43, 0x52,
+ 0x42, 0x62, 0x42, 0x42, 0x73, 0x36, 0xA2, 0x34,
+ 0xC3, 0xC4, 0x32, 0xA6, 0x33, 0x72, 0x42, 0x42,
+ 0x62, 0x42, 0x53, 0x42, 0x42, 0x72, 0x46, 0x91,
+ 0x54, 0x70,
+//ascii 0x0026
+ 0xF0, 0x32, 0xD3, 0x13, 0xD6, 0x64, 0x63, 0x66,
+ 0x45, 0x52, 0x23, 0x23, 0x13, 0x32, 0x46, 0x32,
+ 0x32, 0x54, 0x42, 0x32, 0x44, 0x52, 0x42, 0x26,
+ 0x42, 0x46, 0x23, 0x23, 0x54, 0x46, 0xF4, 0x60,
+//ascii 0x0027
+ 0x36, 0x66, 0x30,
+//ascii 0x0028
+ 0x22, 0xF0, 0x22, 0x34, 0xD4, 0x56, 0x56, 0x9D,
+ 0xF5, 0x10,
+//ascii 0x0029
+ 0xA5, 0xFD, 0x96, 0x56, 0x54, 0xD4, 0x32, 0xF0,
+ 0x22, 0x10,
+//ascii 0x002A
+ 0x51, 0x31, 0x72, 0x12, 0x83, 0x69, 0x39, 0x63,
+ 0x82, 0x12, 0x71, 0x31, 0x20,
+//ascii 0x002B
+ 0x42, 0xA2, 0xA2, 0xA2, 0x6A, 0x2A, 0x62, 0xA2,
+ 0xA2, 0xA2, 0x60,
+//ascii 0x002C
+ 0x13, 0x56, 0x53, 0x10,
+//ascii 0x002D
+ 0x32, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x30,
+//ascii 0x002E
+ 0x13, 0x13, 0x13, 0x40,
+//ascii 0x002F
+ 0x33, 0xF0, 0x67, 0xF0, 0x66, 0xF0, 0x66, 0xF0,
+ 0x66, 0xF0, 0x67, 0xF0, 0x63, 0x10,
+//ascii 0x0030
+ 0x87, 0xBB, 0x83, 0x73, 0x62, 0xB2, 0x42, 0xD2,
+ 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x42, 0xB2,
+ 0x63, 0x73, 0x8B, 0xB7, 0x50,
+//ascii 0x0031
+ 0x3F, 0x02, 0x3F, 0x02, 0x32, 0xF0, 0x33, 0xF0,
+ 0x33, 0xF0, 0x32, 0xF0, 0x42,
+//ascii 0x0032
+ 0x56, 0x72, 0x48, 0x62, 0x33, 0x43, 0x52, 0x32,
+ 0x63, 0x42, 0x32, 0x73, 0x32, 0x32, 0x83, 0x22,
+ 0x32, 0x93, 0x12, 0x33, 0x95, 0x44, 0x84, 0x53,
+ 0x93,
+//ascii 0x0033
+ 0xD5, 0x74, 0x37, 0x56, 0x12, 0x42, 0x43, 0x33,
+ 0x62, 0x32, 0x52, 0x62, 0x32, 0x52, 0x62, 0x32,
+ 0x52, 0x62, 0x32, 0xD2, 0x42, 0xB3, 0x43, 0x93,
+ 0x62, 0x92, 0x60,
+//ascii 0x0034
+ 0xF2, 0xF0, 0x32, 0x6F, 0x02, 0x3F, 0x02, 0x34,
+ 0x82, 0x74, 0x72, 0x94, 0x52, 0xB4, 0x32, 0xD3,
+ 0x22, 0xE6, 0xF0, 0x14, 0xF0, 0x32, 0x30,
+//ascii 0x0035
+ 0xD3, 0x72, 0x67, 0x52, 0x53, 0x33, 0x42, 0x43,
+ 0x53, 0x32, 0x42, 0x72, 0x32, 0x42, 0x72, 0x32,
+ 0x42, 0x72, 0x32, 0x51, 0x72, 0x35, 0x22, 0x53,
+ 0x57, 0x43, 0x94, 0x42, 0x60,
+//ascii 0x0036
+ 0xC5, 0x82, 0x47, 0x63, 0x33, 0x33, 0x52, 0x33,
+ 0x52, 0x42, 0x42, 0x72, 0x32, 0x42, 0x72, 0x32,
+ 0x42, 0x72, 0x32, 0x42, 0x72, 0x42, 0x42, 0x52,
+ 0x53, 0x42, 0x33, 0x6D, 0x99, 0x40,
+//ascii 0x0037
+ 0x33, 0xF0, 0x25, 0xF2, 0x14, 0xD2, 0x34, 0xB2,
+ 0x54, 0x92, 0x74, 0x72, 0x94, 0x52, 0xB4, 0x32,
+ 0xD2, 0x32, 0xF0, 0x32, 0x30,
+//ascii 0x0038
+ 0xE3, 0x94, 0x27, 0x57, 0x12, 0x23, 0x52, 0x34,
+ 0x43, 0x32, 0x52, 0x62, 0x32, 0x52, 0x62, 0x32,
+ 0x52, 0x62, 0x32, 0x52, 0x62, 0x42, 0x34, 0x43,
+ 0x47, 0x12, 0x23, 0x74, 0x27, 0xF3, 0x30,
+//ascii 0x0039
+ 0x79, 0x9D, 0x63, 0x32, 0x43, 0x43, 0x52, 0x42,
+ 0x42, 0x72, 0x42, 0x32, 0x72, 0x42, 0x32, 0x72,
+ 0x42, 0x32, 0x72, 0x42, 0x33, 0x53, 0x32, 0x53,
+ 0x33, 0x33, 0x67, 0x42, 0x93, 0x20,
+//ascii 0x003A
+ 0x03, 0x66, 0x66, 0x63, 0x40,
+//ascii 0x003B
+ 0x03, 0x73, 0x33, 0x79, 0xA3,
+//ascii 0x003C
+ 0x02, 0x72, 0x12, 0x72, 0x22, 0x52, 0x32, 0x52,
+ 0x42, 0x32, 0x52, 0x32, 0x62, 0x12, 0x72, 0x12,
+ 0x83, 0x93, 0xA1, 0x20,
+//ascii 0x003D
+ 0x22, 0x32, 0x52, 0x32, 0x52, 0x32, 0x52, 0x32,
+ 0x52, 0x32, 0x52, 0x32, 0x52, 0x32, 0x52, 0x32,
+ 0x52, 0x32, 0x52, 0x32, 0x30,
+//ascii 0x003E
+ 0x51, 0xA3, 0x93, 0x82, 0x12, 0x72, 0x12, 0x62,
+ 0x32, 0x52, 0x32, 0x42, 0x52, 0x32, 0x52, 0x22,
+ 0x72, 0x12, 0x72, 0x50,
+//ascii 0x003F
+ 0x55, 0xE7, 0xC3, 0x33, 0xB2, 0x53, 0xA2, 0x64,
+ 0x32, 0x32, 0x82, 0x32, 0x33, 0xF0, 0x33, 0xF0,
+ 0x32, 0x10,
+//ascii 0x0040
+ 0xA7, 0xEA, 0xD3, 0x63, 0xB2, 0xA2, 0x92, 0xB2,
+ 0x92, 0xB2, 0x82, 0x3A, 0x32, 0x42, 0x39, 0x42,
+ 0x41, 0x42, 0x62, 0x41, 0x41, 0x32, 0x82, 0x31,
+ 0x41, 0x32, 0x82, 0x31, 0x41, 0x32, 0x82, 0x31,
+ 0x42, 0x32, 0x62, 0x32, 0x42, 0x3A, 0x32, 0x52,
+ 0x46, 0x42, 0x62, 0xE2, 0x72, 0xC2, 0x93, 0x83,
+ 0xBC, 0xF7, 0x70,
+//ascii 0x0041
+ 0xF0, 0x23, 0xF5, 0xC6, 0xB6, 0xB5, 0x22, 0x95,
+ 0x42, 0x83, 0x72, 0x83, 0x72, 0x95, 0x42, 0xB5,
+ 0x22, 0xE6, 0xF0, 0x26, 0xF0, 0x25, 0xF0, 0x23,
+//ascii 0x0042
+ 0xD4, 0x84, 0x28, 0x56, 0x12, 0x43, 0x33, 0x33,
+ 0x62, 0x32, 0x52, 0x62, 0x32, 0x52, 0x62, 0x32,
+ 0x52, 0x62, 0x32, 0x52, 0x62, 0x32, 0x52, 0x62,
+ 0x32, 0x52, 0x62, 0x3F, 0x02, 0x3F, 0x02,
+//ascii 0x0043
+ 0x63, 0x62, 0x84, 0x64, 0x53, 0xA2, 0x52, 0xC2,
+ 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+ 0x32, 0xD2, 0x42, 0xB3, 0x43, 0x93, 0x64, 0x63,
+ 0x9A, 0xC6, 0x50,
+//ascii 0x0044
+ 0x87, 0xBB, 0x83, 0x73, 0x63, 0xA2, 0x52, 0xB2,
+ 0x42, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+ 0x32, 0xD2, 0x32, 0xD2, 0x3F, 0x02, 0x3F, 0x02,
+ 0x40,
+//ascii 0x0045
+ 0x32, 0x62, 0x52, 0x32, 0x62, 0x52, 0x32, 0x62,
+ 0x52, 0x32, 0x62, 0x52, 0x32, 0x62, 0x52, 0x32,
+ 0x62, 0x52, 0x32, 0x62, 0x52, 0x32, 0x62, 0x52,
+ 0x3F, 0x02, 0x3F, 0x02,
+//ascii 0x0046
+ 0x32, 0xF0, 0x32, 0x62, 0xA2, 0x62, 0xA2, 0x62,
+ 0xA2, 0x62, 0xA2, 0x62, 0xA2, 0x62, 0xA2, 0x62,
+ 0xAF, 0x02, 0x3F, 0x02,
+//ascii 0x0047
+ 0x81, 0x33, 0xB3, 0x35, 0x84, 0x36, 0x63, 0x52,
+ 0x23, 0x52, 0x62, 0x32, 0x42, 0x72, 0x42, 0x32,
+ 0x72, 0x42, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+ 0x42, 0xB2, 0x53, 0x93, 0x64, 0x54, 0x8B, 0xB7,
+ 0x10,
+//ascii 0x0048
+ 0x3F, 0x02, 0x3F, 0x02, 0xB2, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xAF, 0x02, 0x3F,
+ 0x02, 0x40,
+//ascii 0x0049
+ 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x3F, 0x02,
+ 0x3F, 0x02, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+//ascii 0x004A
+ 0x3F, 0x5F, 0x01, 0xF0, 0x33, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x32, 0xF0, 0x23, 0xF0, 0x13, 0xF0,
+ 0x22, 0x60,
+//ascii 0x004B
+ 0x32, 0xE1, 0x33, 0xC2, 0x43, 0xA3, 0x53, 0x74,
+ 0x73, 0x53, 0xA3, 0x24, 0xC6, 0xF4, 0xF0, 0x23,
+ 0xF0, 0x33, 0x9F, 0x02, 0x3F, 0x02,
+//ascii 0x004C
+ 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32,
+ 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32,
+ 0x3F, 0x02, 0x3F, 0x02,
+//ascii 0x004D
+ 0x3F, 0x02, 0x3F, 0x02, 0x35, 0xF0, 0x35, 0xF0,
+ 0x25, 0xF0, 0x35, 0xF0, 0x25, 0xF0, 0x34, 0xF0,
+ 0x14, 0xD5, 0xD5, 0xC5, 0xD5, 0xC5, 0xFF, 0x02,
+ 0x3F, 0x02,
+//ascii 0x004E
+ 0x3F, 0x02, 0x3F, 0x02, 0xF0, 0x13, 0xF3, 0xF0,
+ 0x13, 0xF4, 0xF3, 0xF4, 0xF3, 0xF4, 0xF3, 0xF0,
+ 0x1F, 0x02, 0x3F, 0x02, 0x40,
+//ascii 0x004F
+ 0x87, 0xBB, 0x84, 0x54, 0x63, 0x93, 0x52, 0xB2,
+ 0x42, 0xD2, 0x32, 0xD2, 0x32, 0xD2, 0x32, 0xD2,
+ 0x32, 0xD2, 0x42, 0xB2, 0x53, 0x93, 0x64, 0x54,
+ 0x8B, 0xB7, 0x10,
+//ascii 0x0050
+ 0x65, 0xE7, 0xC3, 0x33, 0xB2, 0x52, 0xA2, 0x72,
+ 0x92, 0x72, 0x92, 0x72, 0x92, 0x72, 0x92, 0x72,
+ 0x9F, 0x02, 0x3F, 0x02, 0x40,
+//ascii 0x0051
+ 0x87, 0xFB, 0x32, 0x74, 0x54, 0x13, 0x63, 0xA4,
+ 0x72, 0xA4, 0x72, 0xA5, 0x72, 0xA2, 0x12, 0x72,
+ 0xD2, 0x72, 0xD2, 0x72, 0xD2, 0x82, 0xB2, 0x93,
+ 0x93, 0xA4, 0x54, 0xCB, 0xF7, 0x10,
+//ascii 0x0052
+ 0xF0, 0x41, 0x56, 0x63, 0x48, 0x35, 0x42, 0x52,
+ 0x14, 0x52, 0x65, 0x72, 0x72, 0x92, 0x72, 0x92,
+ 0x72, 0x92, 0x72, 0x92, 0x72, 0x9F, 0x02, 0x3F,
+ 0x02,
+//ascii 0x0053
+ 0x52, 0x65, 0x63, 0x57, 0x52, 0x62, 0x32, 0x42,
+ 0x62, 0x52, 0x32, 0x62, 0x52, 0x32, 0x61, 0x62,
+ 0x32, 0x52, 0x62, 0x32, 0x52, 0x62, 0x42, 0x33,
+ 0x52, 0x57, 0x53, 0x65, 0x62, 0x60,
+//ascii 0x0054
+ 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x32, 0xF0, 0x3F, 0x02, 0x3F, 0x02,
+ 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0,
+ 0x32, 0x30,
+//ascii 0x0055
+ 0x3E, 0x6F, 0xF0, 0x33, 0xF0, 0x33, 0xF0, 0x32,
+ 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32, 0xF0, 0x32,
+ 0xF0, 0x23, 0xF0, 0x13, 0x4F, 0x5E, 0x70,
+//ascii 0x0056
+ 0x33, 0xF0, 0x26, 0xF0, 0x25, 0xF0, 0x26, 0xF0,
+ 0x26, 0xF0, 0x26, 0xF0, 0x23, 0xF0, 0x23, 0xE6,
+ 0xB6, 0xB6, 0xC5, 0xC6, 0xE3, 0x60,
+//ascii 0x0057
+ 0x33, 0xF0, 0x27, 0xF0, 0x18, 0xF0, 0x18, 0xF0,
+ 0x16, 0xF0, 0x14, 0xB7, 0xA8, 0x87, 0xC5, 0xF5,
+ 0xF0, 0x17, 0xF0, 0x27, 0xF0, 0x17, 0xF0, 0x34,
+ 0xE6, 0xA8, 0x88, 0x97, 0xD3, 0x60,
+//ascii 0x0058
+ 0x32, 0xE1, 0x33, 0xB3, 0x44, 0x84, 0x63, 0x54,
+ 0x94, 0x14, 0xC7, 0xF3, 0xF7, 0xC4, 0x14, 0xA3,
+ 0x54, 0x64, 0x84, 0x33, 0xB3, 0x32, 0xE1, 0x40,
+//ascii 0x0059
+ 0x32, 0xF0, 0x33, 0xF0, 0x34, 0xF0, 0x34, 0xF0,
+ 0x33, 0xF0, 0x34, 0xF0, 0x39, 0xB9, 0x94, 0xF3,
+ 0xF4, 0xE4, 0xF3, 0xF0, 0x22, 0x70,
+//ascii 0x005A
+ 0x33, 0xC2, 0x34, 0xB2, 0x36, 0x92, 0x32, 0x23,
+ 0x82, 0x32, 0x33, 0x72, 0x32, 0x53, 0x52, 0x32,
+ 0x63, 0x42, 0x32, 0x83, 0x22, 0x32, 0x93, 0x12,
+ 0x32, 0xA5, 0x32, 0xC3, 0x32, 0xD2,
+//ascii 0x005B
+ 0x22, 0xF0, 0x22, 0x32, 0xF0, 0x22, 0x32, 0xF0,
+ 0x22, 0x3F, 0x06, 0x3F, 0x06, 0x10,
+//ascii 0x005C
+ 0xF0, 0x53, 0xF0, 0x27, 0xE6, 0xF6, 0xF6, 0xE7,
+ 0xF0, 0x23, 0x20,
+//ascii 0x005D
+ 0x2F, 0x06, 0x3F, 0x06, 0x32, 0xF0, 0x22, 0x32,
+ 0xF0, 0x22, 0x32, 0xF0, 0x22, 0x10,
+//ascii 0x005E
+ 0x91, 0x93, 0x74, 0x64, 0x82, 0xA4, 0xA4, 0xA3,
+ 0xB1, 0x60,
+//ascii 0x005F
+ 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x60,
+//ascii 0x0060
+ 0x43, 0x35, 0x33, 0x30,
+//ascii 0x0061
+ 0x5B, 0x4C, 0x33, 0x21, 0x42, 0x42, 0x32, 0x42,
+ 0x32, 0x41, 0x51, 0x32, 0x41, 0x51, 0x32, 0x42,
+ 0x41, 0x42, 0x32, 0x32, 0x43, 0x36, 0x52, 0x44,
+ 0x10,
+//ascii 0x0062
+ 0xB6, 0xCA, 0x93, 0x62, 0x83, 0x82, 0x72, 0x92,
+ 0x72, 0x92, 0x72, 0x92, 0x81, 0x91, 0xA1, 0x71,
+ 0x5F, 0x02, 0x3F, 0x02, 0x40,
+//ascii 0x0063
+ 0x52, 0x52, 0x63, 0x53, 0x52, 0x72, 0x42, 0x92,
+ 0x32, 0x92, 0x32, 0x92, 0x32, 0x92, 0x42, 0x72,
+ 0x53, 0x53, 0x69, 0x95, 0x40,
+//ascii 0x0064
+ 0x3F, 0x02, 0x3F, 0x02, 0x91, 0x71, 0xA1, 0x91,
+ 0x82, 0x92, 0x72, 0x92, 0x72, 0x92, 0x73, 0x82,
+ 0x83, 0x62, 0xAA, 0xC6, 0x70,
+//ascii 0x0065
+ 0x64, 0x22, 0x75, 0x23, 0x53, 0x21, 0x32, 0x52,
+ 0x31, 0x42, 0x32, 0x41, 0x42, 0x32, 0x41, 0x42,
+ 0x32, 0x41, 0x42, 0x42, 0x31, 0x32, 0x53, 0x21,
+ 0x23, 0x69, 0x95, 0x40,
+//ascii 0x0066
+ 0x32, 0x22, 0xE2, 0x22, 0xEF, 0x02, 0x4F, 0x01,
+ 0x72, 0xF0, 0x32, 0x30,
+//ascii 0x0067
+ 0x3F, 0x01, 0x8F, 0x02, 0x91, 0x71, 0x43, 0x71,
+ 0x91, 0x42, 0x62, 0x92, 0x32, 0x62, 0x92, 0x32,
+ 0x62, 0x92, 0x32, 0x63, 0x73, 0x32, 0x73, 0x53,
+ 0x32, 0x99, 0x41, 0xC5, 0x40,
+//ascii 0x0068
+ 0x9B, 0x8C, 0x73, 0xF0, 0x22, 0xF0, 0x32, 0xF0,
+ 0x32, 0xF0, 0x41, 0xF0, 0x51, 0xDF, 0x02, 0x3F,
+ 0x02,
+//ascii 0x0069
+ 0x32, 0x2D, 0x32, 0x2D,
+//ascii 0x006A
+ 0x32, 0x2F, 0x52, 0x2F, 0x01, 0xF0, 0x82, 0xF0,
+ 0x72,
+//ascii 0x006B
+ 0x71, 0xB1, 0x72, 0x92, 0x73, 0x64, 0x83, 0x43,
+ 0xB3, 0x14, 0xD5, 0xF0, 0x13, 0xF0, 0x33, 0x8F,
+ 0x02, 0x3F, 0x02,
+//ascii 0x006C
+ 0xF0, 0x32, 0xF0, 0x32, 0x3F, 0x02, 0x3F, 0x01,
+ 0x10,
+//ascii 0x006D
+ 0x5B, 0x4C, 0x33, 0xD2, 0xE2, 0xE2, 0xF1, 0xF0,
+ 0x11, 0xFB, 0x4C, 0x33, 0xD2, 0xE2, 0xE2, 0xF1,
+ 0xF0, 0x11, 0xDD, 0x3D,
+//ascii 0x006E
+ 0x5B, 0x4C, 0x33, 0xD2, 0xE2, 0xE2, 0xF1, 0xF0,
+ 0x11, 0xDD, 0x3D,
+//ascii 0x006F
+ 0x75, 0x99, 0x64, 0x34, 0x52, 0x72, 0x42, 0x92,
+ 0x32, 0x92, 0x32, 0x92, 0x32, 0x92, 0x42, 0x72,
+ 0x54, 0x34, 0x69, 0x95, 0x40,
+//ascii 0x0070
+ 0x75, 0xF0, 0x29, 0xE3, 0x53, 0xC3, 0x72, 0xC2,
+ 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xC1, 0x91, 0xE1,
+ 0x71, 0xDF, 0x03, 0x6F, 0x03, 0x30,
+//ascii 0x0071
+ 0x3F, 0x03, 0x6F, 0x03, 0x81, 0x71, 0xE1, 0x91,
+ 0xC2, 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB3, 0x72,
+ 0xD4, 0x34, 0xE9, 0xF0, 0x25, 0x40,
+//ascii 0x0072
+ 0x32, 0xE2, 0xE2, 0xF1, 0xF0, 0x11, 0xDD, 0x3D,
+//ascii 0x0073
+ 0xB3, 0x71, 0x45, 0x52, 0x32, 0x32, 0x41, 0x42,
+ 0x32, 0x32, 0x41, 0x42, 0x32, 0x41, 0x42, 0x32,
+ 0x32, 0x42, 0x42, 0x22, 0x42, 0x45, 0x42, 0x72,
+ 0x51, 0x20,
+//ascii 0x0074
+ 0x32, 0x92, 0x32, 0x9F, 0x0F, 0x03, 0x42, 0xE2,
+ 0x30,
+//ascii 0x0075
+ 0x3D, 0x3D, 0xD1, 0xF0, 0x11, 0xF2, 0xE2, 0xE2,
+ 0xD3, 0x3C, 0x4B, 0x20,
+//ascii 0x0076
+ 0x32, 0xE5, 0xD6, 0xD5, 0xE5, 0xD3, 0xB5, 0x85,
+ 0x86, 0x85, 0xB2, 0x30,
+//ascii 0x0077
+ 0x33, 0xD6, 0xD6, 0xD7, 0xD3, 0xA6, 0x66, 0x76,
+ 0xA4, 0xC6, 0xD6, 0xE6, 0xD3, 0x97, 0x66, 0x76,
+ 0xA3, 0x20,
+//ascii 0x0078
+ 0x32, 0x92, 0x33, 0x73, 0x53, 0x33, 0x83, 0x13,
+ 0xB3, 0xD3, 0xB3, 0x13, 0x83, 0x33, 0x53, 0x73,
+ 0x32, 0x92,
+//ascii 0x0079
+ 0x32, 0xF0, 0x75, 0xF0, 0x66, 0xF0, 0x66, 0xF0,
+ 0x65, 0xF0, 0x65, 0xF0, 0x29, 0xC6, 0x43, 0x86,
+ 0x82, 0x65, 0xB2, 0x62, 0x30,
+//ascii 0x007A
+ 0x33, 0x82, 0x34, 0x72, 0x32, 0x12, 0x62, 0x32,
+ 0x23, 0x42, 0x32, 0x33, 0x32, 0x32, 0x43, 0x22,
+ 0x32, 0x53, 0x12, 0x32, 0x74, 0x32, 0x83, 0xE2,
+//ascii 0x007B
+ 0x21, 0xF0, 0x41, 0x31, 0xF0, 0x41, 0x39, 0x39,
+ 0x49, 0x19, 0xD3, 0xF0, 0x71, 0x30,
+//ascii 0x007C
+ 0x2F, 0x07, 0x2F, 0x07,
+//ascii 0x007D
+ 0xC1, 0xF0, 0x73, 0xD9, 0x19, 0x49, 0x39, 0x31,
+ 0xF0, 0x41, 0x31, 0xF0, 0x41, 0x10,
+//ascii 0x007E
+ 0x42, 0x63, 0x72, 0x62, 0x53, 0x43, 0x43, 0x52,
+ 0x62, 0x73, 0x62, 0x10,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_REGULAR_24PX_1BPP[95] = {
+ { 0, 0, 6,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 6,2, 0, 2, 8 }, //asciii 0x0021
+ { 4, 1, 9,2, 0, 1, 16 }, //asciii 0x0022
+ { 10, 1, 16,0, 0, 1, 8 }, //asciii 0x0023
+ { 41, 1, 16,2, 0, 2, 4 }, //asciii 0x0024
+ { 72, 1, 19,2, 0, 2, 8 }, //asciii 0x0025
+ { 106, 1, 15,1, 0, 1, 8 }, //asciii 0x0026
+ { 138, 1, 6,2, 0, 2, 16 }, //asciii 0x0027
+ { 141, 1, 8,2, 0, 1, 4 }, //asciii 0x0028
+ { 151, 1, 8,1, 0, 2, 4 }, //asciii 0x0029
+ { 161, 1, 12,2, 0, 2, 16 }, //asciii 0x002A
+ { 174, 1, 14,2, 8, 2, 8 }, //asciii 0x002B
+ { 185, 1, 6,2, 16, 1, 4 }, //asciii 0x002C
+ { 189, 1, 11,2, 8, 2, 12 }, //asciii 0x002D
+ { 197, 1, 6,2, 16, 1, 8 }, //asciii 0x002E
+ { 201, 1, 8,1, 0, 0, 4 }, //asciii 0x002F
+ { 215, 1, 14,1, 0, 1, 8 }, //asciii 0x0030
+ { 236, 1, 11,1, 0, 3, 8 }, //asciii 0x0031
+ { 249, 1, 14,2, 0, 2, 8 }, //asciii 0x0032
+ { 274, 1, 15,2, 0, 2, 8 }, //asciii 0x0033
+ { 301, 1, 15,1, 0, 2, 8 }, //asciii 0x0034
+ { 324, 1, 14,2, 0, 1, 8 }, //asciii 0x0035
+ { 353, 1, 14,1, 0, 1, 8 }, //asciii 0x0036
+ { 383, 1, 13,1, 0, 1, 8 }, //asciii 0x0037
+ { 404, 1, 14,1, 0, 1, 8 }, //asciii 0x0038
+ { 435, 1, 14,1, 0, 1, 8 }, //asciii 0x0039
+ { 465, 1, 6,2, 8, 1, 8 }, //asciii 0x003A
+ { 470, 1, 7,2, 8, 2, 4 }, //asciii 0x003B
+ { 475, 1, 15,2, 8, 2, 8 }, //asciii 0x003C
+ { 495, 1, 15,3, 8, 2, 8 }, //asciii 0x003D
+ { 516, 1, 15,2, 8, 2, 8 }, //asciii 0x003E
+ { 536, 1, 12,1, 0, 2, 8 }, //asciii 0x003F
+ { 554, 1, 22,1, 0, 1, 4 }, //asciii 0x0040
+ { 605, 1, 16,1, 0, 1, 8 }, //asciii 0x0041
+ { 629, 1, 15,2, 0, 1, 8 }, //asciii 0x0042
+ { 660, 1, 18,2, 0, 2, 8 }, //asciii 0x0043
+ { 687, 1, 17,2, 0, 2, 8 }, //asciii 0x0044
+ { 712, 1, 14,2, 0, 2, 8 }, //asciii 0x0045
+ { 740, 1, 14,2, 0, 2, 8 }, //asciii 0x0046
+ { 760, 1, 17,1, 0, 1, 8 }, //asciii 0x0047
+ { 793, 1, 17,2, 0, 2, 8 }, //asciii 0x0048
+ { 819, 1, 12,2, 0, 2, 8 }, //asciii 0x0049
+ { 835, 1, 12,1, 0, 2, 8 }, //asciii 0x004A
+ { 853, 1, 15,2, 0, 1, 8 }, //asciii 0x004B
+ { 875, 1, 13,2, 0, 1, 8 }, //asciii 0x004C
+ { 895, 1, 20,2, 0, 2, 8 }, //asciii 0x004D
+ { 921, 1, 17,2, 0, 2, 8 }, //asciii 0x004E
+ { 942, 1, 18,1, 0, 2, 8 }, //asciii 0x004F
+ { 969, 1, 15,2, 0, 2, 8 }, //asciii 0x0050
+ { 990, 1, 18,1, 0, 2, 4 }, //asciii 0x0051
+ { 1020, 1, 15,2, 0, 1, 8 }, //asciii 0x0052
+ { 1045, 1, 15,2, 0, 2, 8 }, //asciii 0x0053
+ { 1075, 1, 15,1, 0, 1, 8 }, //asciii 0x0054
+ { 1101, 1, 17,2, 0, 2, 8 }, //asciii 0x0055
+ { 1124, 1, 16,1, 0, 1, 8 }, //asciii 0x0056
+ { 1146, 1, 22,1, 0, 1, 8 }, //asciii 0x0057
+ { 1176, 1, 15,1, 0, 1, 8 }, //asciii 0x0058
+ { 1200, 1, 16,1, 0, 1, 8 }, //asciii 0x0059
+ { 1222, 1, 14,1, 0, 1, 8 }, //asciii 0x005A
+ { 1252, 1, 8,3, 0, 0, 4 }, //asciii 0x005B
+ { 1266, 1, 8,0, 0, 1, 4 }, //asciii 0x005C
+ { 1277, 1, 8,1, 0, 2, 4 }, //asciii 0x005D
+ { 1291, 1, 11,1, 0, 1, 16 }, //asciii 0x005E
+ { 1301, 1, 12,0, 20, 3, 4 }, //asciii 0x005F
+ { 1311, 1, 11,5, 0, 3, 20 }, //asciii 0x0060
+ { 1315, 1, 13,1, 4, 2, 8 }, //asciii 0x0061
+ { 1340, 1, 14,2, 0, 1, 8 }, //asciii 0x0062
+ { 1361, 1, 13,1, 4, 1, 8 }, //asciii 0x0063
+ { 1382, 1, 14,1, 0, 2, 8 }, //asciii 0x0064
+ { 1403, 1, 13,1, 4, 1, 8 }, //asciii 0x0065
+ { 1431, 1, 8,1, 0, 1, 8 }, //asciii 0x0066
+ { 1443, 1, 14,1, 4, 2, 0 }, //asciii 0x0067
+ { 1472, 1, 14,2, 0, 2, 8 }, //asciii 0x0068
+ { 1489, 1, 6,2, 0, 2, 8 }, //asciii 0x0069
+ { 1493, 1, 6,0, 0, 2, 4 }, //asciii 0x006A
+ { 1502, 1, 13,2, 0, 1, 8 }, //asciii 0x006B
+ { 1521, 1, 7,2, 0, 1, 8 }, //asciii 0x006C
+ { 1530, 1, 22,2, 4, 2, 8 }, //asciii 0x006D
+ { 1550, 1, 13,2, 4, 1, 8 }, //asciii 0x006E
+ { 1561, 1, 14,1, 4, 1, 8 }, //asciii 0x006F
+ { 1582, 1, 14,2, 4, 1, 0 }, //asciii 0x0070
+ { 1604, 1, 14,1, 4, 2, 0 }, //asciii 0x0071
+ { 1626, 1, 10,2, 4, 1, 8 }, //asciii 0x0072
+ { 1634, 1, 12,1, 4, 1, 8 }, //asciii 0x0073
+ { 1660, 1, 8,1, 4, 1, 8 }, //asciii 0x0074
+ { 1669, 1, 13,2, 4, 1, 8 }, //asciii 0x0075
+ { 1681, 1, 13,1, 4, 1, 8 }, //asciii 0x0076
+ { 1693, 1, 19,1, 4, 1, 8 }, //asciii 0x0077
+ { 1711, 1, 12,1, 4, 1, 8 }, //asciii 0x0078
+ { 1729, 1, 13,1, 4, 1, 0 }, //asciii 0x0079
+ { 1750, 1, 12,1, 4, 1, 8 }, //asciii 0x007A
+ { 1774, 1, 7,1, 0, 0, 4 }, //asciii 0x007B
+ { 1788, 1, 8,3, 0, 3, 4 }, //asciii 0x007C
+ { 1792, 1, 8,1, 0, 1, 4 }, //asciii 0x007D
+ { 1806, 1, 15,2, 8, 2, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_REGULAR_24PX_1BPP= {
+ 1818, // bitmap len
+ BAGL_FONT_INTER_REGULAR_24px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 32, // height of all characters in pixels
+ 32, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 4, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_REGULAR_24PX_1BPP,
+ bitmapINTER_REGULAR_24PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.json
new file mode 100644
index 00000000..96f2962d
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_24_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 33,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 34,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 10,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 41,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 72,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 37,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 106,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 38,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 138,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 39,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 141,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 40,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 151,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 41,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 161,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 174,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 185,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 44,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 189,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 197,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 46,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 201,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 215,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 48,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 236,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 249,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 274,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 51,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 301,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 324,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 53,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 353,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 54,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 383,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 404,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 56,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 435,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 57,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 465,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 58,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 470,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 59,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 475,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 495,
+ "width": 15,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 516,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 62,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 536,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 63,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 554,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 64,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 605,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 629,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 660,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 67,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 687,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 712,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 740,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 760,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 71,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 793,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 819,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 835,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 74,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 853,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 875,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 895,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 921,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 942,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 79,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 969,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 990,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1020,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1045,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 83,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1075,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1101,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 85,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1124,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1146,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1176,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1200,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1222,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1252,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1266,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1277,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1291,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1301,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 20,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1311,
+ "width": 11,
+ "x_min_offset": 5,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 96,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1315,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 97,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1340,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 98,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1361,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 99,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1382,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 100,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1403,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 101,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1431,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1443,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1472,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1489,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1493,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 106,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1502,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1521,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1530,
+ "width": 22,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1550,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1561,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 111,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1582,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1604,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1626,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1634,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 115,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1660,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 116,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1669,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 117,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1681,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1693,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1711,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1729,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1750,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1774,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1788,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 124,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1792,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1806,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 12
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.inc b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.inc
new file mode 100644
index 00000000..19a9f702
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.inc
@@ -0,0 +1,1251 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_REGULAR_28PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC3, 0x1C, 0x4D, 0x3E, 0xC5, 0x89, 0x6C, 0xC6,
+ 0x0A, 0x70, 0x50, 0x0C, 0xC0, 0x0B, 0x10, 0x01,
+ 0xC6, 0x0A, 0x70, 0x50, 0x0C, 0xC0, 0x0A, 0x20,
+ 0xC6, 0x0D, 0x29, 0x4A, 0x3B, 0x1C, 0xC2, 0x86,
+ 0x29,
+//ascii 0x0022
+ 0xC2, 0x0E, 0x5C, 0x0D, 0xC3, 0x0A, 0x50, 0x06,
+ 0xC3, 0x0B, 0x51, 0x07, 0xDC, 0x5D, 0x0E, 0xC3,
+ 0x0A, 0x50, 0x06, 0xC3, 0x0A, 0x50, 0x06, 0xC0,
+//ascii 0x0023
+ 0xE0, 0x84, 0x0C, 0xD4, 0x84, 0x0C, 0xC3, 0x86,
+ 0x3C, 0xC7, 0xBA, 0x14, 0x69, 0xB0, 0x84, 0x0C,
+ 0xC3, 0x86, 0x0A, 0xC7, 0x0A, 0x60, 0xA3, 0x69,
+ 0xBE, 0x86, 0x0A, 0xC9, 0xAC, 0xA7, 0x41, 0x70,
+ 0x94, 0x8B, 0xE0, 0xCA, 0xB4, 0x09, 0xA7, 0x50,
+ 0x02, 0x60, 0x03, 0xC8, 0x84, 0x0C, 0xC3, 0xB6,
+ 0x06, 0x85, 0x20, 0x10, 0xC8, 0x84, 0x0C, 0xC3,
+ 0x86, 0x0A, 0xC3, 0x0D, 0xC8, 0x84, 0x0C, 0xC3,
+ 0x86, 0x0A, 0xC7, 0xBB, 0x36, 0x9B, 0xE0, 0x84,
+ 0x0C, 0xC3, 0x86, 0x0A, 0xC7, 0x0A, 0x60, 0x95,
+ 0x8B, 0xE0, 0xC0, 0x86, 0x0A, 0xC8, 0xAC, 0xA7,
+ 0x52, 0x50, 0x11, 0x90, 0x6B, 0xE0, 0xCB, 0x04,
+ 0x00, 0x17, 0x05, 0x02, 0x60, 0x03, 0x05, 0xC8,
+ 0x84, 0x0C, 0xC3, 0x05, 0x00, 0x15, 0x02, 0x20,
+ 0xC8, 0x84, 0x0C, 0xC3, 0x86, 0x0A, 0xC2, 0x0D,
+ 0x0B, 0xC9, 0x0D, 0xC4, 0x86, 0x0A, 0xD4, 0x8D,
+ 0xAD, 0xC0,
+//ascii 0x0024
+ 0xD0, 0x8D, 0xCD, 0xCD, 0x8A, 0x45, 0xC5, 0x0B,
+ 0x02, 0x20, 0x02, 0x0A, 0xCA, 0x06, 0x10, 0x04,
+ 0xC4, 0x0B, 0x60, 0x08, 0xC8, 0x09, 0x10, 0x03,
+ 0x0A, 0xC4, 0xB1, 0x02, 0xBE, 0xB0, 0x03, 0x10,
+ 0x0C, 0xC7, 0x81, 0x05, 0xC5, 0x08, 0x10, 0x0E,
+ 0xC3, 0x82, 0x04, 0xC6, 0x0B, 0x10, 0xC6, 0x83,
+ 0x06, 0xC4, 0x0A, 0x10, 0xC6, 0x87, 0x04, 0xC5,
+ 0x0E, 0x10, 0x0C, 0xC5, 0x10, 0x0C, 0xC3, 0xA5,
+ 0x42, 0x02, 0x54, 0x03, 0x10, 0x64, 0x10, 0x83,
+ 0x49, 0xC1, 0x03, 0x02, 0x20, 0x52, 0x10, 0x01,
+ 0x62, 0x10, 0x81, 0x28, 0xC3, 0x88, 0x04, 0xC5,
+ 0x81, 0x0A, 0xC6, 0x10, 0x0C, 0xC5, 0x0C, 0x10,
+ 0x0E, 0xC3, 0x09, 0x10, 0xC6, 0x0B, 0x10, 0x0E,
+ 0xC6, 0x82, 0x04, 0xC2, 0x9E, 0x10, 0x60, 0xC6,
+ 0x83, 0x03, 0xC7, 0x0B, 0x10, 0xB2, 0x76, 0x10,
+ 0x10, 0x0E, 0xC4, 0x0B, 0x03, 0x10, 0x0B, 0xC8,
+ 0x09, 0x50, 0x0B, 0xC4, 0x0C, 0x20, 0x06, 0xCA,
+ 0x0D, 0x06, 0x13, 0x06, 0x0D, 0xC5, 0x9C, 0x01,
+ 0x80, 0xD7, 0x0E, 0x0B,
+//ascii 0x0025
+ 0xD0, 0xAE, 0xA9, 0xAD, 0xD5, 0x07, 0x40, 0x04,
+ 0x0E, 0xC6, 0x8A, 0x4E, 0xC8, 0xB8, 0x01, 0x56,
+ 0x50, 0x82, 0x04, 0xC6, 0x9A, 0x01, 0x90, 0xC7,
+ 0x82, 0x1E, 0xC3, 0x84, 0x0D, 0xC6, 0x08, 0x10,
+ 0x04, 0x0E, 0xC5, 0x00, 0x04, 0xC4, 0x89, 0x0C,
+ 0xC7, 0xAD, 0x30, 0x1A, 0xC4, 0x02, 0x01, 0xC4,
+ 0x85, 0x0D, 0xC9, 0x07, 0x10, 0x05, 0xC3, 0xB8,
+ 0x02, 0x78, 0x70, 0x83, 0x03, 0xCB, 0xAC, 0x20,
+ 0x2B, 0xC2, 0x05, 0x40, 0x02, 0x0E, 0xCD, 0x06,
+ 0x10, 0x06, 0xC2, 0x0C, 0x09, 0x18, 0x0B, 0xD0,
+ 0xAB, 0x10, 0x2C, 0xD1, 0x0D, 0x1C, 0x0D, 0xC2,
+ 0x05, 0x10, 0x07, 0xCE, 0x0D, 0x03, 0x30, 0x03,
+ 0x0D, 0xC1, 0xAA, 0x10, 0x3D, 0xCB, 0x9E, 0x10,
+ 0x20, 0x14, 0x81, 0x01, 0xC2, 0x0E, 0x04, 0x10,
+ 0x08, 0xCA, 0x88, 0x08, 0xC3, 0x88, 0x08, 0xC3,
+ 0xA9, 0x10, 0x4E, 0xC8, 0x06, 0x00, 0xC4, 0x8E,
+ 0x06, 0xC4, 0xAE, 0x30, 0x19, 0xC7, 0x87, 0x0C,
+ 0xC3, 0x8C, 0x07, 0xC6, 0x08, 0x10, 0x04, 0xC6,
+ 0x9C, 0x01, 0x70, 0x1A, 0x97, 0x10, 0xC0, 0xC7,
+ 0x8D, 0x30, 0xC7, 0x08, 0x50, 0x08, 0xCA, 0x07,
+ 0xC8, 0x0C, 0x07, 0x16, 0x07, 0x0D, 0xC0,
+//ascii 0x0026
+ 0xD6, 0x0E, 0xD2, 0x0C, 0x0D, 0xC4, 0x0C, 0x01,
+ 0xD2, 0x01, 0x10, 0x04, 0x0B, 0xC0, 0x09, 0x10,
+ 0xD2, 0x01, 0x30, 0x02, 0x10, 0x04, 0xD3, 0x8E,
+ 0xA4, 0x20, 0x06, 0xC9, 0x0C, 0x04, 0x12, 0x07,
+ 0xC6, 0x0D, 0x02, 0x20, 0x03, 0xC8, 0x0A, 0x40,
+ 0x02, 0x0D, 0xC3, 0xAB, 0x10, 0x19, 0x10, 0x09,
+ 0xC7, 0xB1, 0x02, 0x87, 0x10, 0x80, 0x2E, 0xC1,
+ 0x08, 0x10, 0x02, 0x0E, 0xC0, 0x88, 0x02, 0xC6,
+ 0x8A, 0x02, 0xC2, 0x9D, 0x10, 0x40, 0xC0, 0x05,
+ 0x10, 0x04, 0xC3, 0x10, 0x0E, 0xC5, 0x87, 0x08,
+ 0xC3, 0x0B, 0x10, 0x01, 0x10, 0x07, 0xC4, 0x82,
+ 0x0C, 0xC5, 0x87, 0x07, 0xC4, 0x05, 0x20, 0x09,
+ 0xC5, 0x83, 0x0C, 0xC5, 0x9A, 0x01, 0xE0, 0xC2,
+ 0x09, 0x20, 0x01, 0x0E, 0xC5, 0x81, 0x0D, 0xC6,
+ 0xB1, 0x01, 0x78, 0x30, 0x10, 0x92, 0x10, 0x40,
+ 0xC4, 0x89, 0x01, 0xC7, 0x0A, 0x50, 0x05, 0xC0,
+ 0x0A, 0x10, 0x04, 0x0D, 0xC1, 0x09, 0x10, 0x07,
+ 0xC8, 0xBC, 0x52, 0x14, 0xB0, 0xC2, 0x08, 0x20,
+ 0x02, 0x01, 0x10, 0x02, 0xD3, 0x09, 0x40, 0x04,
+ 0x0E, 0xD4, 0xAE, 0x97, 0x8C, 0xC0,
+//ascii 0x0027
+ 0xC3, 0x5D, 0x0E, 0xC3, 0x0A, 0x50, 0x06, 0xC3,
+ 0x0A, 0x50, 0x06, 0xC0,
+//ascii 0x0028
+ 0xC1, 0x0C, 0x0B, 0xD6, 0x09, 0x0E, 0xC4, 0x9B,
+ 0x04, 0xB0, 0xD2, 0x99, 0x20, 0xE0, 0xC4, 0x0E,
+ 0x04, 0x10, 0x91, 0x6A, 0xE0, 0xCA, 0x9E, 0xA5,
+ 0x10, 0x10, 0x06, 0xC7, 0x0B, 0x02, 0x30, 0x92,
+ 0x47, 0x80, 0x29, 0x98, 0x64, 0x10, 0x30, 0x04,
+ 0x0C, 0xCA, 0x0B, 0x05, 0x70, 0x50, 0x81, 0x6C,
+ 0xCF, 0xAB, 0x75, 0x21, 0x20, 0xA1, 0x35, 0x8C,
+//ascii 0x0029
+ 0xCD, 0x2E, 0xD6, 0x9D, 0x95, 0x20, 0x50, 0xA1,
+ 0x36, 0xAE, 0xCE, 0x09, 0x03, 0x70, 0x60, 0x04,
+ 0x0A, 0xCA, 0x08, 0x01, 0x20, 0xB1, 0x47, 0x9A,
+ 0xB0, 0xBC, 0xBA, 0x86, 0x30, 0x30, 0x02, 0x0A,
+ 0xC6, 0x0E, 0x02, 0x10, 0x83, 0x8D, 0xCC, 0x8C,
+ 0x72, 0x10, 0x04, 0xC5, 0x9B, 0x06, 0xD0, 0xD2,
+ 0x9C, 0x40, 0xE0, 0xC4, 0x1D, 0xD6, 0x0C,
+//ascii 0x002A
+ 0xC6, 0x0D, 0xC2, 0x0C, 0xC8, 0x8E, 0x13, 0xC1,
+ 0x8E, 0x04, 0xC8, 0x85, 0x0A, 0xC0, 0x86, 0x09,
+ 0xC8, 0xBE, 0x12, 0xD0, 0x30, 0xCA, 0xA9, 0x02,
+ 0x0D, 0xC6, 0x0B, 0x01, 0x12, 0x03, 0x10, 0x01,
+ 0x03, 0x12, 0x01, 0xC3, 0x0A, 0x01, 0x12, 0x03,
+ 0x10, 0x01, 0x03, 0x12, 0x01, 0xC7, 0xA9, 0x02,
+ 0x0D, 0xC9, 0xBE, 0x12, 0xD0, 0x30, 0xC9, 0x85,
+ 0x0A, 0xC0, 0x86, 0x09, 0xC7, 0x8E, 0x13, 0xC1,
+ 0x8E, 0x04, 0xC9, 0x0D, 0xC2, 0x0C,
+//ascii 0x002B
+ 0xC6, 0x13, 0x0E, 0xCC, 0x10, 0x0D, 0xCC, 0x10,
+ 0x0D, 0xCC, 0x10, 0x0D, 0xCC, 0x10, 0x0D, 0xC6,
+ 0x0D, 0x4A, 0x10, 0x09, 0x3A, 0x0D, 0xC1, 0x08,
+ 0x70, 0x30, 0x06, 0xC1, 0x09, 0x32, 0x01, 0x10,
+ 0x01, 0x32, 0x07, 0xC7, 0x10, 0x0D, 0xCC, 0x10,
+ 0x0D, 0xCC, 0x10, 0x0D, 0xCC, 0x10, 0x0D, 0xCC,
+ 0x10, 0x0D, 0xCC, 0x1B, 0xC0,
+//ascii 0x002C
+ 0xC0, 0x19, 0x0C, 0xC8, 0x03, 0x20, 0x84, 0x8E,
+ 0xC4, 0x04, 0x50, 0x03, 0xC5, 0xBD, 0xB9, 0x63,
+ 0x10, 0xC0,
+//ascii 0x002D
+ 0xC1, 0x84, 0x2B, 0xC4, 0x83, 0x0A, 0xC4, 0x83,
+ 0x0A, 0xC4, 0x83, 0x0A, 0xC4, 0x83, 0x0A, 0xC4,
+ 0x83, 0x0A, 0xC4, 0x83, 0x0A, 0xC4, 0x83, 0x0A,
+ 0xC4, 0x83, 0x0A, 0xC0,
+//ascii 0x002E
+ 0xC0, 0x8A, 0x6C, 0xC3, 0x0C, 0x10, 0x01, 0xC3,
+ 0x0A, 0x20, 0x0E, 0xC3, 0x85, 0x18,
+//ascii 0x002F
+ 0xC1, 0x1E, 0xD9, 0xAB, 0x02, 0x7B, 0xD6, 0x0C,
+ 0x40, 0x84, 0x8C, 0xD4, 0x8B, 0x73, 0x30, 0x91,
+ 0x59, 0xD0, 0xD3, 0x9E, 0xA6, 0x20, 0x30, 0x82,
+ 0x6A, 0xD4, 0x9D, 0x95, 0x10, 0x30, 0x83, 0x7C,
+ 0xD4, 0x8C, 0x83, 0x40, 0x84, 0x8D, 0xD4, 0x8B,
+ 0x72, 0x30, 0x01, 0xD6, 0xAE, 0xA5, 0x10, 0xDA,
+ 0x0D, 0xC0,
+//ascii 0x0030
+ 0xC7, 0x9E, 0xA7, 0x50, 0x23, 0x94, 0x58, 0xC0,
+ 0xCE, 0x0C, 0x04, 0x70, 0x20, 0x01, 0x07, 0xCB,
+ 0x08, 0x30, 0x82, 0x56, 0x17, 0x86, 0x41, 0x20,
+ 0x01, 0x0C, 0xC8, 0x09, 0x10, 0x02, 0x09, 0xC8,
+ 0x0D, 0x07, 0x10, 0x01, 0x0E, 0xC7, 0x81, 0x05,
+ 0xCC, 0x9D, 0x10, 0x50, 0xC6, 0x89, 0x02, 0xCE,
+ 0x0B, 0x10, 0xC6, 0x87, 0x06, 0xCF, 0x10, 0x0C,
+ 0xC5, 0x86, 0x08, 0xCF, 0x81, 0x0C, 0xC5, 0x88,
+ 0x04, 0xCE, 0x0E, 0x10, 0x0D, 0xC5, 0x0C, 0x10,
+ 0x0B, 0xCD, 0x85, 0x02, 0xC7, 0x94, 0x01, 0x90,
+ 0xCA, 0x0E, 0x05, 0x10, 0x09, 0xC7, 0x0E, 0x02,
+ 0x10, 0xA2, 0x7B, 0xDE, 0xC1, 0x9E, 0xC9, 0x50,
+ 0x20, 0x05, 0xC9, 0x0E, 0x05, 0x70, 0x40, 0x01,
+ 0x08, 0xCC, 0x8C, 0x72, 0x70, 0x83, 0x8E, 0xD1,
+ 0x0D, 0x2B, 0x0C, 0x0D, 0xC0,
+//ascii 0x0031
+ 0xC2, 0x0E, 0x7C, 0x7C, 0x3C, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0D, 0x10, 0x07, 0x7D, 0x7D, 0x0D, 0xC3, 0x88,
+ 0x01, 0xD5, 0x83, 0x05, 0xD4, 0x0D, 0x10, 0x0B,
+ 0xD4, 0x88, 0x01, 0xD5, 0x1B, 0x0E,
+//ascii 0x0032
+ 0xC6, 0x0A, 0x17, 0x0A, 0xC9, 0x0D, 0x11, 0xC4,
+ 0x0B, 0x01, 0x40, 0x08, 0xC7, 0x0D, 0x10, 0xC3,
+ 0x0B, 0x10, 0x01, 0x14, 0x01, 0x10, 0x03, 0x0E,
+ 0xC5, 0x0D, 0x10, 0xC3, 0x82, 0x04, 0xC3, 0xA9,
+ 0x10, 0x1C, 0xC4, 0x0D, 0x10, 0xC2, 0x8A, 0x01,
+ 0xC5, 0x0D, 0x02, 0x10, 0x0B, 0xC3, 0x0D, 0x10,
+ 0xC2, 0x87, 0x06, 0xC7, 0x03, 0x10, 0x0A, 0xC2,
+ 0x0D, 0x10, 0xC2, 0x86, 0x08, 0xC8, 0x04, 0x10,
+ 0x09, 0xC1, 0x0D, 0x10, 0xC2, 0x87, 0x06, 0xC9,
+ 0x05, 0x10, 0x08, 0xC0, 0x0D, 0x10, 0xC2, 0x8A,
+ 0x02, 0xCA, 0x07, 0x10, 0x07, 0x0D, 0x10, 0xC3,
+ 0x81, 0x05, 0xCA, 0x08, 0x10, 0x04, 0x10, 0xC3,
+ 0x0A, 0x10, 0x81, 0x6D, 0xC8, 0x09, 0x30, 0xC4,
+ 0x09, 0x20, 0x0A, 0xC9, 0x0A, 0x20, 0xC5, 0x9E,
+ 0x74, 0xB0, 0xCA, 0x0C, 0x12,
+//ascii 0x0033
+ 0xCF, 0xA8, 0x32, 0x49, 0xCC, 0x07, 0x01, 0x10,
+ 0x03, 0x0A, 0xC1, 0x0D, 0x02, 0x40, 0x02, 0x0E,
+ 0xC8, 0x0E, 0x02, 0x50, 0x09, 0xC0, 0x03, 0x10,
+ 0x85, 0x74, 0x10, 0x02, 0xC8, 0x04, 0x10, 0x07,
+ 0x1B, 0x06, 0x10, 0x9A, 0x02, 0xD0, 0xC2, 0x0C,
+ 0x10, 0x08, 0xC6, 0x0C, 0x10, 0x0B, 0xC3, 0xA9,
+ 0x01, 0x0C, 0xC4, 0x88, 0x01, 0xC6, 0x88, 0x04,
+ 0xC5, 0x82, 0x02, 0xC5, 0x0E, 0x10, 0x0E, 0xC5,
+ 0x86, 0x07, 0xC5, 0x86, 0x05, 0xC6, 0x81, 0x0C,
+ 0xC5, 0x86, 0x07, 0xC5, 0x87, 0x05, 0xC6, 0x81,
+ 0x0C, 0xC5, 0x88, 0x04, 0xC5, 0x87, 0x05, 0xC6,
+ 0x10, 0x0D, 0xC5, 0x0D, 0x10, 0x0D, 0xCD, 0x89,
+ 0x01, 0xC7, 0x93, 0x02, 0xC0, 0xCB, 0x9C, 0x10,
+ 0x60, 0xC7, 0x0D, 0x01, 0x10, 0x05, 0xC9, 0x05,
+ 0x10, 0x01, 0x0E, 0xC8, 0x9D, 0x20, 0x40, 0xC8,
+ 0x0E, 0x10, 0x01, 0x0C, 0xCB, 0x1B, 0xC9, 0x82,
+ 0x6E,
+//ascii 0x0034
+ 0xD0, 0x8E, 0xAB, 0xD4, 0x8A, 0x03, 0xD4, 0x8A,
+ 0x03, 0xC6, 0x0D, 0x77, 0x47, 0x84, 0x01, 0x37,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x09, 0x10,
+ 0x01, 0x73, 0x13, 0x82, 0x01, 0x33, 0xC2, 0x0D,
+ 0x01, 0x10, 0x06, 0xC8, 0x8A, 0x03, 0xC8, 0x06,
+ 0x10, 0x01, 0x0A, 0xC6, 0x8A, 0x03, 0xC9, 0x0C,
+ 0x03, 0x10, 0x05, 0x0E, 0xC4, 0x8A, 0x03, 0xCB,
+ 0x08, 0x10, 0x01, 0x09, 0xC3, 0x8A, 0x03, 0xCC,
+ 0x0E, 0x04, 0x10, 0x03, 0x0D, 0xC1, 0x8A, 0x03,
+ 0xCE, 0x0A, 0x01, 0x10, 0x07, 0xC0, 0x8A, 0x03,
+ 0xCF, 0x0E, 0x05, 0x10, 0x92, 0x60, 0x30, 0xD1,
+ 0x0B, 0x02, 0x20, 0x03, 0xD3, 0x07, 0x10, 0x03,
+ 0xD4, 0x8D, 0xAB,
+//ascii 0x0035
+ 0xCF, 0x8E, 0xDE, 0xCB, 0x8E, 0xBC, 0xC6, 0x8E,
+ 0x71, 0x20, 0x01, 0x07, 0xC9, 0x8A, 0x03, 0xC5,
+ 0x0C, 0x01, 0x60, 0x01, 0x0D, 0xC7, 0x8A, 0x03,
+ 0xC4, 0x0D, 0x01, 0x10, 0xA6, 0xBD, 0xB7, 0x10,
+ 0x01, 0xC7, 0x8A, 0x03, 0xC4, 0x05, 0x10, 0x0C,
+ 0xC4, 0x9D, 0x10, 0x60, 0xC6, 0x8A, 0x03, 0xC4,
+ 0x10, 0x09, 0xC6, 0x8A, 0x01, 0xC6, 0x8A, 0x03,
+ 0xC3, 0x0C, 0x10, 0xC8, 0x10, 0x0D, 0xC5, 0x8A,
+ 0x03, 0xC3, 0x8B, 0x01, 0xC8, 0x81, 0x0C, 0xC5,
+ 0x8A, 0x03, 0xC3, 0x8D, 0x01, 0xC8, 0x10, 0x0D,
+ 0xC5, 0x8A, 0x03, 0xC4, 0x82, 0x0D, 0xC6, 0x0A,
+ 0x10, 0xC6, 0xBA, 0x01, 0x57, 0x90, 0xAB, 0xD8,
+ 0x08, 0xC5, 0x9D, 0x10, 0x50, 0xC6, 0x0A, 0x70,
+ 0x00, 0x02, 0xC4, 0x05, 0x10, 0x01, 0x0E, 0xC6,
+ 0xBE, 0x97, 0x54, 0x20, 0x30, 0x03, 0xC3, 0x0E,
+ 0x10, 0x01, 0x0C, 0xCE, 0x9E, 0xCA, 0xB0, 0xC4,
+ 0x04, 0x08, 0xC0,
+//ascii 0x0036
+ 0xC6, 0x0D, 0x0B, 0xC5, 0xA9, 0x65, 0x7A, 0xCC,
+ 0x9E, 0x40, 0x40, 0xC3, 0x08, 0x50, 0x01, 0x09,
+ 0xC9, 0x0E, 0x01, 0x10, 0x04, 0xC2, 0x06, 0x20,
+ 0x83, 0x43, 0x20, 0x07, 0xC8, 0x93, 0x01, 0x90,
+ 0xC2, 0x09, 0x10, 0x05, 0x0E, 0xC2, 0x0D, 0x04,
+ 0x10, 0x0B, 0xC6, 0x0C, 0x10, 0x0C, 0xC3, 0x82,
+ 0x04, 0xC6, 0x83, 0x03, 0xC6, 0x88, 0x04, 0xC3,
+ 0x0D, 0x10, 0x0E, 0xC6, 0x0C, 0x10, 0x0E, 0xC5,
+ 0x86, 0x07, 0xC3, 0x8B, 0x01, 0xC8, 0x81, 0x0C,
+ 0xC5, 0x86, 0x06, 0xC3, 0x8C, 0x02, 0xC8, 0x81,
+ 0x0C, 0xC5, 0x89, 0x02, 0xC4, 0x10, 0x0E, 0xC6,
+ 0x0E, 0x10, 0x0E, 0xC5, 0x0E, 0x10, 0x08, 0xC3,
+ 0x86, 0x06, 0xC6, 0x86, 0x02, 0xC7, 0x08, 0x10,
+ 0x07, 0xC3, 0x82, 0x07, 0xC4, 0x07, 0x10, 0x0A,
+ 0xC8, 0x06, 0x10, 0xB1, 0x6A, 0xDC, 0x20, 0xB0,
+ 0x27, 0x97, 0x20, 0x10, 0x06, 0xCA, 0x0A, 0x02,
+ 0x70, 0x40, 0x08, 0xCD, 0x8B, 0x62, 0x60, 0x83,
+ 0x8E, 0xD2, 0x0E, 0x2D, 0x0E, 0xC0,
+//ascii 0x0037
+ 0xC2, 0x0E, 0x1A, 0x0E, 0xD3, 0x0A, 0x20, 0x06,
+ 0x0E, 0xD1, 0x0A, 0x40, 0x06, 0x0E, 0xCF, 0xAA,
+ 0x02, 0xA2, 0x20, 0x06, 0x0E, 0xCD, 0x8A, 0x03,
+ 0xC1, 0x09, 0x02, 0x20, 0x06, 0x0E, 0xCB, 0x8A,
+ 0x03, 0xC3, 0x09, 0x02, 0x20, 0x06, 0x0E, 0xC9,
+ 0x8A, 0x03, 0xC5, 0x09, 0x02, 0x20, 0x06, 0x0E,
+ 0xC7, 0x8A, 0x03, 0xC7, 0x09, 0x01, 0x20, 0x07,
+ 0x0E, 0xC5, 0x8A, 0x03, 0xC9, 0x09, 0x01, 0x20,
+ 0x07, 0x0E, 0xC3, 0x8A, 0x03, 0xCB, 0x08, 0x01,
+ 0x20, 0x07, 0xC2, 0x8A, 0x03, 0xCD, 0x08, 0x01,
+ 0x10, 0xC2, 0x8A, 0x03, 0xCF, 0x08, 0x01, 0xC2,
+ 0x8A, 0x03, 0xD4, 0x8C, 0x67,
+//ascii 0x0038
+ 0xCF, 0xAE, 0x97, 0x9D, 0xCC, 0x0C, 0x06, 0x14,
+ 0x08, 0xC3, 0x06, 0x40, 0x06, 0xCA, 0x07, 0x40,
+ 0x01, 0x0D, 0xC0, 0x05, 0x20, 0x02, 0x20, 0x04,
+ 0xC8, 0x08, 0x10, 0x02, 0x16, 0x91, 0x02, 0xB0,
+ 0x10, 0x09, 0xC2, 0x07, 0x10, 0x0A, 0xC7, 0x10,
+ 0x06, 0xC3, 0xA5, 0x01, 0x09, 0xC4, 0x86, 0x03,
+ 0xC6, 0x8A, 0x02, 0xC5, 0x81, 0x02, 0xC5, 0x0D,
+ 0x10, 0x0E, 0xC5, 0x87, 0x07, 0xC5, 0x85, 0x06,
+ 0xC6, 0x81, 0x0C, 0xC5, 0x86, 0x08, 0xC5, 0x86,
+ 0x07, 0xC6, 0x81, 0x0C, 0xC5, 0x87, 0x06, 0xC5,
+ 0x84, 0x06, 0xC6, 0x10, 0x0D, 0xC5, 0x8B, 0x01,
+ 0xC4, 0x0E, 0x10, 0x01, 0xC5, 0x0C, 0x10, 0xC7,
+ 0x91, 0x03, 0xE0, 0xC1, 0xBD, 0x20, 0x30, 0x60,
+ 0xC4, 0x84, 0x04, 0xC7, 0x0B, 0x20, 0x02, 0x01,
+ 0x10, 0x04, 0x0D, 0x10, 0xA5, 0xCE, 0xB4, 0x10,
+ 0x0C, 0xC8, 0x0A, 0x01, 0x30, 0x04, 0x0E, 0xC0,
+ 0x08, 0x60, 0x07, 0xCB, 0x0A, 0x18, 0x0C, 0xC3,
+ 0x0A, 0x02, 0x20, 0x01, 0x09, 0xD6, 0x8D, 0xBD,
+//ascii 0x0039
+ 0xC7, 0x9E, 0xA8, 0x60, 0x15, 0x96, 0x79, 0xD0,
+ 0xCF, 0x0C, 0x04, 0x70, 0x10, 0x81, 0x6D, 0xCB,
+ 0x08, 0x70, 0x94, 0x53, 0x10, 0x20, 0x07, 0xC9,
+ 0x0A, 0x10, 0x03, 0x0B, 0xC1, 0xAC, 0x50, 0x2D,
+ 0xC1, 0x0C, 0x05, 0x10, 0x05, 0xC8, 0x81, 0x05,
+ 0xC5, 0x88, 0x02, 0xC3, 0x0A, 0x10, 0x09, 0xC6,
+ 0x8A, 0x01, 0xC7, 0x84, 0x09, 0xC3, 0x88, 0x02,
+ 0xC6, 0x87, 0x06, 0xC7, 0x8A, 0x04, 0xC4, 0x10,
+ 0x0D, 0xC5, 0x86, 0x07, 0xC7, 0x8B, 0x01, 0xC4,
+ 0x81, 0x0C, 0xC5, 0x87, 0x05, 0xC7, 0x8A, 0x02,
+ 0xC4, 0x10, 0x0C, 0xC5, 0x0A, 0x10, 0x0E, 0xC6,
+ 0x84, 0x05, 0xC3, 0x0B, 0x10, 0xC7, 0x81, 0x03,
+ 0xC5, 0x08, 0x10, 0x0B, 0xC2, 0x9E, 0x20, 0x40,
+ 0xC7, 0x0A, 0x10, 0xB1, 0x8C, 0xDA, 0x40, 0x10,
+ 0x05, 0xC2, 0x07, 0x01, 0x10, 0x0D, 0xC8, 0x08,
+ 0x70, 0x04, 0xC2, 0x0E, 0x10, 0x01, 0x0B, 0xCA,
+ 0x0C, 0x05, 0x30, 0x03, 0x0A, 0xC3, 0x9E, 0x16,
+ 0xE0, 0xCE, 0x1D, 0xC0,
+//ascii 0x003A
+ 0xC1, 0x17, 0xC8, 0x8A, 0x6C, 0xC4, 0x06, 0x10,
+ 0x05, 0xC6, 0x0C, 0x10, 0x01, 0xC4, 0x05, 0x10,
+ 0x04, 0xC6, 0x0A, 0x20, 0x0E, 0xC3, 0x9D, 0x32,
+ 0xC0, 0xC7, 0x85, 0x18,
+//ascii 0x003B
+ 0xC0, 0x0C, 0x12, 0x0C, 0xC7, 0x19, 0x0C, 0xC8,
+ 0x05, 0x10, 0x04, 0xC7, 0x03, 0x20, 0x84, 0x8E,
+ 0xC4, 0x07, 0x10, 0x06, 0xC7, 0x04, 0x50, 0x03,
+ 0xC4, 0x18, 0xCA, 0xBD, 0xB9, 0x63, 0x10, 0xC0,
+//ascii 0x003C
+ 0xC0, 0x16, 0x0C, 0xC7, 0x0D, 0x16, 0x0E, 0xC0,
+ 0x85, 0x03, 0xC7, 0x84, 0x03, 0xC1, 0x0D, 0x10,
+ 0x0B, 0xC5, 0x0D, 0x10, 0x0B, 0xC2, 0x85, 0x04,
+ 0xC5, 0x85, 0x04, 0xC3, 0x0D, 0x10, 0x0C, 0xC3,
+ 0x0D, 0x10, 0x0C, 0xC4, 0x85, 0x04, 0xC3, 0x85,
+ 0x04, 0xC5, 0x0D, 0x10, 0x0C, 0xC1, 0x0E, 0x10,
+ 0x0C, 0xC6, 0x86, 0x05, 0xC1, 0x86, 0x04, 0xC7,
+ 0x0E, 0x10, 0x0D, 0x0E, 0x10, 0x0C, 0xC8, 0xB6,
+ 0x05, 0x60, 0x40, 0xC9, 0x0E, 0x30, 0x0D, 0xCA,
+ 0x06, 0x10, 0x05, 0xCB, 0x0E, 0x10, 0x0D, 0xCC,
+ 0x1E, 0xC0,
+//ascii 0x003D
+ 0x1A, 0xC3, 0x1A, 0xC3, 0x10, 0x0D, 0xC2, 0x10,
+ 0xC3, 0x10, 0x0D, 0xC2, 0x10, 0xC3, 0x10, 0x0D,
+ 0xC2, 0x10, 0xC3, 0x10, 0x0D, 0xC2, 0x10, 0xC3,
+ 0x10, 0x0D, 0xC2, 0x10, 0xC3, 0x10, 0x0D, 0xC2,
+ 0x10, 0xC3, 0x10, 0x0D, 0xC2, 0x10, 0xC3, 0x10,
+ 0x0D, 0xC2, 0x10, 0xC3, 0x10, 0x0D, 0xC2, 0x10,
+ 0xC3, 0x10, 0x0D, 0xC2, 0x10, 0xC3, 0x10, 0x0D,
+ 0xC2, 0x10, 0xC3, 0x12, 0x0E, 0xC2, 0x12,
+//ascii 0x003E
+ 0xC6, 0x07, 0x06, 0xCC, 0x0B, 0x10, 0x09, 0xCB,
+ 0x03, 0x10, 0x02, 0xCA, 0xBA, 0x01, 0x20, 0x90,
+ 0xC9, 0xB3, 0x09, 0xA0, 0x20, 0xC8, 0x8A, 0x01,
+ 0xC1, 0x82, 0x09, 0xC7, 0x82, 0x08, 0xC1, 0x89,
+ 0x01, 0xC6, 0x8A, 0x01, 0xC3, 0x82, 0x08, 0xC5,
+ 0x82, 0x08, 0xC3, 0x89, 0x01, 0xC4, 0x8A, 0x01,
+ 0xC5, 0x81, 0x08, 0xC3, 0x82, 0x07, 0xC5, 0x88,
+ 0x01, 0xC2, 0x09, 0x10, 0x0E, 0xC6, 0x81, 0x08,
+ 0xC1, 0x82, 0x06, 0xC7, 0x88, 0x01, 0xC1, 0x1D,
+ 0xC9, 0x1D, 0xC0,
+//ascii 0x003F
+ 0xC5, 0xBA, 0x53, 0x47, 0xE0, 0xD4, 0x04, 0x40,
+ 0x01, 0x0B, 0xD2, 0x05, 0x10, 0x83, 0x65, 0x20,
+ 0x0D, 0xD0, 0x0D, 0x10, 0x09, 0xC2, 0x9E, 0x30,
+ 0x30, 0xD0, 0x88, 0x04, 0xC4, 0xAE, 0x10, 0x4E,
+ 0xC5, 0x0C, 0xC7, 0x86, 0x09, 0xC5, 0x0A, 0x20,
+ 0x84, 0x6D, 0xC0, 0x9E, 0x10, 0x40, 0xC6, 0x86,
+ 0x08, 0xC6, 0x09, 0x30, 0x0C, 0xC0, 0x0A, 0x20,
+ 0x0E, 0xC5, 0x88, 0x04, 0xC7, 0xAE, 0x85, 0x4D,
+ 0xC0, 0x9E, 0x10, 0x30, 0xC6, 0x0D, 0x10, 0x08,
+ 0xCD, 0x0E, 0x0B, 0xC8, 0x06, 0x10, 0x02, 0x08,
+ 0xD7, 0x04, 0x10, 0x04, 0xD8, 0x8A, 0x56, 0xC0,
+//ascii 0x0040
+ 0xC6, 0xBC, 0x84, 0x32, 0x30, 0x94, 0x58, 0xC0,
+ 0xCF, 0x0B, 0x03, 0x70, 0x10, 0x03, 0x0D, 0xCC,
+ 0x06, 0x10, 0xA1, 0x7A, 0xCD, 0x1C, 0xAA, 0x72,
+ 0x01, 0xCB, 0x94, 0x01, 0x90, 0xC9, 0x85, 0x09,
+ 0xC9, 0x97, 0x02, 0xD0, 0xCA, 0x8B, 0x07, 0xC8,
+ 0x9D, 0x01, 0xD0, 0xCB, 0x88, 0x07, 0xC1, 0x8E,
+ 0x8C, 0xC3, 0x85, 0x08, 0xC1, 0x0D, 0x79, 0x09,
+ 0x06, 0x10, 0x0B, 0xC1, 0x8A, 0x05, 0xC3, 0x00,
+ 0x01, 0xC2, 0x0A, 0x70, 0x20, 0x03, 0xC3, 0x00,
+ 0x01, 0xC2, 0x8B, 0x05, 0xC2, 0x0C, 0x03, 0x10,
+ 0x04, 0x27, 0x95, 0x10, 0x40, 0xC4, 0x83, 0x0E,
+ 0xC1, 0x88, 0x09, 0xC2, 0x0E, 0x11, 0x0C, 0xC5,
+ 0x86, 0x08, 0xC3, 0x85, 0x0C, 0xC1, 0x87, 0x0B,
+ 0xC2, 0x88, 0x08, 0xC7, 0x82, 0x0E, 0xC2, 0x87,
+ 0x0A, 0xC1, 0x86, 0x0C, 0xC2, 0x85, 0x0B, 0xC7,
+ 0x86, 0x09, 0xC2, 0x87, 0x0A, 0xC1, 0x87, 0x0B,
+ 0xC2, 0x85, 0x0B, 0xC7, 0x87, 0x08, 0xC2, 0x86,
+ 0x0B, 0xC1, 0x88, 0x09, 0xC2, 0x88, 0x07, 0xC7,
+ 0x84, 0x0A, 0xC2, 0x84, 0x0C, 0xC1, 0x8B, 0x06,
+ 0xC2, 0x9E, 0x01, 0xC0, 0xC5, 0x09, 0x10, 0x0E,
+ 0xC2, 0x01, 0x00, 0xC3, 0x00, 0x01, 0xC3, 0x08,
+ 0x10, 0xB6, 0xAC, 0xB9, 0x30, 0x10, 0x08, 0xC2,
+ 0x8C, 0x03, 0xC3, 0x84, 0x0A, 0xC3, 0x08, 0x60,
+ 0x01, 0x09, 0xC3, 0x85, 0x08, 0xC3, 0x8A, 0x02,
+ 0xC4, 0x8E, 0x84, 0x13, 0x05, 0x09, 0xC4, 0x0C,
+ 0x10, 0x0E, 0xC4, 0x83, 0x04, 0xCE, 0x9E, 0x20,
+ 0x70, 0xC5, 0xAD, 0x10, 0x3E, 0xCB, 0x9C, 0x20,
+ 0x20, 0xC7, 0x0C, 0x01, 0x10, 0x07, 0x0D, 0xC7,
+ 0x0C, 0x05, 0x10, 0x02, 0x0E, 0xC8, 0x0E, 0x03,
+ 0x20, 0x81, 0x46, 0x17, 0x86, 0x41, 0x20, 0x05,
+ 0xCC, 0x0A, 0x04, 0x70, 0x10, 0x05, 0x0C, 0xD0,
+ 0x8B, 0x87, 0x16, 0x87, 0x9C, 0xC0,
+//ascii 0x0041
+ 0xEC, 0x8B, 0x50, 0xD1, 0x8D, 0x71, 0x20, 0xCE,
+ 0x8E, 0x93, 0x30, 0x02, 0x07, 0xCC, 0x0A, 0x04,
+ 0x30, 0x81, 0x6C, 0xCB, 0x8C, 0x61, 0x40, 0x09,
+ 0xCB, 0x8D, 0x82, 0x30, 0xA4, 0xA1, 0x0C, 0xC9,
+ 0x09, 0x03, 0x30, 0x83, 0x9E, 0xC1, 0x81, 0x0C,
+ 0xC7, 0x0B, 0x30, 0x82, 0x8D, 0xC4, 0x81, 0x0C,
+ 0xC7, 0x0A, 0x20, 0x0A, 0xC7, 0x81, 0x0C, 0xC7,
+ 0x0B, 0x30, 0x83, 0x9E, 0xC4, 0x81, 0x0C, 0xC8,
+ 0x8E, 0x82, 0x30, 0x04, 0x0A, 0xC2, 0x81, 0x0C,
+ 0xCB, 0x8C, 0x61, 0x30, 0xA5, 0xB1, 0x0C, 0xCE,
+ 0x0B, 0x05, 0x50, 0x0A, 0xD1, 0x09, 0x03, 0x30,
+ 0x82, 0x7D, 0xD0, 0x8D, 0x72, 0x30, 0x03, 0x08,
+ 0xD1, 0x8C, 0x61, 0x20, 0xD4, 0x8A, 0x40, 0xD6,
+ 0x0E,
+//ascii 0x0042
+ 0xCF, 0xAC, 0x76, 0x7B, 0xC8, 0x0C, 0x06, 0x13,
+ 0x06, 0x0D, 0xC2, 0x04, 0x40, 0x03, 0x0E, 0xC5,
+ 0x07, 0x50, 0x0B, 0xC0, 0x04, 0x10, 0x82, 0x42,
+ 0x10, 0x03, 0xC4, 0x0A, 0x10, 0x02, 0x17, 0x93,
+ 0x02, 0xB0, 0x10, 0x0A, 0xC2, 0x09, 0x10, 0x0A,
+ 0xC3, 0x82, 0x04, 0xC3, 0xA7, 0x02, 0x09, 0xC4,
+ 0x85, 0x05, 0xC2, 0x0D, 0x10, 0x0E, 0xC4, 0x82,
+ 0x01, 0xC5, 0x8B, 0x02, 0xC2, 0x8B, 0x02, 0xC5,
+ 0x87, 0x04, 0xC5, 0x0D, 0x10, 0xC2, 0x8A, 0x03,
+ 0xC5, 0x89, 0x04, 0xC5, 0x0D, 0x10, 0xC2, 0x8A,
+ 0x03, 0xC5, 0x89, 0x04, 0xC5, 0x0D, 0x10, 0xC2,
+ 0x8A, 0x03, 0xC5, 0x89, 0x04, 0xC5, 0x0D, 0x10,
+ 0xC2, 0x8A, 0x03, 0xC5, 0x89, 0x04, 0xC5, 0x0D,
+ 0x10, 0xC2, 0x8A, 0x03, 0xC5, 0x89, 0x04, 0xC5,
+ 0x0D, 0x10, 0xC2, 0x0A, 0x10, 0x61, 0x10, 0x61,
+ 0x10, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D,
+ 0x77, 0x77, 0x37,
+//ascii 0x0043
+ 0xC7, 0x09, 0x04, 0xC6, 0x8B, 0x5B, 0xCD, 0x0A,
+ 0x01, 0x10, 0xC6, 0x0A, 0x10, 0x04, 0x0E, 0xCA,
+ 0x09, 0x20, 0x04, 0xC6, 0x0C, 0x02, 0x10, 0x01,
+ 0x0D, 0xC8, 0x0C, 0x10, 0x03, 0x0D, 0xC9, 0x0A,
+ 0x10, 0x02, 0xC8, 0x83, 0x02, 0xCC, 0x0B, 0x10,
+ 0x09, 0xC6, 0x0D, 0x10, 0x0B, 0xCD, 0x85, 0x02,
+ 0xC6, 0x89, 0x01, 0xCE, 0x0B, 0x10, 0x0E, 0xC5,
+ 0x86, 0x04, 0xCF, 0x10, 0x0C, 0xC5, 0x86, 0x05,
+ 0xCF, 0x10, 0x0C, 0xC5, 0x87, 0x03, 0xCE, 0x0E,
+ 0x10, 0x0D, 0xC5, 0x0A, 0x10, 0xCE, 0x09, 0x10,
+ 0xC6, 0x0E, 0x10, 0x08, 0xCD, 0x82, 0x04, 0xC7,
+ 0x06, 0x10, 0x0C, 0xCB, 0x06, 0x10, 0x0C, 0xC8,
+ 0x01, 0x10, 0x09, 0xC8, 0x0E, 0x05, 0x10, 0x06,
+ 0xC9, 0x0D, 0x01, 0x10, 0x92, 0x8C, 0xE0, 0xC0,
+ 0xAE, 0xDA, 0x61, 0x10, 0x04, 0xCB, 0x0E, 0x04,
+ 0x70, 0x30, 0x08, 0xCE, 0x8C, 0x51, 0x50, 0x82,
+ 0x7E, 0xD2, 0x0E, 0x0C, 0x1B, 0x0C, 0x0E, 0xC0,
+//ascii 0x0044
+ 0xC9, 0x8E, 0xBA, 0x19, 0x0A, 0x0D, 0xCE, 0x0A,
+ 0x03, 0x60, 0x81, 0x6D, 0xC9, 0x0D, 0x03, 0x40,
+ 0x01, 0x50, 0x07, 0xC7, 0x0D, 0x01, 0x10, 0x84,
+ 0xAD, 0xC3, 0x8C, 0x71, 0x10, 0x05, 0xC6, 0x92,
+ 0x01, 0xA0, 0xC9, 0x05, 0x10, 0x08, 0xC4, 0x09,
+ 0x10, 0x0C, 0xCB, 0x85, 0x01, 0xC4, 0x83, 0x06,
+ 0xCD, 0x81, 0x09, 0xC2, 0x0E, 0x10, 0x0D, 0xCD,
+ 0x86, 0x05, 0xC2, 0x8C, 0x01, 0xCE, 0x8A, 0x02,
+ 0xC2, 0x8A, 0x02, 0xCE, 0x0C, 0x10, 0xC2, 0x8A,
+ 0x03, 0xCE, 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xCE,
+ 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xCE, 0x0D, 0x10,
+ 0xC2, 0x8A, 0x03, 0xCE, 0x0D, 0x10, 0xC2, 0x0A,
+ 0x10, 0x71, 0x71, 0x10, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x0045
+ 0xC2, 0x8C, 0x46, 0xC6, 0x1E, 0xC5, 0x0D, 0x11,
+ 0xC2, 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xC5, 0x0D,
+ 0x10, 0xC2, 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xC5,
+ 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xC5, 0x8B, 0x02,
+ 0xC5, 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xC5, 0x8B,
+ 0x02, 0xC5, 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xC5,
+ 0x8B, 0x02, 0xC5, 0x0D, 0x10, 0xC2, 0x8A, 0x03,
+ 0xC5, 0x8B, 0x02, 0xC5, 0x0D, 0x10, 0xC2, 0x8A,
+ 0x03, 0xC5, 0x8B, 0x02, 0xC5, 0x0D, 0x10, 0xC2,
+ 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xC5, 0x0D, 0x10,
+ 0xC2, 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xC5, 0x0D,
+ 0x10, 0xC2, 0x0A, 0x10, 0x61, 0x10, 0x61, 0x10,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D, 0x77,
+ 0x77, 0x37,
+//ascii 0x0046
+ 0xC2, 0x8C, 0x57, 0xD4, 0x8A, 0x03, 0xC5, 0x8C,
+ 0x45, 0xCB, 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xCB,
+ 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xCB, 0x8A, 0x03,
+ 0xC5, 0x8B, 0x02, 0xCB, 0x8A, 0x03, 0xC5, 0x8B,
+ 0x02, 0xCB, 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xCB,
+ 0x8A, 0x03, 0xC5, 0x8B, 0x02, 0xCB, 0x8A, 0x03,
+ 0xC5, 0x8B, 0x02, 0xCB, 0x8A, 0x03, 0xC5, 0x8B,
+ 0x02, 0xCB, 0x0A, 0x10, 0x61, 0x10, 0x71, 0x01,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D, 0x77,
+ 0x77, 0x37,
+//ascii 0x0047
+ 0xE3, 0x08, 0x03, 0xC2, 0x0D, 0x20, 0x81, 0x4A,
+ 0xCD, 0x0A, 0x01, 0x10, 0xC2, 0x0D, 0x50, 0x02,
+ 0x0D, 0xCA, 0x09, 0x20, 0x03, 0xC2, 0x0D, 0x10,
+ 0x8A, 0x83, 0x10, 0x01, 0x0C, 0xC8, 0x0D, 0x10,
+ 0x01, 0x0B, 0xC3, 0x0D, 0x10, 0xC2, 0x9A, 0x10,
+ 0x10, 0xC8, 0x94, 0x01, 0xE0, 0xC4, 0x0D, 0x10,
+ 0xC3, 0x0C, 0x10, 0x08, 0xC6, 0x0D, 0x10, 0x0A,
+ 0xC5, 0x0D, 0x10, 0xC4, 0x86, 0x02, 0xC6, 0x89,
+ 0x01, 0xC6, 0x0D, 0x10, 0xC4, 0x0C, 0x10, 0x0E,
+ 0xC5, 0x87, 0x04, 0xC6, 0x0E, 0x15, 0xC5, 0x10,
+ 0x0C, 0xC5, 0x86, 0x05, 0xCF, 0x10, 0x0C, 0xC5,
+ 0x87, 0x04, 0xCE, 0x0E, 0x10, 0x0D, 0xC5, 0x0A,
+ 0x10, 0xCE, 0x09, 0x10, 0xC6, 0x0E, 0x10, 0x08,
+ 0xCD, 0x82, 0x04, 0xC7, 0x05, 0x10, 0x0C, 0xCB,
+ 0x06, 0x10, 0x0B, 0xC7, 0x0E, 0x01, 0x10, 0x09,
+ 0xC8, 0x0E, 0x05, 0x10, 0x05, 0xC9, 0x0C, 0x01,
+ 0x10, 0x92, 0x8C, 0xE0, 0xC0, 0xAE, 0xDA, 0x61,
+ 0x10, 0x04, 0xCB, 0x0E, 0x04, 0x70, 0x30, 0x07,
+ 0xCE, 0x8B, 0x51, 0x50, 0x82, 0x7E, 0xD2, 0x0E,
+ 0x0C, 0x1B, 0x0C, 0x0E, 0xC0,
+//ascii 0x0048
+ 0xC3, 0x7C, 0x7C, 0x3C, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC3, 0x7D,
+ 0x89, 0x01, 0x7D, 0x0D, 0xCB, 0x8B, 0x02, 0xD4,
+ 0x8B, 0x02, 0xD4, 0x8B, 0x02, 0xD4, 0x8B, 0x02,
+ 0xD4, 0x8B, 0x02, 0xD4, 0x8B, 0x02, 0xD4, 0x8B,
+ 0x02, 0xD4, 0x8B, 0x02, 0xD4, 0x8B, 0x02, 0xD4,
+ 0x8B, 0x02, 0xCB, 0x0B, 0x71, 0x01, 0x10, 0x71,
+ 0x01, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D,
+ 0x77, 0x77, 0x37,
+//ascii 0x0049
+ 0xC2, 0x0B, 0x71, 0x71, 0x31, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x004A
+ 0xC2, 0x0C, 0x74, 0x64, 0x06, 0x09, 0xC9, 0x0A,
+ 0x70, 0x70, 0x80, 0x1B, 0xC7, 0x0C, 0x74, 0x64,
+ 0x02, 0x20, 0x0C, 0xD7, 0x9C, 0x20, 0x30, 0xD8,
+ 0x0C, 0x10, 0x0E, 0xD8, 0x81, 0x0C, 0xD8, 0x81,
+ 0x0C, 0xD7, 0x0D, 0x10, 0x0E, 0xD7, 0x84, 0x02,
+ 0xD6, 0x08, 0x02, 0x10, 0x09, 0xD6, 0x04, 0x10,
+ 0x06, 0xD7, 0x86, 0x5B,
+//ascii 0x004B
+ 0xC2, 0x0E, 0xD2, 0x0D, 0xC2, 0x0A, 0x04, 0xD0,
+ 0x0A, 0x00, 0xC2, 0x8A, 0x04, 0xCE, 0x06, 0x10,
+ 0xC2, 0x0B, 0x10, 0x03, 0x0E, 0xCA, 0x0E, 0x03,
+ 0x10, 0x03, 0xC3, 0x08, 0x10, 0x02, 0x0E, 0xC8,
+ 0x0B, 0x01, 0x10, 0x07, 0xC5, 0x0A, 0x10, 0x02,
+ 0x0D, 0xC6, 0x07, 0x10, 0x01, 0x0B, 0xC7, 0xAB,
+ 0x10, 0x1D, 0xC3, 0x0E, 0x04, 0x10, 0x04, 0x0E,
+ 0xC9, 0xAC, 0x10, 0x1C, 0xC1, 0x0C, 0x01, 0x10,
+ 0x07, 0xCC, 0x0D, 0x02, 0x10, 0x0B, 0x08, 0x10,
+ 0x01, 0x0B, 0xCE, 0x0E, 0x03, 0x30, 0x04, 0x0E,
+ 0xD1, 0x04, 0x10, 0x03, 0xD4, 0x05, 0x10, 0x06,
+ 0xD4, 0x06, 0x10, 0x05, 0xC9, 0x0B, 0x71, 0x11,
+ 0x20, 0x61, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x004C
+ 0xD5, 0x1A, 0xD4, 0x0D, 0x10, 0xD4, 0x0D, 0x10,
+ 0xD4, 0x0D, 0x10, 0xD4, 0x0D, 0x10, 0xD4, 0x0D,
+ 0x10, 0xD4, 0x0D, 0x10, 0xD4, 0x0D, 0x10, 0xD4,
+ 0x0D, 0x10, 0xD4, 0x0D, 0x10, 0xC2, 0x0B, 0x71,
+ 0x71, 0x11, 0x10, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+ 0xC2, 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x004D
+ 0xC2, 0x0D, 0x79, 0x79, 0x39, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x30, 0x01, 0x72, 0x62,
+ 0xC2, 0x0D, 0x02, 0x20, 0x81, 0x8E, 0xD1, 0x0C,
+ 0x05, 0x30, 0x05, 0x0B, 0xD1, 0x8E, 0x82, 0x20,
+ 0x02, 0x08, 0xD2, 0x0B, 0x04, 0x30, 0x06, 0x0C,
+ 0xD1, 0x8E, 0x71, 0x20, 0x03, 0x09, 0xD2, 0x0A,
+ 0x04, 0x20, 0x81, 0x6D, 0xD1, 0x8D, 0x61, 0x20,
+ 0x04, 0xD3, 0x04, 0x20, 0xD0, 0x8E, 0x82, 0x20,
+ 0x02, 0xCE, 0x0C, 0x05, 0x30, 0x05, 0x0B, 0xCD,
+ 0x09, 0x02, 0x20, 0x81, 0x8E, 0xCC, 0x8D, 0x61,
+ 0x20, 0x04, 0x0A, 0xCD, 0x0A, 0x03, 0x20, 0x81,
+ 0x7D, 0xCC, 0x8D, 0x71, 0x20, 0x03, 0x0A, 0xCD,
+ 0x0D, 0x04, 0x30, 0x06, 0x0C, 0xCF, 0x0A, 0x30,
+ 0x02, 0x74, 0x64, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+ 0xC2, 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x004E
+ 0xC2, 0x0C, 0x76, 0x76, 0x36, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0B, 0x73, 0x63, 0x02, 0x20,
+ 0x01, 0xD1, 0x0D, 0x03, 0x10, 0x03, 0x0E, 0xD0,
+ 0x08, 0x20, 0x08, 0xD0, 0x0E, 0x04, 0x10, 0x02,
+ 0x0D, 0xD0, 0x0A, 0x01, 0x10, 0x07, 0xD1, 0x05,
+ 0x10, 0x02, 0x0B, 0xD0, 0x0B, 0x01, 0x10, 0x05,
+ 0xD1, 0x06, 0x10, 0x01, 0x0A, 0xD0, 0x0C, 0x02,
+ 0x10, 0x04, 0x0E, 0xD0, 0x07, 0x20, 0x09, 0xD0,
+ 0x0D, 0x03, 0x10, 0x03, 0x0D, 0xD0, 0x09, 0x20,
+ 0x07, 0xD1, 0x0A, 0x30, 0x71, 0x71, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0D, 0x77, 0x77, 0x37,
+//ascii 0x004F
+ 0xC9, 0x8C, 0x97, 0x16, 0x87, 0x9D, 0xD0, 0x8E,
+ 0x61, 0x70, 0x02, 0x09, 0xCD, 0x0A, 0x01, 0x20,
+ 0x01, 0x03, 0x14, 0x02, 0x30, 0x03, 0x0E, 0xCA,
+ 0x09, 0x20, 0x07, 0x0D, 0xC5, 0x0B, 0x04, 0x10,
+ 0x01, 0x0D, 0xC8, 0x0C, 0x10, 0x03, 0x0E, 0xC9,
+ 0x0A, 0x10, 0x03, 0xC8, 0x83, 0x02, 0xCC, 0x0B,
+ 0x10, 0x09, 0xC6, 0x0D, 0x10, 0x0B, 0xCD, 0x85,
+ 0x02, 0xC6, 0x89, 0x01, 0xCE, 0x0B, 0x10, 0x0E,
+ 0xC5, 0x86, 0x04, 0xCE, 0x0E, 0x10, 0x0C, 0xC5,
+ 0x86, 0x05, 0xCF, 0x10, 0x0C, 0xC5, 0x87, 0x03,
+ 0xCE, 0x0E, 0x10, 0x0D, 0xC5, 0x0A, 0x10, 0xCE,
+ 0x09, 0x10, 0xC6, 0x0E, 0x10, 0x08, 0xCD, 0x82,
+ 0x04, 0xC7, 0x06, 0x10, 0x0C, 0xCB, 0x06, 0x10,
+ 0x0C, 0xC8, 0x01, 0x10, 0x09, 0xC8, 0x0E, 0x05,
+ 0x10, 0x06, 0xC9, 0x0D, 0x01, 0x10, 0x92, 0x8C,
+ 0xE0, 0xC0, 0xAE, 0xDA, 0x61, 0x10, 0x04, 0xCB,
+ 0x0E, 0x04, 0x70, 0x30, 0x08, 0xCE, 0x8C, 0x51,
+ 0x50, 0x82, 0x7E, 0xD2, 0x0E, 0x0C, 0x1B, 0x0C,
+ 0x0E, 0xC0,
+//ascii 0x0050
+ 0xC7, 0x0E, 0x1C, 0x0E, 0xD1, 0x0B, 0x03, 0x30,
+ 0x02, 0x09, 0xCE, 0x07, 0x70, 0x04, 0xCC, 0x0A,
+ 0x10, 0x03, 0x0A, 0x1D, 0x0A, 0x04, 0x10, 0x07,
+ 0xCB, 0x83, 0x04, 0xC5, 0x06, 0x10, 0xCA, 0x0E,
+ 0x10, 0x0D, 0xC6, 0x81, 0x0A, 0xC9, 0x8B, 0x01,
+ 0xC7, 0x84, 0x08, 0xC9, 0x8A, 0x03, 0xC7, 0x86,
+ 0x07, 0xC9, 0x8A, 0x03, 0xC7, 0x86, 0x07, 0xC9,
+ 0x8A, 0x03, 0xC7, 0x86, 0x07, 0xC9, 0x8A, 0x03,
+ 0xC7, 0x86, 0x07, 0xC9, 0x8A, 0x03, 0xC7, 0x86,
+ 0x07, 0xC9, 0x0A, 0x10, 0x71, 0x20, 0x61, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D, 0x77, 0x77,
+ 0x37,
+//ascii 0x0051
+ 0xC9, 0x8C, 0x97, 0x16, 0x87, 0x9D, 0xD0, 0x8E,
+ 0x61, 0x70, 0x02, 0x09, 0xC4, 0x09, 0xC7, 0x0A,
+ 0x01, 0x20, 0x01, 0x03, 0x14, 0x02, 0x30, 0x03,
+ 0x0E, 0xC0, 0x8E, 0x41, 0xC6, 0x09, 0x20, 0x07,
+ 0x0D, 0xC5, 0x0B, 0x04, 0x10, 0xA1, 0xA1, 0x02,
+ 0xC5, 0x0C, 0x10, 0x03, 0x0E, 0xC9, 0x0A, 0x30,
+ 0x02, 0x0C, 0xC5, 0x83, 0x02, 0xCC, 0x03, 0x10,
+ 0x03, 0xC6, 0x0D, 0x10, 0x0B, 0xCA, 0x0C, 0x02,
+ 0x20, 0x02, 0xC6, 0x89, 0x01, 0xCA, 0x0C, 0x10,
+ 0x02, 0x08, 0x10, 0x0E, 0xC5, 0x86, 0x04, 0xCA,
+ 0x8A, 0x05, 0xC0, 0x0E, 0x10, 0x0C, 0xC5, 0x86,
+ 0x05, 0xCA, 0x0A, 0x08, 0xC2, 0x10, 0x0C, 0xC5,
+ 0x87, 0x03, 0xCE, 0x0E, 0x10, 0x0D, 0xC5, 0x0A,
+ 0x10, 0xCE, 0x09, 0x10, 0xC6, 0x0E, 0x10, 0x08,
+ 0xCD, 0x82, 0x04, 0xC7, 0x06, 0x10, 0x0C, 0xCB,
+ 0x06, 0x10, 0x0C, 0xC8, 0x01, 0x10, 0x09, 0xC8,
+ 0x0E, 0x05, 0x10, 0x06, 0xC9, 0x0D, 0x01, 0x10,
+ 0x92, 0x8C, 0xE0, 0xC0, 0xAE, 0xDA, 0x61, 0x10,
+ 0x04, 0xCB, 0x0E, 0x04, 0x70, 0x30, 0x08, 0xCE,
+ 0x8C, 0x51, 0x50, 0x82, 0x7E, 0xD2, 0x0E, 0x0C,
+ 0x1B, 0x0C, 0x0E, 0xC0,
+//ascii 0x0052
+ 0xDF, 0x0E, 0x1C, 0xCA, 0x0C, 0x03, 0xC5, 0x09,
+ 0x02, 0x30, 0x04, 0x0C, 0xC5, 0x0D, 0x05, 0x10,
+ 0xC4, 0x06, 0x70, 0x0A, 0xC3, 0x06, 0x20, 0x01,
+ 0xC3, 0x0A, 0x10, 0x04, 0x0A, 0x1D, 0x09, 0x02,
+ 0x10, 0x0E, 0xC0, 0x08, 0x01, 0x20, 0x06, 0x0E,
+ 0xC3, 0x82, 0x05, 0xC4, 0xAE, 0x10, 0x42, 0x20,
+ 0x05, 0x0D, 0xC4, 0x0E, 0x10, 0x0D, 0xC5, 0x08,
+ 0x30, 0x04, 0x0C, 0xC6, 0x8B, 0x01, 0xC6, 0x0C,
+ 0x10, 0x03, 0x0B, 0xC8, 0x8A, 0x03, 0xC6, 0x0D,
+ 0x10, 0xCA, 0x8A, 0x03, 0xC6, 0x0D, 0x10, 0xCA,
+ 0x8A, 0x03, 0xC6, 0x0D, 0x10, 0xCA, 0x8A, 0x03,
+ 0xC6, 0x0D, 0x10, 0xCA, 0x8A, 0x03, 0xC6, 0x0D,
+ 0x10, 0xCA, 0x0A, 0x10, 0x71, 0x10, 0x71, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0D, 0x77, 0x77,
+ 0x37,
+//ascii 0x0053
+ 0xD0, 0x8D, 0xCD, 0xCD, 0x8A, 0x45, 0xC5, 0x0B,
+ 0x02, 0x20, 0x02, 0x0A, 0xCA, 0x06, 0x10, 0x04,
+ 0xC4, 0x0B, 0x60, 0x08, 0xC8, 0x09, 0x10, 0x03,
+ 0x0A, 0xC4, 0xB1, 0x02, 0xBE, 0xB0, 0x03, 0x10,
+ 0x0C, 0xC7, 0x81, 0x05, 0xC5, 0x08, 0x10, 0x0E,
+ 0xC3, 0x82, 0x04, 0xC6, 0x0B, 0x10, 0xC6, 0x83,
+ 0x06, 0xC4, 0x0A, 0x10, 0xC6, 0x87, 0x04, 0xC5,
+ 0x0E, 0x10, 0x0C, 0xC5, 0x10, 0x0C, 0xC5, 0x86,
+ 0x07, 0xC5, 0x89, 0x01, 0xC6, 0x81, 0x0B, 0xC5,
+ 0x86, 0x07, 0xC5, 0x85, 0x05, 0xC6, 0x82, 0x0A,
+ 0xC5, 0x88, 0x04, 0xC5, 0x81, 0x0A, 0xC6, 0x10,
+ 0x0C, 0xC5, 0x0C, 0x10, 0x0E, 0xC3, 0x09, 0x10,
+ 0xC6, 0x0B, 0x10, 0x0E, 0xC6, 0x82, 0x04, 0xC2,
+ 0x9E, 0x10, 0x60, 0xC6, 0x83, 0x03, 0xC7, 0x0B,
+ 0x10, 0xB2, 0x76, 0x10, 0x10, 0x0E, 0xC4, 0x0B,
+ 0x03, 0x10, 0x0B, 0xC8, 0x09, 0x50, 0x0B, 0xC4,
+ 0x0C, 0x20, 0x06, 0xCA, 0x0D, 0x06, 0x13, 0x06,
+ 0x0D, 0xC5, 0x9C, 0x01, 0x80, 0xD7, 0x0E, 0x0B,
+//ascii 0x0054
+ 0xC2, 0x8C, 0x68, 0xD4, 0x8A, 0x03, 0xD4, 0x8A,
+ 0x03, 0xD4, 0x8A, 0x03, 0xD4, 0x8A, 0x03, 0xD4,
+ 0x8A, 0x03, 0xD4, 0x8A, 0x02, 0x7C, 0x7C, 0x1C,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x8A, 0x02, 0x7C, 0x7C, 0x1C,
+ 0xC2, 0x8A, 0x03, 0xD4, 0x8A, 0x03, 0xD4, 0x8A,
+ 0x03, 0xD4, 0x8A, 0x03, 0xD4, 0x8A, 0x03, 0xD4,
+ 0x8C, 0x67,
+//ascii 0x0055
+ 0xC2, 0x0E, 0x7B, 0x4B, 0x0C, 0x0D, 0xCB, 0x0A,
+ 0x70, 0x60, 0x02, 0x08, 0xC9, 0x0A, 0x70, 0x70,
+ 0x80, 0x3E, 0xC8, 0x7D, 0x5D, 0x0A, 0x03, 0x10,
+ 0x03, 0xD8, 0x07, 0x10, 0x09, 0xD8, 0x84, 0x02,
+ 0xD8, 0x0B, 0x10, 0x0E, 0xD8, 0x10, 0x0B, 0xD8,
+ 0x10, 0x0A, 0xD8, 0x10, 0x0B, 0xD7, 0x0D, 0x10,
+ 0x0D, 0xD7, 0x86, 0x01, 0xD7, 0x0B, 0x10, 0x07,
+ 0xD5, 0x0D, 0x07, 0x10, 0x01, 0xC7, 0x0B, 0x71,
+ 0x41, 0x30, 0x01, 0x0C, 0xC7, 0x0A, 0x70, 0x70,
+ 0x04, 0x0E, 0xC8, 0x0D, 0x77, 0x47, 0x88, 0xAE,
+//ascii 0x0056
+ 0xDA, 0x9A, 0x27, 0xD0, 0xD3, 0x0A, 0x20, 0x03,
+ 0x09, 0xD1, 0x0D, 0x05, 0x40, 0x05, 0x0B, 0xD1,
+ 0x0A, 0x04, 0x30, 0x81, 0x6C, 0xD0, 0x8E, 0x93,
+ 0x30, 0x82, 0x8E, 0xD0, 0x8E, 0x82, 0x30, 0x04,
+ 0x0A, 0xD1, 0x8D, 0x72, 0x20, 0x81, 0x5B, 0xD1,
+ 0x8C, 0x61, 0x20, 0x01, 0xD3, 0x06, 0x20, 0xD0,
+ 0x8D, 0x72, 0x20, 0x01, 0xCD, 0x8E, 0x83, 0x30,
+ 0x04, 0x0A, 0xCC, 0x09, 0x04, 0x30, 0x83, 0x8E,
+ 0xCB, 0x0A, 0x05, 0x30, 0x81, 0x7D, 0xCB, 0x8B,
+ 0x51, 0x30, 0x05, 0x0B, 0xCB, 0x8E, 0x61, 0x30,
+ 0x04, 0x0A, 0xCE, 0x0A, 0x20, 0x82, 0x8E, 0xD0,
+ 0x9A, 0x16, 0xC0, 0xC0,
+//ascii 0x0057
+ 0xC2, 0x9B, 0x49, 0xD0, 0xD3, 0x0A, 0x20, 0x91,
+ 0x6A, 0xE0, 0xCF, 0x0D, 0x04, 0x50, 0x83, 0x7C,
+ 0xCF, 0x8C, 0x83, 0x50, 0x84, 0x9D, 0xCF, 0x8B,
+ 0x73, 0x40, 0x91, 0x6A, 0xE0, 0xCF, 0x8B, 0x73,
+ 0x40, 0x03, 0x07, 0xD0, 0x9E, 0xA6, 0x10, 0x20,
+ 0xD0, 0x8B, 0x73, 0x30, 0xCC, 0x8C, 0x84, 0x40,
+ 0x83, 0x7C, 0xC8, 0x9D, 0x84, 0x10, 0x30, 0x91,
+ 0x5A, 0xE0, 0xC7, 0x9D, 0x95, 0x10, 0x40, 0x84,
+ 0x8C, 0xC9, 0x0C, 0x02, 0x40, 0x82, 0x6B, 0xCD,
+ 0x0A, 0x20, 0x81, 0x8D, 0xD0, 0x0A, 0x30, 0x91,
+ 0x49, 0xD0, 0xCF, 0x8B, 0x72, 0x40, 0x82, 0x6B,
+ 0xCF, 0x9E, 0xA6, 0x20, 0x40, 0x84, 0x8C, 0xCF,
+ 0x9D, 0x95, 0x10, 0x30, 0x91, 0x5A, 0xE0, 0xCF,
+ 0x9D, 0x84, 0x10, 0x30, 0x03, 0xD2, 0x09, 0x01,
+ 0x20, 0xCE, 0x9E, 0x95, 0x10, 0x30, 0x01, 0xCA,
+ 0x9E, 0xA6, 0x20, 0x40, 0x83, 0x8C, 0xC7, 0x9E,
+ 0xA6, 0x20, 0x40, 0x82, 0x6B, 0xC8, 0x8B, 0x73,
+ 0x40, 0x91, 0x59, 0xD0, 0xCA, 0x0A, 0x40, 0x83,
+ 0x8C, 0xCE, 0xAA, 0x02, 0x6A, 0xD2, 0x0E, 0x0D,
+ 0xC0,
+//ascii 0x0058
+ 0xDA, 0x8A, 0x5E, 0xCF, 0x0C, 0x02, 0xC2, 0x9A,
+ 0x01, 0x90, 0xCD, 0x06, 0x10, 0xC2, 0x0B, 0x20,
+ 0x04, 0x0D, 0xC9, 0x0A, 0x01, 0x10, 0x01, 0xC3,
+ 0x0C, 0x03, 0x20, 0x07, 0xC6, 0x0E, 0x04, 0x20,
+ 0x06, 0xC6, 0x09, 0x01, 0x10, 0x02, 0x0C, 0xC3,
+ 0x08, 0x20, 0x02, 0x0C, 0xC8, 0x0E, 0x05, 0x20,
+ 0x06, 0xC0, 0x0C, 0x02, 0x20, 0x07, 0xCC, 0x0B,
+ 0x02, 0x10, 0x01, 0x20, 0x03, 0x0D, 0xCF, 0x07,
+ 0x20, 0x01, 0x09, 0xD1, 0x07, 0x20, 0x01, 0x0A,
+ 0xCF, 0x0B, 0x02, 0x10, 0x02, 0x20, 0x04, 0x0E,
+ 0xCB, 0x0E, 0x05, 0x20, 0x07, 0xC0, 0x0D, 0x04,
+ 0x20, 0x08, 0xC9, 0x09, 0x01, 0x10, 0x03, 0x0D,
+ 0xC3, 0x09, 0x01, 0x10, 0x03, 0x0C, 0xC5, 0x0D,
+ 0x03, 0x20, 0x08, 0xC6, 0x0E, 0x05, 0x20, 0x06,
+ 0xC3, 0x0C, 0x20, 0x04, 0x0E, 0xC9, 0x0A, 0x01,
+ 0x10, 0x01, 0xC2, 0x9A, 0x01, 0xA0, 0xCD, 0x06,
+ 0x10, 0xC2, 0x8A, 0x5E, 0xCF, 0x0B, 0x02,
+//ascii 0x0059
+ 0xC2, 0x0B, 0x0A, 0xD5, 0x9A, 0x04, 0xD0, 0xD3,
+ 0x0A, 0x20, 0x08, 0xD3, 0x09, 0x01, 0x10, 0x02,
+ 0x0B, 0xD3, 0x06, 0x20, 0x05, 0x0E, 0xD2, 0x0C,
+ 0x03, 0x10, 0x01, 0x09, 0xD3, 0x09, 0x01, 0x10,
+ 0x03, 0x0C, 0xD3, 0x06, 0x20, 0x05, 0x77, 0xCB,
+ 0x0D, 0x01, 0x70, 0x10, 0xCA, 0x0C, 0x03, 0x10,
+ 0x71, 0x01, 0xC9, 0x06, 0x20, 0x06, 0xD0, 0x09,
+ 0x01, 0x10, 0x03, 0x0C, 0xCF, 0x0C, 0x03, 0x10,
+ 0x01, 0x09, 0xCF, 0x0E, 0x06, 0x20, 0x05, 0x0E,
+ 0xCF, 0x0C, 0x01, 0x10, 0x02, 0x0B, 0xD1, 0x0A,
+ 0x10, 0x08, 0xD3, 0x8A, 0x4D,
+//ascii 0x005A
+ 0xC2, 0x8C, 0x57, 0xCE, 0x0D, 0x13, 0xC2, 0x0A,
+ 0x10, 0x01, 0x0B, 0xCC, 0x0D, 0x10, 0xC2, 0x0A,
+ 0x30, 0x06, 0xCB, 0x0D, 0x10, 0xC2, 0x9A, 0x02,
+ 0x50, 0x10, 0x01, 0x0B, 0xC9, 0x0D, 0x10, 0xC2,
+ 0x8A, 0x03, 0xC0, 0x0A, 0x01, 0x10, 0x06, 0xC8,
+ 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xC1, 0x0E, 0x05,
+ 0x10, 0x02, 0x0B, 0xC6, 0x0D, 0x10, 0xC2, 0x8A,
+ 0x03, 0xC3, 0x0A, 0x01, 0x10, 0x06, 0xC5, 0x0D,
+ 0x10, 0xC2, 0x8A, 0x03, 0xC4, 0x0E, 0x05, 0x10,
+ 0x02, 0x0B, 0xC3, 0x0D, 0x10, 0xC2, 0x8A, 0x03,
+ 0xC6, 0x0A, 0x01, 0x10, 0x06, 0xC2, 0x0D, 0x10,
+ 0xC2, 0x8A, 0x03, 0xC7, 0x0E, 0x05, 0x10, 0x02,
+ 0x0B, 0xC0, 0x0D, 0x10, 0xC2, 0x8A, 0x03, 0xC9,
+ 0x0A, 0x01, 0x10, 0x06, 0x0C, 0x10, 0xC2, 0x8A,
+ 0x03, 0xCA, 0x0E, 0x04, 0x10, 0x01, 0x10, 0xC2,
+ 0x8A, 0x03, 0xCC, 0x0A, 0x01, 0x20, 0xC2, 0x8A,
+ 0x03, 0xCD, 0x0E, 0x04, 0x10, 0xC2, 0x8E, 0xBC,
+ 0xCF, 0x1D,
+//ascii 0x005B
+ 0xC2, 0x0D, 0x0E, 0xD4, 0x0E, 0x0D, 0xC5, 0x8B,
+ 0x06, 0xD4, 0x83, 0x0E, 0xC4, 0x8B, 0x06, 0xD4,
+ 0x83, 0x0E, 0xC4, 0x8B, 0x06, 0xD4, 0x83, 0x0E,
+ 0xC4, 0x8B, 0x03, 0x77, 0x77, 0x47, 0x81, 0x0E,
+ 0xC4, 0x0B, 0x70, 0x70, 0x70, 0x00, 0x0E, 0xC4,
+ 0x0C, 0x75, 0x75, 0x75, 0x05, 0x0E, 0xC0,
+//ascii 0x005C
+ 0xD9, 0x0D, 0xD6, 0xAE, 0xA5, 0x10, 0xD3, 0x8B,
+ 0x72, 0x30, 0x01, 0xCF, 0x8C, 0x84, 0x40, 0x84,
+ 0x8C, 0xCC, 0x9D, 0x95, 0x10, 0x30, 0x83, 0x7B,
+ 0xCD, 0x8A, 0x62, 0x30, 0x91, 0x6A, 0xE0, 0xCC,
+ 0x8C, 0x73, 0x30, 0x91, 0x49, 0xD0, 0xCE, 0x0C,
+ 0x40, 0x83, 0x8C, 0xD2, 0xAB, 0x02, 0x6B, 0xD6,
+ 0x1E,
+//ascii 0x005D
+ 0xC1, 0x0C, 0x72, 0x72, 0x72, 0x02, 0x0E, 0xC4,
+ 0x0B, 0x70, 0x70, 0x70, 0x00, 0x0E, 0xC4, 0x8B,
+ 0x04, 0x7A, 0x7A, 0x4A, 0x82, 0x0E, 0xC4, 0x8B,
+ 0x06, 0xD4, 0x83, 0x0E, 0xC4, 0x8B, 0x06, 0xD4,
+ 0x83, 0x0E, 0xC4, 0x8B, 0x06, 0xD4, 0x83, 0x0E,
+ 0xC0,
+//ascii 0x005E
+ 0xC6, 0x0A, 0x05, 0xC7, 0x99, 0x20, 0x20, 0xC5,
+ 0x09, 0x02, 0x10, 0x01, 0x09, 0xC3, 0x08, 0x01,
+ 0x10, 0x02, 0x09, 0xC4, 0x04, 0x10, 0x02, 0x0A,
+ 0xC6, 0x84, 0x04, 0xC8, 0x05, 0x10, 0x01, 0x08,
+ 0xC7, 0x0A, 0x02, 0x20, 0x06, 0x0E, 0xC6, 0x0B,
+ 0x03, 0x20, 0x06, 0xC7, 0x9B, 0x40, 0x20, 0xC9,
+ 0x0C, 0x07, 0xC0,
+//ascii 0x005F
+ 0x15, 0x0E, 0xC0, 0x10, 0x0D, 0xC0, 0x10, 0x0D,
+ 0xC0, 0x10, 0x0D, 0xC0, 0x10, 0x0D, 0xC0, 0x10,
+ 0x0D, 0xC0, 0x10, 0x0D, 0xC0, 0x10, 0x0D, 0xC0,
+ 0x10, 0x0D, 0xC0, 0x10, 0x0D, 0xC0, 0x10, 0x0D,
+ 0xC0, 0x10, 0x0D, 0xC0, 0x10, 0x0D, 0xC0,
+//ascii 0x0060
+ 0xC5, 0x0C, 0xC4, 0x89, 0x25, 0xC2, 0x0A, 0x02,
+ 0x10, 0x08, 0xC2, 0x91, 0x02, 0xB0, 0xC3, 0x01,
+ 0x06, 0xC5, 0x0B, 0xC0,
+//ascii 0x0061
+ 0xC2, 0x0C, 0x08, 0x76, 0x26, 0xC5, 0x05, 0x70,
+ 0x40, 0xC4, 0x06, 0x10, 0xA2, 0x41, 0x03, 0x15,
+ 0x02, 0x10, 0x04, 0x05, 0xC4, 0x10, 0x08, 0xC1,
+ 0x8B, 0x05, 0xC2, 0x8A, 0x13, 0xC4, 0x8B, 0x03,
+ 0xC2, 0x8E, 0x02, 0xC3, 0x89, 0x06, 0xC3, 0x89,
+ 0x06, 0xC3, 0x01, 0x00, 0xC4, 0x81, 0x0E, 0xC2,
+ 0x89, 0x06, 0xC3, 0x82, 0x0D, 0xC3, 0x84, 0x0B,
+ 0xC2, 0x8B, 0x03, 0xC3, 0x85, 0x0B, 0xC3, 0x83,
+ 0x0A, 0xC2, 0x0E, 0x10, 0x0B, 0xC2, 0x88, 0x06,
+ 0xC3, 0x81, 0x0C, 0xC3, 0x95, 0x01, 0xB0, 0xC1,
+ 0x0C, 0x10, 0x0C, 0xC1, 0x87, 0x01, 0xC4, 0x9E,
+ 0x10, 0x50, 0xC2, 0x03, 0x10, 0x03, 0x02, 0x10,
+ 0x08, 0xC5, 0x8D, 0x3B, 0xC2, 0x0D, 0x01, 0x30,
+ 0x06, 0xCE, 0x99, 0x78, 0xD0,
+//ascii 0x0062
+ 0xCB, 0x8C, 0x73, 0x11, 0x92, 0x48, 0xD0, 0xD0,
+ 0x0E, 0x04, 0x70, 0x00, 0x06, 0xCE, 0x0E, 0x02,
+ 0x10, 0xB2, 0x79, 0xA8, 0x60, 0x01, 0x10, 0x04,
+ 0xCD, 0x95, 0x01, 0xA0, 0xC6, 0x07, 0x10, 0x07,
+ 0xCB, 0x0E, 0x10, 0x0B, 0xC8, 0x88, 0x01, 0xCB,
+ 0x8A, 0x02, 0xCA, 0x10, 0x0C, 0xCA, 0x89, 0x05,
+ 0xCA, 0x83, 0x0B, 0xCA, 0x8A, 0x05, 0xCA, 0x82,
+ 0x0C, 0xCA, 0x8D, 0x01, 0xC9, 0x8E, 0x01, 0xCC,
+ 0x86, 0x07, 0xC8, 0x84, 0x09, 0xCD, 0x97, 0x04,
+ 0xC0, 0xC4, 0x9B, 0x31, 0xA0, 0xC7, 0x0B, 0x63,
+ 0x20, 0x91, 0x34, 0x30, 0x20, 0x01, 0x14, 0xC6,
+ 0x0A, 0x70, 0x70, 0x30, 0xC6, 0x0D, 0x77, 0x77,
+ 0x37,
+//ascii 0x0063
+ 0xC3, 0x0D, 0x0E, 0xC4, 0x1E, 0xC8, 0x9E, 0x40,
+ 0xB0, 0xC4, 0x89, 0x05, 0xC6, 0x0E, 0x01, 0x10,
+ 0x0B, 0xC4, 0x09, 0x10, 0x03, 0xC5, 0x94, 0x01,
+ 0xB0, 0xC6, 0x9A, 0x10, 0x70, 0xC3, 0x0E, 0x10,
+ 0x0C, 0xC8, 0x8A, 0x01, 0xC3, 0x8A, 0x03, 0xCA,
+ 0x81, 0x0C, 0xC2, 0x89, 0x05, 0xCA, 0x83, 0x0B,
+ 0xC2, 0x89, 0x04, 0xCA, 0x82, 0x0C, 0xC2, 0x0C,
+ 0x10, 0xC9, 0x0D, 0x10, 0xC4, 0x82, 0x04, 0xC8,
+ 0x83, 0x04, 0xC4, 0x0B, 0x10, 0x03, 0x0B, 0xC4,
+ 0x0A, 0x02, 0x10, 0x0D, 0xC5, 0x09, 0x20, 0x01,
+ 0x13, 0x02, 0x30, 0x0B, 0xC7, 0x0C, 0x04, 0x60,
+ 0x05, 0x0D, 0xCA, 0xBE, 0xA8, 0x78, 0xA0, 0x0E,
+//ascii 0x0064
+ 0xC2, 0x0B, 0x71, 0x71, 0x31, 0xC6, 0x0A, 0x70,
+ 0x70, 0x30, 0xC6, 0x0D, 0x59, 0xB8, 0x10, 0x27,
+ 0x90, 0xBA, 0x96, 0x10, 0x20, 0x1A, 0xCC, 0x9E,
+ 0x21, 0xB0, 0xC6, 0x88, 0x04, 0xCD, 0x83, 0x0B,
+ 0xC8, 0x88, 0x05, 0xCB, 0x8B, 0x03, 0xCA, 0x81,
+ 0x0E, 0xCA, 0x89, 0x05, 0xCA, 0x83, 0x0B, 0xCA,
+ 0x89, 0x05, 0xCA, 0x82, 0x0B, 0xCA, 0x8B, 0x01,
+ 0xC9, 0x0D, 0x10, 0x0E, 0xCB, 0x81, 0x06, 0xC8,
+ 0x83, 0x03, 0xCC, 0x09, 0x10, 0x04, 0x0C, 0xC4,
+ 0x0A, 0x02, 0x10, 0x0B, 0xCD, 0x06, 0x20, 0x01,
+ 0x13, 0x02, 0x30, 0x09, 0xCF, 0x0B, 0x03, 0x60,
+ 0x04, 0x0C, 0xD2, 0xBD, 0xA8, 0x78, 0xA0, 0x0E,
+//ascii 0x0065
+ 0xC3, 0x8C, 0x74, 0x12, 0x0E, 0xC1, 0x0A, 0x0D,
+ 0xC7, 0x0E, 0x04, 0x40, 0x0D, 0xC1, 0x82, 0x0A,
+ 0xC5, 0x0E, 0x02, 0x10, 0xA4, 0x71, 0x0D, 0xC1,
+ 0x02, 0x10, 0x0C, 0xC4, 0x95, 0x01, 0xC0, 0xC1,
+ 0x82, 0x0D, 0xC2, 0x83, 0x04, 0xC3, 0x0E, 0x10,
+ 0x0C, 0xC2, 0x82, 0x0D, 0xC2, 0x0D, 0x10, 0xC3,
+ 0x8A, 0x03, 0xC3, 0x82, 0x0D, 0xC3, 0x82, 0x0C,
+ 0xC2, 0x89, 0x05, 0xC3, 0x82, 0x0D, 0xC3, 0x83,
+ 0x0B, 0xC2, 0x89, 0x04, 0xC3, 0x82, 0x0D, 0xC3,
+ 0x81, 0x0C, 0xC2, 0x8C, 0x01, 0xC3, 0x82, 0x0D,
+ 0xC2, 0x0D, 0x10, 0xC4, 0x82, 0x06, 0xC2, 0x82,
+ 0x0D, 0xC2, 0x83, 0x05, 0xC4, 0x0B, 0x10, 0x05,
+ 0x0D, 0xC0, 0x82, 0x0D, 0xC0, 0x0C, 0x03, 0x10,
+ 0x0D, 0xC5, 0x09, 0x20, 0x02, 0x10, 0x02, 0x01,
+ 0x20, 0x0B, 0xC7, 0x0C, 0x04, 0x60, 0x04, 0x0D,
+ 0xCA, 0xBE, 0xA8, 0x78, 0xA0, 0x0E,
+//ascii 0x0066
+ 0xC2, 0x07, 0x0C, 0xD4, 0x8C, 0x01, 0xC2, 0x8C,
+ 0x15, 0xCE, 0x8B, 0x02, 0xC2, 0x8C, 0x04, 0xCE,
+ 0x0D, 0x10, 0x0D, 0xC1, 0x8C, 0x04, 0xCF, 0xA2,
+ 0x01, 0x67, 0x85, 0x02, 0x77, 0x47, 0xC2, 0x0B,
+ 0x70, 0x70, 0x30, 0xC3, 0x0C, 0x05, 0x13, 0x82,
+ 0x01, 0x73, 0x43, 0xC7, 0x8C, 0x04, 0xD4, 0x8C,
+ 0x04, 0xD5, 0x0B, 0x0D, 0xC0,
+//ascii 0x0067
+ 0x0C, 0x71, 0x71, 0x83, 0x7E, 0xC3, 0x0C, 0x70,
+ 0x70, 0x10, 0x01, 0x0C, 0xC2, 0xBE, 0xA9, 0x10,
+ 0x30, 0xA7, 0x9A, 0x85, 0x10, 0x06, 0x29, 0x96,
+ 0x10, 0x10, 0xC3, 0x9D, 0x21, 0xB0, 0xC5, 0x9E,
+ 0x40, 0xA0, 0xC2, 0x9E, 0x10, 0x80, 0xC2, 0x83,
+ 0x0B, 0xC8, 0x82, 0x0D, 0xC2, 0x89, 0x03, 0xC1,
+ 0x8B, 0x03, 0xC9, 0x88, 0x07, 0xC2, 0x8E, 0x01,
+ 0xC1, 0x89, 0x05, 0xC9, 0x8A, 0x04, 0xC3, 0x10,
+ 0xC1, 0x89, 0x05, 0xC9, 0x89, 0x04, 0xC3, 0x10,
+ 0xC1, 0x8B, 0x01, 0xC9, 0x85, 0x06, 0xC2, 0x8C,
+ 0x02, 0xC2, 0x81, 0x06, 0xC7, 0x0B, 0x10, 0x0B,
+ 0xC2, 0x84, 0x06, 0xC2, 0x09, 0x10, 0x04, 0x0C,
+ 0xC3, 0x0E, 0x08, 0x10, 0x03, 0xC2, 0x06, 0x10,
+ 0x0C, 0xC3, 0x06, 0x20, 0x01, 0x13, 0x02, 0x20,
+ 0x02, 0x0E, 0xC1, 0x9E, 0x10, 0x70, 0xC5, 0x0A,
+ 0x02, 0x60, 0x06, 0xC4, 0x0B, 0x07, 0xC8, 0xBD,
+ 0x98, 0x78, 0xB0, 0xC0,
+//ascii 0x0068
+ 0xCB, 0x0D, 0x7A, 0x2A, 0xC9, 0x0A, 0x01, 0x70,
+ 0x30, 0xC8, 0x09, 0x30, 0x71, 0x11, 0xC8, 0x91,
+ 0x01, 0xA0, 0xD2, 0x0B, 0x10, 0x0D, 0xD3, 0x89,
+ 0x04, 0xD4, 0x89, 0x05, 0xD4, 0x8C, 0x04, 0xD5,
+ 0x83, 0x0E, 0xD4, 0x9D, 0x23, 0xE0, 0xCD, 0x0D,
+ 0x58, 0x97, 0x01, 0x50, 0x78, 0x18, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0B, 0x72, 0x72, 0x32,
+//ascii 0x0069
+ 0xDA, 0x88, 0x05, 0xC1, 0x0E, 0x78, 0x68, 0xC2,
+ 0x01, 0x10, 0x0E, 0xC0, 0x0C, 0x70, 0x60, 0xC2,
+ 0x84, 0x02, 0xC1, 0x0C, 0x72, 0x62, 0xC3, 0x0B,
+ 0xC0,
+//ascii 0x006A
+ 0xC2, 0x89, 0x16, 0xC1, 0x0E, 0x78, 0x78, 0x08,
+ 0x0A, 0xC7, 0x01, 0x10, 0x0E, 0xC0, 0x0C, 0x70,
+ 0x70, 0x10, 0x01, 0x0A, 0xC5, 0x84, 0x01, 0xC1,
+ 0x0C, 0x72, 0x72, 0x02, 0x20, 0x0D, 0xC5, 0x0A,
+ 0x0E, 0xD3, 0x9E, 0x20, 0x70, 0xDC, 0x88, 0x05,
+ 0xDC, 0x8D, 0xAC,
+//ascii 0x006B
+ 0xD6, 0x09, 0xC7, 0x0C, 0x07, 0xCB, 0x06, 0x00,
+ 0xC7, 0x8C, 0x06, 0xC8, 0x0E, 0x03, 0x10, 0xC7,
+ 0x0D, 0x10, 0x06, 0xC6, 0x0B, 0x01, 0x10, 0x07,
+ 0xC8, 0x0B, 0x10, 0x06, 0xC4, 0x08, 0x10, 0x01,
+ 0x0B, 0xCA, 0x0B, 0x10, 0x06, 0xC2, 0x05, 0x10,
+ 0x02, 0x0D, 0xCC, 0x0B, 0x10, 0x86, 0xD3, 0x10,
+ 0x05, 0xCF, 0x0B, 0x01, 0x30, 0x08, 0xD1, 0xAC,
+ 0x10, 0x1B, 0xD3, 0x9C, 0x10, 0xA0, 0xC8, 0x0D,
+ 0x78, 0x28, 0x04, 0x10, 0x07, 0x48, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0B, 0x72, 0x72, 0x32,
+//ascii 0x006C
+ 0xC2, 0x0D, 0x78, 0x78, 0x38, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0B, 0x72, 0x72, 0x32,
+//ascii 0x006D
+ 0xC4, 0x7D, 0x2D, 0xC1, 0x09, 0x02, 0x70, 0x30,
+ 0xC0, 0x08, 0x70, 0x50, 0x0E, 0x10, 0x02, 0x0A,
+ 0x7D, 0x2D, 0x0A, 0x10, 0x0E, 0xCB, 0x89, 0x04,
+ 0xCC, 0x8A, 0x05, 0xCC, 0x8E, 0x02, 0xCD, 0x86,
+ 0x09, 0xCD, 0x96, 0x05, 0x90, 0x7A, 0x1A, 0xC1,
+ 0x09, 0x70, 0x40, 0xC0, 0x07, 0x70, 0x50, 0x0E,
+ 0x10, 0x03, 0x0D, 0xCA, 0x8A, 0x01, 0xCC, 0x89,
+ 0x05, 0xCC, 0x8B, 0x05, 0xCD, 0x11, 0xCD, 0x8C,
+ 0x14, 0xCB, 0xBE, 0x97, 0x01, 0x60, 0x78, 0x18,
+ 0x0C, 0x70, 0x60, 0x0C, 0x72, 0x62,
+//ascii 0x006E
+ 0xC4, 0x0D, 0x7C, 0x1C, 0xC1, 0x0C, 0x04, 0x70,
+ 0x30, 0xC0, 0x0B, 0x70, 0x50, 0xC0, 0x01, 0x10,
+ 0x08, 0x0D, 0x7E, 0x1E, 0x0B, 0x10, 0x0B, 0xCB,
+ 0x89, 0x03, 0xCC, 0x89, 0x05, 0xCC, 0x8C, 0x04,
+ 0xCD, 0x82, 0x0E, 0xCC, 0x9D, 0x13, 0xE0, 0xCA,
+ 0xBE, 0x98, 0x01, 0x50, 0x78, 0x18, 0x0C, 0x70,
+ 0x60, 0x0C, 0x72, 0x62,
+//ascii 0x006F
+ 0xC5, 0x0E, 0x1C, 0x0D, 0xCD, 0x08, 0x02, 0x40,
+ 0x03, 0x09, 0xC8, 0x0D, 0x02, 0x70, 0x80, 0x3E,
+ 0xC5, 0x0E, 0x01, 0x10, 0x86, 0xBE, 0xC0, 0x8E,
+ 0xB5, 0x10, 0x02, 0xC5, 0x94, 0x02, 0xD0, 0xC6,
+ 0x9C, 0x10, 0x70, 0xC3, 0x0E, 0x10, 0x0D, 0xC8,
+ 0x8B, 0x01, 0xC3, 0x8A, 0x03, 0xCA, 0x81, 0x0C,
+ 0xC2, 0x89, 0x05, 0xCA, 0x83, 0x0B, 0xC2, 0x89,
+ 0x04, 0xCA, 0x82, 0x0C, 0xC2, 0x8C, 0x01, 0xC9,
+ 0x0D, 0x10, 0xC4, 0x82, 0x05, 0xC8, 0x83, 0x04,
+ 0xC4, 0x0B, 0x10, 0x03, 0x0B, 0xC4, 0x0A, 0x02,
+ 0x10, 0x0D, 0xC5, 0x09, 0x30, 0x13, 0x02, 0x20,
+ 0x01, 0x0B, 0xC7, 0x0C, 0x03, 0x60, 0x04, 0x0D,
+ 0xCA, 0xBD, 0xA8, 0x78, 0xA0, 0x0E,
+//ascii 0x0070
+ 0xC4, 0xBC, 0x97, 0x67, 0x90, 0x0D, 0xCE, 0x0A,
+ 0x02, 0x60, 0x03, 0x0B, 0xCB, 0x06, 0x20, 0x01,
+ 0x14, 0x03, 0x01, 0x20, 0x08, 0xC9, 0x08, 0x10,
+ 0x05, 0x0D, 0xC4, 0x0B, 0x03, 0x10, 0x0B, 0xC8,
+ 0x81, 0x07, 0xC8, 0x84, 0x02, 0xC7, 0x8B, 0x01,
+ 0xC9, 0x0E, 0x10, 0x0D, 0xC6, 0x89, 0x05, 0xCA,
+ 0x82, 0x0B, 0xC6, 0x89, 0x05, 0xCA, 0x83, 0x0C,
+ 0xC6, 0x8C, 0x02, 0xCA, 0x81, 0x0E, 0xC7, 0x83,
+ 0x0B, 0xC8, 0x88, 0x06, 0xC8, 0x9E, 0x31, 0x90,
+ 0xC6, 0x87, 0x05, 0xC8, 0x0E, 0x19, 0xB1, 0x02,
+ 0x68, 0x90, 0xA8, 0x51, 0x02, 0x68, 0x0A, 0xC1,
+ 0x0C, 0x70, 0x70, 0x30, 0x04, 0xC1, 0x0C, 0x72,
+ 0x72, 0x32, 0x06,
+//ascii 0x0071
+ 0x0C, 0x71, 0x71, 0x31, 0x05, 0xC1, 0x0C, 0x70,
+ 0x70, 0x30, 0x04, 0xC1, 0xBE, 0xA9, 0x10, 0x20,
+ 0xA7, 0x9A, 0x96, 0x81, 0x02, 0x69, 0x0B, 0xC2,
+ 0x9E, 0x21, 0xB0, 0xC6, 0x88, 0x04, 0xC9, 0x83,
+ 0x0B, 0xC8, 0x88, 0x05, 0xC7, 0x8B, 0x03, 0xCA,
+ 0x81, 0x0E, 0xC6, 0x89, 0x05, 0xCA, 0x83, 0x0B,
+ 0xC6, 0x89, 0x05, 0xCA, 0x82, 0x0B, 0xC6, 0x8B,
+ 0x01, 0xC9, 0x0D, 0x10, 0x0E, 0xC7, 0x81, 0x06,
+ 0xC8, 0x83, 0x03, 0xC8, 0x09, 0x10, 0x04, 0x0C,
+ 0xC4, 0x0A, 0x02, 0x10, 0x0B, 0xC9, 0x06, 0x20,
+ 0x01, 0x13, 0x02, 0x30, 0x09, 0xCB, 0x0B, 0x03,
+ 0x60, 0x04, 0x0C, 0xCE, 0xBD, 0xA8, 0x78, 0xA0,
+ 0x0E,
+//ascii 0x0072
+ 0x8A, 0x35, 0xCC, 0x88, 0x04, 0xCC, 0x8A, 0x02,
+ 0xCD, 0x81, 0x0D, 0xCC, 0x8B, 0x03, 0xCB, 0xBE,
+ 0x96, 0x01, 0x60, 0x78, 0x18, 0x0C, 0x70, 0x60,
+ 0x0C, 0x72, 0x62,
+//ascii 0x0073
+ 0xCA, 0x0C, 0x0D, 0xC8, 0x8E, 0x5C, 0xC3, 0x08,
+ 0x20, 0x03, 0x0D, 0xC5, 0x9D, 0x10, 0x70, 0xC2,
+ 0x09, 0x40, 0x01, 0x0E, 0xC4, 0x93, 0x02, 0xC0,
+ 0xC2, 0xA1, 0x04, 0xCA, 0x81, 0x05, 0xC3, 0x9C,
+ 0x01, 0xE0, 0xC2, 0x0B, 0x10, 0xC2, 0x0C, 0x10,
+ 0xC3, 0x89, 0x05, 0xC3, 0x87, 0x05, 0xC3, 0x82,
+ 0x0C, 0xC2, 0x89, 0x07, 0xC3, 0x83, 0x08, 0xC3,
+ 0x84, 0x0B, 0xC2, 0x8A, 0x05, 0xC3, 0x10, 0x0C,
+ 0xC3, 0x83, 0x0C, 0xC2, 0x9D, 0x01, 0xE0, 0xC1,
+ 0x89, 0x01, 0xC3, 0x0E, 0x10, 0x0E, 0xC3, 0xA3,
+ 0x03, 0xA9, 0x81, 0x06, 0xC3, 0x84, 0x03, 0xC4,
+ 0x0D, 0x01, 0x30, 0x01, 0x0E, 0xC1, 0x0E, 0x01,
+ 0x10, 0x0B, 0xC5, 0x0D, 0x04, 0x10, 0x04, 0x0D,
+ 0xC3, 0x81, 0x08, 0xD0, 0x0B, 0x0E,
+//ascii 0x0074
+ 0xDB, 0x8D, 0x37, 0xCA, 0x04, 0x01, 0xC7, 0x8C,
+ 0x04, 0xCA, 0x10, 0x0D, 0xC6, 0x8C, 0x04, 0xC9,
+ 0x0B, 0x10, 0x0E, 0xC3, 0x08, 0x17, 0x85, 0x02,
+ 0x77, 0xA7, 0x61, 0x03, 0xC4, 0x01, 0x70, 0x70,
+ 0x01, 0x0C, 0xC4, 0x04, 0x13, 0x82, 0x01, 0x73,
+ 0x13, 0x06, 0x0D, 0xC8, 0x8C, 0x04, 0xD4, 0x8C,
+ 0x04, 0xD5, 0x0E,
+//ascii 0x0075
+ 0xC0, 0x7E, 0x6E, 0xC3, 0x0C, 0x70, 0x60, 0xC3,
+ 0x0C, 0x70, 0x60, 0xC4, 0x7C, 0xBC, 0xB7, 0x03,
+ 0xB0, 0x0C, 0xCF, 0x8D, 0x13, 0xD1, 0x88, 0x06,
+ 0xD0, 0x0E, 0x10, 0xD0, 0x0E, 0x10, 0x0D, 0xCF,
+ 0x0A, 0x10, 0x0D, 0xCE, 0x9E, 0x20, 0x10, 0xC3,
+ 0x0E, 0x78, 0x18, 0x05, 0x20, 0x08, 0xC3, 0x0C,
+ 0x70, 0x40, 0x05, 0xC4, 0x0C, 0x72, 0x12, 0x83,
+ 0x6C,
+//ascii 0x0076
+ 0x0D, 0x0A, 0xCD, 0xAC, 0x01, 0x6C, 0xCA, 0x0C,
+ 0x30, 0x82, 0x8E, 0xC8, 0x8D, 0x82, 0x30, 0x04,
+ 0x0A, 0xC9, 0x8D, 0x72, 0x20, 0x81, 0x5B, 0xC9,
+ 0x8C, 0x61, 0x20, 0x82, 0x7D, 0xC9, 0x8B, 0x61,
+ 0x20, 0xCA, 0x0C, 0x06, 0x20, 0xC7, 0x8D, 0x72,
+ 0x20, 0x01, 0x07, 0xC4, 0x8D, 0x82, 0x30, 0x05,
+ 0x0B, 0xC3, 0x8E, 0x93, 0x30, 0x03, 0x09, 0xC4,
+ 0x0E, 0x04, 0x30, 0x82, 0x7D, 0xC6, 0x0C, 0x10,
+ 0x81, 0x5B, 0xC9, 0x8C, 0x4A, 0xC0,
+//ascii 0x0077
+ 0x8D, 0x7C, 0xCC, 0x0C, 0x10, 0x81, 0x6A, 0xC9,
+ 0x0D, 0x02, 0x40, 0x84, 0x9E, 0xC7, 0x8D, 0x94,
+ 0x40, 0x83, 0x8D, 0xC8, 0x8B, 0x72, 0x30, 0x82,
+ 0x6B, 0xC8, 0x8D, 0x94, 0x30, 0xC9, 0x8A, 0x61,
+ 0x20, 0xC5, 0x8C, 0x83, 0x30, 0x82, 0x6B, 0xC1,
+ 0x9E, 0x95, 0x10, 0x30, 0x84, 0x9D, 0xC2, 0x0D,
+ 0x02, 0x30, 0x82, 0x7B, 0xC6, 0x0C, 0x20, 0x05,
+ 0x0D, 0xC9, 0x0C, 0x30, 0x82, 0x6B, 0xC9, 0x8A,
+ 0x61, 0x30, 0x84, 0x8D, 0xC8, 0x8D, 0x84, 0x30,
+ 0x81, 0x6A, 0xC9, 0x8B, 0x72, 0x30, 0xC9, 0x8D,
+ 0x92, 0x20, 0xC6, 0x8B, 0x62, 0x30, 0x02, 0x07,
+ 0xC2, 0x8D, 0x84, 0x40, 0x84, 0x9E, 0xC1, 0x8E,
+ 0x61, 0x30, 0x81, 0x5A, 0xC5, 0x0C, 0x20, 0x82,
+ 0x6B, 0xC8, 0x9C, 0x38, 0xD0,
+//ascii 0x0078
+ 0x0C, 0x09, 0xCC, 0xA6, 0xC0, 0x4D, 0xC8, 0x9B,
+ 0x20, 0xC0, 0x20, 0x08, 0xC6, 0x05, 0x10, 0x01,
+ 0xC0, 0x0C, 0x03, 0x10, 0x03, 0x0D, 0xC2, 0x0A,
+ 0x01, 0x10, 0x05, 0x0E, 0xC2, 0x09, 0x01, 0x10,
+ 0x87, 0xD4, 0x10, 0x02, 0x0B, 0xC6, 0x07, 0x40,
+ 0x07, 0xC9, 0x09, 0x20, 0x08, 0xC8, 0x0E, 0x05,
+ 0x40, 0x05, 0x0E, 0xC5, 0x08, 0x20, 0x88, 0xE5,
+ 0x10, 0x01, 0x09, 0xC2, 0x0A, 0x02, 0x10, 0x04,
+ 0x0D, 0xC2, 0x0B, 0x02, 0x10, 0x83, 0xDC, 0x10,
+ 0x01, 0x09, 0xC6, 0x07, 0x20, 0x9C, 0x05, 0xE0,
+ 0xC8, 0xAC, 0x30, 0xDB, 0xCC, 0x08,
+//ascii 0x0079
+ 0x0D, 0x0A, 0xD5, 0xAC, 0x01, 0x6C, 0xD2, 0x0C,
+ 0x30, 0x82, 0x8E, 0xD0, 0x8D, 0x82, 0x30, 0x04,
+ 0x0A, 0xD1, 0x8D, 0x72, 0x20, 0x81, 0x5B, 0xD1,
+ 0x8C, 0x61, 0x20, 0x82, 0x7D, 0xD1, 0x8B, 0x61,
+ 0x20, 0x03, 0x09, 0xD0, 0x0C, 0x06, 0x50, 0x07,
+ 0xCB, 0x8D, 0x72, 0x20, 0x91, 0x67, 0x10, 0x10,
+ 0x04, 0xC7, 0x8D, 0x82, 0x30, 0x05, 0x0B, 0xC3,
+ 0x09, 0x10, 0x0A, 0xC3, 0x8E, 0x93, 0x30, 0x83,
+ 0x9E, 0xC6, 0x87, 0x05, 0xC1, 0x0E, 0x04, 0x30,
+ 0x81, 0x7D, 0xC9, 0x88, 0x04, 0xC1, 0x0C, 0x20,
+ 0x05, 0x0B, 0xCC, 0x8B, 0x47, 0xC1, 0x8C, 0x4A,
+ 0xC0,
+//ascii 0x007A
+ 0x8E, 0x9A, 0xC9, 0x0E, 0x15, 0x0C, 0x10, 0x05,
+ 0xC8, 0x0D, 0x10, 0x0C, 0x20, 0x02, 0x0D, 0xC6,
+ 0x0D, 0x10, 0x0C, 0x10, 0x02, 0x10, 0x09, 0xC5,
+ 0x0D, 0x10, 0x8C, 0x01, 0xC0, 0x04, 0x10, 0x05,
+ 0xC4, 0x0D, 0x10, 0x8C, 0x01, 0xC1, 0x08, 0x10,
+ 0x02, 0x0D, 0xC2, 0x0D, 0x10, 0x8C, 0x01, 0xC2,
+ 0xAB, 0x10, 0x1A, 0xC1, 0x0D, 0x10, 0x8C, 0x01,
+ 0xC3, 0x0E, 0x03, 0x10, 0x06, 0xC0, 0x0D, 0x10,
+ 0x8C, 0x01, 0xC5, 0x06, 0x10, 0x03, 0x0B, 0x10,
+ 0x8C, 0x01, 0xC6, 0x09, 0x40, 0x8C, 0x01, 0xC7,
+ 0x0D, 0x02, 0x20, 0x8C, 0x01, 0xC9, 0x04, 0x10,
+ 0xCD, 0x1B,
+//ascii 0x007B
+ 0xC2, 0x0D, 0x0E, 0xD4, 0x0E, 0x0D, 0xC5, 0x8B,
+ 0x05, 0xD4, 0x82, 0x0E, 0xC4, 0x8D, 0x01, 0xD3,
+ 0x0E, 0x10, 0xC6, 0x92, 0x03, 0xB0, 0x4D, 0x0E,
+ 0xC4, 0x0E, 0x4D, 0x9A, 0x20, 0x40, 0xC6, 0x0B,
+ 0x70, 0x80, 0x2C, 0xC0, 0x0A, 0x01, 0x70, 0x01,
+ 0x0D, 0xC7, 0x8C, 0x52, 0x60, 0x02, 0x0E, 0x60,
+ 0x91, 0x26, 0xE0, 0xD0, 0xBE, 0x50, 0x40, 0x70,
+ 0x0E, 0xDA, 0x10, 0x03, 0xDC, 0x83, 0x04, 0xC0,
+//ascii 0x007C
+ 0xC0, 0x08, 0x77, 0x77, 0x77, 0x77, 0x0B, 0xC1,
+ 0x01, 0x70, 0x70, 0x70, 0x70, 0x07, 0xC1, 0x0A,
+ 0x79, 0x79, 0x79, 0x79, 0x0C, 0xC0,
+//ascii 0x007D
+ 0xCD, 0x8D, 0xCE, 0xDC, 0x82, 0x04, 0xDC, 0x10,
+ 0x02, 0xD5, 0x4E, 0xBB, 0x40, 0x60, 0x50, 0x0C,
+ 0x4E, 0xCB, 0x0A, 0x03, 0x70, 0x03, 0xC0, 0x01,
+ 0x70, 0x04, 0x0C, 0xC7, 0x09, 0x70, 0x80, 0x4E,
+ 0xC0, 0x0C, 0x03, 0x70, 0x00, 0x0C, 0xC6, 0x91,
+ 0x06, 0xD0, 0xD0, 0x9C, 0x40, 0x40, 0xC5, 0x8D,
+ 0x02, 0xD4, 0x10, 0xC5, 0x8B, 0x05, 0xD4, 0x82,
+ 0x0E, 0xC0,
+//ascii 0x007E
+ 0xC1, 0x0E, 0xC6, 0x10, 0x06, 0xC4, 0x20, 0x03,
+ 0xC4, 0x0A, 0x10, 0x0B, 0xC4, 0x85, 0x08, 0xC4,
+ 0x83, 0x09, 0xC3, 0x09, 0x10, 0x0E, 0xC2, 0x0C,
+ 0x10, 0x08, 0xC3, 0x82, 0x04, 0xC3, 0x89, 0x02,
+ 0xC4, 0x86, 0x07, 0xC4, 0x87, 0x04, 0xC4, 0x0C,
+ 0x10, 0x04, 0x09, 0xC3, 0x07, 0x10, 0x01, 0xC4,
+ 0x8C, 0x76,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_REGULAR_28PX[95] = {
+ { 0, 0, 8,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 8,2, 4, 2, 4 }, //asciii 0x0021
+ { 33, 1, 11,1, 4, 1, 20 }, //asciii 0x0022
+ { 57, 1, 18,0, 4, 0, 8 }, //asciii 0x0023
+ { 187, 1, 18,1, 4, 1, 4 }, //asciii 0x0024
+ { 335, 1, 23,2, 4, 2, 4 }, //asciii 0x0025
+ { 502, 1, 18,1, 4, 0, 4 }, //asciii 0x0026
+ { 660, 1, 6,1, 4, 1, 20 }, //asciii 0x0027
+ { 672, 1, 10,2, 4, 1, 0 }, //asciii 0x0028
+ { 728, 1, 10,1, 4, 2, 0 }, //asciii 0x0029
+ { 783, 1, 14,1, 4, 1, 16 }, //asciii 0x002A
+ { 853, 1, 18,2, 12, 2, 8 }, //asciii 0x002B
+ { 906, 1, 8,1, 24, 2, 0 }, //asciii 0x002C
+ { 924, 1, 13,1, 16, 2, 12 }, //asciii 0x002D
+ { 952, 1, 8,2, 24, 2, 4 }, //asciii 0x002E
+ { 966, 1, 10,0, 4, 0, 4 }, //asciii 0x002F
+ { 1016, 1, 18,1, 4, 2, 4 }, //asciii 0x0030
+ { 1133, 1, 13,1, 4, 3, 8 }, //asciii 0x0031
+ { 1171, 1, 17,2, 4, 2, 8 }, //asciii 0x0032
+ { 1288, 1, 18,2, 4, 2, 4 }, //asciii 0x0033
+ { 1417, 1, 18,1, 4, 1, 8 }, //asciii 0x0034
+ { 1516, 1, 17,2, 4, 1, 4 }, //asciii 0x0035
+ { 1647, 1, 17,1, 4, 1, 4 }, //asciii 0x0036
+ { 1789, 1, 16,1, 4, 1, 8 }, //asciii 0x0037
+ { 1882, 1, 17,1, 4, 1, 4 }, //asciii 0x0038
+ { 2026, 1, 17,1, 4, 1, 4 }, //asciii 0x0039
+ { 2166, 1, 8,2, 12, 2, 4 }, //asciii 0x003A
+ { 2194, 1, 8,1, 12, 2, 0 }, //asciii 0x003B
+ { 2226, 1, 18,2, 12, 2, 8 }, //asciii 0x003C
+ { 2308, 1, 18,3, 16, 2, 8 }, //asciii 0x003D
+ { 2371, 1, 18,2, 12, 2, 8 }, //asciii 0x003E
+ { 2446, 1, 14,1, 4, 1, 4 }, //asciii 0x003F
+ { 2534, 1, 26,1, 8, 1, 0 }, //asciii 0x0040
+ { 2788, 1, 19,0, 4, 0, 8 }, //asciii 0x0041
+ { 2893, 1, 18,2, 4, 1, 8 }, //asciii 0x0042
+ { 3024, 1, 20,1, 4, 1, 4 }, //asciii 0x0043
+ { 3160, 1, 20,2, 4, 1, 8 }, //asciii 0x0044
+ { 3270, 1, 17,2, 4, 2, 8 }, //asciii 0x0045
+ { 3376, 1, 16,2, 4, 1, 8 }, //asciii 0x0046
+ { 3450, 1, 21,1, 4, 1, 4 }, //asciii 0x0047
+ { 3607, 1, 21,2, 4, 2, 8 }, //asciii 0x0048
+ { 3674, 1, 7,2, 4, 2, 8 }, //asciii 0x0049
+ { 3689, 1, 15,1, 4, 2, 4 }, //asciii 0x004A
+ { 3741, 1, 18,2, 4, 0, 8 }, //asciii 0x004B
+ { 3849, 1, 16,2, 4, 1, 8 }, //asciii 0x004C
+ { 3894, 1, 25,2, 4, 2, 8 }, //asciii 0x004D
+ { 4011, 1, 21,2, 4, 2, 8 }, //asciii 0x004E
+ { 4099, 1, 21,1, 4, 1, 4 }, //asciii 0x004F
+ { 4245, 1, 18,2, 4, 1, 8 }, //asciii 0x0050
+ { 4334, 1, 21,1, 4, 1, 4 }, //asciii 0x0051
+ { 4498, 1, 18,2, 4, 0, 8 }, //asciii 0x0052
+ { 4611, 1, 18,1, 4, 1, 4 }, //asciii 0x0053
+ { 4755, 1, 18,1, 4, 1, 8 }, //asciii 0x0054
+ { 4813, 1, 21,2, 4, 2, 4 }, //asciii 0x0055
+ { 4893, 1, 19,0, 4, 0, 8 }, //asciii 0x0056
+ { 4985, 1, 27,0, 4, 1, 8 }, //asciii 0x0057
+ { 5138, 1, 18,0, 4, 0, 8 }, //asciii 0x0058
+ { 5273, 1, 19,0, 4, 1, 8 }, //asciii 0x0059
+ { 5358, 1, 18,1, 4, 2, 8 }, //asciii 0x005A
+ { 5496, 1, 10,3, 4, 0, 0 }, //asciii 0x005B
+ { 5543, 1, 10,0, 4, 0, 4 }, //asciii 0x005C
+ { 5592, 1, 10,0, 4, 3, 0 }, //asciii 0x005D
+ { 5633, 1, 13,1, 8, 1, 16 }, //asciii 0x005E
+ { 5684, 1, 14,0, 28, 0, 4 }, //asciii 0x005F
+ { 5723, 1, 14,4, 4, 4, 24 }, //asciii 0x0060
+ { 5743, 1, 16,1, 12, 2, 4 }, //asciii 0x0061
+ { 5852, 1, 17,2, 4, 1, 4 }, //asciii 0x0062
+ { 5949, 1, 16,1, 12, 1, 4 }, //asciii 0x0063
+ { 6045, 1, 17,1, 4, 2, 4 }, //asciii 0x0064
+ { 6141, 1, 16,1, 12, 1, 4 }, //asciii 0x0065
+ { 6267, 1, 10,0, 4, 0, 8 }, //asciii 0x0066
+ { 6320, 1, 17,1, 12, 2, 0 }, //asciii 0x0067
+ { 6452, 1, 17,2, 4, 2, 8 }, //asciii 0x0068
+ { 6508, 1, 7,1, 4, 1, 8 }, //asciii 0x0069
+ { 6533, 1, 8,0, 4, 2, 0 }, //asciii 0x006A
+ { 6576, 1, 15,2, 4, 0, 8 }, //asciii 0x006B
+ { 6656, 1, 7,2, 4, 2, 8 }, //asciii 0x006C
+ { 6671, 1, 24,2, 12, 1, 8 }, //asciii 0x006D
+ { 6749, 1, 16,2, 12, 1, 8 }, //asciii 0x006E
+ { 6801, 1, 17,1, 12, 1, 4 }, //asciii 0x006F
+ { 6903, 1, 17,2, 12, 1, 0 }, //asciii 0x0070
+ { 7002, 1, 17,1, 12, 2, 0 }, //asciii 0x0071
+ { 7099, 1, 10,2, 12, 0, 8 }, //asciii 0x0072
+ { 7126, 1, 15,1, 12, 1, 4 }, //asciii 0x0073
+ { 7236, 1, 10,0, 8, 0, 4 }, //asciii 0x0074
+ { 7287, 1, 16,2, 12, 1, 4 }, //asciii 0x0075
+ { 7344, 1, 16,0, 12, 1, 8 }, //asciii 0x0076
+ { 7414, 1, 23,0, 12, 1, 8 }, //asciii 0x0077
+ { 7523, 1, 15,1, 12, 1, 8 }, //asciii 0x0078
+ { 7609, 1, 16,0, 12, 1, 0 }, //asciii 0x0079
+ { 7698, 1, 15,1, 12, 1, 8 }, //asciii 0x007A
+ { 7788, 1, 10,1, 4, 0, 0 }, //asciii 0x007B
+ { 7852, 1, 9,3, 0, 3, 0 }, //asciii 0x007C
+ { 7874, 1, 10,0, 4, 0, 0 }, //asciii 0x007D
+ { 7932, 1, 18,2, 16, 1, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_REGULAR_28PX= {
+ 7982, // bitmap len
+ BAGL_FONT_INTER_REGULAR_28px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 36, // height of all characters in pixels
+ 36, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_REGULAR_28PX,
+ bitmapINTER_REGULAR_28PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.json b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.json
new file mode 100644
index 00000000..ae97d528
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "wxxNPsWJbMYKcFAMwAsQAcYKcFAMwAogxg0pSjscwoYpwg5cDcMKUAbDC1EH3F0OwwpQBsMKUAbA4IQM1IQMw4Y8x7oUabCEDMOGCscKYKNpvoYKyaynQXCUi+DKtAmnUAJgA8iEDMO2BoUgEMiEDMOGCsMNyIQMw4YKx7s2m+CEDMOGCscKYJWL4MCGCsisp1JQEZBr4MsEABcFAmADBciEDMMFABUCIMiEDMOGCsINC8kNxIYK1I2twNCNzc2KRcULAiACCsoGEATEC2AIyAkQAwrEsQK+sAMQDMeBBcUIEA7DggTGCxDGgwbEChDGhwTFDhAMxRAMw6VCAlQDEGQQg0nBAwIgUhABYhCBKMOIBMWBCsYQDMUMEA7DCRDGCxAOxoIEwp4QYMaDA8cLELJ2EBAOxAsDEAvICVALxAwgBsoNBhMGDcWcAYDXDgvQrqmt1QdABA7Gik7IuAFWUIIExpoBkMeCHsOEDcYIEAQOxQAExIkMx60wGsQCAcSFDckHEAXDuAJ4cIMDy6wgK8IFQAIOzQYQBsIMCRgL0KsQLNENHA3CBRAHzg0DMAMNwaoQPcueECAUgQHCDgQQCMqICMOICMOpEE7IBgDEjgbErjAZx4cMw4wHxggQBMacAXAalxDAx40wxwhQCMoHyAwHFgcNwNYO0gwNxAwB0gEQBAvACRDSATACEATTjqQgBskMBBIHxg0CIAPICkACDcOrEBkQCcexAocQgC7BCBACDsCIAsaKAsKdEEDABRAEwxAOxYcIwwsQARAHxIIMxYcHxAUgCcWDDMWaAeDCCSABDsWBDcaxAXgwEJIQQMSJAccKUAXAChAEDcEJEAfIvFIUsMIIIAIBEALTCUAEDtSul4zAw10OwwpQBsMKUAbAwQwL1gkOxJsEsNKZIODEDgQQkWrgyp6lEBAGxwsCMJJHgCmYZBAwBAzKCwVwUIFsz6t1ISChNYzNLtadlSBQoTauzgkDcGAECsoIASCxR5qwvLqGMDACCsYOAhCDjcyMchAExZsG0NKcQODEHdYMxg3CDMiOE8GOBMiFCsCGCci+EtAwyqkCDcYLARIDEAEDEgHDCgESAxABAxIBx6kCDcm+EtAwyYUKwIYJx44TwY4EyQ3CDMYTDswQDcwQDcwQDcwQDcYNShAJOg3BCHAwBsEJMgEQATIHxxANzBANzBANzBANzBANzBvAwBkMyAMghI7EBFADxb25YxDAwYQrxIMKxIMKxIMKxIMKxIMKxIMKxIMKxIMKwMCKbMMMEAHDCiAOw4UYwR7ZqwJ71gxAhIzUi3MwkVnQ056mIDCCatSdlRAwg3zUjINAhI3Ui3IwAdaupRDaDcDHnqdQI5RYwM4MBHAgAQfLCDCCVheGQSABDMgJEAIJyA0HEAEOx4EFzJ0QUMaJAs4LEMaHBs8QDMWGCM+BDMWIBM4OEA3FDBALzYUCx5QBkMoOBRAJxw4CEKJ73sGeyVAgBckOBXBAAQjMjHJwg47RDSsMDcDCDnx8PMIKcHAwwgpwcDDCDRAHfX0Nw4gB1YMF1A0QC9SIAdUbDsYKFwrJDRHECwFACMcNEMMLEAEUARADDsUNEMOCBMOpEBzEDRDCigHFDQIQC8MNEMKHBscDEArCDRDChgjIBBAJwQ0QwocGyQUQCMANEMKKAsoHEAcNEMOBBcoIEAQQwwoQgW3ICTDECSAKyQogxZ50sMoMEs+oMknMBwEQAwrBDQJAAg7IDgJQCcADEIV0EALIBBAHGwYQmgLQwgwQCMYMEAvDqQEMxIgBxogExYICxQ4QDsWGB8WGBcaBDMWGB8WHBcaBDMWIBMWHBcYQDcUNEA3NiQHHkwLAy5wQYMcNARAFyQUQAQ7InSBAyA4QAQzLG8mCbtCOq9SKA9SKA8YNd0eEATfCCnBwMMIJEAFzE4IBM8INARAGyIoDyAYQAQrGigPJDAMQBQ7EigPLCBABCcOKA8wOBBADDcGKA84KARAHwIoDzw4FEJJgMNELAiAD0wcQA9SNq8+O3suOvMaOcSABB8mKA8UMAWABDceKA8QNARCmvbcQAceKA8QFEAzEnRBgxooDxBAJxooBxooDwwwQyBANxYoDw4sByIEMxYoDw40ByBANxYoDxIINxgoQxroBV5Cr2AjFnRBQxgpwAALEBRABDsa+l1QgMAPDDhABDM6eyrDEBAjAxg0LxallesyeQEDDCFABCckOARAEwgYgg0MgB8iTAZDCCRAFDsINBBALxgwQDMOCBMaDA8aIBMMNEA7GDBAOxYYHw4sByIEMxYYGw4wCyIEMxYkCxBAOxg4QDsUOEAjDhgbGhgLHCBAHw4IHxAcQCsgGELFq3CCwJ5cgEAbKCgJwQAjNi2Jgg47SDi0OwMIOGg7TCiAGDtEKQAYOz6oCoiAGDs2KA8EJAiAGDsuKA8MJAiAGDsmKA8UJAiAGDseKA8cJASAHDsWKA8kJASAHDsOKA8sIASAHwooDzQgBEMKKA88IAcKKA9SMZ8+ul53MDAYUCMMGQAbKB0ABDcAFIAIgBMgIEAIWkQKwEAnCBxAKxxAGw6UBCcSGA8aKAsWBAsUNEA7FhwfFhQbGgQzFhgjFhgfGgQzFhwbFhAbGEA3FiwHEDhABxQwQx5ED4MG9IDBgxIQExwsgAgEQBA0Qpc60EAzICgEwBA7ACGAHywoYDMMKAiABCdaNvceeqGAVlnnQzwwEcBCBbcsIcJRTECAHyQoQAwvBrFAtwQwFEAXIgQXFiALDChAJxooBx4QJw4gCxocGx4oExBANxYYHx4sBxIEMxYcFx4oCxBAMxQoQDsaEBcMLEMeBA8UIEAvCniBAxwoQsYzaQBAFwgcBEA3ICHAEwg4QAQvKDAUwAwrDnhbgzh3AwRfIimzEBhAFxgwQAcQFEATGCiAOw50ywMeFGMAMEgzHGQzIBRAExwMghI7EBxAGxwRQA8QYyr25YxDAwBYMxw0WDsCFA8eEA8ENEAvFDRALwoUExYUEww0QDMMNEAzEhQTDhQTFDRAMwQ4QDMaGBcGGBMcOEA0OEAzItgVgQMkOMA3KBhAFyw4QDcwewBrDGsMQDcIQwxANwhDDEA3CEMMQDcIQwxANwhDDEA3CEMMQDcIQwxANwhDDEA3CEMMQDcIQwxANwhDDEg7CEsYHBswLEAnLAxACyroBIJDJswmgIMiKAcGCCceCCMGJAcaKAcOCCMWCCMOJAcSKAcWBCMOCB8WIAcIJEA7GgQjBggbHiAHBHckdwMW6U0fg1ARAAQvSBRCDZSAN0A0QCcKeMDDQiATErhBOxQzHhgnFCiCEbcCeEEDGhgjGCTAMwAogDsWIBMeuhU3AnhAwxg0QCM0OC8gGEAII1wQQBNiKVsDGvIQyMJRYwM8LA3AQAw3MBhChes0cqnIBy5QBkMmFCcmXAtDKiwfInQHQy4gHwY6Mw4UIwQ15CQYQC8GKBcMAAcIKcCADwwABwosFwgwDEAQnlRBAxIMOwYgJwg4RDMWGCMOFDMGHC8KICMeCDsKHCsGGDMKFC8eGCcKHCsGHC8KFC8eHCMKGC8GICcKIB8eECsKEDMGLBsKeAcDFCRAOwgEAwwABwwgQtqy5MBAIwowDw4QKwwhgAQnDhQjDigLEjoQTBQnEDBAOxIMEzp4gcMWtED7LnCAgxwwBEAcNxwwFEAIOyA4DIIFGF4ZBIAXMCgRwEAUM0IuHFoecwOyLUNGNcSDOjpMwAgfMCgQwgWzLjGFACcuNgjCkoQzJCQMwg57BgQzHCzCCjcSBDMcKIArHgQzHCzCDnsSBDMiOgjAECsKBDMuMYTClsQzOCwVQCtEJAzCCfdCNcjADCNGMYSDUikDWDs+sdnvIDAYTBg3CBEADDsUHUAvABBCCQhADxAoQAheTArAQCsIJEArDggTDpwIJxIUFwg0QDsSCAcWLAsKLAsWHBMUNEMKKA8WJBMUNEMKKA8WJBMUNEMKKA8WJBMUNEMKKA8WJBMUNEMKKA8WJBMUNEMIKEGEQYRDCCnBwMMINd3c3xwkExotbzQoBEMYKEAQOygkgBMYMAhABDcgMEAMNyQoQAsiDAswLEAnGDRALzYUCxokBzgsQDsWGBM8QDMWGBc8QDMWHA84OEA3FChDOCRDGDhAIzYIExwYQDMsGEAzIARAJyA4FEAbJDQEQkozgwK7aYRAEyw4EcDAIzoxRUIJ+0g4MGwwOwMmOuhkKDc4KA2CBbckNA0ABUAfHDQEQhK3DjHEQBcaSAaDJBRAIxAkQDMuFAcSDBs2BCcIOEA3NhgXCjAHOigLCigLODBDCigPODRDCigPODRDCigPODRDCigPODRDCChBxcRDCCnBwMMINd3c3woxGxh7FDRHCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCigPFiwLFDRDCChBhEGEQwgpwcDDCDXd3N8KMV9SKA8WMRcuKA8WLAsuKA8WLAsuKA8WLAsuKA8WLAsuKA8WLAsuKA8WLAsuKA8WLAsuKA8WLAssKEGEQcQHCCnBwMMINd3c34wgDwg0ggUrNCgEQwg1QAg3KCSADwg0QioMQAQzIDRABC8MNEMKaEBDIlAHgxA0QwwwQCMYNEArFDRDEhgLGiQHGDRDEDBAOxYcExg4VxRAMxYYFzxAMxYcEzg4QDcUKEM4JEMYOEAjNggTHBRAMywYQC8cOARAJyA4FEAXJDAEQkozgwK7aYRAEyw4EcDAHzotRUIJ+0g4MGwwOwMN8fDzCCnBwMMIKcHAww32JAX0Ny4sC1IsC1IsC1IsC1IsC1IsC1IsC1IsC1IsC1IsCywtxARBxAcIKcHAwwg13dzfCC3FxMcIKcHAwwg13dzfCDHRkBgnJCnBwgBvHDHRkAiAM15wgMNgMEA7YgQzYgQzXDRAO14QC1ggCEAnWBBAG14Zbwg7SDcIKBNAKAMKKBM4GEMILEAMOyg4DEAPDCBACDsgLARAHxQoQAg3GBxABC8erEB3DDgQQBA7JrBAcwQwBEAfMDQIQCwgQAQvODgMwBA7RBBAD1AUQBtQGEAXJC3ERIGHCCnBwMMINd3c31RrUDRDUDRDUDRDUDRDUDRDUDRDUDRDUDRDUDRDCC3FxERDCCnBwMMINd3c3wg15eTnCCnBwMMIKMAFyYsINAiCBjtEMBTAFC9GOgiACCNILBDAGDNGOcSADCdIKBCCBbdGNYSAE0wQg0I6CIALODAUwBQvNCQIggY7MjWEgBArNCgMggX3MjXEgAwrNDQQwBgzPCjACdGTCCnBwMMINd3c3wgx2djbCCnBwMMILc2MCIAHRDQMQAw7QCCAI0A4EEAIN0AoBEAfRBRACC9ALARAF0QYQAQrQDAIQBA7QByAJ0A0DEAMN0AkgB9EKMHFxwgpwcDDCDXd3N8mMlxaHndCOYXACCc0KASABAxQCMAMOygkgBw3FCwQQAQ3IDBADDskKEAPIgwLMCxAJxg0QC82FAsaJAc4LEA7FhgTODhAMxYYFzxAMxYcDzg4QDcUKEM4JEMYOEAjNggTHBhAMywYQDMgBEAnIDgUQBskNARCSjODArtphEATLDgRwMAjOjFFQgn7SDgwbDA7Axw4cDtELAzACCc4HcATMChADCh0KBBAHy4MExQYQyg4QDcaBCsmLAceECMmKA8eGB8mKA8eGB8mKA8eGB8mKA8eGB8mKA8eGB8kKEHEgYcIKcHAwwg13dzfJjJcWh53QjmFwAgnECccKASABAxQCMAMOwI5BxgkgBw3FCwQQoaECxQwQAw7JCjACDMWDAswDEAPGDRALygwCIALGiQHKDBACCBAOxYYEyooFwA4QDMWGBcoKCMIQDMWHA84OEA3FChDOCRDGDhAIzYIExwYQDMsGEAzIARAJyA4FEAbJDQEQkozgwK7aYRAEyw4EcDAIzoxRUIJ+0g4MGwwOwN8OHMoMA8UJAjAEDMUNBRDEBnAKwwYgAcMKEAQKHQkCEA7ACAEgBg7DggXErhBCIAUNxA4QDcUIMAQMxosBxgwQAwvIigPGDRDKigPGDRDKigPGDRDKigPGDRDKigPGDRDKChBxEHHCCnBwMMINd3c30I3NzYpFxQsCIAIKygYQBMQLYAjICRADCsSxAr6wAxAMx4EFxQgQDsOCBMYLEMaDBsQKEMaHBMUOEAzFEAzFhgfFiQHGgQvFhgfFhQXGggrFiATFgQrGEAzFDBAOwwkQxgsQDsaCBMKeEGDGgwPHCxCydhAQDsQLAxALyAlQC8QMIAbKDQYTBg3FnAGA1w4Lwoxo1IoD1IoD1IoD1IoD1IoD1IoCfHwcwgpwcDDCCnBwMMKKAnx8HMKKA9SKA9SKA9SKA9SKA9SMZ8IOe0sMDcsKcGACCMkKcHCAPsh9XQoDEAPYBxAJ2IQC2AsQDtgQC9gQCtgQC9cNEA3XhgHXCxAH1Q0HEAHHC3FBMAEMxwpwcAQOyA13R4iu2pon0NMKIAMJ0Q0FQAUL0QoEMIFs0I6TMIKO0I6CMAQK0Y1yIIFb0YxhIAHTBiDQjXIgAc2OgzAECswJBDCDjssKBTCBfcuLUTAFC8uOYTAECs4KIIKO0JoWwMDCm0nQ0wogkWrgzw0EUIN8z4yDUISdz4tzQJFq4M+Lc0ADB9CephAg0ItzMMyMhECDfMidhBAwkVrgx52VEECEjMkMAkCCa80KIIGN0AowkUnQz4tyQIJrz56mIECEjM+dlRAwkVrgz52EEDAD0gkBIM6elRAwAcqepiBAg4zHnqYgQIJryItzQJFZ0MoKQIOMzqoCatIODcDail7PDALCmgGQzQYQwgsgBA3JCgEQAcMMAyAHxg4EIAbGCQEQAgzDCCACDMgOBSAGwAwCIAfMCwIQASADDc8HIAEJ0QcgAQrPCwIQAiAEDssOBSAHwA0EIAjJCQEQAw3DCQEQAwzFDQMgCMYOBSAGwwwgBA7JCgEQAcKaAaDNBhDCil7PCwLCCwrVmgTQ0wogCNMJARACC9MGIAUO0gwDEAEJ0wkBEAMM0wYgBXfLDQFwEMoMAxBxAckGIAbQCQEQAwzPDAMQAQnPDgYgBQ7PDAEQAgvRChAI04pNwoxXzg0TwgoQAQvMDRDCCjAGyw0QwpoCUBABC8kNEMKKA8AKARAGyA0QwooDwQ4FEAILxg0QwooDwwoBEAbFDRDCigPEDgUQAgvDDRDCigPGCgEQBsINEMKKA8cOBRACC8ANEMKKA8kKARAGDBDCigPKDgQQARDCigPMCgEgwooDzQ4EEMKOvM8dwg0O1A4NxYsG1IMOxIsG1IMOxIsG1IMOxIsDd3dHgQ7EC3BwcAAOxAx1dXUFDsDZDdaupRDTi3IwAc+MhECEjMydlRAwg3vNimIwkWrgzIxzMJFJ0M4MQIOM0qsCa9YewQxycnICDsQLcHBwAA7EiwR6ekqCDsSLBtSDDsSLBtSDDsSLBtSDDsDGCgXHmSAgxQkCEAEJwwgBEAIJxAQQAgrGhATIBRABCMcKAiAGDsYLAyAGx5tAIMkMB8AVDsAQDcAQDcAQDcAQDcAQDcAQDcAQDcAQDcAQDcAQDcAQDcAQDcDFDMSJJcIKAhAIwpECsMMBBsULwMIMCHYmxQVwQMQGEKJBAxUCEAQFxBAIwYsFwooTxIsDwo4Cw4kGw4kGwwEAxIEOwokGw4INw4QLwosDw4ULw4MKwg4QC8KIBsOBDMOVAbDBDBAMwYcBxJ4QUMIDEAMCEAjFjTvCDQEwBs6ZeNDLjHMRkkjQ0A4EcAAGzg4CELJ5qGABEATNlQGgxgcQB8sOEAvIiAHLigLKEAzKiQXKgwvKigXKggzKjQHJjgHMhgfIhAnNlwTAxJsxoMcLYyCRNDAgARTGCnBwMMYNd3c3ww0OxB7InkCwxIkFxg4BEAvECRADxZQBsMaaEHDDDhAMyIoBw4oDyoEMwokFyoMLwokEyoIMwgwQyQ0QxIIEyIMExAsQAwvECgIQDcUJIAETAjALxwwEYAUNyr6oeKAOwgtxcTHGCnBwMMYNWbgQJ5C6lhAgGsyeIbDGiATNgwvIiAXLiwPKgQ7KiQXKgwvKiQXKggvKiwHJDRAOy4EGyIMDzAkQBAzECgIQC80GIAETAjAJzwsDYAQM0r2oeKAOw4x0Eg7BCg3HDgRADcGCCsUOAhCkcQ3BAhAMxJUBwMGCDcKDBMMOEAzCgg3CDRDDigPDgg3DggzCiQXDgg3DgwvCiQTDgg3DgQzCjAHDgg3CDRDEggbCgg3CgwXECxAFDcCCDcAMAxANxQkgAhACASALxwwEYAQNyr6oeKAOwgcM1IwBwowVzosCwowEzg0QDcGMBM+iAWeFAndHwgtwcDDDDAUTggFzQ8eMBNSMBNULDcAMcXGDfsMMcHAQAQzCvqkQMKeahRAGKZYQEMOdIbDFnkCgwp4QgMKDC8iCDcKJA8GLA8mIB8KOAcGJBcmKBMMQwYkFyYkEwxDBiwHJhQbCjALCgQbHCxALwoQGwgkQBAzDDggQA8IGEAzDBiABEwIgAg7BnhBwxQoCYAbECwfIvZh4sMDLDXoqyQoBcDDICTBxEciRAaDSCxAN04kE1IkF1IwE1YMO1J0j4M0NWJcBUHgYwgpwcDDCC3JyMtqIBcEOeGjCARAOwAxwYMKEAsEMcmLDC8DCiRbBDnh4CArHARAOwAxwcBABCsWEAcEMcnICIA3FCg7TniBw3IgF3I2s1gnHDAfLBgDHjAbIDgMQxw0QBsYLARAHyAsQBsQIEAELygsQBsIFEAINzAsQhtMQBc8LATAI0awQG9OcEKDIDXgoBBAHSMIKcHAwwgtycjLCDXh4OMIKcHAwwgtycjLEfS3BCQJwMMAIcFAOEAIKfS0KEA7LiQTMigXMjgLNhgnNlgWQehrBCXBAwAdwUA4QAw3KigHMiQXMiwXNEc2MFMu+lwFgeBgMcGAMcmLEDXwcwQwEcDDAC3BQwAEQCA1+HgsQC8uJA8yJBcyMBM2CDsydE+DKvpgBUHgYDHBgDHJixQ4cDc0IAkADCcgNAnCAPsUOARCGvsCOtRACxZQC0MacEHDDDhANyIsBw4oDyoEMwokFyoMLwokEyoIMwowByQ0QxIIFyIMExAsQAwvECgIQDcUJMBMCIAELxwwDYAQNyr2oeKAOxLyXZ5ANzgoCYAMLywYgARQDASAIyQgQBQ3ECwMQC8iBB8iEAseLAckOEA3GiQXKggvGiQXKgwzGjALKgQ7HgwvIiAbInjGQxocFyA4ZsQJokKhRAmgKwQxwcDAEwQxycjIGDHFxMQXBDHBwMATBvqkQIKealoECaQvCniGwxogEyYMLyIgFx4sDyoEOxokFyoMLxokFyoILxosByQ0QDseBBsiDA8gJEAQMxAoCEAvJBiABEwIwCcsLA2AEDM69qHigDoo1zIgEzIoCzYENzIsDy76WAWB4GAxwYAxyYsoMDciOXMMIIAMNxZ0QcMIJQAEOxJMCwMKhBMqBBcOcAeDCCxDCDBDDiQXDhwXDggzCiQfDgwjDhAvCigXDEAzDgwzCnQHgwYkBww4QDsOjA6mBBsOEA8QNATABDsEOARALxQ0EEAQNw4EI0AsO2403ygQBx4wEyhANxowEyQsQDsMIF4UCd6dhA8QBcHABDMQEE4IBcxMGDciMBNSMBNUOwH5uwwxwYMMMcGDEfLy3A7AMz40T0YgG0A4Q0A4QDc8KEA3OniAQww54GAUgCMMMcEAFxAxyEoNsDQrNrAFsygwwgo7IjYIwBArJjXIggVvJjGEggn3Ji2EgygwGIMeNciABB8SNgjAFC8OOkzADCcQOBDCCfcYMEIFbyYxKwI18zAwQgWrJDQJAhJ7HjZRAg43Ii3IwgmvIjZQwyYphIMWMgzCCa8GelRAwhJ3CDQIwgnvGDCAFDckMMIJryYphMISNyI2EMIFqyYtyMMmNkiDGi2IwAgfCjYRAhJ7BjmEwgVrFDCCCa8icONAMCcymwE3ImyDAIAjGBRABwAwDEAMNwgoBEAUOwgkBEIfUEAILxgdAB8kJIAjIDgVABQ7FCCCI5RABCcIKAhAEDcILAhCD3BABCcYHIJwF4MisMNvMCA0K1awBbNIMMIKO0I2CMAQK0Y1yIIFb0YxhIIJ90YthIAMJ0AwGUAfLjXIgkWcQEATHjYIwBQvDCRAKw46TMIOexocFwQ4EMIF9yYgEwQwgBQvMi0fBjErAjprJDhUMEAXIDRAMIAINxg0QDBACEAnFDRCMAcAEEAXEDRCMAcEIEAINwg0QjAHCqxAawQ0QjAHDDgMQBsANEIwBxQYQAwsQjAHGCUCMAccNAiCMAckEEM0bwg0O1A4NxYsF1IIOxI0B0w4QxpIDsE0OxA5NmiBAxgtwgCzACgFwAQ3HjFJgAg5gkSbg0L5QQHAO2hAD3IMEwMAId3d3dwvBAXBwcHAHwQp5eXl5DMDNjc7cggTcEALVTrtAYFAMTssKA3ADwAFwBAzHCXCATsAMA3AADMaRBtDQnEBAxY0C1BDFiwXUgg7AwQ7GEAbEIAPEChALxIUIxIMJwwkQDsIMEAjDggTDiQLEhgfEhwTEDBAECcMHEAHEjHY=",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 33,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 20,
+ "char": 34,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 57,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 130
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 187,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 148
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 335,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 167
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 502,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 158
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 660,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 20,
+ "char": 39,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 672,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 728,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 55
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 783,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 70
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 853,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 906,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 24,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 924,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 952,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 24,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 966,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1016,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1133,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1171,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1288,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 129
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1417,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 99
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1516,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 131
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1647,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 142
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1789,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 93
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1882,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 144
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2026,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 140
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2166,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2194,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2226,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 82
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2308,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 63
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2371,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 62,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2446,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2534,
+ "width": 26,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 254
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2788,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2893,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 131
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3024,
+ "width": 20,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 67,
+ "bitmap_byte_count": 136
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3160,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 110
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3270,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 106
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3376,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 74
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3450,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 157
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3607,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 67
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3674,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3689,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 74,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3741,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 108
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3849,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3894,
+ "width": 25,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4011,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4099,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 146
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4245,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4334,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 164
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4498,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 113
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4611,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 144
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4755,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 58
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4813,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4893,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 92
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4985,
+ "width": 27,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 153
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5138,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 135
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5273,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 85
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5358,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 138
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5496,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5543,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5592,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5633,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5684,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 28,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5723,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 4,
+ "y_max_offset": 24,
+ "char": 96,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5743,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 109
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5852,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5949,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6045,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6141,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 126
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6267,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6320,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 132
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6452,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6508,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6533,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6576,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6656,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6671,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6749,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6801,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6903,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 99
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7002,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 97
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7099,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7126,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 110
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7236,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7287,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 57
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7344,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 70
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7414,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 109
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7523,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 86
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7609,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7698,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 90
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7788,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 64
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7852,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7874,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 58
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7932,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 50
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.inc
new file mode 100644
index 00000000..936c2736
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.inc
@@ -0,0 +1,541 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_REGULAR_28PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xF0, 0x61, 0x5E, 0x33, 0x4E, 0x33, 0xF0, 0x62,
+ 0x20,
+//ascii 0x0022
+ 0x37, 0x57, 0xF0, 0xF0, 0xB7, 0x57, 0x60,
+//ascii 0x0023
+ 0x82, 0xF0, 0x72, 0x52, 0xA3, 0x22, 0x52, 0xA9,
+ 0x32, 0xDC, 0xE2, 0x2B, 0x92, 0x52, 0x15, 0x92,
+ 0x52, 0xF2, 0x52, 0xA2, 0x32, 0x52, 0xA8, 0x42,
+ 0xCC, 0xF2, 0x1C, 0x92, 0x58, 0x92, 0x52, 0xF0,
+ 0x72, 0xF0, 0x91, 0x60,
+//ascii 0x0024
+ 0x72, 0x75, 0xC4, 0x68, 0xA3, 0x63, 0x33, 0x93,
+ 0x72, 0x53, 0x82, 0x73, 0x62, 0x73, 0x72, 0x72,
+ 0x5F, 0x0B, 0x2F, 0x0B, 0x52, 0x62, 0x82, 0x82,
+ 0x62, 0x82, 0x83, 0x43, 0x73, 0x98, 0x73, 0xB6,
+ 0x74, 0xC4, 0x83, 0x60,
+//ascii 0x0025
+ 0xF0, 0x17, 0x51, 0xA9, 0x42, 0x92, 0x52, 0x53,
+ 0x72, 0x61, 0x63, 0x62, 0x52, 0x74, 0x49, 0x93,
+ 0x47, 0xB4, 0x43, 0xF3, 0xF0, 0x74, 0xC6, 0x43,
+ 0xA8, 0x43, 0x82, 0x61, 0x63, 0x62, 0x62, 0x63,
+ 0x52, 0x62, 0x83, 0x43, 0x23, 0xA2, 0x48, 0xB1,
+ 0x64, 0x60,
+//ascii 0x0026
+ 0xF0, 0x81, 0xF4, 0x32, 0xF9, 0xF0, 0x35, 0x74,
+ 0x85, 0x66, 0x63, 0x12, 0x53, 0x14, 0x34, 0x32,
+ 0x42, 0x43, 0x14, 0x42, 0x33, 0x56, 0x52, 0x33,
+ 0x54, 0x72, 0x42, 0x54, 0x72, 0x44, 0x17, 0x62,
+ 0x57, 0x23, 0x43, 0x64, 0x49, 0xF0, 0x26, 0xF0,
+ 0x52, 0x40,
+//ascii 0x0027
+ 0x37, 0x57, 0x20,
+//ascii 0x0028
+ 0x21, 0xF0, 0x81, 0x32, 0xF0, 0x62, 0x35, 0xF5,
+ 0x58, 0x58, 0x9F, 0x02, 0xEB,
+//ascii 0x0029
+ 0x9B, 0xEF, 0x02, 0x97, 0x77, 0x55, 0xF5, 0x32,
+ 0xF0, 0x62, 0x31, 0xF0, 0x81, 0x10,
+//ascii 0x002A
+ 0x52, 0x32, 0x92, 0x22, 0xB2, 0x12, 0xC3, 0x9B,
+ 0x5B, 0x93, 0xC2, 0x12, 0xA2, 0x22, 0xA2, 0x32,
+ 0x40,
+//ascii 0x002B
+ 0x72, 0xE2, 0xE2, 0xE2, 0xE2, 0xE2, 0x8E, 0x2E,
+ 0x82, 0xE2, 0xE2, 0xE2, 0xE2, 0x70,
+//ascii 0x002C
+ 0x11, 0xB5, 0x78, 0x93, 0x30,
+//ascii 0x002D
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x40,
+//ascii 0x002E
+ 0x11, 0x23, 0x13, 0x13, 0x10,
+//ascii 0x002F
+ 0x23, 0xF0, 0xA7, 0xF0, 0x88, 0xF0, 0x98, 0xF0,
+ 0x98, 0xF0, 0x88, 0xF0, 0x97, 0xF0, 0xA3, 0x20,
+//ascii 0x0030
+ 0xA8, 0xDE, 0x8F, 0x02, 0x73, 0xB4, 0x53, 0xE3,
+ 0x42, 0xF0, 0x12, 0x33, 0xF0, 0x12, 0x33, 0xF0,
+ 0x12, 0x42, 0xF0, 0x12, 0x42, 0xF3, 0x43, 0xD3,
+ 0x65, 0x85, 0x7F, 0x01, 0xAB, 0x50,
+//ascii 0x0031
+ 0x3F, 0x05, 0x4F, 0x05, 0x42, 0xF0, 0x73, 0xF0,
+ 0x73, 0xF0, 0x72, 0xF0, 0x74, 0x70,
+//ascii 0x0032
+ 0x82, 0xC2, 0x67, 0x92, 0x59, 0x82, 0x43, 0x53,
+ 0x72, 0x42, 0x73, 0x62, 0x33, 0x83, 0x52, 0x33,
+ 0x93, 0x42, 0x33, 0xA4, 0x22, 0x42, 0xB4, 0x12,
+ 0x43, 0xB6, 0x54, 0xB4, 0x63, 0xC3, 0x72, 0xD2,
+//ascii 0x0033
+ 0xF0, 0x14, 0xA5, 0x47, 0x77, 0x29, 0x54, 0x23,
+ 0x12, 0x53, 0x42, 0x63, 0x72, 0x33, 0x63, 0x72,
+ 0x33, 0x63, 0x72, 0x33, 0x63, 0x72, 0x42, 0x63,
+ 0x72, 0x42, 0xF0, 0x12, 0x43, 0xE3, 0x54, 0xA4,
+ 0x73, 0xA3, 0xA1, 0xA2, 0x30,
+//ascii 0x0034
+ 0xF0, 0x22, 0xF0, 0x72, 0x8F, 0x05, 0x4F, 0x05,
+ 0x4F, 0x05, 0x44, 0xA2, 0x94, 0x92, 0xB4, 0x72,
+ 0xC4, 0x62, 0xE4, 0x42, 0xF0, 0x14, 0x22, 0xF0,
+ 0x24, 0x12, 0xF0, 0x45, 0xF0, 0x54, 0x50,
+//ascii 0x0035
+ 0xD7, 0x72, 0x79, 0x62, 0x64, 0x34, 0x52, 0x53,
+ 0x73, 0x42, 0x52, 0x92, 0x42, 0x52, 0x92, 0x42,
+ 0x52, 0x92, 0x42, 0x52, 0x92, 0x42, 0x52, 0x92,
+ 0x44, 0x42, 0x73, 0x4A, 0x54, 0x69, 0x53, 0xF1,
+ 0x52, 0x40,
+//ascii 0x0036
+ 0x81, 0x73, 0xB3, 0x48, 0x84, 0x3B, 0x53, 0x53,
+ 0x53, 0x52, 0x53, 0x73, 0x33, 0x52, 0x92, 0x33,
+ 0x52, 0x92, 0x33, 0x52, 0x92, 0x42, 0x52, 0x92,
+ 0x42, 0x53, 0x73, 0x44, 0x43, 0x53, 0x65, 0x34,
+ 0x15, 0x8F, 0xBB, 0x40,
+//ascii 0x0037
+ 0x34, 0xF0, 0x56, 0xF0, 0x32, 0x15, 0xF0, 0x12,
+ 0x35, 0xE2, 0x55, 0xC2, 0x75, 0xA2, 0x95, 0x82,
+ 0xB5, 0x62, 0xD5, 0x42, 0xF3, 0x42, 0xF0, 0x12,
+ 0x42, 0xF0, 0x72, 0x30,
+//ascii 0x0038
+ 0xF0, 0x31, 0xC4, 0x47, 0x77, 0x29, 0x59, 0x12,
+ 0x43, 0x53, 0x44, 0x63, 0x42, 0x63, 0x72, 0x33,
+ 0x63, 0x72, 0x33, 0x63, 0x72, 0x33, 0x63, 0x72,
+ 0x42, 0x63, 0x72, 0x43, 0x45, 0x53, 0x58, 0x13,
+ 0x33, 0x76, 0x29, 0x92, 0x65, 0x30,
+//ascii 0x0039
+ 0xA6, 0xFD, 0xAF, 0x01, 0x73, 0x43, 0x44, 0x53,
+ 0x72, 0x52, 0x52, 0x82, 0x53, 0x42, 0x92, 0x52,
+ 0x33, 0x92, 0x52, 0x33, 0x92, 0x52, 0x42, 0x83,
+ 0x52, 0x43, 0x72, 0x53, 0x54, 0x34, 0x34, 0x6A,
+ 0x43, 0x96, 0x62, 0x30,
+//ascii 0x003A
+ 0x22, 0xA1, 0x24, 0x83, 0x14, 0x83, 0x22, 0x93,
+//ascii 0x003B
+ 0x22, 0x91, 0xB4, 0x85, 0x74, 0x88, 0x52, 0xE3,
+ 0x30,
+//ascii 0x003C
+ 0x02, 0xA2, 0x23, 0x83, 0x32, 0x82, 0x43, 0x63,
+ 0x52, 0x62, 0x63, 0x43, 0x72, 0x42, 0x83, 0x23,
+ 0x92, 0x22, 0xA6, 0xB4, 0xC4, 0xD2,
+//ascii 0x003D
+ 0x02, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
+ 0x44, 0x44, 0x44, 0x44, 0x42,
+//ascii 0x003E
+ 0x62, 0xE2, 0xD4, 0xC4, 0xB2, 0x22, 0xA2, 0x22,
+ 0x93, 0x32, 0x82, 0x42, 0x73, 0x52, 0x62, 0x63,
+ 0x43, 0x72, 0x42, 0x83, 0x23, 0x83, 0x20,
+//ascii 0x003F
+ 0x74, 0xF0, 0x37, 0xF0, 0x19, 0xF2, 0x53, 0xD3,
+ 0x63, 0xC3, 0x75, 0x33, 0x33, 0x75, 0x33, 0x42,
+ 0x93, 0x33, 0x42, 0xF0, 0x75, 0xF0, 0x54, 0xF0,
+ 0x72, 0x70,
+//ascii 0x0040
+ 0x88, 0xF0, 0x3C, 0xE5, 0x64, 0xC3, 0xB2, 0xB3,
+ 0xD2, 0xA2, 0xE2, 0x22, 0x52, 0xD3, 0x42, 0x42,
+ 0x4C, 0x42, 0x42, 0x4A, 0x62, 0x41, 0x52, 0x73,
+ 0x42, 0x32, 0x43, 0x82, 0x42, 0x32, 0x42, 0x92,
+ 0x42, 0x32, 0x42, 0x93, 0x32, 0x41, 0x43, 0x82,
+ 0x42, 0x42, 0x42, 0x82, 0x42, 0x42, 0x44, 0x44,
+ 0x42, 0x42, 0x59, 0x53, 0x52, 0x65, 0x72, 0x63,
+ 0xF0, 0x13, 0x73, 0xE3, 0x94, 0xA4, 0xBF, 0x01,
+ 0xEC, 0xF0, 0x45, 0x50,
+//ascii 0x0041
+ 0xF0, 0x62, 0xF0, 0x45, 0xF0, 0x27, 0xE7, 0xE7,
+ 0xE7, 0x12, 0xC6, 0x42, 0xA6, 0x62, 0xA3, 0x92,
+ 0xA5, 0x72, 0xB7, 0x42, 0xE7, 0x12, 0xF0, 0x27,
+ 0xF0, 0x57, 0xF0, 0x47, 0xF0, 0x55, 0xF0, 0x72,
+ 0x10,
+//ascii 0x0042
+ 0xF0, 0x13, 0xB4, 0x47, 0x77, 0x29, 0x68, 0x12,
+ 0x52, 0x53, 0x44, 0x63, 0x42, 0x63, 0x72, 0x42,
+ 0x63, 0x72, 0x42, 0x72, 0x72, 0x42, 0x72, 0x72,
+ 0x42, 0x72, 0x72, 0x42, 0x72, 0x72, 0x42, 0x72,
+ 0x72, 0x4F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0043
+ 0x91, 0x81, 0xC3, 0x83, 0x94, 0x84, 0x73, 0xC3,
+ 0x53, 0xE2, 0x52, 0xF3, 0x42, 0xF0, 0x12, 0x33,
+ 0xF0, 0x12, 0x33, 0xF0, 0x12, 0x42, 0xF0, 0x12,
+ 0x42, 0xF0, 0x12, 0x43, 0xE3, 0x43, 0xD3, 0x63,
+ 0xB4, 0x75, 0x65, 0x9E, 0xCA, 0x50,
+//ascii 0x0044
+ 0x8A, 0xCE, 0x94, 0x75, 0x73, 0xB4, 0x62, 0xD3,
+ 0x53, 0xE2, 0x52, 0xF3, 0x42, 0xF0, 0x12, 0x42,
+ 0xF0, 0x12, 0x42, 0xF0, 0x12, 0x42, 0xF0, 0x12,
+ 0x42, 0xF0, 0x12, 0x42, 0xF0, 0x12, 0x4F, 0x05,
+ 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0045
+ 0x32, 0xF0, 0x12, 0x42, 0x72, 0x72, 0x42, 0x72,
+ 0x72, 0x42, 0x72, 0x72, 0x42, 0x72, 0x72, 0x42,
+ 0x72, 0x72, 0x42, 0x72, 0x72, 0x42, 0x72, 0x72,
+ 0x42, 0x72, 0x72, 0x42, 0x72, 0x72, 0x4F, 0x05,
+ 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0046
+ 0x32, 0xF0, 0x72, 0x72, 0xD2, 0x72, 0xD2, 0x72,
+ 0xD2, 0x72, 0xD2, 0x72, 0xD2, 0x72, 0xD2, 0x72,
+ 0xD2, 0x72, 0xD2, 0x72, 0xDF, 0x05, 0x4F, 0x05,
+ 0x4F, 0x05, 0x10,
+//ascii 0x0047
+ 0x91, 0x45, 0xC3, 0x47, 0x94, 0x42, 0x15, 0x73,
+ 0x62, 0x43, 0x53, 0x72, 0x53, 0x42, 0x82, 0x53,
+ 0x42, 0x82, 0x62, 0x42, 0x82, 0x62, 0x33, 0xF0,
+ 0x12, 0x33, 0xF0, 0x12, 0x42, 0xF0, 0x12, 0x42,
+ 0xF3, 0x43, 0xD3, 0x63, 0xB4, 0x75, 0x65, 0x9E,
+ 0xCA, 0x50,
+//ascii 0x0048
+ 0x3F, 0x05, 0x4F, 0x05, 0xD2, 0xF0, 0x72, 0xF0,
+ 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0,
+ 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0,
+ 0x72, 0xDF, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0049
+ 0x3F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x004A
+ 0x3F, 0x01, 0x8F, 0x03, 0x6F, 0x04, 0xF0, 0x73,
+ 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72,
+ 0xF0, 0x63, 0xF0, 0x44, 0xF0, 0x54, 0xF0, 0x52,
+ 0x40,
+//ascii 0x004B
+ 0x31, 0xF0, 0x31, 0x41, 0xF0, 0x31, 0x42, 0xF3,
+ 0x43, 0xD4, 0x53, 0xB4, 0x73, 0x84, 0xA3, 0x64,
+ 0xC3, 0x44, 0xE3, 0x14, 0xF0, 0x26, 0xF0, 0x44,
+ 0xF0, 0x64, 0xF0, 0x64, 0xBF, 0x05, 0x4F, 0x05,
+ 0x4F, 0x05, 0x10,
+//ascii 0x004C
+ 0xF0, 0x62, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72,
+ 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72,
+ 0xF0, 0x72, 0x4F, 0x05, 0x4F, 0x05, 0x4F, 0x05,
+ 0x10,
+//ascii 0x004D
+ 0x3F, 0x05, 0x4F, 0x05, 0x46, 0xF0, 0x56, 0xF0,
+ 0x56, 0xF0, 0x66, 0xF0, 0x56, 0xF0, 0x66, 0xF0,
+ 0x56, 0xF0, 0x63, 0xF0, 0x45, 0xF0, 0x16, 0xF0,
+ 0x16, 0xF6, 0xF0, 0x16, 0xF6, 0xF0, 0x16, 0xF0,
+ 0x3F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x004E
+ 0x3F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0xF0, 0x44,
+ 0xF0, 0x44, 0xF0, 0x34, 0xF0, 0x44, 0xF0, 0x34,
+ 0xF0, 0x44, 0xF0, 0x34, 0xF0, 0x44, 0xF0, 0x34,
+ 0xF0, 0x44, 0xF0, 0x44, 0xF0, 0x4F, 0x05, 0x4F,
+ 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x004F
+ 0xC4, 0xF0, 0x1B, 0xCE, 0x94, 0x84, 0x73, 0xC3,
+ 0x53, 0xE2, 0x52, 0xF3, 0x42, 0xF0, 0x12, 0x33,
+ 0xF0, 0x12, 0x33, 0xF0, 0x12, 0x42, 0xF0, 0x12,
+ 0x42, 0xF0, 0x12, 0x43, 0xE3, 0x43, 0xD3, 0x63,
+ 0xB4, 0x75, 0x65, 0x9E, 0xCA, 0x50,
+//ascii 0x0050
+ 0x66, 0xF0, 0x1A, 0xE3, 0x44, 0xC3, 0x63, 0xC2,
+ 0x82, 0xC2, 0x82, 0xC2, 0x83, 0xB2, 0x83, 0xB2,
+ 0x83, 0xB2, 0x83, 0xB2, 0x83, 0xBF, 0x05, 0x4F,
+ 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0051
+ 0xC4, 0xF0, 0x5B, 0x61, 0x9E, 0x32, 0x84, 0x84,
+ 0x13, 0x73, 0xC5, 0x73, 0xD4, 0x82, 0xD5, 0x82,
+ 0xC3, 0x12, 0x73, 0xC2, 0x22, 0x73, 0xC1, 0x32,
+ 0x82, 0xF0, 0x12, 0x82, 0xF0, 0x12, 0x83, 0xE3,
+ 0x83, 0xD3, 0xA3, 0xB4, 0xB5, 0x65, 0xDE, 0xF0,
+ 0x1A, 0x10,
+//ascii 0x0052
+ 0xF0, 0x71, 0x76, 0x83, 0x59, 0x55, 0x53, 0x43,
+ 0x26, 0x53, 0x68, 0x72, 0x76, 0x92, 0x83, 0xB2,
+ 0x82, 0xC2, 0x82, 0xC2, 0x82, 0xC2, 0x82, 0xC2,
+ 0x82, 0xCF, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0053
+ 0x72, 0x75, 0x84, 0x68, 0x63, 0x63, 0x33, 0x53,
+ 0x72, 0x53, 0x42, 0x73, 0x62, 0x33, 0x72, 0x72,
+ 0x33, 0x72, 0x72, 0x33, 0x63, 0x72, 0x42, 0x62,
+ 0x82, 0x42, 0x62, 0x82, 0x43, 0x43, 0x73, 0x58,
+ 0x73, 0x76, 0x74, 0x84, 0x83, 0x20,
+//ascii 0x0054
+ 0x32, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0,
+ 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x7F, 0x05,
+ 0x4F, 0x05, 0x42, 0xF0, 0x72, 0xF0, 0x72, 0xF0,
+ 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72, 0x30,
+//ascii 0x0055
+ 0x3F, 0x01, 0x8F, 0x03, 0xF0, 0x64, 0xF0, 0x63,
+ 0xF0, 0x73, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x72,
+ 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x63, 0xF0, 0x63,
+ 0xF0, 0x44, 0x5F, 0x03, 0x6F, 0x02, 0x7E, 0x70,
+//ascii 0x0056
+ 0x32, 0xF0, 0x74, 0xF0, 0x57, 0xF0, 0x57, 0xF0,
+ 0x57, 0xF0, 0x47, 0xF0, 0x57, 0xF0, 0x56, 0xF0,
+ 0x63, 0xF0, 0x36, 0xF0, 0x16, 0xF6, 0xF7, 0xE7,
+ 0xE7, 0xF0, 0x25, 0xF0, 0x42, 0x30,
+//ascii 0x0057
+ 0x31, 0xF0, 0x85, 0xF0, 0x49, 0xF0, 0x39, 0xF0,
+ 0x49, 0xF0, 0x49, 0xF0, 0x45, 0xF0, 0x36, 0xE9,
+ 0xC8, 0xC9, 0xC8, 0xF0, 0x14, 0xF0, 0x56, 0xF0,
+ 0x49, 0xF0, 0x49, 0xF0, 0x48, 0xF0, 0x57, 0xF0,
+ 0x54, 0xF0, 0x27, 0xD9, 0xB9, 0xB9, 0xE7, 0xF0,
+ 0x23, 0x20,
+//ascii 0x0058
+ 0x31, 0xF0, 0x31, 0x42, 0xF3, 0x44, 0xC4, 0x55,
+ 0x85, 0x84, 0x55, 0xB5, 0x25, 0xE8, 0xF0, 0x25,
+ 0xF0, 0x45, 0xF0, 0x38, 0xE5, 0x25, 0xB4, 0x64,
+ 0x84, 0x95, 0x54, 0xC4, 0x42, 0xF3, 0x41, 0xF0,
+ 0x31, 0x10,
+//ascii 0x0059
+ 0x31, 0xF0, 0x82, 0xF0, 0x74, 0xF0, 0x64, 0xF0,
+ 0x65, 0xF0, 0x64, 0xF0, 0x74, 0xF0, 0x6D, 0xDB,
+ 0xCC, 0xA5, 0xF0, 0x34, 0xF0, 0x34, 0xF0, 0x35,
+ 0xF0, 0x34, 0xF0, 0x53, 0xF0, 0x61, 0x40,
+//ascii 0x005A
+ 0x32, 0xF0, 0x12, 0x43, 0xF2, 0x45, 0xD2, 0x46,
+ 0xC2, 0x42, 0x24, 0xA2, 0x42, 0x34, 0x92, 0x42,
+ 0x54, 0x72, 0x42, 0x64, 0x62, 0x42, 0x84, 0x42,
+ 0x42, 0x94, 0x32, 0x42, 0xB4, 0x12, 0x42, 0xC6,
+ 0x42, 0xE4, 0x42, 0xF3, 0x10,
+//ascii 0x005B
+ 0x22, 0xF0, 0x62, 0x32, 0xF0, 0x62, 0x32, 0xF0,
+ 0x62, 0x3F, 0x0A, 0x3F, 0x0A, 0x3F, 0x0A, 0x10,
+//ascii 0x005C
+ 0xF0, 0x83, 0xF0, 0x67, 0xF0, 0x28, 0xF0, 0x28,
+ 0xF0, 0x18, 0xF0, 0x18, 0xF0, 0x37, 0xF0, 0x63,
+ 0x70,
+//ascii 0x005D
+ 0x2F, 0x0A, 0x3F, 0x0A, 0x32, 0xF0, 0x62, 0x32,
+ 0xF0, 0x62, 0x32, 0xF0, 0x62, 0x32, 0xF0, 0x62,
+ 0x10,
+//ascii 0x005E
+ 0x81, 0x93, 0x75, 0x45, 0x64, 0x82, 0xA5, 0x95,
+ 0x95, 0x93, 0xB1, 0x70,
+//ascii 0x005F
+ 0x02, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
+ 0x22, 0x22, 0x22, 0x22, 0x22, 0x60,
+//ascii 0x0060
+ 0x61, 0x62, 0x44, 0x33, 0x52, 0x61, 0x50,
+//ascii 0x0061
+ 0x3C, 0x2E, 0x1F, 0x12, 0x42, 0x42, 0x22, 0x42,
+ 0x52, 0x12, 0x42, 0x52, 0x12, 0x42, 0x52, 0x12,
+ 0x42, 0x52, 0x12, 0x43, 0x42, 0x13, 0x42, 0x33,
+ 0x23, 0x38, 0x31, 0x56, 0xC2, 0x40,
+//ascii 0x0062
+ 0xC7, 0xFB, 0xC5, 0x35, 0xA3, 0x84, 0x92, 0xA3,
+ 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2,
+ 0x93, 0x92, 0xB3, 0x72, 0x6F, 0x05, 0x4F, 0x05,
+ 0x4F, 0x05, 0x10,
+//ascii 0x0063
+ 0x22, 0x72, 0x43, 0x73, 0x23, 0x93, 0x12, 0xB2,
+ 0x12, 0xB2, 0x12, 0xB2, 0x12, 0xB2, 0x12, 0xB2,
+ 0x13, 0x93, 0x23, 0x73, 0x4B, 0x69, 0xA3, 0x70,
+//ascii 0x0064
+ 0x3F, 0x05, 0x4F, 0x05, 0xB4, 0x34, 0xC2, 0x92,
+ 0xA2, 0xB2, 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2,
+ 0x92, 0xB2, 0x93, 0x93, 0xA3, 0x73, 0xBC, 0xE9,
+ 0xF0, 0x33, 0x70,
+//ascii 0x0065
+ 0x44, 0x31, 0x66, 0x32, 0x47, 0x33, 0x23, 0x32,
+ 0x43, 0x12, 0x42, 0x52, 0x12, 0x42, 0x52, 0x12,
+ 0x42, 0x52, 0x12, 0x42, 0x52, 0x12, 0x42, 0x52,
+ 0x13, 0x32, 0x43, 0x23, 0x22, 0x33, 0x4B, 0x69,
+ 0xA3, 0x70,
+//ascii 0x0066
+ 0x21, 0xF0, 0x82, 0x42, 0xF0, 0x12, 0x42, 0xF0,
+ 0x12, 0x42, 0xF0, 0x1F, 0x06, 0x4F, 0x05, 0x5F,
+ 0x04, 0x92, 0xF0, 0x72, 0x60,
+//ascii 0x0067
+ 0x0F, 0x03, 0x6F, 0x04, 0x74, 0x24, 0x44, 0x52,
+ 0x82, 0x53, 0x32, 0xA2, 0x52, 0x32, 0xB1, 0x52,
+ 0x32, 0xB2, 0x42, 0x32, 0xB2, 0x42, 0x32, 0xA3,
+ 0x42, 0x33, 0x92, 0x43, 0x43, 0x73, 0x33, 0x5C,
+ 0x43, 0x79, 0x61, 0xB3, 0x70,
+//ascii 0x0068
+ 0xAD, 0xAE, 0x93, 0xF0, 0x62, 0xF0, 0x72, 0xF0,
+ 0x72, 0xF0, 0x72, 0xF0, 0x72, 0xF0, 0x82, 0xF0,
+ 0x1F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x0069
+ 0x33, 0x3F, 0x33, 0x3F, 0x33, 0x3F,
+//ascii 0x006A
+ 0x33, 0x3F, 0x01, 0xA3, 0x3F, 0x04, 0x73, 0x3F,
+ 0x05, 0xF0, 0xF3, 0xF0, 0xE3, 0x20,
+//ascii 0x006B
+ 0xF0, 0x71, 0x91, 0xC2, 0x92, 0xA3, 0x93, 0x84,
+ 0xA3, 0x63, 0xD3, 0x34, 0xF3, 0x14, 0xF0, 0x25,
+ 0xF0, 0x53, 0xF0, 0x72, 0xBF, 0x05, 0x4F, 0x05,
+ 0x4F, 0x05, 0x10,
+//ascii 0x006C
+ 0x3F, 0x05, 0x4F, 0x05, 0x4F, 0x05, 0x10,
+//ascii 0x006D
+ 0x2D, 0x1F, 0x13, 0xD2, 0xE2, 0xE2, 0xE2, 0xE2,
+ 0xF3, 0xED, 0x1F, 0x13, 0xD2, 0xE2, 0xE2, 0xE2,
+ 0xF2, 0xFD, 0x1F, 0x1F, 0x10,
+//ascii 0x006E
+ 0x2D, 0x2E, 0x14, 0xC2, 0xE2, 0xE2, 0xE2, 0xE2,
+ 0xF2, 0xFD, 0x1F, 0x1F, 0x10,
+//ascii 0x006F
+ 0x47, 0x7B, 0x44, 0x54, 0x23, 0x93, 0x12, 0xB2,
+ 0x12, 0xB2, 0x12, 0xB2, 0x12, 0xB2, 0x12, 0xB2,
+ 0x13, 0x93, 0x23, 0x73, 0x3C, 0x69, 0xA3, 0x70,
+//ascii 0x0070
+ 0x63, 0xF0, 0x39, 0xDD, 0xA4, 0x73, 0xA3, 0x93,
+ 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2,
+ 0x92, 0xB2, 0xA2, 0x83, 0xC5, 0x1D, 0x3F, 0x06,
+ 0x3F, 0x06, 0x30,
+//ascii 0x0071
+ 0x0F, 0x06, 0x3F, 0x06, 0x54, 0x34, 0xC2, 0x92,
+ 0xA2, 0xB2, 0x92, 0xB2, 0x92, 0xB2, 0x92, 0xB2,
+ 0x92, 0xB2, 0x93, 0x93, 0xA3, 0x73, 0xBC, 0xE9,
+ 0xF0, 0x33, 0x70,
+//ascii 0x0072
+ 0x03, 0xD3, 0xE2, 0xE2, 0xF2, 0xFD, 0x1F, 0x1F,
+//ascii 0x0073
+ 0x21, 0x55, 0x43, 0x46, 0x23, 0x43, 0x23, 0x12,
+ 0x52, 0x42, 0x12, 0x43, 0x42, 0x12, 0x42, 0x52,
+ 0x12, 0x42, 0x52, 0x12, 0x42, 0x52, 0x13, 0x23,
+ 0x43, 0x26, 0x43, 0x44, 0x53, 0xD1, 0x40,
+//ascii 0x0074
+ 0x52, 0xB2, 0x52, 0xB2, 0x52, 0xB2, 0x1F, 0x04,
+ 0x1F, 0x03, 0x2F, 0x02, 0x72, 0xF0, 0x32, 0x50,
+//ascii 0x0075
+ 0x0F, 0x1F, 0xB3, 0xF2, 0xF2, 0xE2, 0xE2, 0xE2,
+ 0xD3, 0x1F, 0x1E, 0x2C, 0x40,
+//ascii 0x0076
+ 0x01, 0xF3, 0xD6, 0xB7, 0xC7, 0xC7, 0xC5, 0xC4,
+ 0x97, 0x67, 0x76, 0x77, 0x94, 0xC1, 0x70,
+//ascii 0x0077
+ 0x01, 0xF4, 0xC7, 0xC8, 0xB8, 0xC5, 0xB5, 0x78,
+ 0x57, 0x67, 0x93, 0xD6, 0xC8, 0xC7, 0xC6, 0xC4,
+ 0x88, 0x57, 0x58, 0x85, 0xB2, 0x60,
+//ascii 0x0078
+ 0x01, 0xD1, 0x12, 0xB2, 0x13, 0x84, 0x24, 0x54,
+ 0x54, 0x14, 0x87, 0xB3, 0xB7, 0x75, 0x14, 0x54,
+ 0x54, 0x23, 0x84, 0x12, 0xB2, 0x11, 0xD1, 0x10,
+//ascii 0x0079
+ 0x01, 0xF0, 0x83, 0xF0, 0x66, 0xF0, 0x47, 0xF0,
+ 0x57, 0xF0, 0x57, 0xF0, 0x56, 0xF0, 0x48, 0xDC,
+ 0x97, 0x62, 0x76, 0x93, 0x37, 0xC2, 0x34, 0xE3,
+ 0x31, 0x70,
+//ascii 0x007A
+ 0xD2, 0x13, 0xA2, 0x14, 0x92, 0x15, 0x82, 0x12,
+ 0x14, 0x62, 0x12, 0x24, 0x52, 0x12, 0x43, 0x42,
+ 0x12, 0x54, 0x22, 0x12, 0x64, 0x12, 0x12, 0x85,
+ 0x12, 0x94, 0x12, 0xA3, 0x10,
+//ascii 0x007B
+ 0x22, 0xF0, 0x62, 0x32, 0xF0, 0x62, 0x33, 0xF0,
+ 0x43, 0x4A, 0x3A, 0x6A, 0x1A, 0xF2, 0x12, 0xF0,
+ 0x93, 0xF0, 0xA3, 0x40,
+//ascii 0x007C
+ 0x1F, 0x0F, 0x04, 0x2F, 0x0F, 0x04, 0x10,
+//ascii 0x007D
+ 0xD3, 0xF0, 0xA3, 0xF0, 0x92, 0x12, 0xFA, 0x1A,
+ 0x6A, 0x3A, 0x43, 0xF0, 0x43, 0x32, 0xF0, 0x62,
+ 0x32, 0xF0, 0x62, 0x10,
+//ascii 0x007E
+ 0x23, 0x54, 0x62, 0x63, 0x52, 0x62, 0x53, 0x43,
+ 0x52, 0x53, 0x62, 0x63, 0x54, 0x62, 0x20,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_REGULAR_28PX_1BPP[95] = {
+ { 0, 0, 8,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 8,2, 4, 2, 8 }, //asciii 0x0021
+ { 9, 1, 11,2, 4, 2, 20 }, //asciii 0x0022
+ { 16, 1, 18,0, 4, 1, 8 }, //asciii 0x0023
+ { 52, 1, 18,2, 4, 2, 4 }, //asciii 0x0024
+ { 88, 1, 23,2, 4, 3, 8 }, //asciii 0x0025
+ { 130, 1, 18,1, 4, 1, 8 }, //asciii 0x0026
+ { 172, 1, 6,2, 4, 2, 20 }, //asciii 0x0027
+ { 175, 1, 10,3, 4, 1, 4 }, //asciii 0x0028
+ { 188, 1, 10,1, 4, 3, 4 }, //asciii 0x0029
+ { 202, 1, 14,2, 4, 2, 16 }, //asciii 0x002A
+ { 219, 1, 18,3, 12, 2, 8 }, //asciii 0x002B
+ { 233, 1, 8,2, 24, 2, 0 }, //asciii 0x002C
+ { 238, 1, 13,2, 16, 2, 16 }, //asciii 0x002D
+ { 248, 1, 8,2, 24, 2, 8 }, //asciii 0x002E
+ { 253, 1, 10,1, 4, 1, 4 }, //asciii 0x002F
+ { 269, 1, 18,2, 4, 2, 8 }, //asciii 0x0030
+ { 299, 1, 13,2, 4, 4, 8 }, //asciii 0x0031
+ { 313, 1, 17,2, 4, 2, 8 }, //asciii 0x0032
+ { 345, 1, 18,2, 4, 2, 8 }, //asciii 0x0033
+ { 382, 1, 18,2, 4, 2, 8 }, //asciii 0x0034
+ { 413, 1, 17,2, 4, 2, 8 }, //asciii 0x0035
+ { 447, 1, 17,2, 4, 1, 8 }, //asciii 0x0036
+ { 483, 1, 16,1, 4, 2, 8 }, //asciii 0x0037
+ { 511, 1, 17,2, 4, 1, 8 }, //asciii 0x0038
+ { 549, 1, 17,2, 4, 1, 8 }, //asciii 0x0039
+ { 585, 1, 8,2, 12, 2, 8 }, //asciii 0x003A
+ { 593, 1, 8,2, 12, 2, 0 }, //asciii 0x003B
+ { 602, 1, 18,3, 12, 2, 8 }, //asciii 0x003C
+ { 624, 1, 18,3, 16, 3, 12 }, //asciii 0x003D
+ { 637, 1, 18,3, 12, 2, 8 }, //asciii 0x003E
+ { 660, 1, 14,1, 4, 1, 8 }, //asciii 0x003F
+ { 686, 1, 26,1, 8, 1, 0 }, //asciii 0x0040
+ { 754, 1, 19,1, 4, 1, 8 }, //asciii 0x0041
+ { 787, 1, 18,2, 4, 1, 8 }, //asciii 0x0042
+ { 827, 1, 20,2, 4, 1, 8 }, //asciii 0x0043
+ { 865, 1, 20,2, 4, 2, 8 }, //asciii 0x0044
+ { 902, 1, 17,2, 4, 2, 8 }, //asciii 0x0045
+ { 939, 1, 16,2, 4, 1, 8 }, //asciii 0x0046
+ { 966, 1, 21,2, 4, 2, 8 }, //asciii 0x0047
+ { 1008, 1, 21,2, 4, 3, 8 }, //asciii 0x0048
+ { 1040, 1, 7,2, 4, 2, 8 }, //asciii 0x0049
+ { 1047, 1, 15,1, 4, 2, 8 }, //asciii 0x004A
+ { 1072, 1, 18,2, 4, 0, 8 }, //asciii 0x004B
+ { 1107, 1, 16,2, 4, 2, 8 }, //asciii 0x004C
+ { 1132, 1, 25,2, 4, 3, 8 }, //asciii 0x004D
+ { 1171, 1, 21,2, 4, 2, 8 }, //asciii 0x004E
+ { 1207, 1, 21,2, 4, 1, 8 }, //asciii 0x004F
+ { 1245, 1, 18,2, 4, 2, 8 }, //asciii 0x0050
+ { 1273, 1, 21,2, 4, 1, 4 }, //asciii 0x0051
+ { 1315, 1, 18,2, 4, 1, 8 }, //asciii 0x0052
+ { 1347, 1, 18,2, 4, 2, 8 }, //asciii 0x0053
+ { 1385, 1, 18,1, 4, 1, 8 }, //asciii 0x0054
+ { 1417, 1, 21,2, 4, 3, 8 }, //asciii 0x0055
+ { 1449, 1, 19,1, 4, 1, 8 }, //asciii 0x0056
+ { 1479, 1, 27,1, 4, 1, 8 }, //asciii 0x0057
+ { 1521, 1, 18,1, 4, 1, 8 }, //asciii 0x0058
+ { 1555, 1, 19,1, 4, 1, 8 }, //asciii 0x0059
+ { 1586, 1, 18,2, 4, 2, 8 }, //asciii 0x005A
+ { 1623, 1, 10,3, 4, 1, 4 }, //asciii 0x005B
+ { 1639, 1, 10,1, 4, 1, 4 }, //asciii 0x005C
+ { 1656, 1, 10,1, 4, 3, 4 }, //asciii 0x005D
+ { 1673, 1, 13,1, 8, 1, 16 }, //asciii 0x005E
+ { 1685, 1, 14,0, 28, 1, 4 }, //asciii 0x005F
+ { 1699, 1, 14,4, 4, 4, 24 }, //asciii 0x0060
+ { 1706, 1, 16,1, 12, 2, 8 }, //asciii 0x0061
+ { 1736, 1, 17,2, 4, 1, 8 }, //asciii 0x0062
+ { 1763, 1, 16,1, 12, 2, 8 }, //asciii 0x0063
+ { 1787, 1, 17,1, 4, 2, 8 }, //asciii 0x0064
+ { 1814, 1, 16,1, 12, 1, 8 }, //asciii 0x0065
+ { 1848, 1, 10,1, 4, 0, 8 }, //asciii 0x0066
+ { 1869, 1, 17,1, 12, 2, 0 }, //asciii 0x0067
+ { 1906, 1, 17,2, 4, 3, 8 }, //asciii 0x0068
+ { 1929, 1, 7,2, 4, 2, 8 }, //asciii 0x0069
+ { 1935, 1, 8,0, 4, 3, 0 }, //asciii 0x006A
+ { 1949, 1, 15,2, 4, 0, 8 }, //asciii 0x006B
+ { 1976, 1, 7,2, 4, 2, 8 }, //asciii 0x006C
+ { 1983, 1, 24,2, 12, 2, 8 }, //asciii 0x006D
+ { 2004, 1, 16,2, 12, 2, 8 }, //asciii 0x006E
+ { 2017, 1, 17,1, 12, 2, 8 }, //asciii 0x006F
+ { 2041, 1, 17,2, 12, 1, 0 }, //asciii 0x0070
+ { 2068, 1, 17,1, 12, 2, 0 }, //asciii 0x0071
+ { 2095, 1, 10,2, 12, 0, 8 }, //asciii 0x0072
+ { 2103, 1, 15,1, 12, 2, 8 }, //asciii 0x0073
+ { 2134, 1, 10,1, 8, 1, 8 }, //asciii 0x0074
+ { 2150, 1, 16,2, 12, 2, 8 }, //asciii 0x0075
+ { 2163, 1, 16,1, 12, 1, 8 }, //asciii 0x0076
+ { 2178, 1, 23,1, 12, 1, 8 }, //asciii 0x0077
+ { 2200, 1, 15,1, 12, 1, 8 }, //asciii 0x0078
+ { 2224, 1, 16,1, 12, 1, 0 }, //asciii 0x0079
+ { 2250, 1, 15,2, 12, 1, 8 }, //asciii 0x007A
+ { 2279, 1, 10,1, 4, 1, 4 }, //asciii 0x007B
+ { 2299, 1, 9,4, 0, 3, 0 }, //asciii 0x007C
+ { 2306, 1, 10,1, 4, 1, 4 }, //asciii 0x007D
+ { 2326, 1, 18,2, 16, 2, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_REGULAR_28PX_1BPP= {
+ 2341, // bitmap len
+ BAGL_FONT_INTER_REGULAR_28px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 36, // height of all characters in pixels
+ 36, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_REGULAR_28PX_1BPP,
+ bitmapINTER_REGULAR_28PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.json
new file mode 100644
index 00000000..f86e1bfc
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_regular_28_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 33,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 9,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 34,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 16,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 52,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 88,
+ "width": 23,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 37,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 130,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 38,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 172,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 20,
+ "char": 39,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 175,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 40,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 188,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 41,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 202,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 219,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 233,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 24,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 238,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 16,
+ "char": 45,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 248,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 24,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 46,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 253,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 269,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 48,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 299,
+ "width": 13,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 4,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 313,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 345,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 51,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 382,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 413,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 53,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 447,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 54,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 483,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 511,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 56,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 549,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 57,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 585,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 58,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 593,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 602,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 624,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 16,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 61,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 637,
+ "width": 18,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 62,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 660,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 63,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 686,
+ "width": 26,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 68
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 754,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 787,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 827,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 67,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 865,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 902,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 939,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 966,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 71,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1008,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1040,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1047,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 74,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1072,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1107,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1132,
+ "width": 25,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1171,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1207,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 79,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1245,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1273,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1315,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1347,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 83,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1385,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1417,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 85,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1449,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1479,
+ "width": 27,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1521,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1555,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1586,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1623,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1639,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1656,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1673,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1685,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 28,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1699,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 4,
+ "y_max_offset": 24,
+ "char": 96,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1706,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 97,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1736,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 98,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1763,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 99,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1787,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 100,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1814,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 101,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1848,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1869,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1906,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1929,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1935,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1949,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1976,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1983,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2004,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2017,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 111,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2041,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2068,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2095,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2103,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 115,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2134,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 116,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2150,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 117,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2163,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2178,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2200,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2224,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2250,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2279,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 123,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2299,
+ "width": 9,
+ "x_min_offset": 4,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2306,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 125,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2326,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 15
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.inc b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.inc
new file mode 100644
index 00000000..482f329b
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.inc
@@ -0,0 +1,1179 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_SEMIBOLD_24PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC1, 0x0D, 0x2B, 0x3C, 0x1D, 0x1E, 0xC2, 0x8B,
+ 0x8D, 0xC5, 0x09, 0x70, 0x20, 0x02, 0xC0, 0x0B,
+ 0x10, 0x02, 0xC5, 0x09, 0x70, 0x20, 0x02, 0xC0,
+ 0x08, 0x20, 0x0D, 0xC4, 0x09, 0x42, 0x33, 0x15,
+ 0x06, 0xC0, 0x9E, 0x20, 0x50, 0xD5, 0x0E, 0xC0,
+//ascii 0x0022
+ 0xC2, 0x5E, 0xC4, 0x09, 0x50, 0xC4, 0x09, 0x50,
+ 0xC4, 0x0E, 0x5C, 0xD0, 0x0C, 0x55, 0xC4, 0x09,
+ 0x50, 0xC4, 0x0C, 0x56, 0xC0,
+//ascii 0x0023
+ 0xC6, 0x80, 0x2B, 0xCB, 0x8E, 0xBE, 0xC1, 0x10,
+ 0x09, 0xC2, 0x12, 0x09, 0xC5, 0x09, 0x10, 0x02,
+ 0x04, 0x10, 0x06, 0x0E, 0xC1, 0x82, 0x09, 0xC5,
+ 0x09, 0x70, 0x00, 0x04, 0x10, 0x06, 0x0E, 0xC5,
+ 0x9E, 0xB9, 0x60, 0x70, 0x20, 0x04, 0x06, 0xC6,
+ 0x10, 0x96, 0xB9, 0x60, 0x60, 0xC6, 0x10, 0x09,
+ 0xC2, 0xB2, 0x06, 0xB9, 0x60, 0x04, 0xC1, 0x1E,
+ 0xC2, 0x10, 0x09, 0xC2, 0x82, 0x09, 0xC5, 0x09,
+ 0x10, 0x04, 0x06, 0x10, 0x09, 0xC2, 0x82, 0x09,
+ 0xC5, 0x09, 0x70, 0x04, 0x06, 0x10, 0x06, 0xC6,
+ 0x9B, 0x96, 0x40, 0x70, 0x10, 0x84, 0x69, 0xC6,
+ 0x10, 0x96, 0x96, 0x40, 0x60, 0xC6, 0x10, 0x09,
+ 0xC2, 0xB2, 0x06, 0x96, 0x40, 0x02, 0xC6, 0x8B,
+ 0x6B, 0xC2, 0x82, 0x09, 0xD0, 0x8B, 0x6B,
+//ascii 0x0024
+ 0xE1, 0x0D, 0xC5, 0x0C, 0x19, 0x0B, 0xCE, 0x9C,
+ 0x30, 0xB0, 0xC3, 0x05, 0x30, 0x03, 0x0D, 0xCB,
+ 0x0C, 0x20, 0x0B, 0xC2, 0x06, 0x50, 0x01, 0xCB,
+ 0x03, 0x20, 0x0B, 0xC1, 0x0D, 0x20, 0x03, 0x05,
+ 0x20, 0x07, 0xC9, 0x0B, 0x10, 0x03, 0xC3, 0x06,
+ 0x10, 0x06, 0xC1, 0x0B, 0x10, 0x01, 0xC9, 0x07,
+ 0x10, 0x0C, 0xC3, 0x01, 0x10, 0xC3, 0x05, 0x10,
+ 0x0D, 0xC7, 0x06, 0x03, 0x10, 0x46, 0x10, 0x01,
+ 0x36, 0x03, 0x10, 0x05, 0x06, 0xC6, 0x03, 0x01,
+ 0x10, 0x33, 0x01, 0x10, 0x01, 0x33, 0x01, 0x10,
+ 0x13, 0x0D, 0xC6, 0x07, 0x10, 0x0D, 0xC2, 0x05,
+ 0x10, 0x0C, 0xC3, 0x06, 0x10, 0x0D, 0xC8, 0x0B,
+ 0x10, 0x05, 0xC1, 0x0B, 0x10, 0x01, 0xC4, 0x01,
+ 0x10, 0xCA, 0x01, 0x10, 0x01, 0x03, 0x20, 0x07,
+ 0xC2, 0x0B, 0x03, 0x10, 0x05, 0xCA, 0x0B, 0x50,
+ 0x01, 0xC2, 0x0D, 0x30, 0x0D, 0xCB, 0x0A, 0x01,
+ 0x20, 0x01, 0x0C, 0xC2, 0x0D, 0x20, 0x0A, 0xCE,
+ 0x8B, 0x9B, 0xC4, 0x9D, 0x36, 0xD0,
+//ascii 0x0025
+ 0xEA, 0x1C, 0x0D, 0xD6, 0x07, 0x30, 0x02, 0x0D,
+ 0xC9, 0x0A, 0x08, 0xC7, 0x08, 0x50, 0x02, 0xC9,
+ 0x98, 0x04, 0xE0, 0xC5, 0x82, 0x0A, 0xC1, 0x9E,
+ 0x40, 0xA0, 0xC9, 0x04, 0x10, 0x0A, 0xC4, 0x10,
+ 0xC3, 0x88, 0x08, 0xCA, 0x0A, 0x10, 0x04, 0x0E,
+ 0xC2, 0x82, 0x07, 0x1E, 0x9C, 0x20, 0xA0, 0xCB,
+ 0xAE, 0x40, 0x2A, 0xC1, 0x0A, 0x50, 0x02, 0xCE,
+ 0x0A, 0x10, 0x07, 0xC1, 0x0A, 0x02, 0x20, 0x04,
+ 0x0E, 0xCF, 0xAE, 0x40, 0x2C, 0xC2, 0x0E, 0xCE,
+ 0x0D, 0x1A, 0x0C, 0xC1, 0x08, 0x10, 0x07, 0xD0,
+ 0x04, 0x40, 0x0C, 0xC0, 0xAD, 0x20, 0x2D, 0xCD,
+ 0x08, 0x10, 0x12, 0x20, 0x0E, 0xC1, 0x07, 0x10,
+ 0x08, 0xCC, 0x82, 0x0C, 0xC2, 0x84, 0x0A, 0xC2,
+ 0xAC, 0x20, 0x2D, 0xCA, 0x02, 0x00, 0xC3, 0x88,
+ 0x08, 0xC4, 0x07, 0x10, 0x08, 0xC9, 0x84, 0x04,
+ 0x1C, 0x9A, 0x20, 0xC0, 0xC5, 0x8C, 0x20, 0xC9,
+ 0x0C, 0x50, 0x04, 0xC8, 0x04, 0xCA, 0x0C, 0x04,
+ 0x10, 0x02, 0x07, 0xC0,
+//ascii 0x0026
+ 0xD2, 0x0B, 0xCE, 0x9E, 0x68, 0xB0, 0xC2, 0x09,
+ 0x00, 0xCE, 0x0D, 0x30, 0x08, 0x06, 0x10, 0xCE,
+ 0x0D, 0x60, 0x01, 0xC7, 0x9E, 0x98, 0xB0, 0xC4,
+ 0x0D, 0x06, 0x20, 0x01, 0x0E, 0xC6, 0x0B, 0x30,
+ 0x01, 0x0D, 0xC2, 0x0D, 0x01, 0x30, 0x0B, 0xC5,
+ 0x0E, 0x50, 0x01, 0x0E, 0xC0, 0x0B, 0x20, 0x04,
+ 0x10, 0x04, 0xC5, 0x08, 0x10, 0x88, 0xE9, 0x10,
+ 0x04, 0x08, 0x20, 0x08, 0xC0, 0x06, 0x10, 0xC5,
+ 0x86, 0x01, 0xC2, 0x09, 0x40, 0x09, 0xC1, 0x0B,
+ 0x10, 0x0D, 0xC4, 0x06, 0x10, 0xC2, 0x0E, 0x30,
+ 0x0B, 0xC2, 0x0B, 0x10, 0x0D, 0xC4, 0x09, 0x10,
+ 0x94, 0xB9, 0x10, 0x20, 0x01, 0x0E, 0xC2, 0x06,
+ 0x10, 0x0E, 0xC5, 0x01, 0x50, 0x01, 0x10, 0x91,
+ 0xBE, 0x90, 0x10, 0x01, 0xC6, 0x0D, 0x01, 0x30,
+ 0x08, 0xC0, 0x06, 0x60, 0x09, 0xC8, 0x0B, 0x19,
+ 0x0E, 0xC2, 0x04, 0x40, 0x04, 0xD1, 0x08, 0x11,
+ 0x04, 0x09,
+//ascii 0x0027
+ 0xC1, 0x0B, 0x55, 0xC4, 0x09, 0x50, 0xC4, 0x0B,
+ 0x56, 0xC0,
+//ascii 0x0028
+ 0xC1, 0x0B, 0xD3, 0x0B, 0xC1, 0x80, 0x4B, 0xCF,
+ 0x8B, 0x24, 0xC1, 0x20, 0x82, 0x8B, 0xC9, 0x8B,
+ 0x62, 0x10, 0x04, 0xC1, 0x06, 0x50, 0x02, 0x04,
+ 0x36, 0x04, 0x02, 0x50, 0x0B, 0xC2, 0x0D, 0x04,
+ 0x70, 0x70, 0x06, 0x0E, 0xC5, 0x8D, 0x62, 0x70,
+ 0x10, 0x82, 0x8E, 0xCA, 0x8D, 0xB8, 0x36, 0x88,
+ 0xBE,
+//ascii 0x0029
+ 0xCB, 0x1E, 0xCF, 0x9E, 0x96, 0x20, 0x50, 0x82,
+ 0x6B, 0xC8, 0x0D, 0x06, 0x70, 0x50, 0x06, 0x0E,
+ 0xC3, 0x0E, 0x06, 0x70, 0x70, 0x10, 0x09, 0xC2,
+ 0x02, 0x30, 0xB2, 0x69, 0xBD, 0xE0, 0x1D, 0x9B,
+ 0x96, 0x20, 0x30, 0x06, 0xC1, 0x10, 0x82, 0x9E,
+ 0xCB, 0xAD, 0x92, 0x06, 0xC1, 0x02, 0x0B, 0xD1,
+ 0x09, 0x06,
+//ascii 0x002A
+ 0xFB, 0x88, 0x1B, 0xC0, 0x89, 0x19, 0xD4, 0x89,
+ 0x03, 0xC0, 0x83, 0x0B, 0xD5, 0xA3, 0x05, 0x05,
+ 0xD3, 0x0C, 0x28, 0x20, 0x28, 0x0D, 0xD0, 0x08,
+ 0x70, 0x00, 0x0B, 0xD0, 0x9C, 0x89, 0x80, 0x20,
+ 0x98, 0x98, 0xD0, 0xD3, 0xA3, 0x05, 0x05, 0xD5,
+ 0x89, 0x03, 0xC0, 0x83, 0x0B, 0xD4, 0x89, 0x1B,
+ 0xC0, 0x89, 0x1B, 0xC0,
+//ascii 0x002B
+ 0xC6, 0x0C, 0x10, 0x09, 0xCB, 0x0C, 0x10, 0x09,
+ 0xCB, 0x0C, 0x10, 0x09, 0xCB, 0x0C, 0x10, 0x09,
+ 0xC7, 0x0C, 0x29, 0x06, 0x10, 0x06, 0x39, 0xC3,
+ 0x03, 0x70, 0x20, 0xC3, 0x03, 0x70, 0x20, 0xC3,
+ 0x3C, 0x09, 0x10, 0x06, 0x3C, 0xC7, 0x0C, 0x10,
+ 0x09, 0xCB, 0x0C, 0x10, 0x09, 0xCB, 0x0C, 0x10,
+ 0x09, 0xCB, 0x0C, 0x13, 0x0C, 0xC0,
+//ascii 0x002C
+ 0xCC, 0x0A, 0x10, 0x85, 0x9E, 0xC5, 0x0A, 0x40,
+ 0x03, 0x0E, 0xC3, 0x9D, 0x75, 0x30, 0x20, 0x0C,
+ 0xC8, 0x8D, 0xAE, 0xC0,
+//ascii 0x002D
+ 0xC2, 0x0B, 0x17, 0xC4, 0x07, 0x10, 0xC4, 0x07,
+ 0x10, 0xC4, 0x07, 0x10, 0xC4, 0x07, 0x10, 0xC4,
+ 0x07, 0x10, 0xC4, 0x07, 0x10, 0xC4, 0x07, 0x10,
+ 0xC4, 0x0D, 0x1A,
+//ascii 0x002E
+ 0xEC, 0x0E, 0x0B, 0xD8, 0x0C, 0x10, 0x03, 0xD7,
+ 0x08, 0x20, 0x0D, 0xD6, 0x0C, 0x10, 0x03, 0xD8,
+ 0x0D, 0x0B, 0xC0,
+//ascii 0x002F
+ 0xC0, 0x8D, 0x9C, 0xD8, 0x0C, 0x20, 0x84, 0x9D,
+ 0xD4, 0x0C, 0x50, 0x82, 0x6A, 0xD2, 0x8D, 0x94,
+ 0x60, 0x82, 0x7C, 0xD2, 0x8C, 0x72, 0x60, 0x84,
+ 0x9D, 0xD2, 0x8A, 0x62, 0x50, 0x82, 0x6A, 0xD2,
+ 0x8D, 0x94, 0x50, 0x06, 0xD5, 0x8C, 0x94, 0x10,
+ 0x06, 0xD9, 0x1A, 0xC0,
+//ascii 0x0030
+ 0xC6, 0x8C, 0x97, 0x25, 0x87, 0x9E, 0xCC, 0x09,
+ 0x01, 0x70, 0x80, 0x4C, 0xC9, 0x04, 0x70, 0x40,
+ 0x09, 0xC7, 0x05, 0x30, 0x05, 0x07, 0x29, 0x07,
+ 0x04, 0x30, 0x0C, 0xC5, 0x0C, 0x20, 0x09, 0xC7,
+ 0x0E, 0x05, 0x10, 0x02, 0xC5, 0x07, 0x10, 0x09,
+ 0xCA, 0x04, 0x10, 0x0D, 0xC4, 0x05, 0x10, 0xCB,
+ 0x09, 0x10, 0x0C, 0xC4, 0x05, 0x10, 0xCB, 0x09,
+ 0x10, 0x0C, 0xC4, 0x07, 0x10, 0x09, 0xCA, 0x04,
+ 0x10, 0x0D, 0xC4, 0x0C, 0x20, 0x09, 0xC7, 0x0D,
+ 0x04, 0x10, 0x02, 0xC6, 0x05, 0x30, 0x04, 0x07,
+ 0x19, 0x17, 0x02, 0x30, 0x0C, 0xC7, 0x04, 0x70,
+ 0x40, 0x09, 0xC9, 0x09, 0x01, 0x70, 0x80, 0x4C,
+ 0xCC, 0x8C, 0x97, 0x25, 0x87, 0x9E,
+//ascii 0x0031
+ 0xC1, 0x0C, 0x75, 0x75, 0x05, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x0C, 0x10, 0x03, 0x78, 0x58, 0xC2, 0x05, 0x10,
+ 0x0C, 0xCF, 0x9E, 0x10, 0x30, 0xD0, 0x09, 0x10,
+ 0x08, 0xD0, 0x25,
+//ascii 0x0032
+ 0xE1, 0x8D, 0xCE, 0xC7, 0x0B, 0x18, 0xCB, 0x0B,
+ 0x01, 0x20, 0x04, 0x0D, 0xC5, 0x06, 0x10, 0xCA,
+ 0x0B, 0x60, 0x09, 0xC4, 0x06, 0x10, 0xCA, 0x01,
+ 0x10, 0x81, 0x41, 0x20, 0x06, 0xC3, 0x06, 0x10,
+ 0xC9, 0x0A, 0x10, 0x04, 0xC2, 0x0A, 0x20, 0x06,
+ 0xC2, 0x06, 0x10, 0xC9, 0x06, 0x10, 0x0E, 0xC3,
+ 0x0C, 0x01, 0x10, 0x06, 0xC1, 0x06, 0x10, 0xC9,
+ 0x86, 0x01, 0xC5, 0x0D, 0x01, 0x10, 0x06, 0xC0,
+ 0x06, 0x10, 0xC9, 0x06, 0x10, 0xC6, 0x0D, 0x01,
+ 0x10, 0x16, 0x10, 0xC9, 0x09, 0x10, 0x09, 0xC6,
+ 0x0D, 0x01, 0x40, 0xC9, 0x0E, 0x20, 0x04, 0x0A,
+ 0xC5, 0x0D, 0x01, 0x30, 0xCA, 0x08, 0x20, 0x04,
+ 0xC6, 0x0C, 0x01, 0x20, 0xCB, 0x08, 0x10, 0x04,
+ 0xC7, 0x0C, 0x20, 0xCC, 0x0E, 0x1A, 0xC8, 0x0C,
+ 0x19,
+//ascii 0x0033
+ 0xE9, 0x0D, 0x0C, 0xD0, 0x0B, 0x17, 0x0A, 0xC2,
+ 0x0B, 0x01, 0x20, 0x07, 0xCD, 0x04, 0x30, 0x04,
+ 0xC0, 0x0C, 0x50, 0x05, 0xCB, 0x05, 0x50, 0x07,
+ 0x05, 0x60, 0x0A, 0xC9, 0x0D, 0x20, 0x97, 0x94,
+ 0x00, 0x11, 0x00, 0x07, 0xC1, 0x07, 0x10, 0x04,
+ 0xC9, 0x07, 0x10, 0x0B, 0xC2, 0x05, 0x10, 0x05,
+ 0xC3, 0x04, 0x10, 0xC9, 0x85, 0x01, 0xC3, 0x0C,
+ 0x10, 0x0A, 0xC3, 0x09, 0x10, 0x0D, 0xC8, 0x85,
+ 0x01, 0xC3, 0x0E, 0x10, 0x0B, 0xC3, 0x09, 0x10,
+ 0x0C, 0xC8, 0x07, 0x10, 0x0E, 0xC2, 0x0E, 0x10,
+ 0x0B, 0xC3, 0x07, 0x10, 0x0E, 0xC8, 0x0B, 0x10,
+ 0x04, 0xC9, 0x0D, 0x10, 0x01, 0xCA, 0x01, 0x20,
+ 0x0D, 0xC6, 0x07, 0x20, 0x07, 0xCA, 0x0C, 0x20,
+ 0x0C, 0xC6, 0x04, 0x10, 0x01, 0xCC, 0x9C, 0x40,
+ 0xC0, 0xC6, 0x94, 0x01, 0xD0, 0xCE, 0x0E, 0xC7,
+ 0x1A, 0xC0,
+//ascii 0x0034
+ 0xCD, 0x85, 0x47, 0xD0, 0x82, 0x04, 0xC4, 0x0C,
+ 0x77, 0x27, 0x10, 0x02, 0x27, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x09, 0x20, 0x05, 0x6A, 0x82, 0x02, 0x29, 0xC1,
+ 0x0C, 0x02, 0x20, 0x07, 0xC5, 0x82, 0x04, 0xC6,
+ 0x07, 0x20, 0x02, 0x0A, 0xC3, 0x82, 0x04, 0xC7,
+ 0x0C, 0x02, 0x20, 0x05, 0x0E, 0xC1, 0x82, 0x04,
+ 0xC9, 0x09, 0x30, 0x09, 0xC0, 0x82, 0x04, 0xCA,
+ 0x0E, 0x04, 0x20, 0x94, 0x20, 0x40, 0xCC, 0x0A,
+ 0x40, 0x04, 0xCD, 0x0E, 0x05, 0x20, 0x04, 0xCF,
+ 0x0C, 0x14, 0x07, 0xC0,
+//ascii 0x0035
+ 0xCA, 0x0B, 0x06, 0x12, 0x04, 0x09, 0xC8, 0x09,
+ 0x10, 0x0D, 0xC3, 0x06, 0x50, 0x02, 0x0D, 0xC6,
+ 0x09, 0x10, 0x0D, 0xC2, 0x07, 0x70, 0x00, 0x0E,
+ 0xC5, 0x09, 0x10, 0x0D, 0xC1, 0x0E, 0x20, 0xA6,
+ 0xBD, 0xB2, 0x10, 0x06, 0xC5, 0x09, 0x10, 0x0D,
+ 0xC1, 0x09, 0x10, 0x07, 0xC4, 0x02, 0x10, 0xC5,
+ 0x09, 0x10, 0x0D, 0xC1, 0x07, 0x10, 0x0E, 0xC4,
+ 0x09, 0x10, 0x0D, 0xC4, 0x09, 0x10, 0x0D, 0xC1,
+ 0x09, 0x10, 0xC5, 0x0B, 0x10, 0x0D, 0xC4, 0x09,
+ 0x10, 0x0D, 0xC1, 0x0D, 0x10, 0x0E, 0xC4, 0x07,
+ 0x10, 0x0D, 0xC4, 0x09, 0x10, 0xB7, 0xBD, 0xE7,
+ 0x00, 0x09, 0xC3, 0x0D, 0x10, 0x02, 0xC5, 0x09,
+ 0x70, 0x00, 0xC2, 0x07, 0x20, 0x07, 0xC5, 0x09,
+ 0x70, 0x04, 0xC2, 0x04, 0x10, 0x02, 0xC7, 0x1B,
+ 0xB9, 0x76, 0x42, 0x00, 0x06, 0xC2, 0x94, 0x04,
+ 0xE0, 0xD3, 0x0B, 0x0D, 0xC0,
+//ascii 0x0036
+ 0xCC, 0x8D, 0xCE, 0xCC, 0x88, 0x2C, 0xC1, 0x0E,
+ 0x06, 0x30, 0x03, 0x0A, 0xC8, 0x0E, 0x02, 0x10,
+ 0x0C, 0xC0, 0x0D, 0x02, 0x60, 0x08, 0xC7, 0x03,
+ 0x20, 0x0C, 0xC0, 0x03, 0x20, 0x12, 0x30, 0x0C,
+ 0xC5, 0x0C, 0x10, 0x02, 0x0A, 0xC0, 0x0C, 0x10,
+ 0x02, 0x0A, 0xC2, 0x06, 0x10, 0x03, 0xC5, 0x08,
+ 0x10, 0x0A, 0xC1, 0x0A, 0x10, 0x0A, 0xC4, 0x05,
+ 0x10, 0x0E, 0xC4, 0x06, 0x10, 0x0E, 0xC1, 0x08,
+ 0x10, 0xC5, 0x0A, 0x10, 0x0C, 0xC4, 0x06, 0x10,
+ 0x0E, 0xC1, 0x0C, 0x10, 0xC5, 0x0A, 0x10, 0x0C,
+ 0xC4, 0x08, 0x10, 0x08, 0xC2, 0x82, 0x0A, 0xC4,
+ 0x06, 0x10, 0x0E, 0xC4, 0x0D, 0x20, 0x08, 0xC1,
+ 0x9C, 0x02, 0xC0, 0xC2, 0x08, 0x10, 0x03, 0xC6,
+ 0x08, 0x20, 0x92, 0x68, 0x60, 0x10, 0x83, 0x52,
+ 0x20, 0x0A, 0xC7, 0x06, 0x70, 0x40, 0x08, 0xC9,
+ 0x0A, 0x03, 0x70, 0x80, 0x2A, 0xCC, 0x0D, 0x0A,
+ 0x16, 0x15, 0x86, 0x8C,
+//ascii 0x0037
+ 0xC1, 0x09, 0x10, 0x04, 0x0C, 0xCE, 0x09, 0x30,
+ 0x04, 0x0C, 0xCC, 0x09, 0x50, 0x04, 0x0C, 0xCA,
+ 0x09, 0x10, 0x07, 0x40, 0x04, 0x0C, 0xC8, 0x09,
+ 0x10, 0x0D, 0xC0, 0x07, 0x40, 0x04, 0x0C, 0xC6,
+ 0x09, 0x10, 0x0D, 0xC2, 0x07, 0x40, 0x04, 0x0C,
+ 0xC4, 0x09, 0x10, 0x0D, 0xC4, 0x07, 0x40, 0x04,
+ 0x0C, 0xC2, 0x09, 0x10, 0x0D, 0xC6, 0x07, 0x40,
+ 0x04, 0xC1, 0x09, 0x10, 0x0D, 0xC8, 0x07, 0x30,
+ 0xC1, 0x09, 0x10, 0x0D, 0xCA, 0x07, 0x10, 0xC1,
+ 0x09, 0x10, 0x0D, 0xCB, 0x0E, 0x07, 0xC1, 0x09,
+ 0x10, 0x0D,
+//ascii 0x0038
+ 0xCD, 0x0E, 0x0C, 0xCC, 0x0A, 0x17, 0x0A, 0xC2,
+ 0x0C, 0x03, 0x20, 0x07, 0xC9, 0x05, 0x30, 0x05,
+ 0xC0, 0x0D, 0x50, 0x05, 0xC7, 0x05, 0x50, 0x07,
+ 0x03, 0x60, 0x0A, 0xC5, 0x0D, 0x20, 0x17, 0x83,
+ 0x01, 0x10, 0x07, 0xC1, 0x0A, 0x10, 0x03, 0xC5,
+ 0x07, 0x10, 0x0A, 0xC2, 0x05, 0x10, 0x05, 0xC3,
+ 0x07, 0x10, 0xC5, 0x85, 0x01, 0xC3, 0x0C, 0x10,
+ 0x0A, 0xC3, 0x0C, 0x10, 0x0D, 0xC4, 0x85, 0x03,
+ 0xC3, 0x0D, 0x10, 0x0C, 0xC3, 0x0C, 0x10, 0x0C,
+ 0xC4, 0x07, 0x10, 0xC3, 0x0A, 0x10, 0x07, 0xC3,
+ 0x0A, 0x10, 0x0E, 0xC4, 0x0A, 0x10, 0x05, 0x0E,
+ 0xC0, 0x0A, 0x01, 0x10, 0x01, 0x0E, 0xC2, 0x83,
+ 0x01, 0xC6, 0x01, 0x50, 0x95, 0x10, 0x10, 0x17,
+ 0x01, 0x10, 0x07, 0xC6, 0x0A, 0x50, 0x0C, 0x07,
+ 0x60, 0x0E, 0xC7, 0x0C, 0x03, 0x10, 0x03, 0x0C,
+ 0xC1, 0x05, 0x40, 0x0A, 0xD1, 0x0A, 0x15, 0x07,
+ 0x0E,
+//ascii 0x0039
+ 0xE3, 0x0E, 0x2C, 0x0D, 0xD3, 0x8D, 0x61, 0x50,
+ 0x83, 0x6D, 0xCE, 0x08, 0x70, 0x30, 0x06, 0xCC,
+ 0x09, 0x60, 0x82, 0x31, 0x30, 0x04, 0xCA, 0x0E,
+ 0x01, 0x10, 0x96, 0xCD, 0x90, 0x11, 0x0A, 0xC0,
+ 0x0D, 0x06, 0x20, 0x08, 0xC9, 0x09, 0x10, 0x08,
+ 0xC3, 0x9D, 0x10, 0xD0, 0xC1, 0x0C, 0x10, 0x02,
+ 0xC9, 0x86, 0x01, 0xC5, 0x86, 0x06, 0xC2, 0x06,
+ 0x10, 0x0D, 0xC8, 0x86, 0x02, 0xC5, 0x88, 0x02,
+ 0xC2, 0x08, 0x10, 0x0C, 0xC8, 0x06, 0x10, 0x0E,
+ 0xC4, 0x86, 0x01, 0xC2, 0x06, 0x10, 0x0D, 0xC8,
+ 0x09, 0x10, 0x06, 0xC3, 0x0C, 0x10, 0x03, 0xC1,
+ 0x0C, 0x10, 0x01, 0xCA, 0x01, 0x10, 0x93, 0x89,
+ 0x60, 0x20, 0x08, 0xC0, 0x08, 0x20, 0x06, 0xCA,
+ 0x0A, 0x70, 0x03, 0xC1, 0x04, 0x10, 0x03, 0xCC,
+ 0x0A, 0x01, 0x40, 0x04, 0x0E, 0xC1, 0x94, 0x04,
+ 0xE0, 0xCE, 0x09, 0x26, 0x0C, 0xC3, 0x0A, 0x0C,
+ 0xC0,
+//ascii 0x003A
+ 0xC3, 0x1C, 0xC6, 0x0D, 0x0B, 0xC7, 0x07, 0x10,
+ 0x08, 0xC4, 0x0C, 0x10, 0x03, 0xC6, 0x03, 0x10,
+ 0x03, 0xC4, 0x08, 0x20, 0x0D, 0xC5, 0x07, 0x10,
+ 0x08, 0xC4, 0x0C, 0x10, 0x03, 0xC7, 0x1B, 0xC6,
+ 0x0D, 0x0B, 0xC0,
+//ascii 0x003B
+ 0xC3, 0x17, 0xD4, 0x04, 0x10, 0x05, 0xC5, 0x09,
+ 0x10, 0x84, 0x9E, 0xC7, 0x03, 0x10, 0x03, 0xC5,
+ 0x09, 0x40, 0x03, 0x0E, 0xC5, 0x0B, 0x10, 0x0B,
+ 0xC5, 0x9C, 0x75, 0x30, 0x20, 0x0C, 0xD4, 0x8E,
+ 0x9E, 0xC0,
+//ascii 0x003C
+ 0xC1, 0x0A, 0x11, 0x06, 0xC5, 0x07, 0x11, 0x0A,
+ 0xC2, 0x01, 0x10, 0x0E, 0xC4, 0x01, 0x10, 0x0E,
+ 0xC2, 0x0A, 0x10, 0x07, 0xC3, 0x0A, 0x10, 0x07,
+ 0xC4, 0x81, 0x01, 0xC3, 0x04, 0x10, 0x0E, 0xC4,
+ 0x07, 0x10, 0x0A, 0xC1, 0x0C, 0x10, 0x06, 0xC5,
+ 0x0E, 0x10, 0x04, 0xC1, 0x06, 0x10, 0x0C, 0xC6,
+ 0x07, 0x10, 0x0C, 0x0E, 0x10, 0x04, 0xC7, 0x0E,
+ 0x10, 0x06, 0x07, 0x10, 0x0C, 0xC8, 0x06, 0x10,
+ 0x81, 0x04, 0xC9, 0x0C, 0x30, 0x0A, 0xCA, 0x04,
+ 0x10, 0x01, 0xCB, 0x0C, 0x14, 0x0A, 0xC0,
+//ascii 0x003D
+ 0xC0, 0x15, 0x08, 0xC1, 0x0A, 0x15, 0x0E, 0xC2,
+ 0x10, 0x05, 0xC1, 0x08, 0x10, 0x0E, 0xC2, 0x10,
+ 0x05, 0xC1, 0x08, 0x10, 0x0E, 0xC2, 0x10, 0x05,
+ 0xC1, 0x08, 0x10, 0x0E, 0xC2, 0x10, 0x05, 0xC1,
+ 0x08, 0x10, 0x0E, 0xC2, 0x10, 0x05, 0xC1, 0x08,
+ 0x10, 0x0E, 0xC2, 0x10, 0x05, 0xC1, 0x08, 0x10,
+ 0x0E, 0xC2, 0x10, 0x05, 0xC1, 0x08, 0x10, 0x0E,
+ 0xC2, 0x10, 0x05, 0xC1, 0x08, 0x10, 0x0E, 0xC2,
+ 0x10, 0x05, 0xC1, 0x08, 0x10, 0x0E, 0xC2, 0x10,
+ 0x05, 0xC1, 0x08, 0x10, 0x0E, 0xC2, 0x17, 0x0A,
+ 0xC1, 0x0A, 0x17, 0x0E,
+//ascii 0x003E
+ 0xFF, 0xC2, 0x0B, 0x11, 0x09, 0xD7, 0x04, 0x10,
+ 0x01, 0xD6, 0x0B, 0x30, 0x09, 0xD5, 0xB4, 0x01,
+ 0x20, 0x20, 0xD4, 0x0D, 0x10, 0x06, 0x09, 0x10,
+ 0x0B, 0xD3, 0x06, 0x10, 0x0D, 0xC0, 0x81, 0x04,
+ 0xD2, 0x0D, 0x10, 0x04, 0xC1, 0x06, 0x10, 0x0B,
+ 0xD1, 0x06, 0x10, 0x0B, 0xC1, 0x0D, 0x10, 0x04,
+ 0xD1, 0x81, 0x02, 0xC3, 0x04, 0x10, 0x0D, 0xCF,
+ 0x09, 0x10, 0x09, 0xC3, 0x0B, 0x10, 0x06, 0xCF,
+ 0x81, 0x01, 0xC5, 0x02, 0x10, 0x0D, 0xCD, 0x0B,
+ 0x14, 0x09, 0xC5, 0x09, 0x14, 0x09,
+//ascii 0x003F
+ 0xC3, 0x0D, 0x05, 0x12, 0x05, 0x0D, 0xD0, 0x0B,
+ 0x50, 0x0B, 0xCF, 0x70, 0x0E, 0xCD, 0x09, 0x10,
+ 0x02, 0x1B, 0x05, 0x10, 0x02, 0xCD, 0x05, 0x10,
+ 0x0E, 0xC2, 0x05, 0x10, 0x82, 0x8B, 0xC1, 0x85,
+ 0x29, 0xC5, 0x85, 0x02, 0xC3, 0x0E, 0x02, 0x20,
+ 0x02, 0xC0, 0x09, 0x20, 0x0E, 0xC4, 0x05, 0x10,
+ 0xC4, 0x0D, 0x02, 0x10, 0x02, 0xC0, 0x09, 0x20,
+ 0x0E, 0xC4, 0x09, 0x10, 0x05, 0x0E, 0xC4, 0x0D,
+ 0x19, 0xC1, 0x85, 0x2A, 0xC5, 0x0E, 0x30, 0x0D,
+ 0xD2, 0x0A, 0x20, 0x0D, 0xD3, 0x9D, 0x20, 0xD0,
+//ascii 0x0040
+ 0xE3, 0xAE, 0x84, 0x20, 0x12, 0x84, 0x8E, 0xD0,
+ 0x06, 0x70, 0x10, 0x08, 0xCD, 0x0D, 0x02, 0x20,
+ 0x02, 0x04, 0x16, 0x04, 0x02, 0x20, 0x09, 0xCC,
+ 0x02, 0x10, 0x04, 0x0D, 0xC6, 0x84, 0x02, 0xCB,
+ 0x04, 0x10, 0x09, 0xC8, 0x0A, 0x10, 0xCA, 0x0D,
+ 0x10, 0x06, 0xC0, 0x0B, 0x7A, 0x02, 0x10, 0xC0,
+ 0x8D, 0x40, 0xC6, 0x06, 0x10, 0xC1, 0x02, 0x70,
+ 0x10, 0x04, 0xC1, 0x10, 0x0A, 0xC5, 0x82, 0x06,
+ 0xC1, 0x02, 0x70, 0x80, 0x4E, 0xC1, 0x82, 0x06,
+ 0xC5, 0x10, 0x0A, 0xC1, 0x0A, 0x10, 0xA6, 0xCE,
+ 0xDB, 0x84, 0x02, 0xC2, 0x84, 0x04, 0xC4, 0x0D,
+ 0x10, 0x0C, 0xC1, 0x82, 0x04, 0xC5, 0x82, 0x06,
+ 0xC1, 0x87, 0x02, 0xC4, 0x0D, 0x10, 0x0D, 0xC1,
+ 0x10, 0x09, 0xC5, 0x87, 0x02, 0xC1, 0x87, 0x02,
+ 0xC4, 0x0D, 0x10, 0x0C, 0xC0, 0x0E, 0x10, 0x09,
+ 0xC5, 0x07, 0x10, 0xC1, 0x86, 0x02, 0xC5, 0x10,
+ 0x0A, 0xC1, 0x10, 0x04, 0xC5, 0x82, 0x02, 0xC1,
+ 0x84, 0x04, 0xC5, 0x82, 0x06, 0xC1, 0x06, 0x10,
+ 0x04, 0x0D, 0xC1, 0x0C, 0x04, 0x10, 0x07, 0xC1,
+ 0x82, 0x06, 0xC5, 0x06, 0x10, 0xC2, 0x02, 0x70,
+ 0x02, 0xC1, 0x0B, 0x10, 0x0A, 0xC5, 0x0B, 0x10,
+ 0x07, 0xC1, 0x0E, 0x04, 0x50, 0x04, 0x0E, 0xC1,
+ 0x04, 0x10, 0xC7, 0x04, 0x10, 0x0B, 0xC2, 0xBC,
+ 0x86, 0x79, 0xD0, 0xC2, 0x07, 0x10, 0x06, 0xC7,
+ 0x0D, 0x20, 0x08, 0xC9, 0x06, 0x10, 0x02, 0xC9,
+ 0x0A, 0x20, 0x82, 0x7C, 0xC2, 0x8E, 0xB7, 0x30,
+ 0x0C, 0xCA, 0x0B, 0x02, 0x70, 0x30, 0x02, 0x0C,
+ 0xCD, 0x07, 0x02, 0x70, 0x02, 0x08, 0xD1, 0x0C,
+ 0x09, 0x36, 0x09, 0x0C,
+//ascii 0x0041
+ 0xD1, 0x0C, 0x06, 0xD6, 0x8C, 0x61, 0x10, 0xD3,
+ 0x8D, 0x83, 0x40, 0xD0, 0x8E, 0x93, 0x60, 0x04,
+ 0xCE, 0x0A, 0x04, 0x60, 0x84, 0x9E, 0xCC, 0x0A,
+ 0x04, 0x70, 0x00, 0x04, 0xCD, 0x0A, 0x01, 0x50,
+ 0xB3, 0x9E, 0x30, 0x40, 0xCD, 0x09, 0x30, 0x83,
+ 0x9E, 0xC2, 0x83, 0x04, 0xCD, 0x09, 0x20, 0x06,
+ 0x0D, 0xC4, 0x83, 0x04, 0xCD, 0x09, 0x40, 0x83,
+ 0x8D, 0xC1, 0x83, 0x04, 0xCD, 0x8D, 0x61, 0x50,
+ 0xA3, 0x81, 0x04, 0xD0, 0x0A, 0x06, 0x70, 0x03,
+ 0x0E, 0xD2, 0x0A, 0x04, 0x60, 0x83, 0x9E, 0xD1,
+ 0x8E, 0x93, 0x60, 0xD4, 0x8E, 0x83, 0x30, 0xD7,
+ 0x9D, 0x81, 0x00, 0xDA, 0x0C,
+//ascii 0x0042
+ 0xCC, 0xA9, 0x63, 0x6D, 0xC5, 0x0C, 0x03, 0x10,
+ 0x03, 0x0C, 0xC1, 0x03, 0x40, 0x0A, 0xC3, 0x0C,
+ 0x50, 0x0E, 0x06, 0x60, 0x0D, 0xC2, 0x02, 0x50,
+ 0x06, 0x10, 0x02, 0x16, 0x02, 0x10, 0x06, 0xC1,
+ 0x0D, 0x10, 0xA2, 0xAE, 0xA2, 0x10, 0x02, 0xC2,
+ 0x0D, 0x10, 0x02, 0xC1, 0x0A, 0x10, 0x0A, 0xC2,
+ 0x0A, 0x10, 0x0A, 0xC3, 0x03, 0x10, 0xC1, 0x09,
+ 0x10, 0x0D, 0xC3, 0x10, 0x0C, 0xC3, 0x06, 0x10,
+ 0xC1, 0x09, 0x10, 0x0E, 0xC3, 0x10, 0x0C, 0xC3,
+ 0x06, 0x10, 0xC1, 0x09, 0x10, 0x0E, 0xC3, 0x10,
+ 0x0C, 0xC3, 0x06, 0x10, 0xC1, 0x09, 0x10, 0x0E,
+ 0xC3, 0x10, 0x0C, 0xC3, 0x06, 0x10, 0xC1, 0x09,
+ 0x10, 0x42, 0x10, 0x42, 0x20, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x0E, 0x7C, 0x7C, 0x0C,
+//ascii 0x0043
+ 0xE1, 0x8E, 0x8B, 0xC4, 0x08, 0x0B, 0xD0, 0x06,
+ 0x10, 0x08, 0xC4, 0x94, 0x01, 0xB0, 0xCD, 0x04,
+ 0x20, 0x08, 0xC4, 0x04, 0x20, 0x0B, 0xCB, 0x06,
+ 0x20, 0x04, 0x0B, 0xC4, 0x08, 0x01, 0x10, 0x01,
+ 0x0E, 0xCA, 0x20, 0x08, 0xC8, 0x04, 0x10, 0x06,
+ 0xC9, 0x08, 0x10, 0x06, 0xC9, 0x0E, 0x10, 0x01,
+ 0xC9, 0x06, 0x10, 0x0B, 0xCA, 0x04, 0x10, 0x0E,
+ 0xC8, 0x06, 0x10, 0x0E, 0xCA, 0x06, 0x10, 0x0B,
+ 0xC8, 0x06, 0x10, 0x0B, 0xCA, 0x06, 0x10, 0x0E,
+ 0xC8, 0x08, 0x10, 0x08, 0xCA, 0x01, 0x10, 0xC9,
+ 0x0B, 0x10, 0x01, 0x0E, 0xC8, 0x08, 0x10, 0x04,
+ 0xCA, 0x04, 0x10, 0x01, 0x0B, 0xC6, 0x06, 0x20,
+ 0x0B, 0xCA, 0x0E, 0x01, 0x20, 0x01, 0x06, 0x28,
+ 0x06, 0x01, 0x20, 0x06, 0xCC, 0x0B, 0x01, 0x70,
+ 0x20, 0x04, 0xCE, 0x0E, 0x06, 0x70, 0x01, 0x08,
+ 0xD1, 0x0E, 0x08, 0x16, 0x94, 0x68, 0xB0, 0xC0,
+//ascii 0x0044
+ 0xCA, 0x0E, 0xCD, 0x8E, 0x94, 0x30, 0x82, 0x6B,
+ 0xC8, 0x09, 0x70, 0x10, 0x04, 0x0E, 0xC5, 0x09,
+ 0x70, 0x30, 0x02, 0x0E, 0xC3, 0x0C, 0x20, 0x82,
+ 0x9C, 0xC1, 0x8E, 0xB6, 0x20, 0x04, 0xC3, 0x04,
+ 0x10, 0x06, 0xC7, 0x0C, 0x20, 0x0B, 0xC1, 0x0E,
+ 0x10, 0x02, 0xC9, 0x09, 0x10, 0x06, 0xC1, 0x0B,
+ 0x10, 0x06, 0xCA, 0x10, 0x02, 0xC1, 0x09, 0x10,
+ 0x0B, 0xCA, 0x04, 0x10, 0xC1, 0x09, 0x10, 0x0B,
+ 0xCA, 0x04, 0x10, 0xC1, 0x09, 0x10, 0x0B, 0xCA,
+ 0x04, 0x10, 0xC1, 0x09, 0x10, 0x0B, 0xCA, 0x04,
+ 0x10, 0xC1, 0x09, 0x10, 0x72, 0x32, 0x20, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70,
+ 0x00, 0xC1, 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x0045
+ 0xD1, 0x1E, 0xC1, 0x09, 0x10, 0x0D, 0xC3, 0x18,
+ 0x0B, 0xC3, 0x05, 0x10, 0xC1, 0x09, 0x10, 0x0D,
+ 0xC3, 0x10, 0x07, 0xC3, 0x05, 0x10, 0xC1, 0x09,
+ 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC3, 0x05, 0x10,
+ 0xC1, 0x09, 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC3,
+ 0x05, 0x10, 0xC1, 0x09, 0x10, 0x0D, 0xC3, 0x10,
+ 0x07, 0xC3, 0x05, 0x10, 0xC1, 0x09, 0x10, 0x0D,
+ 0xC3, 0x10, 0x07, 0xC3, 0x05, 0x10, 0xC1, 0x09,
+ 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC3, 0x05, 0x10,
+ 0xC1, 0x09, 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC3,
+ 0x05, 0x10, 0xC1, 0x09, 0x10, 0x42, 0x20, 0x32,
+ 0x20, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC1, 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x0046
+ 0xC1, 0x09, 0x12, 0x0D, 0xC3, 0x1E, 0xC9, 0x09,
+ 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC8, 0x09, 0x10,
+ 0x0D, 0xC3, 0x10, 0x07, 0xC8, 0x09, 0x10, 0x0D,
+ 0xC3, 0x10, 0x07, 0xC8, 0x09, 0x10, 0x0D, 0xC3,
+ 0x10, 0x07, 0xC8, 0x09, 0x10, 0x0D, 0xC3, 0x10,
+ 0x07, 0xC8, 0x09, 0x10, 0x0D, 0xC3, 0x10, 0x07,
+ 0xC8, 0x09, 0x10, 0x0D, 0xC3, 0x10, 0x07, 0xC8,
+ 0x09, 0x10, 0x42, 0x20, 0x62, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x0047
+ 0xC5, 0x0D, 0x08, 0xC2, 0x23, 0x06, 0x09, 0xCC,
+ 0x06, 0x10, 0x0D, 0xC0, 0x0D, 0x50, 0x0B, 0xC9,
+ 0x03, 0x20, 0x0D, 0xC0, 0x0D, 0x60, 0x09, 0xC7,
+ 0x08, 0x20, 0x03, 0xC1, 0x0D, 0x10, 0x88, 0x93,
+ 0x20, 0x0D, 0xC6, 0x20, 0x08, 0xC2, 0x0D, 0x10,
+ 0x0B, 0xC1, 0x05, 0x10, 0x05, 0xC5, 0x09, 0x10,
+ 0x05, 0xC3, 0x0D, 0x10, 0x0B, 0xC2, 0x20, 0xC5,
+ 0x06, 0x10, 0x0B, 0xC3, 0x0D, 0x10, 0x0B, 0xC2,
+ 0x05, 0x10, 0x0D, 0xC4, 0x05, 0x10, 0x0D, 0xC4,
+ 0x1B, 0xC3, 0x06, 0x10, 0x0D, 0xC4, 0x06, 0x10,
+ 0x0D, 0xCA, 0x05, 0x10, 0x0D, 0xC4, 0x08, 0x10,
+ 0x08, 0xCA, 0x20, 0xC5, 0x0D, 0x20, 0x0D, 0xC8,
+ 0x08, 0x10, 0x03, 0xC6, 0x03, 0x20, 0x0B, 0xC6,
+ 0x06, 0x20, 0x0B, 0xC6, 0x0D, 0x30, 0xB3, 0x68,
+ 0x98, 0x50, 0x30, 0x05, 0xC8, 0x0B, 0x70, 0x30,
+ 0x05, 0xCA, 0x0D, 0x05, 0x70, 0x00, 0x09, 0xCE,
+ 0x09, 0x06, 0x25, 0x08, 0x0B, 0xC0,
+//ascii 0x0048
+ 0xC2, 0x7E, 0x7E, 0x0E, 0xC1, 0x09, 0x70, 0x70,
+ 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC9, 0x10, 0x07, 0xD0, 0x10,
+ 0x07, 0xD0, 0x10, 0x07, 0xD0, 0x10, 0x07, 0xD0,
+ 0x10, 0x07, 0xD0, 0x10, 0x07, 0xD0, 0x10, 0x07,
+ 0xD0, 0x10, 0x07, 0xC8, 0x0A, 0x62, 0x20, 0x62,
+ 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x0049
+ 0xC1, 0x0E, 0x1B, 0xCB, 0x0D, 0x1B, 0xC1, 0x08,
+ 0x10, 0x0D, 0xCA, 0x05, 0x10, 0xC1, 0x08, 0x10,
+ 0x0D, 0xCA, 0x05, 0x10, 0xC1, 0x08, 0x10, 0x0B,
+ 0x7D, 0x2D, 0x05, 0x10, 0xC1, 0x08, 0x70, 0x70,
+ 0x00, 0xC1, 0x08, 0x70, 0x70, 0x00, 0xC1, 0x08,
+ 0x70, 0x70, 0x00, 0xC1, 0x08, 0x10, 0x0D, 0xCA,
+ 0x05, 0x10, 0xC1, 0x08, 0x10, 0x0D, 0xCA, 0x05,
+ 0x10, 0xC1, 0x08, 0x10, 0x0D, 0xCA, 0x05, 0x10,
+//ascii 0x004A
+ 0xC1, 0x0A, 0x74, 0x34, 0x85, 0x8D, 0xC7, 0x08,
+ 0x70, 0x60, 0x08, 0xC6, 0x08, 0x70, 0x70, 0x0B,
+ 0xC5, 0x0D, 0x7A, 0x3A, 0x08, 0x04, 0x10, 0x02,
+ 0xD4, 0x05, 0x10, 0x0E, 0xD3, 0x0A, 0x10, 0x0D,
+ 0xD3, 0x08, 0x10, 0x0D, 0xD2, 0x0D, 0x02, 0x10,
+ 0xD2, 0x08, 0x20, 0x04, 0xD2, 0x05, 0x20, 0x0D,
+ 0xD2, 0x95, 0x02, 0xB0, 0xD3, 0x1D, 0xC0,
+//ascii 0x004B
+ 0xC1, 0x0B, 0x0E, 0xCE, 0x09, 0xC1, 0x89, 0x2E,
+ 0xCB, 0x8E, 0x50, 0xC1, 0x99, 0x02, 0xC0, 0xC9,
+ 0x0B, 0x20, 0xC1, 0x09, 0x20, 0x0B, 0xC7, 0x05,
+ 0x30, 0xC1, 0x0E, 0x02, 0x20, 0x09, 0xC4, 0x0C,
+ 0x02, 0x20, 0x02, 0x0B, 0xC3, 0x05, 0x20, 0x05,
+ 0xC2, 0x09, 0x30, 0x05, 0x0E, 0xC5, 0x05, 0x20,
+ 0x85, 0xC2, 0x30, 0x09, 0xC8, 0x09, 0x60, 0x02,
+ 0x0E, 0xCA, 0x0B, 0x40, 0x09, 0xCD, 0x0C, 0x02,
+ 0x10, 0x02, 0x0E, 0xCE, 0x0E, 0x02, 0x10, 0x02,
+ 0x0C, 0xC6, 0x09, 0x62, 0x40, 0x42, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00,
+ 0xC1, 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x004C
+ 0xD0, 0x0A, 0x16, 0xD0, 0x06, 0x10, 0xD0, 0x06,
+ 0x10, 0xD0, 0x06, 0x10, 0xD0, 0x06, 0x10, 0xD0,
+ 0x06, 0x10, 0xD0, 0x06, 0x10, 0xD0, 0x06, 0x10,
+ 0xC1, 0x0A, 0x72, 0x52, 0x20, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x004D
+ 0xD5, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x09, 0x40, 0x06, 0x0C, 0xCC, 0x0C, 0x06, 0x40,
+ 0x02, 0x09, 0xCC, 0x8E, 0x92, 0x40, 0x06, 0x0C,
+ 0xCC, 0x0B, 0x06, 0x40, 0x02, 0x09, 0xCC, 0x8E,
+ 0x92, 0x40, 0x06, 0x0C, 0xCC, 0x0B, 0x04, 0x40,
+ 0xCC, 0x0E, 0x09, 0x40, 0xCA, 0x0B, 0x06, 0x40,
+ 0x02, 0x09, 0xC8, 0x09, 0x02, 0x40, 0x06, 0x0B,
+ 0xC7, 0x0C, 0x06, 0x40, 0x82, 0x9E, 0xC7, 0x09,
+ 0x04, 0x40, 0x06, 0x0B, 0xC8, 0x0B, 0x40, 0x82,
+ 0x9E, 0xCA, 0x09, 0x40, 0x74, 0x34, 0xC1, 0x09,
+ 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00,
+ 0xC1, 0x0E, 0x7B, 0x7B, 0x0B,
+//ascii 0x004E
+ 0xD5, 0x09, 0x70, 0x70, 0x00, 0xC1, 0x09, 0x70,
+ 0x70, 0x00, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xCC,
+ 0x0B, 0x02, 0x20, 0x03, 0xCC, 0x09, 0x30, 0x08,
+ 0xCC, 0x05, 0x20, 0x03, 0x0B, 0xCB, 0x0B, 0x02,
+ 0x20, 0x07, 0xCC, 0x06, 0x20, 0x02, 0x0B, 0xCB,
+ 0x0B, 0x02, 0x20, 0x06, 0xCC, 0x07, 0x20, 0x02,
+ 0x0B, 0xCB, 0x0B, 0x02, 0x20, 0x05, 0xCC, 0x0B,
+ 0x40, 0x72, 0x32, 0xC1, 0x09, 0x70, 0x70, 0x00,
+ 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC2, 0x7B, 0x7B,
+ 0x0B,
+//ascii 0x004F
+ 0xC8, 0x0D, 0x2B, 0x0E, 0xCF, 0x0B, 0x05, 0x50,
+ 0x02, 0x08, 0xCC, 0x05, 0x70, 0x20, 0x0B, 0xC9,
+ 0x05, 0x40, 0x12, 0x50, 0x09, 0xC7, 0x08, 0x20,
+ 0x05, 0x0B, 0xC3, 0x8E, 0x92, 0x20, 0x0E, 0xC6,
+ 0x20, 0x09, 0xC8, 0x02, 0x10, 0x06, 0xC5, 0x09,
+ 0x10, 0x05, 0xC9, 0x0D, 0x20, 0xC5, 0x06, 0x10,
+ 0x0B, 0xCA, 0x05, 0x10, 0x0D, 0xC4, 0x05, 0x10,
+ 0x0D, 0xCA, 0x06, 0x10, 0x0D, 0xC4, 0x06, 0x10,
+ 0x0D, 0xCA, 0x05, 0x10, 0x0D, 0xC4, 0x08, 0x10,
+ 0x08, 0xCA, 0x02, 0x10, 0xC5, 0x0D, 0x20, 0x0E,
+ 0xC8, 0x08, 0x10, 0x05, 0xC6, 0x05, 0x10, 0x02,
+ 0x0B, 0xC6, 0x06, 0x20, 0x0B, 0xC6, 0x0D, 0x30,
+ 0x02, 0x06, 0x28, 0x05, 0x30, 0x05, 0xC8, 0x0B,
+ 0x70, 0x30, 0x05, 0xCA, 0x0E, 0x05, 0x70, 0x02,
+ 0x09, 0xCD, 0x8E, 0x96, 0x15, 0x86, 0x8B, 0xC0,
+//ascii 0x0050
+ 0xC5, 0xAD, 0xB8, 0xBE, 0xCC, 0x0D, 0x03, 0x40,
+ 0x08, 0xCA, 0x0D, 0x02, 0x60, 0x03, 0xC9, 0x03,
+ 0x20, 0x02, 0x03, 0x30, 0x08, 0xC7, 0x0D, 0x20,
+ 0x0B, 0xC2, 0x08, 0x10, 0x03, 0xC7, 0x0B, 0x10,
+ 0x08, 0xC4, 0x03, 0x10, 0xC7, 0x08, 0x10, 0x0B,
+ 0xC4, 0x08, 0x10, 0x0E, 0xC6, 0x08, 0x10, 0x0D,
+ 0xC4, 0x08, 0x10, 0x0E, 0xC6, 0x08, 0x10, 0x0D,
+ 0xC4, 0x08, 0x10, 0x0E, 0xC6, 0x08, 0x10, 0x0D,
+ 0xC4, 0x08, 0x10, 0x0E, 0xC6, 0x08, 0x10, 0x62,
+ 0x10, 0x52, 0xC1, 0x08, 0x70, 0x70, 0x00, 0xC1,
+ 0x08, 0x70, 0x70, 0x00, 0xC1, 0x0E, 0x7B, 0x7B,
+ 0x0B,
+//ascii 0x0051
+ 0xC8, 0x0D, 0x1B, 0x0C, 0x0E, 0xCF, 0x0B, 0x05,
+ 0x50, 0x02, 0x08, 0xC3, 0x0D, 0x0A, 0xC6, 0x05,
+ 0x70, 0x10, 0x02, 0x0A, 0xC0, 0x8A, 0x08, 0xC5,
+ 0x05, 0x40, 0x22, 0x40, 0x05, 0x10, 0x08, 0xC4,
+ 0x06, 0x20, 0x05, 0x0B, 0xC3, 0x8E, 0x92, 0x30,
+ 0x02, 0x0D, 0xC4, 0x20, 0x09, 0xC7, 0x0C, 0x20,
+ 0x02, 0xC5, 0x09, 0x10, 0x05, 0xC7, 0x0A, 0x30,
+ 0x02, 0xC5, 0x06, 0x10, 0x0B, 0xC7, 0x02, 0x00,
+ 0x12, 0x10, 0x0D, 0xC4, 0x05, 0x10, 0x0D, 0xC7,
+ 0x02, 0x05, 0xC0, 0x06, 0x10, 0x0C, 0xC4, 0x06,
+ 0x10, 0x0C, 0xC7, 0x09, 0xC1, 0x05, 0x10, 0x0D,
+ 0xC4, 0x08, 0x10, 0x08, 0xCA, 0x02, 0x10, 0xC5,
+ 0x0C, 0x10, 0x02, 0x0E, 0xC8, 0x08, 0x10, 0x05,
+ 0xC6, 0x05, 0x10, 0x02, 0x0B, 0xC6, 0x06, 0x20,
+ 0x0A, 0xC6, 0x0D, 0x30, 0x02, 0x06, 0x28, 0x05,
+ 0x30, 0x05, 0xC8, 0x0C, 0x02, 0x70, 0x20, 0x05,
+ 0xCA, 0x0E, 0x05, 0x70, 0x02, 0x09, 0xCD, 0x8E,
+ 0x96, 0x25, 0x08, 0x0B, 0xC0,
+//ascii 0x0052
+ 0xD9, 0x0D, 0x1A, 0x0C, 0xC7, 0x0C, 0x03, 0xC3,
+ 0x0C, 0x02, 0x30, 0x02, 0x0A, 0xC3, 0x0D, 0x03,
+ 0x10, 0xC2, 0x0D, 0x70, 0x0A, 0xC0, 0x0E, 0x06,
+ 0x30, 0xC2, 0x03, 0x20, 0x02, 0x03, 0x20, 0x02,
+ 0x09, 0x40, 0x03, 0xC1, 0x0D, 0x10, 0x02, 0x0D,
+ 0xC1, 0x0E, 0x03, 0x50, 0x03, 0x0C, 0xC2, 0x0A,
+ 0x10, 0x09, 0xC3, 0x0C, 0x30, 0x02, 0x0A, 0xC4,
+ 0x09, 0x10, 0x0C, 0xC4, 0x10, 0x02, 0x09, 0xC6,
+ 0x09, 0x10, 0x0D, 0xC4, 0x10, 0x06, 0xC7, 0x09,
+ 0x10, 0x0D, 0xC4, 0x10, 0x06, 0xC7, 0x09, 0x10,
+ 0x0D, 0xC4, 0x10, 0x06, 0xC7, 0x09, 0x10, 0x52,
+ 0x20, 0x52, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x0E, 0x7C, 0x7C,
+ 0x0C,
+//ascii 0x0053
+ 0xE1, 0x0D, 0xC5, 0x0C, 0x19, 0x0B, 0xCE, 0x9C,
+ 0x30, 0xA0, 0xC3, 0x05, 0x30, 0x03, 0x0D, 0xCB,
+ 0x0C, 0x20, 0x0A, 0xC2, 0x07, 0x50, 0x01, 0x0E,
+ 0xCA, 0x03, 0x20, 0x0B, 0xC1, 0x0D, 0x20, 0x03,
+ 0x05, 0x20, 0x07, 0xC9, 0x0B, 0x10, 0x03, 0x0E,
+ 0xC2, 0x07, 0x10, 0x07, 0xC1, 0x0B, 0x10, 0x01,
+ 0xC9, 0x07, 0x10, 0x0B, 0xC3, 0x01, 0x10, 0x0E,
+ 0xC2, 0x05, 0x10, 0x0D, 0xC8, 0x05, 0x10, 0xC3,
+ 0x0D, 0x10, 0x05, 0xC3, 0x09, 0x10, 0x0C, 0xC8,
+ 0x05, 0x10, 0xC3, 0x0A, 0x10, 0x09, 0xC3, 0x09,
+ 0x10, 0x0C, 0xC8, 0x07, 0x10, 0x0C, 0xC2, 0x05,
+ 0x10, 0x0C, 0xC3, 0x07, 0x10, 0x0D, 0xC8, 0x0A,
+ 0x10, 0x05, 0xC1, 0x0B, 0x10, 0x01, 0xC3, 0x0E,
+ 0x01, 0x10, 0xCA, 0x01, 0x10, 0x01, 0x03, 0x20,
+ 0x07, 0xC2, 0x0A, 0x03, 0x10, 0x05, 0xCA, 0x0A,
+ 0x50, 0x01, 0xC2, 0x0D, 0x30, 0x0C, 0xCB, 0x0A,
+ 0x01, 0x20, 0x01, 0x0C, 0xC2, 0x0D, 0x20, 0x0A,
+ 0xCE, 0x8A, 0x9A, 0xC4, 0x9D, 0x37, 0xD0,
+//ascii 0x0054
+ 0xC1, 0x08, 0x12, 0x0D, 0xCF, 0x08, 0x10, 0x0D,
+ 0xCF, 0x08, 0x10, 0x0D, 0xCF, 0x08, 0x10, 0x0D,
+ 0xCF, 0x08, 0x10, 0x0D, 0xCF, 0x08, 0x10, 0x07,
+ 0x78, 0x58, 0xC1, 0x08, 0x70, 0x70, 0x00, 0xC1,
+ 0x08, 0x70, 0x70, 0x00, 0xC1, 0x08, 0x10, 0x04,
+ 0x75, 0x55, 0xC1, 0x08, 0x10, 0x0D, 0xCF, 0x08,
+ 0x10, 0x0D, 0xCF, 0x08, 0x10, 0x0D, 0xCF, 0x08,
+ 0x10, 0x0D, 0xCF, 0x08, 0x10, 0x0D,
+//ascii 0x0055
+ 0xC1, 0x09, 0x72, 0x32, 0x04, 0x09, 0xC8, 0x09,
+ 0x70, 0x50, 0x04, 0x0E, 0xC6, 0x09, 0x70, 0x60,
+ 0x02, 0xC6, 0x0E, 0x7B, 0x2B, 0x09, 0x04, 0x20,
+ 0x09, 0xD3, 0x09, 0x10, 0x02, 0xD4, 0x02, 0x10,
+ 0x0E, 0xD3, 0x06, 0x10, 0x0C, 0xD3, 0x06, 0x10,
+ 0x0C, 0xD3, 0x04, 0x10, 0x0E, 0xD2, 0x0C, 0x20,
+ 0xD2, 0x0B, 0x02, 0x10, 0x06, 0xC5, 0x09, 0x72,
+ 0x22, 0x40, 0x0E, 0xC5, 0x09, 0x70, 0x60, 0x0B,
+ 0xC6, 0x09, 0x70, 0x40, 0x04, 0x0C, 0xC7, 0x0E,
+ 0x7B, 0x2B, 0x0C, 0x0E,
+//ascii 0x0056
+ 0xC1, 0x8B, 0x9E, 0xD0, 0x09, 0x10, 0x83, 0x9E,
+ 0xCD, 0x09, 0x40, 0x05, 0x0B, 0xCB, 0x0B, 0x01,
+ 0x50, 0x81, 0x5B, 0xCA, 0x8B, 0x51, 0x50, 0x81,
+ 0x7D, 0xCA, 0x8B, 0x51, 0x50, 0x83, 0x7D, 0xCA,
+ 0x8B, 0x51, 0x50, 0x03, 0xCC, 0x8B, 0x51, 0x30,
+ 0xCE, 0x0B, 0x01, 0x20, 0xCB, 0x8B, 0x51, 0x40,
+ 0xC8, 0x8B, 0x51, 0x50, 0x03, 0x09, 0xC5, 0x0B,
+ 0x05, 0x60, 0x83, 0x9D, 0xC4, 0x0B, 0x05, 0x60,
+ 0x81, 0x7D, 0xC6, 0x09, 0x50, 0x81, 0x7B, 0xC9,
+ 0x09, 0x20, 0x81, 0x5B, 0xCC, 0x99, 0x05, 0xB0,
+ 0xCF, 0x0D, 0x0E,
+//ascii 0x0057
+ 0xC1, 0x8B, 0x9E, 0xD8, 0x08, 0x10, 0x83, 0x6B,
+ 0xD5, 0x08, 0x50, 0x84, 0x8E, 0xD1, 0x0B, 0x01,
+ 0x70, 0x82, 0x6B, 0xD0, 0x9C, 0x96, 0x10, 0x70,
+ 0x84, 0x8C, 0xD0, 0x9E, 0x96, 0x20, 0x60, 0x02,
+ 0xD3, 0x9E, 0x96, 0x10, 0x30, 0xD3, 0x8C, 0x84,
+ 0x40, 0xCF, 0x9C, 0x84, 0x10, 0x50, 0x03, 0x08,
+ 0xCB, 0x9E, 0x96, 0x10, 0x50, 0x81, 0x6B, 0xCC,
+ 0x0B, 0x02, 0x60, 0x84, 0x8C, 0xCF, 0x08, 0x30,
+ 0x81, 0x6B, 0xD3, 0x08, 0x40, 0x83, 0x8C, 0xD2,
+ 0x8C, 0x41, 0x50, 0x81, 0x69, 0xD2, 0x8C, 0x84,
+ 0x60, 0x83, 0x8C, 0xD2, 0x8B, 0x63, 0x50, 0x01,
+ 0x06, 0xD4, 0x8B, 0x61, 0x30, 0xD3, 0x8B, 0x63,
+ 0x40, 0xCF, 0x8B, 0x63, 0x70, 0x04, 0xCB, 0x8B,
+ 0x63, 0x70, 0x82, 0x6B, 0xCB, 0x09, 0x70, 0x90,
+ 0x48, 0xE0, 0xCE, 0x08, 0x40, 0x83, 0x6B, 0xD2,
+ 0xB8, 0x01, 0x49, 0xE0, 0xD5, 0x1C,
+//ascii 0x0058
+ 0xC1, 0x0A, 0x0C, 0xCE, 0x06, 0xC1, 0x88, 0x06,
+ 0xCB, 0x8A, 0x20, 0xC1, 0x08, 0x10, 0x01, 0x0A,
+ 0xC7, 0x0E, 0x04, 0x20, 0xC1, 0x08, 0x30, 0x04,
+ 0x0D, 0xC4, 0x08, 0x01, 0x20, 0x01, 0xC2, 0x0A,
+ 0x01, 0x30, 0x08, 0xC1, 0x0C, 0x04, 0x30, 0x06,
+ 0x0E, 0xC4, 0x06, 0x30, 0x02, 0x06, 0x30, 0x02,
+ 0x0A, 0xC7, 0x0D, 0x04, 0x60, 0x08, 0xCB, 0x08,
+ 0x30, 0x02, 0x0D, 0xCB, 0x0A, 0x02, 0x40, 0x06,
+ 0x0E, 0xC8, 0x0D, 0x04, 0x30, 0x01, 0x20, 0x01,
+ 0x08, 0xC6, 0x08, 0x30, 0x02, 0x0C, 0xC0, 0x06,
+ 0x30, 0x02, 0x0C, 0xC2, 0x0C, 0x02, 0x30, 0x08,
+ 0xC3, 0x0C, 0x02, 0x30, 0x06, 0xC1, 0x08, 0x20,
+ 0x04, 0x0D, 0xC6, 0x08, 0x01, 0x20, 0xC1, 0x98,
+ 0x01, 0x80, 0xC9, 0x0D, 0x04, 0x10, 0xC1, 0x88,
+ 0x6E, 0xCC, 0x0A, 0x01,
+//ascii 0x0059
+ 0xC1, 0x0E, 0xDA, 0x89, 0x2C, 0xD8, 0x09, 0x10,
+ 0x06, 0x0E, 0xD6, 0x09, 0x30, 0x09, 0xD5, 0x0E,
+ 0x04, 0x30, 0x02, 0x0A, 0xD5, 0x0B, 0x02, 0x30,
+ 0x04, 0x0D, 0xD5, 0x0A, 0x02, 0x30, 0x06, 0x0E,
+ 0xD5, 0x09, 0x70, 0x20, 0xD0, 0x0E, 0x02, 0x70,
+ 0x00, 0xCF, 0x0A, 0x02, 0x70, 0x10, 0xCD, 0x0B,
+ 0x02, 0x30, 0x04, 0x0D, 0x5E, 0xCB, 0x0D, 0x04,
+ 0x30, 0x02, 0x0B, 0xD1, 0x0E, 0x06, 0x40, 0x09,
+ 0xD3, 0x09, 0x30, 0x06, 0x0E, 0xD4, 0x09, 0x10,
+ 0x04, 0x0D, 0xD6, 0x89, 0x2A, 0xD8, 0x0E, 0xC0,
+//ascii 0x005A
+ 0xC1, 0x8E, 0xBD, 0xCB, 0x0D, 0x1B, 0xC1, 0x09,
+ 0x10, 0x06, 0xCA, 0x06, 0x10, 0xC1, 0x09, 0x20,
+ 0x02, 0x0D, 0xC8, 0x06, 0x10, 0xC1, 0x09, 0x40,
+ 0x09, 0xC7, 0x06, 0x10, 0xC1, 0x09, 0x10, 0x02,
+ 0x20, 0x04, 0x0E, 0xC5, 0x06, 0x10, 0xC1, 0x09,
+ 0x10, 0x0D, 0x06, 0x30, 0x09, 0xC4, 0x06, 0x10,
+ 0xC1, 0x09, 0x10, 0x0D, 0xC0, 0x0B, 0x02, 0x20,
+ 0x04, 0xC3, 0x06, 0x10, 0xC1, 0x09, 0x10, 0x0D,
+ 0xC2, 0x06, 0x20, 0x02, 0x0B, 0xC1, 0x06, 0x10,
+ 0xC1, 0x09, 0x10, 0x0D, 0xC3, 0x0B, 0x30, 0x06,
+ 0xC0, 0x06, 0x10, 0xC1, 0x09, 0x10, 0x0D, 0xC4,
+ 0x0E, 0x04, 0x20, 0x12, 0x10, 0xC1, 0x09, 0x10,
+ 0x0D, 0xC6, 0x09, 0x50, 0xC1, 0x09, 0x10, 0x0D,
+ 0xC7, 0x0D, 0x02, 0x30, 0xC1, 0x09, 0x10, 0x0D,
+ 0xC9, 0x09, 0x20, 0xC1, 0x0B, 0x16, 0x0E, 0xCA,
+ 0x0B, 0x16,
+//ascii 0x005B
+ 0xC1, 0x13, 0x0A, 0xCF, 0x86, 0x36, 0xC1, 0x10,
+ 0x09, 0xCF, 0x85, 0x05, 0xC1, 0x10, 0x09, 0xCF,
+ 0x85, 0x05, 0xC1, 0x10, 0x03, 0x76, 0x76, 0x82,
+ 0x05, 0xC1, 0x70, 0x70, 0x40, 0x05, 0xC1, 0x70,
+ 0x70, 0x40, 0x05, 0xC1, 0x7A, 0x7A, 0x5A,
+//ascii 0x005C
+ 0xD3, 0x0E, 0x1A, 0xD1, 0x8B, 0x72, 0x10, 0x07,
+ 0xCD, 0x8B, 0x73, 0x50, 0x07, 0xC9, 0x9D, 0xA5,
+ 0x10, 0x50, 0x83, 0x7B, 0xC7, 0x8A, 0x72, 0x50,
+ 0x82, 0x7A, 0xC7, 0x8B, 0x73, 0x50, 0x91, 0x5A,
+ 0xD0, 0xC9, 0x0B, 0x50, 0x83, 0x7B, 0xCD, 0x0B,
+ 0x10, 0x82, 0x7B, 0xD1, 0x8D, 0xAE,
+//ascii 0x005D
+ 0xC1, 0x73, 0x73, 0x43, 0x07, 0xC1, 0x70, 0x70,
+ 0x40, 0x05, 0xC1, 0x70, 0x70, 0x40, 0x05, 0xC1,
+ 0x10, 0x07, 0x7D, 0x7D, 0x85, 0x05, 0xC1, 0x10,
+ 0x09, 0xCF, 0x85, 0x05, 0xC1, 0x10, 0x09, 0xCF,
+ 0x85, 0x05, 0xC1, 0x1A, 0x0D, 0xCF, 0x8C, 0xAC,
+//ascii 0x005E
+ 0xC8, 0x1C, 0xC7, 0x9B, 0x30, 0x90, 0xC5, 0x0B,
+ 0x03, 0x20, 0x09, 0xC3, 0x09, 0x03, 0x20, 0x05,
+ 0x0C, 0xC4, 0x20, 0x05, 0x0E, 0xC6, 0x10, 0x05,
+ 0x0E, 0xC7, 0x03, 0x20, 0x05, 0x0C, 0xC6, 0x0B,
+ 0x03, 0x20, 0x03, 0x0C, 0xC6, 0x0C, 0x03, 0x10,
+ 0x09, 0xC8, 0x8C, 0x59, 0xC0,
+//ascii 0x005F
+ 0x10, 0x08, 0xC0, 0x10, 0x08, 0xC0, 0x10, 0x08,
+ 0xC0, 0x10, 0x08, 0xC0, 0x10, 0x08, 0xC0, 0x10,
+ 0x08, 0xC0, 0x10, 0x08, 0xC0, 0x10, 0x08, 0xC0,
+ 0x10, 0x08, 0xC0, 0x10, 0x08, 0xC0, 0x10, 0x08,
+ 0xC0,
+//ascii 0x0060
+ 0xC3, 0x1E, 0xC3, 0x9D, 0x50, 0xD0, 0xC2, 0x08,
+ 0x20, 0x0D, 0xC2, 0x05, 0x10, 0x0B, 0xC3, 0x15,
+ 0x0E, 0xC4, 0x0D,
+//ascii 0x0061
+ 0xE5, 0x7C, 0x1C, 0xCF, 0x09, 0x01, 0x70, 0x10,
+ 0xCE, 0x0B, 0x70, 0x30, 0xCE, 0x03, 0x10, 0x11,
+ 0x10, 0x13, 0x10, 0x03, 0x05, 0xCD, 0x0E, 0x10,
+ 0x06, 0xC1, 0x10, 0xC1, 0x9E, 0x31, 0xD0, 0xCD,
+ 0x0C, 0x10, 0x0D, 0xC1, 0x83, 0x0C, 0xC1, 0x8C,
+ 0x03, 0xCD, 0x0C, 0x10, 0x0E, 0xC1, 0x85, 0x09,
+ 0xC2, 0x10, 0x0D, 0xCC, 0x0E, 0x10, 0x09, 0xC1,
+ 0x86, 0x06, 0xC2, 0x10, 0x0C, 0xCD, 0x03, 0x10,
+ 0x0B, 0xC0, 0x99, 0x01, 0xD0, 0xC0, 0x07, 0x10,
+ 0x0C, 0xCD, 0x09, 0x10, 0x05, 0xC0, 0x0E, 0x50,
+ 0x01, 0xCF, 0x86, 0x07, 0xC1, 0x05, 0x40, 0x09,
+ 0xD0, 0x1C, 0xC2, 0xA6, 0x10, 0x39, 0xC0,
+//ascii 0x0062
+ 0xE0, 0x8D, 0x63, 0x20, 0x83, 0x6D, 0xCD, 0x08,
+ 0x70, 0x00, 0x09, 0xCB, 0x0A, 0x70, 0x20, 0x0A,
+ 0xCA, 0x20, 0x83, 0xAD, 0xC0, 0x8D, 0xA3, 0x10,
+ 0x03, 0xC9, 0x0D, 0x10, 0x03, 0xC6, 0x03, 0x10,
+ 0x0D, 0xC8, 0x0B, 0x10, 0x0A, 0xC6, 0x0A, 0x10,
+ 0x0D, 0xC8, 0x0D, 0x10, 0x0B, 0xC6, 0x0B, 0x10,
+ 0xCA, 0x86, 0x06, 0xC6, 0x86, 0x06, 0xCB, 0x86,
+ 0x08, 0xC4, 0x88, 0x06, 0xC6, 0x0A, 0x53, 0x20,
+ 0x23, 0x20, 0x13, 0xC5, 0x09, 0x70, 0x70, 0x00,
+ 0xC5, 0x09, 0x70, 0x70, 0x00, 0xC5, 0x0D, 0x7B,
+ 0x7B, 0x0B,
+//ascii 0x0063
+ 0xE4, 0x8A, 0x4A, 0xC2, 0x89, 0x4A, 0xD1, 0x05,
+ 0x10, 0x09, 0xC2, 0x09, 0x10, 0x05, 0xCF, 0x09,
+ 0x20, 0x09, 0xC2, 0x09, 0x20, 0x09, 0xCE, 0x02,
+ 0x10, 0x09, 0xC4, 0x09, 0x10, 0x02, 0xCD, 0x0E,
+ 0x10, 0x08, 0xC6, 0x08, 0x10, 0x0E, 0xCC, 0x0C,
+ 0x10, 0x0C, 0xC6, 0x0C, 0x10, 0x0C, 0xCC, 0x0C,
+ 0x10, 0x0A, 0xC6, 0x0A, 0x10, 0x0C, 0xCD, 0x10,
+ 0x02, 0xC6, 0x02, 0x10, 0xCE, 0x05, 0x10, 0xB2,
+ 0x9C, 0xEC, 0x90, 0x02, 0x10, 0x05, 0xCE, 0x0E,
+ 0x02, 0x70, 0x80, 0x2E, 0xCF, 0x0C, 0x02, 0x60,
+ 0x02, 0x0C, 0xD2, 0xB9, 0x42, 0x02, 0x40, 0x09,
+ 0xC0,
+//ascii 0x0064
+ 0xC1, 0x0D, 0x79, 0x79, 0x09, 0xC5, 0x09, 0x70,
+ 0x70, 0x00, 0xC5, 0x09, 0x70, 0x70, 0x00, 0xC5,
+ 0x0B, 0x55, 0x10, 0x01, 0x25, 0x01, 0x10, 0x15,
+ 0xCA, 0x9E, 0x30, 0x90, 0xC4, 0x99, 0x03, 0xE0,
+ 0xCA, 0x84, 0x08, 0xC6, 0x88, 0x04, 0xC9, 0x0D,
+ 0x10, 0x0B, 0xC6, 0x0B, 0x10, 0x0E, 0xC8, 0x0B,
+ 0x10, 0x09, 0xC6, 0x09, 0x10, 0x0D, 0xC8, 0x0D,
+ 0x10, 0x03, 0x0E, 0xC4, 0x0E, 0x01, 0x10, 0x0D,
+ 0xC9, 0x03, 0x10, 0xB1, 0x8B, 0xDB, 0x80, 0x01,
+ 0x10, 0x03, 0xCA, 0x0B, 0x70, 0x20, 0x0B, 0xCB,
+ 0x09, 0x70, 0x01, 0x0B, 0xCD, 0x8E, 0x84, 0x21,
+ 0x84, 0x8E,
+//ascii 0x0065
+ 0xCB, 0x1D, 0xD6, 0x0B, 0x03, 0x20, 0x0B, 0xC0,
+ 0x87, 0x5E, 0xD0, 0x07, 0x40, 0x0B, 0xC0, 0x85,
+ 0x03, 0xCF, 0x0A, 0x20, 0x03, 0x10, 0x0B, 0xC0,
+ 0x03, 0x10, 0x07, 0xCE, 0x03, 0x10, 0x0C, 0xC0,
+ 0x83, 0x0B, 0xC1, 0x03, 0x10, 0xCD, 0x0E, 0x10,
+ 0x09, 0xC1, 0x83, 0x0B, 0xC1, 0x0B, 0x10, 0x0D,
+ 0xCC, 0x0C, 0x10, 0x0D, 0xC1, 0x83, 0x0B, 0xC1,
+ 0x0D, 0x10, 0x0C, 0xCC, 0x0D, 0x10, 0x0C, 0xC1,
+ 0x83, 0x0B, 0xC1, 0x0C, 0x10, 0x0D, 0xCD, 0x10,
+ 0x05, 0xC1, 0x83, 0x0B, 0xC1, 0x05, 0x10, 0xCE,
+ 0x05, 0x10, 0xB5, 0xD3, 0x0A, 0xC0, 0x05, 0x10,
+ 0x05, 0xCE, 0x0E, 0x70, 0x20, 0x0D, 0xCF, 0x0D,
+ 0x03, 0x70, 0x0C, 0xD2, 0x09, 0x05, 0x20, 0x03,
+ 0x09, 0xC0,
+//ascii 0x0066
+ 0xC1, 0x84, 0x8E, 0xC1, 0x1D, 0xD3, 0x0D, 0x10,
+ 0x0B, 0xC0, 0x0E, 0x10, 0x0B, 0xD2, 0x0B, 0x10,
+ 0x0B, 0xC0, 0x0E, 0x10, 0x0B, 0xD2, 0x0D, 0x20,
+ 0x18, 0x10, 0x06, 0x78, 0x18, 0xC9, 0x04, 0x70,
+ 0x70, 0x00, 0xC9, 0x0D, 0x70, 0x70, 0x00, 0xCA,
+ 0x0E, 0x08, 0x16, 0x10, 0x04, 0x76, 0x16, 0xCD,
+ 0x0E, 0x10, 0x0B, 0xD8, 0x18, 0x0D,
+//ascii 0x0067
+ 0xC2, 0x79, 0x59, 0x0C, 0xC8, 0x70, 0x60, 0x02,
+ 0x0C, 0xC6, 0x70, 0x70, 0x02, 0x0D, 0xC5, 0x16,
+ 0x10, 0xB2, 0x46, 0x42, 0x00, 0x02, 0x26, 0x02,
+ 0x10, 0x06, 0xC5, 0x9D, 0x20, 0x90, 0xC4, 0x86,
+ 0x06, 0xC2, 0x84, 0x02, 0xC5, 0x84, 0x08, 0xC6,
+ 0x82, 0x09, 0xC1, 0x0C, 0x10, 0xC4, 0x0D, 0x10,
+ 0x0C, 0xC6, 0x86, 0x04, 0xC1, 0x0D, 0x10, 0xC4,
+ 0x0C, 0x10, 0x09, 0xC6, 0x84, 0x04, 0xC1, 0x0C,
+ 0x10, 0xC4, 0x0D, 0x10, 0x02, 0xC5, 0x0C, 0x10,
+ 0x04, 0xC1, 0x08, 0x10, 0xC5, 0x02, 0x10, 0xB2,
+ 0x8C, 0xDC, 0x80, 0x20, 0x09, 0xC0, 0x09, 0x10,
+ 0x04, 0xC5, 0x0C, 0x70, 0x10, 0x02, 0xC1, 0x06,
+ 0x10, 0x0C, 0xC6, 0x09, 0x70, 0x02, 0x0D, 0xC1,
+ 0x89, 0x08, 0xC8, 0x8D, 0x84, 0x22, 0x04, 0x09,
+ 0xC4, 0x0C, 0xC0,
+//ascii 0x0068
+ 0xCA, 0x7E, 0x0E, 0xC7, 0x0A, 0x03, 0x70, 0x10,
+ 0xC6, 0x0A, 0x70, 0x30, 0xC6, 0x01, 0x30, 0x71,
+ 0xC5, 0x0D, 0x20, 0x0A, 0xCE, 0x0C, 0x10, 0x07,
+ 0xCF, 0x0E, 0x10, 0x0A, 0xD0, 0x83, 0x07, 0xD0,
+ 0x0E, 0x11, 0x0D, 0xCA, 0x0C, 0x47, 0x05, 0x10,
+ 0x03, 0x75, 0xC1, 0x09, 0x70, 0x70, 0x00, 0xC1,
+ 0x09, 0x70, 0x70, 0x00, 0xC1, 0x0D, 0x79, 0x79,
+ 0x09,
+//ascii 0x0069
+ 0xC1, 0x86, 0x29, 0xC1, 0x75, 0x45, 0xC0, 0x0C,
+ 0x20, 0xC0, 0x0E, 0x70, 0x40, 0xC0, 0x0E, 0x10,
+ 0x02, 0xC0, 0x0E, 0x70, 0x40, 0xC1, 0x8B, 0x6D,
+ 0xC1, 0x79, 0x49,
+//ascii 0x006A
+ 0xC1, 0x85, 0x29, 0xC1, 0x75, 0x65, 0x09, 0xC5,
+ 0x0C, 0x20, 0xC1, 0x70, 0x70, 0x02, 0xC4, 0x0D,
+ 0x10, 0x02, 0xC1, 0x70, 0x70, 0x00, 0x09, 0xC4,
+ 0x89, 0x5C, 0xC1, 0x79, 0x59, 0x05, 0x10, 0x02,
+ 0xD8, 0x85, 0x02, 0xC0,
+//ascii 0x006B
+ 0xD2, 0x0D, 0xCE, 0x05, 0xC9, 0x09, 0x00, 0xCE,
+ 0x00, 0x03, 0xC7, 0x05, 0x10, 0xCE, 0x10, 0x03,
+ 0xC4, 0x0B, 0x02, 0x20, 0xCE, 0x02, 0x10, 0x02,
+ 0x0D, 0xC1, 0x08, 0x30, 0x07, 0xCF, 0x03, 0x10,
+ 0x82, 0xB3, 0x20, 0x02, 0x0B, 0xD1, 0x05, 0x50,
+ 0x05, 0xD4, 0x07, 0x30, 0x09, 0xD6, 0x08, 0x10,
+ 0x03, 0xCE, 0x0B, 0x75, 0x05, 0x20, 0x03, 0x35,
+ 0xC9, 0x09, 0x70, 0x70, 0x00, 0xC9, 0x09, 0x70,
+ 0x70, 0x00, 0xC9, 0x0D, 0x79, 0x79, 0x09,
+//ascii 0x006C
+ 0xD0, 0x8C, 0x53, 0xD4, 0x09, 0x10, 0xC5, 0x0B,
+ 0x75, 0x55, 0x01, 0x10, 0xC5, 0x09, 0x70, 0x70,
+ 0x03, 0xC5, 0x09, 0x70, 0x60, 0x01, 0x0B, 0xC5,
+ 0x0D, 0x79, 0x59, 0x0A, 0x0E, 0xC0,
+//ascii 0x006D
+ 0xC3, 0x8B, 0x41, 0x70, 0x00, 0xC2, 0x09, 0x70,
+ 0x30, 0xC2, 0x01, 0x70, 0x30, 0xC1, 0x0C, 0x10,
+ 0x01, 0x0A, 0x7E, 0x0E, 0xC1, 0x0C, 0x10, 0x08,
+ 0xCB, 0x0E, 0x10, 0x0A, 0xCC, 0x86, 0x06, 0xCD,
+ 0x85, 0x06, 0x7B, 0x0B, 0xC3, 0x08, 0x70, 0x20,
+ 0xC2, 0x06, 0x70, 0x30, 0xC1, 0x0E, 0x20, 0x01,
+ 0x74, 0x04, 0xC1, 0x0C, 0x10, 0x04, 0xCB, 0x0C,
+ 0x10, 0x09, 0xCC, 0x81, 0x09, 0xCC, 0x0C, 0x11,
+ 0x0E, 0xCB, 0x08, 0x06, 0x10, 0x04, 0x75, 0xC1,
+ 0x0E, 0x70, 0x40, 0xC1, 0x0E, 0x70, 0x40, 0xC2,
+ 0x79, 0x49,
+//ascii 0x006E
+ 0xD3, 0x0C, 0x05, 0x70, 0x10, 0xC2, 0x0B, 0x70,
+ 0x30, 0xC2, 0x70, 0x40, 0xC1, 0x0D, 0x20, 0x09,
+ 0xCA, 0x0C, 0x10, 0x07, 0xCB, 0x0D, 0x10, 0x0B,
+ 0xCC, 0x85, 0x07, 0xCC, 0x0D, 0x10, 0x0D, 0xCB,
+ 0x17, 0x10, 0x75, 0x05, 0xC2, 0x70, 0x40, 0xC2,
+ 0x70, 0x40, 0xC2, 0x79, 0x49,
+//ascii 0x006F
+ 0xC6, 0xAB, 0x97, 0x9B, 0xCC, 0x07, 0x60, 0x07,
+ 0xC9, 0x04, 0x70, 0x00, 0x04, 0xC7, 0x09, 0x20,
+ 0x02, 0x27, 0x02, 0x20, 0x09, 0xC6, 0x02, 0x10,
+ 0x0B, 0xC4, 0x0B, 0x10, 0x02, 0xC5, 0x0E, 0x10,
+ 0x09, 0xC6, 0x09, 0x10, 0x0E, 0xC4, 0x0C, 0x10,
+ 0x0C, 0xC6, 0x0C, 0x10, 0x0C, 0xC4, 0x0C, 0x10,
+ 0x0B, 0xC6, 0x0B, 0x10, 0x0C, 0xC5, 0x10, 0x03,
+ 0xC6, 0x03, 0x10, 0xC6, 0x04, 0x10, 0xB2, 0x9C,
+ 0xEC, 0x90, 0x02, 0x10, 0x04, 0xC6, 0x0E, 0x02,
+ 0x70, 0x80, 0x2E, 0xC7, 0x0C, 0x02, 0x60, 0x02,
+ 0x0C, 0xCA, 0xB9, 0x42, 0x02, 0x40, 0x09, 0xC0,
+//ascii 0x0070
+ 0xC4, 0x8E, 0x85, 0x22, 0x85, 0x8E, 0xCD, 0x09,
+ 0x70, 0x00, 0x09, 0xCB, 0x0C, 0x70, 0x20, 0x0C,
+ 0xCA, 0x02, 0x10, 0x02, 0x08, 0x2C, 0x08, 0x02,
+ 0x10, 0x03, 0xC9, 0x0E, 0x10, 0x03, 0x0E, 0xC4,
+ 0x0E, 0x02, 0x10, 0x0E, 0xC8, 0x0C, 0x10, 0x09,
+ 0xC6, 0x09, 0x10, 0x0C, 0xC8, 0x0E, 0x10, 0x0C,
+ 0xC6, 0x0C, 0x10, 0x0E, 0xC9, 0x83, 0x08, 0xC6,
+ 0x86, 0x05, 0xCA, 0x9E, 0x30, 0x90, 0xC4, 0x99,
+ 0x03, 0xE0, 0xCA, 0x16, 0x10, 0xA2, 0x56, 0x52,
+ 0x10, 0x55, 0x06, 0xC4, 0x0E, 0x70, 0x70, 0x00,
+ 0x02, 0xC4, 0x0E, 0x70, 0x70, 0x00, 0x02, 0xC5,
+ 0x79, 0x79, 0x19, 0xC0,
+//ascii 0x0071
+ 0xC2, 0x79, 0x79, 0x09, 0x0A, 0xC4, 0x0E, 0x70,
+ 0x70, 0x00, 0x02, 0xC4, 0x0E, 0x70, 0x70, 0x00,
+ 0x02, 0xC5, 0x15, 0x10, 0x02, 0x25, 0x02, 0x10,
+ 0x65, 0xC5, 0x9E, 0x20, 0xA0, 0xC4, 0x99, 0x02,
+ 0xE0, 0xCA, 0x82, 0x08, 0xC6, 0x88, 0x05, 0xC9,
+ 0x0D, 0x10, 0x0B, 0xC6, 0x0B, 0x10, 0x0E, 0xC8,
+ 0x0B, 0x10, 0x0A, 0xC6, 0x09, 0x10, 0x0D, 0xC8,
+ 0x0D, 0x10, 0x02, 0xC5, 0x0E, 0x02, 0x10, 0x0D,
+ 0xC9, 0x02, 0x10, 0xB2, 0x8B, 0xDB, 0x80, 0x02,
+ 0x10, 0x02, 0xCA, 0x0B, 0x70, 0x20, 0x0B, 0xCB,
+ 0x0A, 0x70, 0x00, 0x0A, 0xCD, 0x0E, 0x08, 0x12,
+ 0x90, 0x25, 0x80, 0xC0,
+//ascii 0x0072
+ 0xD1, 0x0C, 0x10, 0x07, 0xCB, 0x0C, 0x10, 0x07,
+ 0xCC, 0x81, 0x05, 0xCC, 0x9B, 0x10, 0xB0, 0xCB,
+ 0x07, 0x05, 0x10, 0x03, 0x75, 0xC1, 0x0E, 0x70,
+ 0x40, 0xC1, 0x0E, 0x70, 0x40, 0xC2, 0x79, 0x49,
+//ascii 0x0073
+ 0xCA, 0x0E, 0x0D, 0xCA, 0x8E, 0x5A, 0xC1, 0x0E,
+ 0x02, 0x10, 0x02, 0x0C, 0xC7, 0x0E, 0x10, 0x07,
+ 0xC1, 0x05, 0x40, 0x0D, 0xC6, 0x05, 0x10, 0x07,
+ 0xC0, 0x0D, 0x50, 0x05, 0xC6, 0x10, 0x05, 0xC1,
+ 0x08, 0x10, 0x0A, 0xC0, 0x05, 0x10, 0xC5, 0x0D,
+ 0x10, 0x0E, 0xC1, 0x05, 0x10, 0xC1, 0x0D, 0x10,
+ 0x0D, 0xC4, 0x0C, 0x10, 0xC2, 0x82, 0x05, 0xC2,
+ 0x10, 0x0C, 0xC4, 0x0D, 0x10, 0x0C, 0xC0, 0x0D,
+ 0x10, 0x08, 0xC1, 0x0C, 0x10, 0x0D, 0xC5, 0x10,
+ 0x82, 0x82, 0x10, 0x0C, 0xC0, 0x0E, 0x02, 0x10,
+ 0xC6, 0x07, 0x40, 0x02, 0xC1, 0x02, 0x10, 0x05,
+ 0xC7, 0x02, 0x30, 0x0C, 0xC1, 0x95, 0x02, 0xE0,
+ 0xC8, 0x0A, 0x17, 0x0D, 0xC2, 0x87, 0x5E, 0xC0,
+//ascii 0x0074
+ 0xC6, 0x1E, 0xC8, 0x0E, 0x0C, 0xC9, 0x0E, 0x10,
+ 0x0B, 0xC6, 0x09, 0x10, 0x0E, 0xC8, 0x0E, 0x10,
+ 0x0B, 0xC6, 0x07, 0x10, 0x0E, 0xC5, 0x0E, 0x27,
+ 0x10, 0x05, 0x67, 0x20, 0x0E, 0xC5, 0x0C, 0x70,
+ 0x60, 0x03, 0xC6, 0x0C, 0x70, 0x60, 0x0C, 0xC6,
+ 0x0E, 0x27, 0x10, 0x05, 0x67, 0x09, 0x0E, 0xCA,
+ 0x0E, 0x10, 0x0B, 0xD4, 0x19, 0x0E,
+//ascii 0x0075
+ 0xFE, 0x70, 0x40, 0xCE, 0x70, 0x40, 0xCE, 0x70,
+ 0x40, 0xD6, 0x9D, 0x41, 0x90, 0xD9, 0x81, 0x09,
+ 0xD8, 0x85, 0x01, 0xD8, 0x05, 0x10, 0x0E, 0xD6,
+ 0x0D, 0x20, 0x0E, 0xCD, 0x75, 0x04, 0x20, 0x01,
+ 0xCE, 0x70, 0x30, 0x09, 0xCE, 0x70, 0x20, 0x09,
+ 0xCF, 0x79, 0x09, 0x0B, 0xC0,
+//ascii 0x0076
+ 0xC2, 0x0E, 0xCD, 0x9E, 0x05, 0xA0, 0xCB, 0x0E,
+ 0x30, 0x05, 0x0B, 0xC8, 0x0E, 0x50, 0x82, 0x7D,
+ 0xC6, 0x8D, 0x82, 0x50, 0x82, 0x8D, 0xC6, 0x8E,
+ 0x95, 0x50, 0x02, 0xC9, 0x0A, 0x05, 0x30, 0xC9,
+ 0x8D, 0x82, 0x20, 0xC6, 0x8C, 0x72, 0x50, 0xC3,
+ 0x0B, 0x05, 0x60, 0x05, 0x0B, 0xC2, 0x0E, 0x60,
+ 0x85, 0x9E, 0xC4, 0x0E, 0x30, 0x82, 0x8E, 0xC7,
+ 0xAE, 0x02, 0x7D, 0xCB, 0x0C,
+//ascii 0x0077
+ 0xC6, 0x0A, 0xDA, 0x10, 0x83, 0x7C, 0xD6, 0x40,
+ 0x81, 0x5A, 0xD3, 0x03, 0x70, 0x83, 0x7C, 0xD1,
+ 0x8B, 0x73, 0x60, 0x01, 0xD4, 0x8B, 0x73, 0x30,
+ 0xD4, 0x8B, 0x73, 0x30, 0xD0, 0x8B, 0x73, 0x50,
+ 0x03, 0x07, 0xCE, 0x03, 0x50, 0x81, 0x5A, 0xD1,
+ 0x30, 0x83, 0x9C, 0xD4, 0x30, 0x81, 0x7B, 0xD4,
+ 0x05, 0x01, 0x50, 0x83, 0x9C, 0xD2, 0x9D, 0x95,
+ 0x10, 0x40, 0x01, 0x05, 0xD4, 0x8D, 0x95, 0x30,
+ 0xD3, 0x9E, 0xA5, 0x10, 0x30, 0xCF, 0x9E, 0xA5,
+ 0x10, 0x60, 0x01, 0xCE, 0x01, 0x70, 0x85, 0x9E,
+ 0xCF, 0x40, 0x83, 0x7B, 0xD3, 0xA0, 0x15, 0xAE,
+ 0xD6, 0x0C,
+//ascii 0x0078
+ 0xC2, 0x0A, 0xCA, 0x09, 0xC1, 0x9E, 0x04, 0xD0,
+ 0xC6, 0x8C, 0x30, 0xC1, 0x0E, 0x20, 0x07, 0xC3,
+ 0x0E, 0x07, 0x20, 0xC2, 0x03, 0x20, 0x01, 0x0A,
+ 0xC0, 0x0A, 0x01, 0x20, 0x04, 0xC3, 0x09, 0x01,
+ 0x20, 0x01, 0x20, 0x01, 0x0A, 0xC6, 0x07, 0x40,
+ 0x07, 0xC8, 0x0E, 0x04, 0x20, 0x04, 0x0E, 0xC7,
+ 0x07, 0x60, 0x09, 0xC4, 0x09, 0x01, 0x20, 0x83,
+ 0x91, 0x20, 0x03, 0x0C, 0xC1, 0x0E, 0x30, 0x09,
+ 0xC2, 0x07, 0x30, 0xC1, 0x0E, 0x10, 0x07, 0x0E,
+ 0xC4, 0x0D, 0x04, 0x10, 0xC1, 0x8E, 0x3C, 0xC8,
+ 0x0A, 0x01,
+//ascii 0x0079
+ 0xD9, 0x9E, 0x04, 0xB0, 0xD3, 0x0E, 0x20, 0x81,
+ 0x6B, 0xD0, 0x0E, 0x50, 0x81, 0x6D, 0xCE, 0x8D,
+ 0x83, 0x50, 0x83, 0x8E, 0xCE, 0x8E, 0x84, 0x50,
+ 0x04, 0x08, 0xD0, 0x8B, 0x61, 0x40, 0x06, 0xCE,
+ 0x8E, 0x84, 0x50, 0x03, 0xCA, 0x8D, 0x83, 0x40,
+ 0x01, 0x03, 0x20, 0x08, 0xC6, 0x8B, 0x61, 0x50,
+ 0x04, 0x0B, 0xC1, 0x9D, 0x10, 0x30, 0xC5, 0x01,
+ 0x50, 0x04, 0x0B, 0xC5, 0x84, 0x01, 0xC4, 0x0E,
+ 0x30, 0x83, 0x8E, 0xC7, 0x84, 0x03, 0xC4, 0xAE,
+ 0x01, 0x8D, 0xCB, 0x0D, 0x0B, 0xC5, 0x0D,
+//ascii 0x007A
+ 0xD0, 0x0E, 0x1D, 0xCD, 0x0E, 0x12, 0x07, 0xC6,
+ 0x07, 0x10, 0xCD, 0x0E, 0x20, 0x04, 0x0E, 0xC4,
+ 0x07, 0x10, 0xCD, 0x0E, 0x30, 0x02, 0x0C, 0xC3,
+ 0x07, 0x10, 0xCD, 0x0E, 0x50, 0x08, 0xC2, 0x07,
+ 0x10, 0xCD, 0x0E, 0x10, 0x08, 0x07, 0x20, 0x04,
+ 0xC1, 0x07, 0x10, 0xCD, 0x0E, 0x10, 0x08, 0xC0,
+ 0x0A, 0x20, 0x82, 0xD7, 0x10, 0xCD, 0x0E, 0x10,
+ 0x08, 0xC1, 0x0D, 0x02, 0x20, 0x02, 0x10, 0xCD,
+ 0x0E, 0x10, 0x08, 0xC2, 0x0E, 0x04, 0x40, 0xCD,
+ 0x0E, 0x10, 0x08, 0xC4, 0x07, 0x30, 0xCD, 0x0E,
+ 0x10, 0x08, 0xC5, 0x0A, 0x20, 0xCE, 0x1A, 0x0D,
+ 0xC6, 0x0D, 0x17,
+//ascii 0x007B
+ 0xC1, 0x84, 0x2B, 0xCF, 0x88, 0x28, 0xC5, 0x82,
+ 0x06, 0xCF, 0x82, 0x06, 0xC5, 0x04, 0x10, 0x06,
+ 0x3B, 0x0C, 0xC3, 0x0C, 0x2B, 0x09, 0x04, 0x10,
+ 0x08, 0xC5, 0x09, 0x70, 0x04, 0xC0, 0x0E, 0x02,
+ 0x70, 0x0D, 0xC6, 0x04, 0x70, 0x09, 0x06, 0x70,
+ 0x08, 0xC8, 0x0C, 0x08, 0x36, 0x82, 0x02, 0x10,
+ 0x02, 0x36, 0x08, 0x0D, 0xD0, 0x02, 0x10, 0x04,
+ 0xD7, 0x06, 0x10, 0x09, 0xD7, 0x0E, 0x1C, 0x0E,
+ 0xC0,
+//ascii 0x007C
+ 0xC0, 0x74, 0x74, 0x74, 0xC3, 0x70, 0x70, 0x70,
+ 0xC3, 0x70, 0x70, 0x70, 0xC3, 0x7E, 0x7E, 0x7E,
+ 0xC0,
+//ascii 0x007D
+ 0xCA, 0x09, 0x14, 0x0C, 0xD7, 0x05, 0x10, 0x08,
+ 0xD6, 0x09, 0x20, 0x02, 0x0C, 0xCE, 0x0D, 0x05,
+ 0x60, 0x06, 0x02, 0x50, 0x02, 0x06, 0xC7, 0x0D,
+ 0x70, 0x80, 0xC9, 0x70, 0x02, 0xC6, 0x06, 0x20,
+ 0x32, 0x04, 0x0A, 0xC1, 0x08, 0x42, 0x20, 0x0A,
+ 0xC5, 0x92, 0x02, 0xD0, 0xCD, 0x0C, 0x10, 0x06,
+ 0xC5, 0x82, 0x08, 0xCF, 0x84, 0x05, 0xC5, 0x1A,
+ 0x0D, 0xCF, 0x8C, 0xAC,
+//ascii 0x007E
+ 0xC2, 0x0C, 0x0E, 0xC5, 0x10, 0x03, 0x0D, 0xC3,
+ 0x30, 0xC3, 0x0C, 0x05, 0x10, 0x08, 0xC3, 0x0E,
+ 0x10, 0x08, 0xC3, 0x0A, 0x10, 0x0A, 0xC2, 0x0D,
+ 0x10, 0x03, 0xC3, 0x03, 0x10, 0x0E, 0xC2, 0x0A,
+ 0x10, 0x0A, 0xC3, 0x08, 0x10, 0x0D, 0xC3, 0x0A,
+ 0x10, 0x03, 0x0A, 0xC3, 0x03, 0x20, 0x0E, 0xC2,
+ 0x0E, 0x05, 0x10, 0x0E,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_SEMIBOLD_24PX[95] = {
+ { 0, 0, 6,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 7,1, 0, 1, 4 }, //asciii 0x0021
+ { 40, 1, 10,1, 0, 1, 16 }, //asciii 0x0022
+ { 61, 1, 15,0, 0, 0, 8 }, //asciii 0x0023
+ { 172, 1, 16,0, 0, 0, 0 }, //asciii 0x0024
+ { 314, 1, 20,0, 0, 0, 0 }, //asciii 0x0025
+ { 454, 1, 16,1, 0, 0, 4 }, //asciii 0x0026
+ { 584, 1, 5,1, 0, 1, 16 }, //asciii 0x0027
+ { 594, 1, 9,2, 0, 0, 4 }, //asciii 0x0028
+ { 643, 1, 9,0, 0, 1, 4 }, //asciii 0x0029
+ { 693, 1, 13,0, 0, 0, 0 }, //asciii 0x002A
+ { 745, 1, 16,2, 4, 2, 8 }, //asciii 0x002B
+ { 799, 1, 7,1, 16, 1, 0 }, //asciii 0x002C
+ { 819, 1, 11,1, 8, 1, 12 }, //asciii 0x002D
+ { 846, 1, 7,0, 0, 0, 0 }, //asciii 0x002E
+ { 865, 1, 9,0, 0, 0, 0 }, //asciii 0x002F
+ { 909, 1, 16,1, 0, 1, 4 }, //asciii 0x0030
+ { 1011, 1, 12,1, 0, 3, 8 }, //asciii 0x0031
+ { 1046, 1, 15,0, 0, 0, 0 }, //asciii 0x0032
+ { 1159, 1, 16,0, 0, 0, 0 }, //asciii 0x0033
+ { 1281, 1, 16,1, 0, 1, 8 }, //asciii 0x0034
+ { 1365, 1, 15,1, 0, 1, 4 }, //asciii 0x0035
+ { 1490, 1, 16,1, 0, 1, 4 }, //asciii 0x0036
+ { 1622, 1, 14,1, 0, 1, 8 }, //asciii 0x0037
+ { 1704, 1, 16,1, 0, 1, 4 }, //asciii 0x0038
+ { 1833, 1, 16,0, 0, 0, 0 }, //asciii 0x0039
+ { 1962, 1, 7,1, 4, 1, 4 }, //asciii 0x003A
+ { 1997, 1, 7,1, 4, 1, 0 }, //asciii 0x003B
+ { 2031, 1, 16,2, 4, 2, 8 }, //asciii 0x003C
+ { 2110, 1, 16,2, 8, 2, 8 }, //asciii 0x003D
+ { 2194, 1, 16,0, 0, 0, 0 }, //asciii 0x003E
+ { 2272, 1, 13,0, 0, 1, 4 }, //asciii 0x003F
+ { 2352, 1, 24,0, 0, 0, 0 }, //asciii 0x0040
+ { 2580, 1, 17,0, 0, 0, 0 }, //asciii 0x0041
+ { 2673, 1, 16,1, 0, 1, 8 }, //asciii 0x0042
+ { 2789, 1, 18,0, 0, 0, 0 }, //asciii 0x0043
+ { 2917, 1, 17,1, 0, 0, 8 }, //asciii 0x0044
+ { 3019, 1, 15,1, 0, 1, 8 }, //asciii 0x0045
+ { 3123, 1, 14,1, 0, 1, 8 }, //asciii 0x0046
+ { 3199, 1, 18,1, 0, 1, 4 }, //asciii 0x0047
+ { 3333, 1, 18,1, 0, 1, 8 }, //asciii 0x0048
+ { 3396, 1, 11,0, 0, 0, 8 }, //asciii 0x0049
+ { 3460, 1, 13,0, 0, 1, 4 }, //asciii 0x004A
+ { 3515, 1, 16,1, 0, 0, 8 }, //asciii 0x004B
+ { 3608, 1, 14,1, 0, 1, 8 }, //asciii 0x004C
+ { 3652, 1, 22,1, 0, 1, 8 }, //asciii 0x004D
+ { 3753, 1, 18,1, 0, 1, 8 }, //asciii 0x004E
+ { 3826, 1, 19,1, 0, 1, 4 }, //asciii 0x004F
+ { 3946, 1, 15,1, 0, 0, 8 }, //asciii 0x0050
+ { 4035, 1, 19,1, 0, 1, 4 }, //asciii 0x0051
+ { 4176, 1, 16,1, 0, 0, 8 }, //asciii 0x0052
+ { 4281, 1, 16,0, 0, 0, 0 }, //asciii 0x0053
+ { 4424, 1, 16,0, 0, 1, 8 }, //asciii 0x0054
+ { 4486, 1, 18,1, 0, 2, 4 }, //asciii 0x0055
+ { 4562, 1, 17,0, 0, 0, 8 }, //asciii 0x0056
+ { 4645, 1, 24,0, 0, 0, 0 }, //asciii 0x0057
+ { 4771, 1, 17,0, 0, 1, 8 }, //asciii 0x0058
+ { 4887, 1, 17,0, 0, 0, 0 }, //asciii 0x0059
+ { 4967, 1, 16,1, 0, 1, 8 }, //asciii 0x005A
+ { 5089, 1, 9,2, 0, 0, 4 }, //asciii 0x005B
+ { 5128, 1, 9,0, 0, 0, 4 }, //asciii 0x005C
+ { 5174, 1, 9,0, 0, 2, 4 }, //asciii 0x005D
+ { 5214, 1, 12,0, 0, 1, 16 }, //asciii 0x005E
+ { 5259, 1, 11,0, 20, 0, 4 }, //asciii 0x005F
+ { 5292, 1, 12,3, 0, 3, 20 }, //asciii 0x0060
+ { 5311, 1, 14,0, 0, 0, 0 }, //asciii 0x0061
+ { 5406, 1, 15,1, 0, 0, 4 }, //asciii 0x0062
+ { 5488, 1, 14,0, 0, 0, 0 }, //asciii 0x0063
+ { 5577, 1, 15,1, 0, 1, 4 }, //asciii 0x0064
+ { 5667, 1, 14,0, 0, 0, 0 }, //asciii 0x0065
+ { 5773, 1, 9,0, 0, 0, 0 }, //asciii 0x0066
+ { 5827, 1, 15,1, 4, 1, 0 }, //asciii 0x0067
+ { 5942, 1, 15,1, 0, 1, 8 }, //asciii 0x0068
+ { 5999, 1, 6,1, 0, 1, 8 }, //asciii 0x0069
+ { 6026, 1, 6,0, 0, 1, 0 }, //asciii 0x006A
+ { 6062, 1, 14,0, 0, 0, 0 }, //asciii 0x006B
+ { 6133, 1, 7,1, 0, 0, 4 }, //asciii 0x006C
+ { 6163, 1, 22,1, 4, 2, 8 }, //asciii 0x006D
+ { 6245, 1, 15,1, 4, 1, 8 }, //asciii 0x006E
+ { 6290, 1, 15,1, 4, 1, 4 }, //asciii 0x006F
+ { 6378, 1, 15,1, 4, 1, 0 }, //asciii 0x0070
+ { 6470, 1, 15,1, 4, 1, 0 }, //asciii 0x0071
+ { 6562, 1, 10,1, 4, 0, 8 }, //asciii 0x0072
+ { 6594, 1, 13,1, 4, 0, 4 }, //asciii 0x0073
+ { 6698, 1, 9,0, 0, 0, 4 }, //asciii 0x0074
+ { 6752, 1, 15,0, 0, 0, 0 }, //asciii 0x0075
+ { 6797, 1, 14,0, 4, 0, 8 }, //asciii 0x0076
+ { 6858, 1, 20,0, 0, 0, 0 }, //asciii 0x0077
+ { 6948, 1, 14,0, 4, 1, 8 }, //asciii 0x0078
+ { 7030, 1, 14,0, 4, 0, 0 }, //asciii 0x0079
+ { 7109, 1, 13,0, 0, 0, 0 }, //asciii 0x007A
+ { 7200, 1, 9,0, 0, 0, 0 }, //asciii 0x007B
+ { 7265, 1, 9,2, 0, 3, 0 }, //asciii 0x007C
+ { 7282, 1, 9,0, 0, 0, 0 }, //asciii 0x007D
+ { 7342, 1, 16,1, 8, 1, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_SEMIBOLD_24PX= {
+ 7394, // bitmap len
+ BAGL_FONT_INTER_SEMIBOLD_24px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 32, // height of all characters in pixels
+ 32, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 4, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_SEMIBOLD_24PX,
+ bitmapINTER_SEMIBOLD_24PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.json b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.json
new file mode 100644
index 00000000..d44666bd
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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cAAExwkgAicCIAnGAhALxAsQAsUOEAnGCRAOxAwQDMYMEAzEDBALxgsQDMUQA8YDEMYEELKc7JACEATGDgJwgC7HDAJgAgzKuUICQAnAxI6FIoWOzQlwAAnLDHAgDMoCEAIILAgCEAPJDhADDsQOAhAOyAwQCcYJEAzIDhAMxgwQDsmDCMaGBcqeMJDEmQPgyhYQolZSEFUGxA5wcAACxA5wcAACxXl5GcDCeXkJCsQOcHAAAsQOcHAAAsUVEAIlAhBlxZ4goMSZAuDKggjGiAXJDRALxgsQDsgLEArGCRANyA0QAsUOAhANyQIQsovbgAIQAsoLcCALywpwAArNDggSkCWAwNEMEAfLDBAHzIEFzJsQsMsHBRADdcEOcEDBDnBAwnlJyg4Nyo5awQ4CEAIMxw4QB8EFQA3GBRAHwA1QBcYQBcEIEArABRDFDRAOwQUQwQ0QDcQMEMKCBcIQDMQNEAzADRAIwQwQDcUQgoIQDMAOAhDGB0ACwQIQBccCMAzBlQLgyAoXDcKHXsDGHsgODMkOEAvGCRAOyA4QC8YHEA7FDicQBWcgDsUMcGADxgxwYAzGDicQBWcJDsoOEAvUGQ7+cEDOcEDOcEDWnUGQ2YEJ2IUB2AUQDtYNIA7NdQQgAc5wMAnOcCAJz3kJC8DCDs2eBaDLDjAFC8gOUIJ9xo2CUIKNxo6VUALJCgUwyY2CIMaMclDDCwVgBQvCDmCFnsQOMIKOx64CfcsMxgraEIN81kCBWtMDcIN80YtzYAHUi3Mw1ItzMNCLc1ADB84DUIFa0TCDnNQwgXvUBQFQg5zSnZUQQAEF1I2VMNOepRAwz56lEGABzgFwhZ7PQIN706AVrtYMwgrKCcGeBNDGjDDBDiAHww4HIMIDIAEKwAoBIATDCQEgASABCsYHQAfIDgQgBA7HB2AJxAkBIIORIAMMwQ4wCcIHMMEOEAcOxA0EEMGOPMgKAdmeBLDTDiCBa9AOUIFtzo2DUIOOzo6EUAQI0IthQAbOjoRQA8qNg0ABAyAIxothUAQLwZ0QMMUBUAQLxYQBxA4wg47HhAPErgGNyw0LxQ3QDh3NDhIHxgcQzQ4gBA7EBxDNDjACDMMHEM0OUAjCBxDNDhAIByAEwQcQzQ4QCMAKIILXEM0OEAjBDQIgAhDNDhAIwg4EQM0OEAjEBzDNDhAIxQogzhoNxg0XwYQrz4goxYIGz4IGxQQQBjsMwwwrCQQQCMUJcATADgJwDcYEcAkGcAjIDAg2ggIQAjYIDdACEATXBhAJ1w4cDsDAdHR0w3BwcMNwcHDDfn5+wMoJFAzXBRAI1gkgAgzODQVgBgJQAgbHDXCAyXACxgYgMgQKwQhCIArFkgLQzQwQBsWCCM+EBcUaDc+MrMIMDsUQAw3DMMMMBRAIww4QCMMKEArCDRADwwMQDsIKEArDCBANwwoQAwrDAyAOwg4FEA4=",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 40,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 34,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 61,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 111
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 172,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 142
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 314,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 37,
+ "bitmap_byte_count": 140
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 454,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 130
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 584,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 39,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 594,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 40,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 643,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 41,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 693,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 42,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 745,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 799,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 819,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 846,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 46,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 865,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 47,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 909,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1011,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1046,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 50,
+ "bitmap_byte_count": 113
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1159,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 51,
+ "bitmap_byte_count": 122
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1281,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1365,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1490,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 132
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1622,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 82
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1704,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 129
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1833,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 57,
+ "bitmap_byte_count": 129
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1962,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1997,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2031,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 79
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2110,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 84
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2194,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 62,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2272,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2352,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 228
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2580,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 65,
+ "bitmap_byte_count": 93
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2673,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 116
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2789,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 67,
+ "bitmap_byte_count": 128
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2917,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 102
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3019,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 104
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3123,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 76
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3199,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 134
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3333,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 63
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3396,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 64
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3460,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 74,
+ "bitmap_byte_count": 55
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3515,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 93
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3608,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3652,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 101
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3753,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 73
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3826,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 120
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3946,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4035,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 141
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4176,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4281,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 83,
+ "bitmap_byte_count": 143
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4424,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 62
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4486,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 76
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4562,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 83
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4645,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 87,
+ "bitmap_byte_count": 126
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4771,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 116
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4887,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 89,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4967,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 122
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5089,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 91,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5128,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5174,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 93,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5214,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5259,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 20,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5292,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 20,
+ "char": 96,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5311,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 97,
+ "bitmap_byte_count": 95
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5406,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 82
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5488,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 99,
+ "bitmap_byte_count": 89
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5577,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 90
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5667,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 101,
+ "bitmap_byte_count": 106
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5773,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 102,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5827,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 115
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5942,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 57
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5999,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6026,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6062,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 107,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6133,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 108,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6163,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 82
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6245,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6290,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6378,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 92
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6470,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 92
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6562,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6594,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 104
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6698,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6752,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 117,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6797,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 61
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6858,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 119,
+ "bitmap_byte_count": 90
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6948,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 82
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7030,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 79
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7109,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 122,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7200,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 65
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7265,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7282,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7342,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 52
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.inc
new file mode 100644
index 00000000..e770b1ce
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.inc
@@ -0,0 +1,557 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_SEMIBOLD_24PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x7C, 0x23, 0xFC, 0x23, 0xFC, 0x23,
+//ascii 0x0022
+ 0x76, 0xF0, 0xB6, 0xF0, 0xB6, 0xF0, 0xF0, 0xF0,
+ 0xD6, 0xF0, 0xB6, 0xF0, 0xB6, 0x30,
+//ascii 0x0023
+ 0x32, 0xF0, 0xF2, 0x42, 0xF0, 0x43, 0x22, 0x42,
+ 0xF0, 0x49, 0x22, 0xF0, 0x7C, 0xF0, 0x72, 0x29,
+ 0xF0, 0x42, 0x42, 0x23, 0xF0, 0x42, 0x42, 0xF0,
+ 0x43, 0x22, 0x42, 0xF0, 0x49, 0x22, 0xF0, 0x7C,
+ 0xF0, 0x72, 0x29, 0xF0, 0x42, 0x42, 0x23, 0xF0,
+ 0x42, 0x42, 0xF0, 0xF2, 0x50,
+//ascii 0x0024
+ 0x22, 0x63, 0xF0, 0x53, 0x47, 0xF0, 0x24, 0x47,
+ 0xF0, 0x23, 0x43, 0x24, 0xF3, 0x53, 0x33, 0xF3,
+ 0x43, 0x43, 0xEF, 0x05, 0xCF, 0x05, 0xD3, 0x43,
+ 0x43, 0xF3, 0x33, 0x53, 0xF0, 0x13, 0x23, 0x44,
+ 0xF0, 0x17, 0x44, 0xF0, 0x36, 0x44, 0xF0, 0x44,
+ 0x52, 0x30,
+//ascii 0x0025
+ 0x14, 0xF0, 0x22, 0x86, 0xF0, 0x13, 0x63, 0x23,
+ 0xF0, 0x13, 0x52, 0x42, 0xF0, 0x33, 0x33, 0x23,
+ 0xF0, 0x43, 0x36, 0xF0, 0x73, 0x24, 0xF0, 0x93,
+ 0xF0, 0x94, 0x33, 0xF0, 0x66, 0x33, 0xF0, 0x43,
+ 0x23, 0x43, 0xF0, 0x22, 0x42, 0x54, 0xF3, 0x23,
+ 0x72, 0xF0, 0x16, 0xF0, 0xC4, 0x40,
+//ascii 0x0026
+ 0x62, 0xF0, 0x93, 0x23, 0xF0, 0x98, 0xF0, 0xA6,
+ 0xF0, 0x43, 0x55, 0xF0, 0x27, 0x27, 0xF0, 0x17,
+ 0x14, 0x13, 0xF4, 0x26, 0x32, 0xF3, 0x44, 0x42,
+ 0xF4, 0x24, 0x52, 0xF0, 0x1A, 0x33, 0xF0, 0x17,
+ 0x18, 0xF0, 0x33, 0x37, 0xF0, 0xC4, 0x20,
+//ascii 0x0027
+ 0x76, 0xF0, 0xB6, 0xF0, 0xB6, 0x30,
+//ascii 0x0028
+ 0x61, 0xF0, 0x41, 0xB3, 0xF3, 0xB7, 0x77, 0xCF,
+ 0x04, 0xFF, 0xF0, 0x67, 0x40,
+//ascii 0x0029
+ 0x57, 0xF0, 0x6F, 0xFF, 0x04, 0xC7, 0x77, 0xB3,
+ 0xF3, 0xB1, 0xF0, 0x41, 0x50,
+//ascii 0x002A
+ 0x12, 0x22, 0xF0, 0xB6, 0xF0, 0xC4, 0xF0, 0xAA,
+ 0xF0, 0x7A, 0xF0, 0xA4, 0xF0, 0xC6, 0xF0, 0xB2,
+ 0x22, 0x10,
+//ascii 0x002B
+ 0x73, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0,
+ 0xAB, 0xF0, 0x6B, 0xF0, 0x6B, 0xF0, 0xA3, 0xF0,
+ 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0x60,
+//ascii 0x002C
+ 0x53, 0xF0, 0xE6, 0xF0, 0xB6, 0xF0, 0xE3, 0x50,
+//ascii 0x002D
+ 0x72, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0,
+ 0xF2, 0xF0, 0xF2, 0xF0, 0xF2, 0x70,
+//ascii 0x002E
+ 0x53, 0xF0, 0xE3, 0xF0, 0xE3,
+//ascii 0x002F
+ 0x73, 0xF0, 0xE6, 0xF0, 0xBA, 0xF0, 0xBA, 0xF0,
+ 0xB9, 0xF0, 0xC8, 0xF0, 0xC5, 0xF0, 0xF2, 0x50,
+//ascii 0x0030
+ 0x47, 0xF0, 0x8B, 0xF0, 0x5D, 0xF0, 0x34, 0x74,
+ 0xF0, 0x14, 0x94, 0xF3, 0xB3, 0xF3, 0xB3, 0xF3,
+ 0xB3, 0xF4, 0x94, 0xF0, 0x14, 0x74, 0xF0, 0x3D,
+ 0xF0, 0x5B, 0xF0, 0x87, 0x50,
+//ascii 0x0031
+ 0x7F, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xF0, 0x13,
+ 0xF0, 0xF2, 0xF0, 0xF3, 0xF0, 0xF2, 0x40,
+//ascii 0x0032
+ 0x24, 0x73, 0xF0, 0x26, 0x63, 0xF0, 0x18, 0x53,
+ 0xF0, 0x13, 0x33, 0x43, 0xF3, 0x53, 0x33, 0xF3,
+ 0x63, 0x23, 0xF3, 0x73, 0x13, 0xF3, 0x86, 0xF0,
+ 0x13, 0x85, 0xF0, 0x14, 0x84, 0xF0, 0x23, 0x93,
+ 0xF0, 0x32, 0xA2,
+//ascii 0x0033
+ 0x15, 0xF0, 0x44, 0x37, 0xF0, 0x26, 0x18, 0xF0,
+ 0x29, 0x43, 0xF3, 0x33, 0x62, 0xF2, 0x52, 0x62,
+ 0xF2, 0x52, 0x62, 0xF2, 0x52, 0x62, 0xF3, 0xB3,
+ 0xF0, 0x13, 0x84, 0xF0, 0x23, 0x84, 0xF0, 0x32,
+ 0x83, 0x20,
+//ascii 0x0034
+ 0x23, 0xF0, 0xE3, 0xF0, 0x3F, 0x02, 0xFF, 0x02,
+ 0xFF, 0x02, 0xF5, 0x63, 0xF0, 0x45, 0x53, 0xF0,
+ 0x65, 0x33, 0xF0, 0x84, 0x23, 0xF0, 0x98, 0xF0,
+ 0xB6, 0xF0, 0xC5, 0xF0, 0xE3, 0x30,
+//ascii 0x0035
+ 0x13, 0xF0, 0xC7, 0xF0, 0x23, 0x49, 0xF0, 0x13,
+ 0x49, 0xF0, 0x13, 0x33, 0x53, 0xF3, 0x32, 0x72,
+ 0xF3, 0x32, 0x72, 0xF3, 0x32, 0x72, 0xF3, 0x32,
+ 0x72, 0xF5, 0x22, 0x53, 0xF9, 0x34, 0xF0, 0x37,
+ 0x34, 0xF0, 0x73, 0x33, 0x20,
+//ascii 0x0036
+ 0x22, 0x45, 0xF0, 0x53, 0x37, 0xF0, 0x34, 0x29,
+ 0xF0, 0x23, 0x24, 0x33, 0xF0, 0x13, 0x33, 0x53,
+ 0xF3, 0x32, 0x72, 0xF3, 0x32, 0x72, 0xF3, 0x32,
+ 0x72, 0xF0, 0x13, 0x32, 0x53, 0xF0, 0x14, 0x32,
+ 0x33, 0xF0, 0x3E, 0xF0, 0x4C, 0xF0, 0x79, 0x30,
+//ascii 0x0037
+ 0x75, 0xF0, 0xC7, 0xF0, 0xA9, 0xF0, 0x83, 0x16,
+ 0xF0, 0x73, 0x36, 0xF0, 0x53, 0x56, 0xF0, 0x33,
+ 0x76, 0xF0, 0x13, 0x95, 0xF3, 0xB3, 0xF3, 0xD1,
+ 0xF3, 0x60,
+//ascii 0x0038
+ 0x15, 0xF0, 0x53, 0x37, 0xF0, 0x26, 0x18, 0xF0,
+ 0x29, 0x43, 0xF3, 0x34, 0x43, 0xF2, 0x52, 0x62,
+ 0xF2, 0x52, 0x62, 0xF2, 0x52, 0x62, 0xF3, 0x34,
+ 0x43, 0xF0, 0x19, 0x43, 0xF0, 0x16, 0x18, 0xF0,
+ 0x43, 0x37, 0xF0, 0xB5, 0x20,
+//ascii 0x0039
+ 0x38, 0xF0, 0x7C, 0xF0, 0x4E, 0xF0, 0x33, 0x32,
+ 0x43, 0xF0, 0x13, 0x52, 0x43, 0xF2, 0x72, 0x42,
+ 0xF2, 0x72, 0x42, 0xF2, 0x72, 0x42, 0xF3, 0x53,
+ 0x42, 0xF0, 0x13, 0x34, 0x33, 0xF0, 0x19, 0x24,
+ 0xF0, 0x37, 0x33, 0xF0, 0x64, 0x42, 0x30,
+//ascii 0x003A
+ 0x43, 0x63, 0xF0, 0x53, 0x63, 0xF0, 0x53, 0x63,
+//ascii 0x003B
+ 0x43, 0x73, 0xF0, 0x43, 0x76, 0xF0, 0x13, 0x76,
+ 0xF0, 0xE3, 0x40,
+//ascii 0x003C
+ 0x33, 0x73, 0xF0, 0x53, 0x53, 0xF0, 0x63, 0x53,
+ 0xF0, 0x73, 0x33, 0xF0, 0x83, 0x33, 0xF0, 0x93,
+ 0x13, 0xF0, 0xA3, 0x13, 0xF0, 0xB5, 0xF0, 0xC5,
+ 0xF0, 0xD3, 0xF0, 0xE3, 0x50,
+//ascii 0x003D
+ 0x53, 0x23, 0xF0, 0x93, 0x23, 0xF0, 0x93, 0x23,
+ 0xF0, 0x93, 0x23, 0xF0, 0x93, 0x23, 0xF0, 0x93,
+ 0x23, 0xF0, 0x93, 0x23, 0xF0, 0x93, 0x23, 0xF0,
+ 0x93, 0x23, 0xF0, 0x93, 0x23, 0xF0, 0x93, 0x23,
+ 0x30,
+//ascii 0x003E
+ 0x03, 0xF0, 0xE3, 0xF0, 0xD5, 0xF0, 0xC5, 0xF0,
+ 0xB3, 0x13, 0xF0, 0xA3, 0x13, 0xF0, 0x93, 0x33,
+ 0xF0, 0x83, 0x33, 0xF0, 0x73, 0x53, 0xF0, 0x63,
+ 0x53, 0xF0, 0x53, 0x73,
+//ascii 0x003F
+ 0x15, 0xF0, 0xB7, 0xF0, 0x99, 0xF0, 0x83, 0x34,
+ 0xF0, 0x73, 0x45, 0x23, 0xF3, 0x54, 0x23, 0xF3,
+ 0x72, 0x23, 0xF0, 0x14, 0xF0, 0xD4, 0xF0, 0xE3,
+ 0x40,
+//ascii 0x0040
+ 0x75, 0xF0, 0x9A, 0xF0, 0x5D, 0xF0, 0x34, 0x73,
+ 0xF0, 0x24, 0x92, 0xF0, 0x23, 0x93, 0xF0, 0x13,
+ 0x2B, 0x22, 0xC2, 0x3A, 0x32, 0xC2, 0x57, 0x42,
+ 0xC2, 0x49, 0x32, 0xC2, 0x33, 0x53, 0x22, 0xC2,
+ 0x32, 0x72, 0x22, 0xC2, 0x32, 0x72, 0x22, 0xC2,
+ 0x33, 0x53, 0x22, 0xC2, 0x49, 0x32, 0xC3, 0x39,
+ 0x23, 0xD3, 0x45, 0x42, 0xE4, 0xB3, 0xF4, 0x93,
+ 0xF0, 0x2E, 0xF0, 0x5B, 0xF0, 0x95, 0x40,
+//ascii 0x0041
+ 0x53, 0xF0, 0xB6, 0xF0, 0x98, 0xF0, 0x78, 0xF0,
+ 0x69, 0xF0, 0x57, 0x23, 0xF0, 0x46, 0x43, 0xF0,
+ 0x44, 0x63, 0xF0, 0x46, 0x43, 0xF0, 0x57, 0x23,
+ 0xF0, 0x89, 0xF0, 0xA9, 0xF0, 0xB8, 0xF0, 0xB6,
+ 0xF0, 0xE3,
+//ascii 0x0042
+ 0x15, 0xF0, 0x45, 0x27, 0xF0, 0x27, 0x17, 0xF0,
+ 0x2A, 0x24, 0xF4, 0x24, 0x43, 0xF3, 0x43, 0x43,
+ 0xF3, 0x43, 0x43, 0xF3, 0x43, 0x43, 0xF3, 0x43,
+ 0x43, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x0043
+ 0x32, 0x52, 0xF0, 0x64, 0x54, 0xF0, 0x35, 0x55,
+ 0xF0, 0x23, 0x93, 0xF0, 0x13, 0xB3, 0xF3, 0xB3,
+ 0xF3, 0xB3, 0xF3, 0xB3, 0xF3, 0xB3, 0xF3, 0xB3,
+ 0xF0, 0x13, 0x94, 0xF0, 0x15, 0x55, 0xF0, 0x3D,
+ 0xF0, 0x5B, 0xF0, 0x87, 0x50,
+//ascii 0x0044
+ 0x39, 0xF0, 0x7C, 0xF0, 0x4D, 0xF0, 0x34, 0x74,
+ 0xF0, 0x23, 0x94, 0xF3, 0xB3, 0xF3, 0xB3, 0xF3,
+ 0xB3, 0xF3, 0xB3, 0xF3, 0xB3, 0xFF, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x0045
+ 0x73, 0xB3, 0xF3, 0x43, 0x43, 0xF3, 0x43, 0x43,
+ 0xF3, 0x43, 0x43, 0xF3, 0x43, 0x43, 0xF3, 0x43,
+ 0x43, 0xF3, 0x43, 0x43, 0xF3, 0x43, 0x43, 0xFF,
+ 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x0046
+ 0x73, 0x43, 0xF0, 0x73, 0x43, 0xF0, 0x73, 0x43,
+ 0xF0, 0x73, 0x43, 0xF0, 0x73, 0x43, 0xF0, 0x73,
+ 0x43, 0xF0, 0x73, 0x43, 0xF0, 0x7F, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x0047
+ 0x23, 0x34, 0xF0, 0x64, 0x36, 0xF0, 0x35, 0x37,
+ 0xF0, 0x14, 0x52, 0x23, 0xF0, 0x13, 0x62, 0x33,
+ 0xF3, 0x62, 0x33, 0xF3, 0x62, 0x33, 0xF3, 0xB3,
+ 0xF3, 0xB3, 0xF3, 0xB3, 0xF0, 0x13, 0x93, 0xF0,
+ 0x25, 0x55, 0xF0, 0x3D, 0xF0, 0x6A, 0xF0, 0x96,
+ 0x50,
+//ascii 0x0048
+ 0x7F, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xF0, 0x73,
+ 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3,
+ 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0x7F, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x0049
+ 0x73, 0xB3, 0xF3, 0xB3, 0xF3, 0xB3, 0xFF, 0x02,
+ 0xFF, 0x02, 0xFF, 0x02, 0xF3, 0xB3, 0xF3, 0xB3,
+ 0xF3, 0xB3,
+//ascii 0x004A
+ 0x7F, 0xF0, 0x2F, 0x01, 0xF0, 0x1F, 0x02, 0xF0,
+ 0xE3, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0, 0xE3, 0xF0,
+ 0xD4, 0xF0, 0xD3, 0xF0, 0xE2, 0x20,
+//ascii 0x004B
+ 0x71, 0xF1, 0xF2, 0xD2, 0xF3, 0xA4, 0xF4, 0x85,
+ 0xF0, 0x15, 0x46, 0xF0, 0x44, 0x25, 0xF0, 0x79,
+ 0xF0, 0x96, 0xF0, 0xC4, 0xF0, 0xE4, 0xF0, 0x6F,
+ 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x004C
+ 0x53, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0,
+ 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xFF, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x004D
+ 0x7F, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xF7, 0xF0,
+ 0xD7, 0xF0, 0xC7, 0xF0, 0xD6, 0xF0, 0xD6, 0xF0,
+ 0xD5, 0xF0, 0xA6, 0xF0, 0x96, 0xF0, 0x87, 0xF0,
+ 0x87, 0xF0, 0x77, 0xF0, 0xAF, 0x02, 0xFF, 0x02,
+ 0xFF, 0x02,
+//ascii 0x004E
+ 0x7F, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xF0, 0xB5,
+ 0xF0, 0xA5, 0xF0, 0xB5, 0xF0, 0xA5, 0xF0, 0xB5,
+ 0xF0, 0xA5, 0xF0, 0xB5, 0xF0, 0xAF, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x004F
+ 0x56, 0xF0, 0x9A, 0xF0, 0x5D, 0xF0, 0x35, 0x55,
+ 0xF0, 0x23, 0x93, 0xF0, 0x13, 0xB3, 0xF2, 0xD2,
+ 0xF2, 0xD2, 0xF2, 0xD2, 0xF2, 0xD2, 0xF3, 0xB3,
+ 0xF0, 0x13, 0x93, 0xF0, 0x25, 0x55, 0xF0, 0x3D,
+ 0xF0, 0x6A, 0xF0, 0x96, 0x50,
+//ascii 0x0050
+ 0x25, 0xF0, 0xB7, 0xF0, 0x99, 0xF0, 0x74, 0x33,
+ 0xF0, 0x73, 0x53, 0xF0, 0x63, 0x62, 0xF0, 0x63,
+ 0x62, 0xF0, 0x63, 0x62, 0xF0, 0x63, 0x62, 0xF0,
+ 0x6F, 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x0051
+ 0x56, 0xF0, 0x9A, 0x31, 0xF0, 0x1D, 0x12, 0xF5,
+ 0x57, 0xF3, 0x94, 0xF3, 0x95, 0xF2, 0x93, 0x12,
+ 0xF2, 0x92, 0x22, 0xF2, 0x91, 0x32, 0xF2, 0xD2,
+ 0xF3, 0xB3, 0xF0, 0x13, 0x93, 0xF0, 0x25, 0x55,
+ 0xF0, 0x3D, 0xF0, 0x6A, 0xF0, 0x96, 0x50,
+//ascii 0x0052
+ 0x35, 0x62, 0xF0, 0x28, 0x34, 0xF0, 0x1A, 0x15,
+ 0xF0, 0x13, 0x48, 0xF0, 0x13, 0x65, 0xF0, 0x33,
+ 0x63, 0xF0, 0x53, 0x62, 0xF0, 0x63, 0x62, 0xF0,
+ 0x63, 0x62, 0xF0, 0x6F, 0x02, 0xFF, 0x02, 0xFF,
+ 0x02,
+//ascii 0x0053
+ 0x32, 0x44, 0xF0, 0x54, 0x37, 0xF0, 0x25, 0x28,
+ 0xF0, 0x23, 0x43, 0x33, 0xF3, 0x52, 0x52, 0xF3,
+ 0x43, 0x52, 0xF3, 0x43, 0x52, 0xF3, 0x43, 0x52,
+ 0xF3, 0x33, 0x53, 0xF0, 0x13, 0x23, 0x53, 0xF0,
+ 0x18, 0x34, 0xF0, 0x36, 0x44, 0xF0, 0x44, 0x52,
+ 0x30,
+//ascii 0x0054
+ 0x73, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0,
+ 0xE3, 0xF0, 0xEF, 0x02, 0xFF, 0x02, 0xFF, 0x02,
+ 0xF3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0,
+ 0xE3, 0x60,
+//ascii 0x0055
+ 0x7E, 0xF0, 0x3F, 0xF0, 0x2F, 0x01, 0xF0, 0xE4,
+ 0xF0, 0xE3, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0, 0xF2,
+ 0xF0, 0xE3, 0xF0, 0xD4, 0xFF, 0x01, 0xF0, 0x1F,
+ 0xF0, 0x2E, 0x30,
+//ascii 0x0056
+ 0x73, 0xF0, 0xE6, 0xF0, 0xB9, 0xF0, 0xA9, 0xF0,
+ 0xB9, 0xF0, 0xB9, 0xF0, 0xB6, 0xF0, 0xD4, 0xF0,
+ 0xB6, 0xF0, 0x89, 0xF0, 0x59, 0xF0, 0x59, 0xF0,
+ 0x69, 0xF0, 0x86, 0xF0, 0xB3, 0x60,
+//ascii 0x0057
+ 0x74, 0xF0, 0xD8, 0xF0, 0x9C, 0xF0, 0x9B, 0xF0,
+ 0xA9, 0xF0, 0xC5, 0xF0, 0xA7, 0xF0, 0x69, 0xF0,
+ 0x4A, 0xF0, 0x58, 0xF0, 0x95, 0xF0, 0xC8, 0xF0,
+ 0xBA, 0xF0, 0xB9, 0xF0, 0xC7, 0xF0, 0xC5, 0xF0,
+ 0x89, 0xF0, 0x4B, 0xF0, 0x2B, 0xF0, 0x68, 0xF0,
+ 0x94, 0x50,
+//ascii 0x0058
+ 0x71, 0xF1, 0xF3, 0xB3, 0xF5, 0x75, 0xF6, 0x56,
+ 0xF0, 0x26, 0x16, 0xF0, 0x69, 0xF0, 0xA5, 0xF0,
+ 0xC5, 0xF0, 0xA9, 0xF0, 0x66, 0x16, 0xF0, 0x26,
+ 0x56, 0xF5, 0x75, 0xF3, 0xB3, 0xF1, 0xF1,
+//ascii 0x0059
+ 0x72, 0xF0, 0xF4, 0xF0, 0xD5, 0xF0, 0xD6, 0xF0,
+ 0xD6, 0xF0, 0xD6, 0xF0, 0xDA, 0xF0, 0x89, 0xF0,
+ 0x7A, 0xF0, 0x56, 0xF0, 0x96, 0xF0, 0x96, 0xF0,
+ 0xA5, 0xF0, 0xC4, 0xF0, 0xD2, 0x70,
+//ascii 0x005A
+ 0x73, 0xB3, 0xF4, 0xA3, 0xF5, 0x93, 0xF7, 0x73,
+ 0xF8, 0x63, 0xF3, 0x24, 0x53, 0xF3, 0x35, 0x33,
+ 0xF3, 0x54, 0x23, 0xF3, 0x68, 0xF3, 0x77, 0xF3,
+ 0x95, 0xF3, 0xA4, 0xF3, 0xB3,
+//ascii 0x005B
+ 0x62, 0xF0, 0x22, 0xB2, 0xF0, 0x22, 0xB2, 0xF0,
+ 0x22, 0xBF, 0x06, 0xBF, 0x06, 0xBF, 0x06, 0x50,
+//ascii 0x005C
+ 0x12, 0xF0, 0xC5, 0xF0, 0x98, 0xF0, 0x59, 0xF0,
+ 0x4A, 0xF0, 0x3A, 0xF0, 0x76, 0xF0, 0xB3, 0x60,
+//ascii 0x005D
+ 0x6F, 0x06, 0xBF, 0x06, 0xBF, 0x06, 0xB2, 0xF0,
+ 0x22, 0xB2, 0xF0, 0x22, 0xB2, 0xF0, 0x22, 0x50,
+//ascii 0x005E
+ 0x51, 0xF0, 0xE3, 0xF0, 0xC5, 0xF0, 0xA5, 0xF0,
+ 0xC3, 0xF0, 0xE3, 0xF0, 0xE5, 0xF0, 0xE5, 0xF0,
+ 0xE3, 0xF0, 0xF0, 0x11, 0x20,
+//ascii 0x005F
+ 0x02, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0,
+ 0xF2, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0, 0xF2, 0xF0,
+ 0xF2, 0xF0, 0xF2, 0x60,
+//ascii 0x0060
+ 0x03, 0xF0, 0xC5, 0xF0, 0xC3, 0x70,
+//ascii 0x0061
+ 0x6A, 0xF0, 0x5C, 0xF0, 0x4D, 0xF0, 0x43, 0x21,
+ 0x42, 0xF0, 0x52, 0x32, 0x42, 0xF0, 0x42, 0x41,
+ 0x42, 0xF0, 0x42, 0x41, 0x42, 0xF0, 0x43, 0x32,
+ 0x32, 0xF0, 0x53, 0x27, 0xF0, 0x53, 0x36, 0xF0,
+ 0x62, 0x44, 0x10,
+//ascii 0x0062
+ 0x68, 0xF0, 0x7B, 0xF0, 0x5D, 0xF0, 0x44, 0x63,
+ 0xF0, 0x43, 0x82, 0xF0, 0x43, 0x82, 0xF0, 0x52,
+ 0x82, 0xF0, 0x62, 0x62, 0xF0, 0x1F, 0x02, 0xFF,
+ 0x02, 0xFF, 0x02,
+//ascii 0x0063
+ 0x52, 0x52, 0xF0, 0x73, 0x53, 0xF0, 0x54, 0x54,
+ 0xF0, 0x43, 0x73, 0xF0, 0x42, 0x92, 0xF0, 0x42,
+ 0x92, 0xF0, 0x43, 0x73, 0xF0, 0x44, 0x54, 0xF0,
+ 0x5B, 0xF0, 0x79, 0xF0, 0x97, 0x30,
+//ascii 0x0064
+ 0x7F, 0x02, 0xFF, 0x02, 0xFF, 0x02, 0xF0, 0x62,
+ 0x52, 0xF0, 0x72, 0x72, 0xF0, 0x53, 0x82, 0xF0,
+ 0x43, 0x82, 0xF0, 0x43, 0x73, 0xF0, 0x44, 0x54,
+ 0xF0, 0x5B, 0xF0, 0x7A, 0xF0, 0x96, 0x30,
+//ascii 0x0065
+ 0x74, 0x21, 0xF0, 0x86, 0x13, 0xF0, 0x67, 0x13,
+ 0xF0, 0x63, 0x22, 0x23, 0xF0, 0x43, 0x32, 0x32,
+ 0xF0, 0x43, 0x32, 0x32, 0xF0, 0x43, 0x32, 0x32,
+ 0xF0, 0x43, 0x32, 0x32, 0xF0, 0x53, 0x22, 0x23,
+ 0xF0, 0x5B, 0xF0, 0x79, 0xF0, 0xA6, 0x30,
+//ascii 0x0066
+ 0x72, 0x22, 0xF0, 0xB2, 0x22, 0xF0, 0xB2, 0x22,
+ 0xF0, 0xBF, 0x02, 0xF0, 0x1F, 0x01, 0xF0, 0x2F,
+ 0xF0, 0x42, 0xF0, 0xF2, 0x30,
+//ascii 0x0067
+ 0x3F, 0xF0, 0x2F, 0x02, 0xFF, 0x02, 0xF0, 0x22,
+ 0x52, 0x43, 0xF2, 0x72, 0x33, 0xE3, 0x73, 0x32,
+ 0xE3, 0x73, 0x32, 0xE3, 0x73, 0x32, 0xE4, 0x54,
+ 0x23, 0xFB, 0x32, 0xF0, 0x29, 0x42, 0xF0, 0x46,
+ 0x30,
+//ascii 0x0068
+ 0x6A, 0xF0, 0x5C, 0xF0, 0x5C, 0xF0, 0x44, 0xF0,
+ 0xD3, 0xF0, 0xE3, 0xF0, 0xF2, 0xF0, 0xF0, 0x12,
+ 0xF0, 0x9F, 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x0069
+ 0x72, 0x2D, 0xF2, 0x2D, 0xF2, 0x2D,
+//ascii 0x006A
+ 0x72, 0x2F, 0xD2, 0x2F, 0x01, 0xC2, 0x2F, 0x02,
+ 0xF0, 0xF2, 0xF0, 0xF2, 0x40,
+//ascii 0x006B
+ 0x31, 0xB1, 0xF0, 0x42, 0x92, 0xF0, 0x43, 0x73,
+ 0xF0, 0x44, 0x45, 0xF0, 0x54, 0x25, 0xF0, 0x78,
+ 0xF0, 0xA6, 0xF0, 0xC4, 0xF0, 0xE4, 0xF0, 0x4F,
+ 0x02, 0xFF, 0x02, 0xFF, 0x02,
+//ascii 0x006C
+ 0x53, 0xF0, 0xE3, 0xF0, 0xE3, 0xFF, 0x02, 0xFF,
+ 0x02, 0xFF, 0x01, 0x10,
+//ascii 0x006D
+ 0x6A, 0xF0, 0x5C, 0xF0, 0x4D, 0xF0, 0x44, 0xF0,
+ 0xD3, 0xF0, 0xE3, 0xF0, 0xF2, 0xF0, 0xF0, 0x12,
+ 0xF0, 0xF0, 0x1A, 0xF0, 0x5C, 0xF0, 0x4D, 0xF0,
+ 0x44, 0xF0, 0xD3, 0xF0, 0xE3, 0xF0, 0xF2, 0xF0,
+ 0xF0, 0x12, 0xF0, 0xDD, 0xF0, 0x4D, 0xF0, 0x4D,
+//ascii 0x006E
+ 0x6A, 0xF0, 0x5C, 0xF0, 0x4D, 0xF0, 0x44, 0xF0,
+ 0xD3, 0xF0, 0xE3, 0xF0, 0xF2, 0xF0, 0xF0, 0x12,
+ 0xF0, 0xDD, 0xF0, 0x4D, 0xF0, 0x4D,
+//ascii 0x006F
+ 0x75, 0xF0, 0xA9, 0xF0, 0x7B, 0xF0, 0x63, 0x53,
+ 0xF0, 0x53, 0x73, 0xF0, 0x42, 0x92, 0xF0, 0x42,
+ 0x92, 0xF0, 0x43, 0x73, 0xF0, 0x53, 0x53, 0xF0,
+ 0x6B, 0xF0, 0x79, 0xF0, 0xA5, 0x40,
+//ascii 0x0070
+ 0x68, 0xF0, 0x7B, 0xF0, 0x5D, 0xF0, 0x44, 0x63,
+ 0xF0, 0x43, 0x82, 0xF0, 0x43, 0x82, 0xF0, 0x52,
+ 0x82, 0xF0, 0x62, 0x62, 0xF0, 0x5F, 0x03, 0xEF,
+ 0x03, 0xEF, 0x03, 0x30,
+//ascii 0x0071
+ 0x3F, 0x03, 0xEF, 0x03, 0xEF, 0x03, 0xF0, 0x12,
+ 0x62, 0xF0, 0x62, 0x82, 0xF0, 0x43, 0x82, 0xF0,
+ 0x43, 0x82, 0xF0, 0x44, 0x63, 0xF0, 0x4D, 0xF0,
+ 0x5B, 0xF0, 0x88, 0x20,
+//ascii 0x0072
+ 0x33, 0xF0, 0xE3, 0xF0, 0xE3, 0xF0, 0xF2, 0xF0,
+ 0xF0, 0x13, 0xF0, 0xCD, 0xF0, 0x4D, 0xF0, 0x4D,
+//ascii 0x0073
+ 0x33, 0xF0, 0x72, 0x45, 0xF0, 0x53, 0x37, 0xF0,
+ 0x43, 0x33, 0x13, 0xF0, 0x42, 0x42, 0x32, 0xF0,
+ 0x42, 0x33, 0x32, 0xF0, 0x42, 0x32, 0x42, 0xF0,
+ 0x43, 0x13, 0x33, 0xF0, 0x47, 0x24, 0xF0, 0x55,
+ 0x33, 0xF0, 0x73, 0x42, 0x20,
+//ascii 0x0074
+ 0x32, 0x92, 0xF0, 0x42, 0x92, 0xF0, 0x42, 0x83,
+ 0xF0, 0x1F, 0x01, 0xF0, 0x1F, 0xF0, 0x2E, 0xF0,
+ 0x62, 0x30,
+//ascii 0x0075
+ 0x3D, 0xF0, 0x4D, 0xF0, 0x4D, 0xF0, 0xD2, 0xF0,
+ 0xF0, 0x12, 0xF0, 0xF3, 0xF0, 0xE3, 0xF0, 0xD4,
+ 0xF0, 0x4D, 0xF0, 0x4C, 0xF0, 0x5A, 0x30,
+//ascii 0x0076
+ 0x33, 0xF0, 0xE7, 0xF0, 0xAA, 0xF0, 0xAA, 0xF0,
+ 0xB6, 0xF0, 0xE3, 0xF0, 0xB6, 0xF0, 0x7A, 0xF0,
+ 0x4A, 0xF0, 0x77, 0xF0, 0xA3, 0x20,
+//ascii 0x0077
+ 0x32, 0xF0, 0xF4, 0xF0, 0xD7, 0xF0, 0xD7, 0xF0,
+ 0xD7, 0xF0, 0xD4, 0xF0, 0xA7, 0xF0, 0x76, 0xF0,
+ 0x86, 0xF0, 0xB4, 0xF0, 0xD6, 0xF0, 0xE6, 0xF0,
+ 0xE7, 0xF0, 0xD4, 0xF0, 0xA7, 0xF0, 0x77, 0xF0,
+ 0x77, 0xF0, 0xA4, 0xF0, 0xD2, 0x30,
+//ascii 0x0078
+ 0x32, 0xA1, 0xF0, 0x43, 0x73, 0xF0, 0x45, 0x35,
+ 0xF0, 0x6A, 0xF0, 0x87, 0xF0, 0xC4, 0xF0, 0xB7,
+ 0xF0, 0x9A, 0xF0, 0x55, 0x35, 0xF0, 0x43, 0x73,
+ 0xF0, 0x42, 0xA1,
+//ascii 0x0079
+ 0x33, 0xF0, 0xE6, 0xF0, 0xB9, 0xF0, 0xB9, 0xF0,
+ 0xC9, 0xF0, 0xB7, 0xF0, 0x7B, 0xF0, 0x29, 0x33,
+ 0xE9, 0x63, 0xE6, 0x93, 0xE3, 0x20,
+//ascii 0x007A
+ 0x32, 0x83, 0xF0, 0x43, 0x73, 0xF0, 0x44, 0x63,
+ 0xF0, 0x46, 0x43, 0xF0, 0x47, 0x33, 0xF0, 0x43,
+ 0x14, 0x23, 0xF0, 0x43, 0x37, 0xF0, 0x43, 0x46,
+ 0xF0, 0x43, 0x55, 0xF0, 0x43, 0x73, 0xF0, 0x43,
+ 0x82,
+//ascii 0x007B
+ 0x62, 0xF0, 0x22, 0xB3, 0xF3, 0xB9, 0x39, 0xC9,
+ 0x19, 0xEF, 0x02, 0xF0, 0x64, 0xF0, 0xE2, 0x70,
+//ascii 0x007C
+ 0x6F, 0x07, 0xAF, 0x07, 0x40,
+//ascii 0x007D
+ 0x72, 0xF0, 0xE4, 0xF0, 0x7F, 0x02, 0xE9, 0x19,
+ 0xC9, 0x39, 0xB3, 0xF3, 0xB2, 0xF0, 0x22, 0x50,
+//ascii 0x007E
+ 0x63, 0xF0, 0xE4, 0xF0, 0xF3, 0xF0, 0xF2, 0xF0,
+ 0xF2, 0xF0, 0xE3, 0xF0, 0xD3, 0xF0, 0xD3, 0xF0,
+ 0xE2, 0xF0, 0xF2, 0xF0, 0xF3, 0xF0, 0xF4, 0xF0,
+ 0xE3, 0x50,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_SEMIBOLD_24PX_1BPP[95] = {
+ { 0, 0, 6,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 7,1, 0, 0, 0 }, //asciii 0x0021
+ { 6, 1, 9,0, 4, 0, 0 }, //asciii 0x0022
+ { 20, 1, 16,0, 5, 0, 0 }, //asciii 0x0023
+ { 65, 1, 16,0, 5, 0, 0 }, //asciii 0x0024
+ { 107, 1, 19,1, 2, 0, 0 }, //asciii 0x0025
+ { 153, 1, 16,0, 6, 0, 0 }, //asciii 0x0026
+ { 192, 1, 5,0, 4, 0, 0 }, //asciii 0x0027
+ { 198, 1, 9,0, 4, 0, 0 }, //asciii 0x0028
+ { 211, 1, 9,1, 1, 0, 0 }, //asciii 0x0029
+ { 224, 1, 12,1, 1, 0, 0 }, //asciii 0x002A
+ { 242, 1, 15,1, 1, 0, 0 }, //asciii 0x002B
+ { 264, 1, 8,1, 2, 0, 0 }, //asciii 0x002C
+ { 272, 1, 11,1, 1, 0, 0 }, //asciii 0x002D
+ { 286, 1, 7,1, 2, 0, 0 }, //asciii 0x002E
+ { 291, 1, 9,0, 4, 0, 0 }, //asciii 0x002F
+ { 307, 1, 15,0, 5, 0, 0 }, //asciii 0x0030
+ { 336, 1, 11,1, 4, 0, 0 }, //asciii 0x0031
+ { 351, 1, 14,0, 5, 0, 0 }, //asciii 0x0032
+ { 386, 1, 15,0, 6, 0, 0 }, //asciii 0x0033
+ { 420, 1, 15,0, 6, 0, 0 }, //asciii 0x0034
+ { 450, 1, 15,0, 6, 0, 0 }, //asciii 0x0035
+ { 487, 1, 15,0, 5, 0, 0 }, //asciii 0x0036
+ { 527, 1, 14,1, 0, 0, 0 }, //asciii 0x0037
+ { 553, 1, 15,0, 6, 0, 0 }, //asciii 0x0038
+ { 590, 1, 15,0, 5, 0, 0 }, //asciii 0x0039
+ { 629, 1, 7,1, 1, 0, 0 }, //asciii 0x003A
+ { 637, 1, 7,1, 1, 0, 0 }, //asciii 0x003B
+ { 648, 1, 15,1, 1, 0, 0 }, //asciii 0x003C
+ { 677, 1, 15,1, 1, 0, 0 }, //asciii 0x003D
+ { 710, 1, 15,1, 2, 0, 0 }, //asciii 0x003E
+ { 738, 1, 13,1, 1, 0, 0 }, //asciii 0x003F
+ { 763, 1, 24,0, 5, 0, 0 }, //asciii 0x0040
+ { 826, 1, 17,0, 6, 0, 0 }, //asciii 0x0041
+ { 860, 1, 15,0, 6, 0, 0 }, //asciii 0x0042
+ { 891, 1, 17,0, 5, 0, 0 }, //asciii 0x0043
+ { 928, 1, 17,1, 1, 0, 0 }, //asciii 0x0044
+ { 955, 1, 14,0, 4, 0, 0 }, //asciii 0x0045
+ { 984, 1, 13,0, 4, 0, 0 }, //asciii 0x0046
+ { 1011, 1, 17,0, 5, 0, 0 }, //asciii 0x0047
+ { 1052, 1, 17,1, 0, 0, 0 }, //asciii 0x0048
+ { 1079, 1, 13,1, 0, 0, 0 }, //asciii 0x0049
+ { 1097, 1, 13,1, 0, 0, 0 }, //asciii 0x004A
+ { 1119, 1, 16,0, 4, 0, 0 }, //asciii 0x004B
+ { 1148, 1, 13,0, 6, 0, 0 }, //asciii 0x004C
+ { 1167, 1, 21,1, 0, 0, 0 }, //asciii 0x004D
+ { 1201, 1, 17,1, 0, 0, 0 }, //asciii 0x004E
+ { 1228, 1, 18,0, 5, 0, 0 }, //asciii 0x004F
+ { 1265, 1, 15,0, 5, 0, 0 }, //asciii 0x0050
+ { 1295, 1, 18,0, 5, 0, 0 }, //asciii 0x0051
+ { 1334, 1, 15,0, 5, 0, 0 }, //asciii 0x0052
+ { 1367, 1, 17,1, 1, 0, 0 }, //asciii 0x0053
+ { 1408, 1, 15,0, 4, 0, 0 }, //asciii 0x0054
+ { 1434, 1, 17,1, 0, 0, 0 }, //asciii 0x0055
+ { 1461, 1, 17,0, 4, 0, 0 }, //asciii 0x0056
+ { 1491, 1, 23,0, 4, 0, 0 }, //asciii 0x0057
+ { 1533, 1, 16,0, 4, 0, 0 }, //asciii 0x0058
+ { 1564, 1, 17,0, 4, 0, 0 }, //asciii 0x0059
+ { 1594, 1, 15,0, 4, 0, 0 }, //asciii 0x005A
+ { 1623, 1, 10,0, 4, 0, 0 }, //asciii 0x005B
+ { 1639, 1, 10,0, 7, 0, 0 }, //asciii 0x005C
+ { 1655, 1, 9,1, 0, 0, 0 }, //asciii 0x005D
+ { 1671, 1, 12,0, 5, 0, 0 }, //asciii 0x005E
+ { 1692, 1, 12,1, 3, 0, 0 }, //asciii 0x005F
+ { 1712, 1, 11,2, 1, 0, 0 }, //asciii 0x0060
+ { 1718, 1, 13,0, 5, 0, 0 }, //asciii 0x0061
+ { 1753, 1, 15,1, 1, 0, 0 }, //asciii 0x0062
+ { 1780, 1, 13,0, 5, 0, 0 }, //asciii 0x0063
+ { 1810, 1, 15,1, 0, 0, 0 }, //asciii 0x0064
+ { 1841, 1, 14,0, 5, 0, 0 }, //asciii 0x0065
+ { 1880, 1, 9,0, 4, 0, 0 }, //asciii 0x0066
+ { 1901, 1, 14,0, 5, 0, 0 }, //asciii 0x0067
+ { 1934, 1, 14,0, 5, 0, 0 }, //asciii 0x0068
+ { 1957, 1, 7,1, 0, 0, 0 }, //asciii 0x0069
+ { 1963, 1, 7,1, 0, 0, 0 }, //asciii 0x006A
+ { 1976, 1, 14,0, 1, 0, 0 }, //asciii 0x006B
+ { 2005, 1, 9,0, 6, 0, 0 }, //asciii 0x006C
+ { 2017, 1, 23,1, 1, 0, 0 }, //asciii 0x006D
+ { 2057, 1, 14,0, 5, 0, 0 }, //asciii 0x006E
+ { 2079, 1, 14,0, 5, 0, 0 }, //asciii 0x006F
+ { 2109, 1, 14,0, 5, 0, 0 }, //asciii 0x0070
+ { 2137, 1, 14,0, 5, 0, 0 }, //asciii 0x0071
+ { 2165, 1, 10,0, 1, 0, 0 }, //asciii 0x0072
+ { 2181, 1, 13,0, 6, 0, 0 }, //asciii 0x0073
+ { 2218, 1, 9,0, 5, 0, 0 }, //asciii 0x0074
+ { 2236, 1, 15,1, 1, 0, 0 }, //asciii 0x0075
+ { 2259, 1, 13,0, 5, 0, 0 }, //asciii 0x0076
+ { 2281, 1, 21,0, 5, 0, 0 }, //asciii 0x0077
+ { 2319, 1, 13,0, 5, 0, 0 }, //asciii 0x0078
+ { 2346, 1, 13,0, 5, 0, 0 }, //asciii 0x0079
+ { 2368, 1, 13,0, 5, 0, 0 }, //asciii 0x007A
+ { 2401, 1, 9,0, 4, 0, 0 }, //asciii 0x007B
+ { 2417, 1, 8,1, 4, 0, 0 }, //asciii 0x007C
+ { 2422, 1, 9,0, 5, 0, 0 }, //asciii 0x007D
+ { 2438, 1, 16,0, 5, 0, 0 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_SEMIBOLD_24PX_1BPP= {
+ 2464, // bitmap len
+ BAGL_FONT_INTER_SEMIBOLD_24px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 32, // height of all characters in pixels
+ 32, // line height in pixels
+ 0, // kerning
+ 0, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_SEMIBOLD_24PX_1BPP,
+ bitmapINTER_SEMIBOLD_24PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.json
new file mode 100644
index 00000000..1a87dd57
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_24_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 33,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 34,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 20,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 35,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 65,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 107,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 37,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 153,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 38,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 192,
+ "width": 5,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 39,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 198,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 211,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 224,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 42,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 242,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 43,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 264,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 272,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 45,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 286,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 46,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 291,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 47,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 307,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 48,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 336,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 49,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 351,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 50,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 386,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 51,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 420,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 52,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 450,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 53,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 487,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 54,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 527,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 55,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 553,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 56,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 590,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 57,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 629,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 58,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 637,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 648,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 60,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 677,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 61,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 710,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 62,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 738,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 63,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 763,
+ "width": 24,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 63
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 826,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 65,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 860,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 66,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 891,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 67,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 928,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 68,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 955,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 69,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 984,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 70,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1011,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 71,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1052,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 72,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1079,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 73,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1097,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 74,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1119,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 75,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1148,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 76,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1167,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 77,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1201,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 78,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1228,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 79,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1265,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 80,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1295,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 81,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1334,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 82,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1367,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 83,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1408,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 84,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1434,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 85,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1461,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 86,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1491,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 87,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1533,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 88,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1564,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 89,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1594,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 90,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1623,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1639,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 92,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1655,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1671,
+ "width": 12,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 94,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1692,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 95,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1712,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 96,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1718,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 97,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1753,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 98,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1780,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 99,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1810,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 100,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1841,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 101,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1880,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 102,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1901,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1934,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 104,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1957,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 105,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1963,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1976,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 107,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2005,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 108,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2017,
+ "width": 23,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 109,
+ "bitmap_byte_count": 40
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2057,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 110,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2079,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 111,
+ "bitmap_byte_count": 30
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2109,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2137,
+ "width": 14,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2165,
+ "width": 10,
+ "x_min_offset": 0,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 114,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2181,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 115,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2218,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 116,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2236,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 117,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2259,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 118,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2281,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 119,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2319,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 120,
+ "bitmap_byte_count": 27
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2346,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2368,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 122,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2401,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2417,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2422,
+ "width": 9,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2438,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 126,
+ "bitmap_byte_count": 26
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.inc b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.inc
new file mode 100644
index 00000000..6868a70d
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.inc
@@ -0,0 +1,1360 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_SEMIBOLD_28PX[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0xC3, 0x0C, 0x2D, 0x2E, 0xC9, 0x19, 0xC7, 0x0A,
+ 0x70, 0x30, 0x11, 0xC1, 0x04, 0x10, 0x03, 0xC6,
+ 0x0A, 0x70, 0x50, 0xC0, 0x0E, 0x30, 0x0D, 0xC5,
+ 0x0A, 0x70, 0x50, 0xC1, 0x01, 0x10, 0x01, 0xC6,
+ 0x0D, 0x27, 0x18, 0x29, 0x2A, 0x2B, 0xC1, 0x9C,
+ 0x43, 0xC0,
+//ascii 0x0022
+ 0xC2, 0x0D, 0x69, 0xC3, 0x0A, 0x60, 0x0E, 0xC2,
+ 0x0A, 0x60, 0x0E, 0xC2, 0x0E, 0x6B, 0xCF, 0x0E,
+ 0x6B, 0xC3, 0x0A, 0x60, 0x0E, 0xC2, 0x0A, 0x60,
+ 0x0E, 0xC2, 0x0E, 0x69, 0xC0,
+//ascii 0x0023
+ 0xC8, 0x87, 0xAD, 0xD3, 0x0E, 0x10, 0x05, 0xC3,
+ 0x0A, 0x0C, 0xC8, 0x9C, 0x8A, 0xD0, 0xC0, 0x0E,
+ 0x10, 0x05, 0xC3, 0x10, 0x04, 0xC7, 0x0A, 0x30,
+ 0x02, 0x10, 0x03, 0x0D, 0xC2, 0x10, 0x04, 0xC7,
+ 0x0A, 0x70, 0x10, 0x02, 0x04, 0x10, 0x03, 0xC8,
+ 0xAB, 0x96, 0x41, 0x70, 0x20, 0x92, 0x47, 0xA0,
+ 0xC7, 0x0E, 0x10, 0x93, 0x74, 0x10, 0x70, 0x00,
+ 0xC7, 0x0E, 0x10, 0x05, 0xC2, 0x0E, 0x10, 0x81,
+ 0x42, 0x20, 0xC7, 0x0E, 0x10, 0x05, 0xC3, 0x10,
+ 0x04, 0xC2, 0x0C, 0x0A, 0xC2, 0x8D, 0xAD, 0xC1,
+ 0x0E, 0x10, 0x05, 0xC3, 0x10, 0x04, 0xC7, 0x0A,
+ 0x20, 0x02, 0x04, 0x10, 0x04, 0xC3, 0x10, 0x04,
+ 0xC7, 0x0A, 0x70, 0x90, 0x25, 0x70, 0x10, 0x04,
+ 0xC7, 0xAE, 0x96, 0x41, 0x70, 0x20, 0xA2, 0x47,
+ 0xAC, 0xC7, 0x0D, 0x10, 0x82, 0x41, 0x70, 0x10,
+ 0xC7, 0x0E, 0x10, 0x05, 0xC2, 0x0C, 0x10, 0x01,
+ 0x02, 0x30, 0xC7, 0x0E, 0x10, 0x05, 0xC3, 0x10,
+ 0x04, 0xC1, 0x8C, 0xA7, 0xC8, 0x8E, 0xBC, 0xC3,
+ 0x10, 0x04, 0xD4, 0x0B, 0x19, 0xC0,
+//ascii 0x0024
+ 0xC6, 0x8B, 0x7E, 0xC4, 0x0E, 0x06, 0x12, 0x04,
+ 0x08, 0xCB, 0x0E, 0x03, 0x10, 0x0C, 0xC3, 0x0B,
+ 0x01, 0x40, 0x02, 0x0E, 0xC8, 0x0E, 0x02, 0x20,
+ 0x0C, 0xC2, 0x0E, 0x01, 0x60, 0x02, 0xC8, 0x05,
+ 0x30, 0x0C, 0xC2, 0x05, 0x20, 0x01, 0x03, 0x30,
+ 0x09, 0xC6, 0x0E, 0x20, 0x04, 0x0E, 0xC2, 0x0E,
+ 0x20, 0x05, 0xC1, 0x0D, 0x02, 0x10, 0x02, 0xC6,
+ 0x0A, 0x10, 0x01, 0xC4, 0x09, 0x20, 0x0E, 0xC2,
+ 0x0B, 0x20, 0x0E, 0xC5, 0x07, 0x10, 0x06, 0xC4,
+ 0x05, 0x10, 0x05, 0xC4, 0x20, 0x0C, 0xC3, 0x01,
+ 0x70, 0x70, 0x70, 0x07, 0xC1, 0x87, 0x62, 0x10,
+ 0x02, 0x36, 0x04, 0x20, 0x05, 0x46, 0x20, 0x84,
+ 0x6A, 0xC3, 0x08, 0x10, 0x04, 0xC3, 0x07, 0x10,
+ 0x02, 0xC5, 0x20, 0x0D, 0xC5, 0x0C, 0x20, 0x0B,
+ 0xC1, 0x0D, 0x01, 0x10, 0x06, 0xC4, 0x08, 0x20,
+ 0xC7, 0x02, 0x20, 0x85, 0x61, 0x20, 0x0C, 0xC3,
+ 0x09, 0x20, 0x04, 0xC7, 0x0A, 0x70, 0x04, 0xC3,
+ 0x40, 0x0B, 0xC8, 0x07, 0x50, 0x01, 0x0E, 0xC3,
+ 0x30, 0x06, 0xCA, 0x0A, 0x02, 0x20, 0x04, 0x0E,
+ 0xC4, 0x20, 0x07, 0xCD, 0x0E, 0x0D, 0xC7, 0x85,
+ 0x8D, 0xC0,
+//ascii 0x0025
+ 0xD1, 0x0C, 0x1B, 0x0E, 0xD5, 0x07, 0x40, 0x05,
+ 0x0E, 0xC6, 0x0B, 0x0A, 0xC9, 0x07, 0x60, 0x03,
+ 0xC6, 0x8A, 0x05, 0xC8, 0x10, 0xA4, 0xAB, 0xA6,
+ 0x10, 0x0B, 0xC5, 0xAC, 0x10, 0x1B, 0xC5, 0x0C,
+ 0x10, 0xC4, 0x83, 0x07, 0xC6, 0x0E, 0x03, 0x10,
+ 0x06, 0xC4, 0x0C, 0x10, 0xC4, 0x83, 0x07, 0xC8,
+ 0x08, 0x10, 0x02, 0x0C, 0xC3, 0x10, 0x03, 0x0A,
+ 0x1B, 0x06, 0x10, 0x0B, 0xC9, 0x0D, 0x03, 0x10,
+ 0x07, 0xC2, 0x07, 0x60, 0x03, 0xCC, 0x07, 0x10,
+ 0x02, 0x0D, 0xC1, 0x08, 0x01, 0x30, 0x05, 0x0E,
+ 0xCD, 0x0C, 0x02, 0x10, 0x08, 0xC2, 0x9C, 0xBC,
+ 0xE0, 0xD1, 0x06, 0x10, 0x03, 0x0D, 0xCF, 0x07,
+ 0x02, 0x11, 0x02, 0x07, 0xC1, 0x0B, 0x01, 0x10,
+ 0x09, 0xCD, 0x02, 0x50, 0x02, 0xC2, 0x05, 0x10,
+ 0x04, 0x0E, 0xCA, 0x07, 0x10, 0x03, 0x15, 0x03,
+ 0x10, 0x07, 0xC2, 0xAA, 0x10, 0x1A, 0xC9, 0x82,
+ 0x07, 0xC3, 0x86, 0x03, 0xC3, 0x0E, 0x04, 0x10,
+ 0x05, 0xC8, 0x81, 0x0A, 0xC3, 0x89, 0x02, 0xC5,
+ 0xA9, 0x10, 0x1B, 0xC6, 0x93, 0x04, 0xE0, 0xC1,
+ 0x9E, 0x30, 0x40, 0xC6, 0x0E, 0x03, 0x10, 0xC6,
+ 0x09, 0x70, 0x0A, 0xC8, 0x08, 0x00, 0xC7, 0x06,
+ 0x50, 0x06, 0xCA, 0x0D, 0xC8, 0x0C, 0x07, 0x16,
+ 0x07, 0x0C, 0xC0,
+//ascii 0x0026
+ 0xEA, 0x0E, 0xC5, 0x0E, 0x02, 0xD1, 0x06, 0x10,
+ 0x04, 0x09, 0xC1, 0x8C, 0x10, 0xD1, 0x06, 0x30,
+ 0x01, 0x07, 0x20, 0xD1, 0x07, 0x70, 0x02, 0xC9,
+ 0x0D, 0x19, 0x0C, 0xC5, 0x0C, 0x06, 0x30, 0x03,
+ 0x0E, 0xC8, 0x05, 0x30, 0x03, 0x0E, 0xC4, 0x03,
+ 0x30, 0x01, 0xC8, 0x05, 0x50, 0x01, 0x0E, 0xC1,
+ 0x0D, 0x02, 0x50, 0x07, 0xC6, 0x0D, 0x20, 0x84,
+ 0x61, 0x10, 0x03, 0xC0, 0x0C, 0x01, 0x20, 0x08,
+ 0x0B, 0x10, 0x01, 0xC6, 0x08, 0x10, 0x05, 0xC1,
+ 0x0E, 0x02, 0x10, 0x04, 0x30, 0x0A, 0xC1, 0x02,
+ 0x10, 0x0E, 0xC5, 0x06, 0x10, 0x0A, 0xC2, 0x0D,
+ 0x40, 0x01, 0x0C, 0xC2, 0x05, 0x10, 0x0C, 0xC5,
+ 0x07, 0x10, 0x07, 0xC3, 0x02, 0x20, 0x02, 0x0D,
+ 0xC3, 0x05, 0x10, 0x0C, 0xC5, 0x0A, 0x20, 0x99,
+ 0xD9, 0x20, 0x30, 0x04, 0xC4, 0x01, 0x10, 0x0D,
+ 0xC6, 0x01, 0x70, 0x20, 0x05, 0xC2, 0x05, 0x10,
+ 0x01, 0xC7, 0x0C, 0x01, 0x50, 0x19, 0x20, 0x81,
+ 0x41, 0x20, 0x06, 0xC8, 0xBD, 0x51, 0x01, 0x60,
+ 0x0E, 0xC1, 0x06, 0x60, 0x01, 0x0E, 0xD2, 0x06,
+ 0x40, 0x02, 0x0D, 0xD4, 0xAB, 0x54, 0x59, 0xC0,
+//ascii 0x0027
+ 0xC2, 0x0E, 0x6B, 0xC3, 0x0A, 0x60, 0x0E, 0xC2,
+ 0x0A, 0x60, 0x0E, 0xC2, 0x0E, 0x69, 0xC0,
+//ascii 0x0028
+ 0xE2, 0x05, 0x0D, 0xD5, 0x08, 0x0B, 0xC5, 0x91,
+ 0x06, 0xC0, 0xD0, 0xAE, 0x81, 0x0B, 0xC5, 0x01,
+ 0x20, 0x82, 0x7B, 0xCA, 0x8D, 0x94, 0x30, 0x0B,
+ 0xC5, 0x07, 0x60, 0x92, 0x46, 0x70, 0x18, 0x97,
+ 0x53, 0x10, 0x50, 0x02, 0x0E, 0xC6, 0x0C, 0x03,
+ 0x70, 0x70, 0x20, 0x01, 0x08, 0xCA, 0x0B, 0x04,
+ 0x70, 0x60, 0x01, 0x08, 0xCE, 0x9E, 0x95, 0x20,
+ 0x60, 0x91, 0x47, 0xC0, 0xD5, 0x0E, 0x0D, 0x1C,
+ 0x0D,
+//ascii 0x0029
+ 0xCC, 0x0D, 0x2C, 0x0D, 0x0E, 0xD4, 0x9D, 0x95,
+ 0x20, 0x60, 0x91, 0x37, 0xB0, 0xCE, 0x0A, 0x03,
+ 0x70, 0x60, 0x81, 0x7E, 0xC9, 0x0B, 0x02, 0x70,
+ 0x70, 0x20, 0x01, 0x08, 0xC7, 0x06, 0x60, 0x82,
+ 0x57, 0x28, 0x97, 0x63, 0x10, 0x50, 0x02, 0x0E,
+ 0xC5, 0x01, 0x20, 0x82, 0x7C, 0xCA, 0x8D, 0x95,
+ 0x30, 0x0B, 0xC5, 0x91, 0x06, 0xC0, 0xD1, 0x99,
+ 0x20, 0xB0, 0xC5, 0x05, 0x0D, 0xD5, 0x08, 0x0B,
+ 0xC0,
+//ascii 0x002A
+ 0xD5, 0x07, 0x02, 0xC1, 0x8D, 0x19, 0xC7, 0x0C,
+ 0x10, 0x0A, 0xC0, 0x85, 0x01, 0xC8, 0x97, 0x02,
+ 0xD0, 0x10, 0x0B, 0xC9, 0xA2, 0x01, 0x05, 0xC6,
+ 0x0B, 0x04, 0x15, 0x03, 0x20, 0x15, 0x04, 0x03,
+ 0xC3, 0x0A, 0x70, 0x20, 0x0E, 0xC2, 0xAD, 0x78,
+ 0x94, 0x20, 0x97, 0x98, 0x70, 0xC6, 0xBE, 0x10,
+ 0x30, 0x30, 0xC9, 0xB4, 0x03, 0xE1, 0x00, 0x09,
+ 0xC7, 0x0B, 0x10, 0x0B, 0xC0, 0x87, 0x01, 0xC8,
+ 0x0A, 0x05, 0xC1, 0x8E, 0x4D, 0xC0,
+//ascii 0x002B
+ 0xC5, 0x0D, 0x1B, 0x0E, 0xCB, 0x06, 0x10, 0x08,
+ 0xCB, 0x06, 0x10, 0x08, 0xCB, 0x06, 0x10, 0x08,
+ 0xCB, 0x06, 0x10, 0x08, 0xCB, 0x06, 0x10, 0x08,
+ 0xC6, 0x01, 0x70, 0x30, 0x03, 0xC1, 0x70, 0x40,
+ 0x03, 0xC1, 0x70, 0x40, 0x03, 0xC1, 0x4E, 0x05,
+ 0x10, 0x07, 0x4E, 0xC6, 0x06, 0x10, 0x08, 0xCB,
+ 0x06, 0x10, 0x08, 0xCB, 0x06, 0x10, 0x08, 0xCB,
+ 0x06, 0x10, 0x08, 0xCB, 0x0B, 0x18, 0x0C,
+//ascii 0x002C
+ 0xCC, 0xA3, 0x14, 0x7C, 0xC6, 0x03, 0x30, 0x81,
+ 0x6C, 0xC3, 0x03, 0x60, 0xC3, 0xBE, 0xDC, 0x97,
+ 0x30, 0x10, 0xCA, 0x0C, 0xC0,
+//ascii 0x002D
+ 0xC1, 0x2E, 0xC4, 0x20, 0xC4, 0x20, 0xC4, 0x20,
+ 0xC4, 0x20, 0xC4, 0x20, 0xC4, 0x20, 0xC4, 0x20,
+ 0xC4, 0x20, 0xC4, 0x20, 0xC0,
+//ascii 0x002E
+ 0xC4, 0x1D, 0xC8, 0x08, 0x10, 0x06, 0xC7, 0x30,
+ 0x0E, 0xC6, 0x30, 0x0E, 0xC6, 0x09, 0x10, 0x08,
+//ascii 0x002F
+ 0xDD, 0xAB, 0x15, 0xAE, 0xD6, 0x0B, 0x30, 0x82,
+ 0x7B, 0xD3, 0x0B, 0x70, 0x83, 0x8C, 0xD0, 0x8D,
+ 0x84, 0x70, 0x91, 0x59, 0xD0, 0xD0, 0x8C, 0x73,
+ 0x70, 0x92, 0x6A, 0xE0, 0xD0, 0x8A, 0x62, 0x70,
+ 0x83, 0x7B, 0xD0, 0x9D, 0x95, 0x10, 0x70, 0x04,
+ 0xD2, 0x8C, 0x84, 0x50, 0xD6, 0x8B, 0x72, 0x10,
+ 0xD9, 0x0E, 0x0A, 0xC0,
+//ascii 0x0030
+ 0xCB, 0x0E, 0x1D, 0x0E, 0xD3, 0x8A, 0x52, 0x50,
+ 0x83, 0x7C, 0xCD, 0x0A, 0x02, 0x70, 0x30, 0x03,
+ 0x0D, 0xCA, 0x07, 0x70, 0x70, 0x0B, 0xC8, 0x09,
+ 0x40, 0x02, 0x05, 0x27, 0x86, 0x41, 0x40, 0x0D,
+ 0xC7, 0x01, 0x20, 0x07, 0x0E, 0xC7, 0x0C, 0x04,
+ 0x20, 0x04, 0xC6, 0x0A, 0x20, 0x0B, 0xCB, 0x07,
+ 0x20, 0x0E, 0xC5, 0x07, 0x10, 0x05, 0xCD, 0x01,
+ 0x10, 0x0B, 0xC5, 0x06, 0x10, 0x09, 0xCD, 0x04,
+ 0x10, 0x0A, 0xC5, 0x06, 0x10, 0x07, 0xCD, 0x02,
+ 0x10, 0x0A, 0xC5, 0x09, 0x10, 0x01, 0x0E, 0xCB,
+ 0x0B, 0x20, 0x0D, 0xC5, 0x0E, 0x20, 0x02, 0x0C,
+ 0xC9, 0x09, 0x01, 0x10, 0x02, 0xC7, 0x06, 0x30,
+ 0x83, 0x7A, 0x2C, 0x9B, 0xA6, 0x20, 0x30, 0x0A,
+ 0xC8, 0x03, 0x70, 0x70, 0x06, 0xCA, 0x05, 0x70,
+ 0x50, 0x08, 0xCC, 0x8C, 0x51, 0x70, 0x81, 0x7E,
+ 0xD0, 0x8D, 0xA9, 0x18, 0x89, 0xBD,
+//ascii 0x0031
+ 0xC3, 0x7E, 0x7E, 0x3E, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0C, 0x20, 0x05, 0x76,
+ 0x76, 0xC3, 0x05, 0x10, 0x04, 0xD3, 0x0E, 0x01,
+ 0x10, 0x0A, 0xD3, 0x0A, 0x10, 0x01, 0xD4, 0x04,
+ 0x10, 0x06, 0xD3, 0x0E, 0x28,
+//ascii 0x0032
+ 0xC6, 0x9D, 0xA9, 0xB0, 0xC9, 0x24, 0xC4, 0x0E,
+ 0x04, 0x30, 0x01, 0x08, 0xC7, 0x20, 0xC3, 0x0E,
+ 0x02, 0x60, 0x03, 0x0E, 0xC5, 0x20, 0xC3, 0x05,
+ 0x70, 0x80, 0x2D, 0xC4, 0x20, 0xC2, 0x0E, 0x20,
+ 0xA4, 0xCE, 0xC5, 0x20, 0x01, 0x0D, 0xC3, 0x20,
+ 0xC2, 0x09, 0x10, 0x02, 0xC4, 0x0A, 0x20, 0x01,
+ 0x0D, 0xC2, 0x20, 0xC2, 0x07, 0x10, 0x09, 0xC5,
+ 0x0B, 0x01, 0x10, 0x01, 0x0D, 0xC1, 0x20, 0xC2,
+ 0x06, 0x10, 0x0A, 0xC6, 0x0C, 0x01, 0x10, 0x01,
+ 0x0D, 0xC0, 0x20, 0xC2, 0x07, 0x10, 0x08, 0xC7,
+ 0x0C, 0x20, 0x01, 0x0B, 0x20, 0xC2, 0x0A, 0x10,
+ 0x02, 0xC8, 0x0B, 0x60, 0xC3, 0x20, 0x82, 0xAD,
+ 0xC6, 0x0B, 0x50, 0xC3, 0x07, 0x30, 0x04, 0xC7,
+ 0x0B, 0x40, 0xC4, 0x04, 0x20, 0x04, 0xC8, 0x0A,
+ 0x30, 0xC5, 0x98, 0x10, 0x40, 0xC9, 0x0A, 0x20,
+ 0xC7, 0x1D, 0xCA, 0x0E, 0x1D,
+//ascii 0x0033
+ 0xCF, 0xAB, 0x76, 0x8D, 0xCC, 0xBC, 0x63, 0x26,
+ 0xD0, 0xC2, 0x04, 0x40, 0x07, 0xCA, 0x08, 0x40,
+ 0x01, 0x0C, 0xC0, 0x06, 0x60, 0x07, 0xC8, 0x09,
+ 0x60, 0x02, 0x0E, 0x70, 0x00, 0x0C, 0xC7, 0x01,
+ 0x20, 0x14, 0x01, 0x10, 0x05, 0x10, 0x95, 0xCD,
+ 0x80, 0x20, 0x05, 0xC6, 0x0B, 0x20, 0x0C, 0xC2,
+ 0x03, 0x20, 0x04, 0xC3, 0x08, 0x20, 0xC6, 0x07,
+ 0x10, 0x07, 0xC3, 0x0D, 0x20, 0x0C, 0xC4, 0x20,
+ 0x0D, 0xC5, 0x06, 0x10, 0x0A, 0xC4, 0x02, 0x10,
+ 0xC5, 0x03, 0x10, 0x0C, 0xC5, 0x06, 0x10, 0x0A,
+ 0xC4, 0x03, 0x10, 0xC5, 0x02, 0x10, 0x0C, 0xC5,
+ 0x08, 0x10, 0x05, 0xC4, 0x03, 0x10, 0xC5, 0x20,
+ 0x0E, 0xC5, 0x0C, 0x20, 0x0B, 0xCB, 0x06, 0x10,
+ 0x01, 0xC7, 0x02, 0x20, 0x04, 0xC8, 0x0C, 0x05,
+ 0x20, 0x06, 0xC7, 0x0C, 0x30, 0x0E, 0xC7, 0x07,
+ 0x30, 0x0E, 0xC8, 0x0A, 0x20, 0x0E, 0xC7, 0x07,
+ 0x20, 0x0A, 0xCA, 0x9D, 0x62, 0xE0, 0xC7, 0x97,
+ 0x02, 0xB0, 0xD7, 0x1D,
+//ascii 0x0034
+ 0xD0, 0x0C, 0x1B, 0xD4, 0x03, 0x10, 0x0C, 0xD3,
+ 0x03, 0x10, 0x0C, 0xC5, 0x0C, 0x75, 0x45, 0x01,
+ 0x10, 0x04, 0x25, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+ 0xC2, 0x09, 0x70, 0x70, 0x30, 0xC2, 0x09, 0x20,
+ 0x01, 0x73, 0x03, 0x01, 0x10, 0x32, 0xC2, 0x0A,
+ 0x30, 0x06, 0xC7, 0x03, 0x10, 0x0C, 0xC6, 0x08,
+ 0x01, 0x20, 0x01, 0x0B, 0xC5, 0x03, 0x10, 0x0C,
+ 0xC7, 0x0E, 0x04, 0x30, 0x05, 0x0E, 0xC3, 0x03,
+ 0x10, 0x0C, 0xC9, 0x0A, 0x01, 0x20, 0x01, 0x09,
+ 0xC2, 0x03, 0x10, 0x0C, 0xCB, 0x06, 0x30, 0x03,
+ 0x0D, 0xC0, 0x03, 0x10, 0x0C, 0xCC, 0x0C, 0x02,
+ 0x30, 0x07, 0x02, 0x10, 0x0C, 0xCE, 0x07, 0x60,
+ 0x0C, 0xCF, 0x0D, 0x03, 0x40, 0x0C, 0xD1, 0x09,
+ 0x01, 0x20, 0x0C, 0xD2, 0x0E, 0x27, 0x0E, 0xC0,
+//ascii 0x0035
+ 0xCF, 0x8E, 0xDE, 0xCC, 0x2E, 0xC5, 0x8D, 0x51,
+ 0x20, 0x02, 0x08, 0xC9, 0x0A, 0x10, 0x04, 0xC4,
+ 0x0A, 0x70, 0x03, 0x0E, 0xC7, 0x0A, 0x10, 0x04,
+ 0xC3, 0x0C, 0x70, 0x10, 0x03, 0xC7, 0x0A, 0x10,
+ 0x04, 0xC3, 0x02, 0x20, 0xA3, 0x8A, 0x82, 0x20,
+ 0x09, 0xC6, 0x0A, 0x10, 0x04, 0xC2, 0x0D, 0x20,
+ 0x07, 0xC4, 0x04, 0x10, 0x02, 0xC6, 0x0A, 0x10,
+ 0x04, 0xC2, 0x0A, 0x10, 0x03, 0xC5, 0x0E, 0x20,
+ 0x0E, 0xC5, 0x0A, 0x10, 0x04, 0xC2, 0x09, 0x10,
+ 0x08, 0xC6, 0x04, 0x10, 0x0C, 0xC5, 0x0A, 0x10,
+ 0x04, 0xC2, 0x0B, 0x10, 0x09, 0xC6, 0x04, 0x10,
+ 0x0C, 0xC5, 0x0A, 0x10, 0x04, 0xC3, 0x81, 0x06,
+ 0xC6, 0x01, 0x10, 0x0D, 0xC5, 0x0A, 0x10, 0x83,
+ 0xBD, 0xC1, 0x89, 0x01, 0xC5, 0x07, 0x10, 0x01,
+ 0xC6, 0x0A, 0x50, 0x01, 0x02, 0x10, 0x07, 0xC2,
+ 0x0C, 0x04, 0x20, 0x06, 0xC6, 0x0A, 0x70, 0x10,
+ 0x08, 0xC2, 0x07, 0x20, 0x01, 0x0E, 0xC6, 0x9C,
+ 0x42, 0x10, 0x60, 0x0A, 0xC2, 0x07, 0x10, 0x01,
+ 0x0C, 0xCC, 0xBD, 0xCA, 0x87, 0x50, 0x0E, 0xC2,
+ 0x97, 0x05, 0xE0,
+//ascii 0x0036
+ 0xC7, 0x0B, 0xC4, 0xBE, 0xA7, 0x68, 0xC0, 0xCD,
+ 0x98, 0x10, 0xE0, 0xC2, 0x07, 0x50, 0x02, 0x0C,
+ 0xCA, 0x05, 0x20, 0x0E, 0xC1, 0x04, 0x70, 0x00,
+ 0x0A, 0xC8, 0x08, 0x30, 0x0E, 0xC0, 0x08, 0x70,
+ 0x20, 0x0E, 0xC7, 0x01, 0x10, 0x01, 0x09, 0xC1,
+ 0x01, 0x10, 0x01, 0x0A, 0xC1, 0x0E, 0x07, 0x20,
+ 0x06, 0xC6, 0x0A, 0x20, 0x0D, 0xC1, 0x0C, 0x20,
+ 0x0D, 0xC4, 0x08, 0x10, 0x01, 0xC6, 0x07, 0x10,
+ 0x05, 0xC2, 0x0A, 0x10, 0x06, 0xC6, 0x01, 0x10,
+ 0x0D, 0xC5, 0x06, 0x10, 0x07, 0xC2, 0x0B, 0x10,
+ 0x09, 0xC6, 0x04, 0x10, 0x0C, 0xC5, 0x07, 0x10,
+ 0x05, 0xC2, 0x0E, 0x10, 0x07, 0xC6, 0x03, 0x10,
+ 0x0C, 0xC5, 0x0A, 0x10, 0x01, 0x0E, 0xC2, 0x85,
+ 0x02, 0xC5, 0x0D, 0x20, 0xC7, 0x01, 0x10, 0x02,
+ 0x0D, 0xC1, 0x9E, 0x10, 0x50, 0xC3, 0x0E, 0x03,
+ 0x10, 0x03, 0xC7, 0x08, 0x30, 0xB5, 0xAD, 0xC2,
+ 0x00, 0xA1, 0x78, 0x61, 0x20, 0x0B, 0xC8, 0x05,
+ 0x70, 0x70, 0x06, 0xCA, 0x08, 0x70, 0x50, 0x06,
+ 0xCC, 0x8E, 0x72, 0x70, 0x80, 0x5C, 0xD0, 0x8E,
+ 0xB9, 0x28, 0x0A, 0x0C,
+//ascii 0x0037
+ 0xDA, 0x0A, 0x20, 0x05, 0x0D, 0xD1, 0x0A, 0x40,
+ 0x05, 0x0D, 0xCF, 0x0A, 0x60, 0x05, 0x0D, 0xCD,
+ 0x0A, 0x10, 0x01, 0x50, 0x05, 0x0D, 0xCB, 0x0A,
+ 0x10, 0x84, 0xE6, 0x50, 0x05, 0x0D, 0xC9, 0x0A,
+ 0x10, 0x04, 0xC1, 0x0E, 0x06, 0x50, 0x05, 0x0D,
+ 0xC7, 0x0A, 0x10, 0x04, 0xC3, 0x0E, 0x06, 0x50,
+ 0x06, 0x0E, 0xC5, 0x0A, 0x10, 0x04, 0xC5, 0x0E,
+ 0x06, 0x50, 0x06, 0x0E, 0xC3, 0x0A, 0x10, 0x04,
+ 0xC7, 0x0E, 0x06, 0x50, 0x06, 0xC2, 0x0A, 0x10,
+ 0x04, 0xC9, 0x0D, 0x05, 0x40, 0xC2, 0x0A, 0x10,
+ 0x04, 0xCB, 0x0D, 0x05, 0x20, 0xC2, 0x0A, 0x10,
+ 0x04, 0xCD, 0x8D, 0x50, 0xC2, 0x0A, 0x10, 0x04,
+ 0xCF, 0x0D, 0xC2, 0x0B, 0x12, 0x06, 0xC0,
+//ascii 0x0038
+ 0xCF, 0xAD, 0x87, 0x8D, 0xCC, 0x0C, 0x05, 0x13,
+ 0x07, 0x0E, 0xC2, 0x07, 0x40, 0x06, 0xCA, 0x08,
+ 0x40, 0x01, 0x0D, 0xC0, 0x06, 0x60, 0x06, 0xC8,
+ 0x0A, 0x60, 0x02, 0x0D, 0x70, 0x00, 0x0C, 0xC7,
+ 0x01, 0x20, 0x83, 0x41, 0x10, 0x03, 0x10, 0xA4,
+ 0xBD, 0x91, 0x10, 0x05, 0xC6, 0x0B, 0x10, 0x01,
+ 0x0C, 0xC1, 0x0E, 0x03, 0x20, 0x04, 0xC3, 0x0C,
+ 0x20, 0xC6, 0x08, 0x10, 0x08, 0xC3, 0x0E, 0x20,
+ 0x0D, 0xC4, 0x04, 0x10, 0x0D, 0xC5, 0x06, 0x10,
+ 0x0C, 0xC4, 0x02, 0x10, 0xC5, 0x07, 0x10, 0x0C,
+ 0xC5, 0x06, 0x10, 0x0B, 0xC4, 0x02, 0x10, 0xC5,
+ 0x06, 0x10, 0x0C, 0xC5, 0x08, 0x10, 0x07, 0xC3,
+ 0x0D, 0x20, 0x0C, 0xC4, 0x03, 0x10, 0x0D, 0xC5,
+ 0x0B, 0x20, 0x0B, 0xC1, 0x0E, 0x03, 0x20, 0x04,
+ 0xC3, 0x0B, 0x10, 0x01, 0xC7, 0x02, 0x20, 0x01,
+ 0x02, 0x20, 0x04, 0x10, 0x93, 0xAB, 0x80, 0x20,
+ 0x05, 0xC7, 0x0B, 0x60, 0x03, 0x0D, 0x70, 0x00,
+ 0x0D, 0xC8, 0x09, 0x40, 0x02, 0x0D, 0xC0, 0x07,
+ 0x60, 0x07, 0xCA, 0xAD, 0x74, 0x59, 0xC3, 0x08,
+ 0x40, 0x08, 0xD5, 0xAE, 0x98, 0x9E, 0xC0,
+//ascii 0x0039
+ 0xC8, 0x8C, 0x97, 0x26, 0x87, 0xAD, 0xD0, 0x07,
+ 0x01, 0x70, 0x90, 0x17, 0xE0, 0xCB, 0x0C, 0x01,
+ 0x70, 0x40, 0x01, 0x0A, 0xC9, 0x0D, 0x01, 0x70,
+ 0x01, 0x60, 0x09, 0xC8, 0x04, 0x20, 0xB4, 0x9A,
+ 0x71, 0x00, 0x05, 0xC0, 0x8E, 0xB5, 0x30, 0x0C,
+ 0xC6, 0x0D, 0x20, 0x09, 0xC3, 0x9E, 0x20, 0x40,
+ 0xC2, 0x0C, 0x01, 0x10, 0x04, 0xC6, 0x09, 0x10,
+ 0x05, 0xC5, 0x0C, 0x10, 0x0A, 0xC2, 0x0A, 0x20,
+ 0xC6, 0x06, 0x10, 0x09, 0xC6, 0x81, 0x04, 0xC3,
+ 0x20, 0x0C, 0xC5, 0x06, 0x10, 0x0A, 0xC6, 0x82,
+ 0x01, 0xC3, 0x01, 0x10, 0x0C, 0xC5, 0x07, 0x10,
+ 0x06, 0xC5, 0x0E, 0x10, 0x01, 0xC2, 0x0E, 0x20,
+ 0x0D, 0xC5, 0x0B, 0x20, 0x0C, 0xC4, 0x05, 0x10,
+ 0x03, 0xC2, 0x06, 0x10, 0x01, 0xC7, 0x01, 0x10,
+ 0xB1, 0x8D, 0xEB, 0x40, 0x20, 0x08, 0xC0, 0x0C,
+ 0x04, 0x20, 0x06, 0xC7, 0x0A, 0x70, 0x10, 0x01,
+ 0xC1, 0x07, 0x20, 0x01, 0x0E, 0xC8, 0x07, 0x70,
+ 0x01, 0x0C, 0xC1, 0x07, 0x10, 0x01, 0x0C, 0xCA,
+ 0x0A, 0x02, 0x40, 0x04, 0x0D, 0xC2, 0x97, 0x05,
+ 0xE0, 0xCD, 0x0C, 0x19, 0x0A, 0x0E, 0xC4, 0x0E,
+ 0xC0,
+//ascii 0x003A
+ 0xC1, 0x0E, 0x0D, 0xC8, 0x1D, 0xC5, 0x09, 0x10,
+ 0x05, 0xC6, 0x08, 0x10, 0x06, 0xC4, 0x01, 0x20,
+ 0x0C, 0xC5, 0x30, 0x0E, 0xC3, 0x01, 0x20, 0x0C,
+ 0xC5, 0x30, 0x0E, 0xC3, 0x9A, 0x10, 0x60, 0xC6,
+ 0x09, 0x10, 0x08,
+//ascii 0x003B
+ 0xC1, 0x88, 0x7E, 0xD3, 0x04, 0x10, 0x01, 0xC7,
+ 0xA3, 0x14, 0x7C, 0xC6, 0x30, 0x0B, 0xC6, 0x03,
+ 0x30, 0x81, 0x6C, 0xC3, 0x03, 0x20, 0x0E, 0xC6,
+ 0x03, 0x60, 0xC3, 0x9E, 0x65, 0xC0, 0xC7, 0xBE,
+ 0xDC, 0x97, 0x30, 0x10, 0xD6, 0x0C, 0xC0,
+//ascii 0x003C
+ 0x0D, 0x1C, 0x0D, 0xC7, 0x0D, 0x1C, 0x0E, 0x08,
+ 0x10, 0x01, 0xC6, 0x0D, 0x20, 0x0B, 0xC0, 0x01,
+ 0x10, 0x08, 0xC5, 0x06, 0x10, 0x03, 0xC1, 0x07,
+ 0x10, 0x02, 0xC5, 0x20, 0x0A, 0xC1, 0x0E, 0x20,
+ 0x0B, 0xC3, 0x08, 0x10, 0x02, 0xC3, 0x06, 0x10,
+ 0x04, 0xC3, 0x02, 0x10, 0x09, 0xC3, 0x0D, 0x20,
+ 0x0D, 0xC1, 0x0A, 0x10, 0x01, 0xC5, 0x05, 0x10,
+ 0x06, 0xC1, 0x04, 0x10, 0x08, 0xC5, 0x0C, 0x10,
+ 0x01, 0xC0, 0x0D, 0x20, 0x0E, 0xC6, 0x04, 0x10,
+ 0x08, 0x06, 0x10, 0x06, 0xC7, 0x0B, 0x10, 0x01,
+ 0x20, 0x0E, 0xC8, 0x02, 0x30, 0x05, 0xC9, 0x0A,
+ 0x30, 0x0C, 0xCA, 0x02, 0x10, 0x04, 0xCB, 0x0C,
+ 0x1A, 0x0D,
+//ascii 0x003D
+ 0xD2, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x03, 0x10, 0x0B, 0xC1, 0x09, 0x10, 0x06,
+ 0xC5, 0x2D, 0xC3, 0x1D, 0x0E, 0xC0,
+//ascii 0x003E
+ 0xC5, 0x0E, 0x1C, 0xCC, 0x02, 0x10, 0x05, 0xCA,
+ 0x0B, 0x30, 0x0E, 0xC9, 0x04, 0x30, 0x06, 0xC8,
+ 0x0C, 0x50, 0xC8, 0x05, 0x10, 0x07, 0x05, 0x10,
+ 0x08, 0xC6, 0x0D, 0x20, 0x0E, 0x0C, 0x10, 0x01,
+ 0xC6, 0x06, 0x10, 0x05, 0xC1, 0x02, 0x10, 0x09,
+ 0xC4, 0x0E, 0x20, 0x0C, 0xC1, 0x09, 0x10, 0x02,
+ 0xC4, 0x07, 0x10, 0x03, 0xC3, 0x01, 0x10, 0x0A,
+ 0xC3, 0x01, 0x10, 0x0A, 0xC3, 0x07, 0x10, 0x03,
+ 0xC2, 0x08, 0x10, 0x01, 0xC4, 0x0E, 0x20, 0x0B,
+ 0xC1, 0x02, 0x10, 0x07, 0xC5, 0x05, 0x10, 0x04,
+ 0xC0, 0x0A, 0x20, 0x0E, 0xC5, 0x0C, 0x20, 0x1C,
+ 0x1A, 0x0B, 0xC7, 0x2A, 0x0D,
+//ascii 0x003F
+ 0xC5, 0x0A, 0x04, 0x12, 0x06, 0x0D, 0xD4, 0x04,
+ 0x50, 0x09, 0xD2, 0x06, 0x70, 0x0B, 0xD0, 0x0E,
+ 0x30, 0x03, 0x02, 0x20, 0x01, 0xD0, 0x09, 0x10,
+ 0x01, 0x0D, 0xC1, 0x0B, 0x01, 0x10, 0x03, 0x0E,
+ 0xC4, 0x1E, 0xC7, 0x07, 0x10, 0x08, 0xC3, 0x0B,
+ 0x30, 0x04, 0x06, 0xC1, 0x08, 0x10, 0x07, 0xC6,
+ 0x06, 0x10, 0x0B, 0xC4, 0x06, 0x40, 0xC1, 0x30,
+ 0x0E, 0xC5, 0x07, 0x10, 0x08, 0xC5, 0x05, 0x30,
+ 0xC1, 0x30, 0x0E, 0xC5, 0x0A, 0x10, 0x01, 0x0D,
+ 0xC5, 0x9C, 0x86, 0x50, 0xC1, 0x08, 0x10, 0x07,
+ 0xC6, 0x0E, 0x30, 0x05, 0xCC, 0x0E, 0xC8, 0x07,
+ 0x30, 0xD7, 0x05, 0x20, 0xD8, 0x8B, 0x52, 0xC0,
+//ascii 0x0040
+ 0xCA, 0x8E, 0x96, 0x24, 0x85, 0x7B, 0xD4, 0x0C,
+ 0x04, 0x70, 0x10, 0x07, 0xD1, 0x06, 0x70, 0x40,
+ 0x03, 0xCF, 0x04, 0x20, 0xA1, 0x7A, 0xCD, 0x1C,
+ 0x8A, 0x71, 0x10, 0x08, 0xCD, 0x06, 0x20, 0x08,
+ 0xC8, 0x9E, 0x10, 0x20, 0xCC, 0x0B, 0x20, 0x0C,
+ 0xCA, 0x04, 0x10, 0xCC, 0x02, 0x10, 0x0A, 0xC0,
+ 0x0D, 0x7C, 0x0C, 0x09, 0x20, 0xC1, 0x88, 0x25,
+ 0xC6, 0x0C, 0x10, 0x03, 0xC1, 0x03, 0x70, 0x30,
+ 0x03, 0xC1, 0x02, 0x10, 0xC6, 0x07, 0x10, 0x0A,
+ 0xC1, 0x03, 0x70, 0x30, 0x0B, 0xC1, 0x07, 0x10,
+ 0x0C, 0xC5, 0x03, 0x10, 0xC2, 0x09, 0x01, 0x10,
+ 0xA1, 0x46, 0x53, 0x20, 0x0B, 0xC2, 0x0A, 0x10,
+ 0x09, 0xC5, 0x81, 0x02, 0xC2, 0x08, 0x10, 0x06,
+ 0xC4, 0xAE, 0x30, 0x1E, 0xC1, 0x0D, 0x10, 0x06,
+ 0xC5, 0x10, 0x04, 0xC2, 0x01, 0x10, 0xC6, 0x0D,
+ 0x10, 0x06, 0xC1, 0x0E, 0x10, 0x05, 0xC5, 0x10,
+ 0x05, 0xC1, 0x0E, 0x10, 0x03, 0xC7, 0x81, 0x02,
+ 0xC1, 0x0E, 0x10, 0x05, 0xC5, 0x10, 0x04, 0xC1,
+ 0x0E, 0x10, 0x03, 0xC7, 0x81, 0x01, 0xC1, 0x0E,
+ 0x10, 0x05, 0xC5, 0x81, 0x02, 0xC2, 0x20, 0x0E,
+ 0xC5, 0x0D, 0x10, 0x02, 0xC1, 0x0C, 0x10, 0x07,
+ 0xC5, 0x03, 0x10, 0xC2, 0x05, 0x10, 0x04, 0xC4,
+ 0x0E, 0x02, 0x10, 0x06, 0xC1, 0x09, 0x10, 0x09,
+ 0xC5, 0x07, 0x10, 0x0A, 0xC1, 0x0D, 0x20, 0x01,
+ 0x06, 0x18, 0x05, 0x30, 0x0D, 0xC1, 0x04, 0x10,
+ 0x0C, 0xC5, 0x0C, 0x10, 0x03, 0xC2, 0x0A, 0x70,
+ 0x10, 0x0A, 0xC1, 0x0D, 0x10, 0x01, 0xC7, 0x02,
+ 0x10, 0x09, 0xC2, 0x0C, 0x03, 0x50, 0x03, 0x0C,
+ 0xC2, 0x05, 0x10, 0x06, 0xC7, 0x0A, 0x20, 0x0B,
+ 0xC3, 0x0D, 0x0A, 0x18, 0x0A, 0x0D, 0xC3, 0x08,
+ 0x20, 0x0D, 0xC8, 0x04, 0x20, 0x09, 0xCB, 0x07,
+ 0x20, 0x07, 0xC9, 0x0E, 0x02, 0x20, 0x82, 0x9E,
+ 0xC5, 0x8E, 0x82, 0x20, 0x04, 0xCB, 0x0E, 0x03,
+ 0x40, 0x02, 0x04, 0x15, 0x04, 0x02, 0x40, 0x04,
+ 0xCE, 0x07, 0x70, 0x40, 0x01, 0x08, 0xD0, 0x8E,
+ 0x83, 0x70, 0x03, 0x08, 0xD6, 0x8C, 0xA9, 0x1A,
+ 0x0C,
+//ascii 0x0041
+ 0xD6, 0x09, 0xD3, 0x0A, 0x05, 0x10, 0xD0, 0x8B,
+ 0x61, 0x30, 0xCD, 0x8C, 0x71, 0x60, 0xCA, 0x8D,
+ 0x72, 0x70, 0x02, 0x08, 0xC7, 0x8E, 0x83, 0x70,
+ 0x82, 0x8D, 0xC7, 0x09, 0x04, 0x70, 0x20, 0xC7,
+ 0x0D, 0x05, 0x70, 0x82, 0x7D, 0x20, 0xC7, 0x0A,
+ 0x50, 0x82, 0x7D, 0xC2, 0x20, 0xC7, 0x0A, 0x20,
+ 0x81, 0x7C, 0xC5, 0x20, 0xC7, 0x0A, 0x30, 0x83,
+ 0x8E, 0xC4, 0x20, 0xC7, 0x0A, 0x60, 0x83, 0x8E,
+ 0xC1, 0x20, 0xC8, 0x09, 0x03, 0x70, 0x03, 0x08,
+ 0x20, 0xCA, 0x8E, 0x82, 0x70, 0x10, 0x0E, 0xCC,
+ 0x8D, 0x72, 0x70, 0x83, 0x9E, 0xCC, 0x8C, 0x61,
+ 0x70, 0x03, 0xCE, 0x8B, 0x51, 0x50, 0xD1, 0x0A,
+ 0x04, 0x30, 0xD3, 0x9E, 0x93, 0x00, 0xD6, 0x0E,
+//ascii 0x0042
+ 0xD0, 0x8E, 0xDE, 0xCA, 0x0D, 0x1A, 0x0E, 0xC3,
+ 0x0A, 0x02, 0x20, 0x03, 0x0B, 0xC6, 0x0D, 0x03,
+ 0x30, 0x06, 0xC1, 0x09, 0x60, 0x0A, 0xC4, 0x0E,
+ 0x01, 0x50, 0x07, 0x0E, 0x70, 0x01, 0x0E, 0xC3,
+ 0x06, 0x70, 0x08, 0x10, 0x91, 0x67, 0x20, 0x20,
+ 0x08, 0xC3, 0x20, 0x91, 0x9B, 0x80, 0x10, 0x91,
+ 0x02, 0xE0, 0xC2, 0x03, 0x10, 0x03, 0xC2, 0x0C,
+ 0x20, 0x0D, 0xC2, 0x0B, 0x20, 0x0B, 0xC3, 0x0B,
+ 0x10, 0x01, 0xC2, 0x0B, 0x10, 0x03, 0xC4, 0x02,
+ 0x10, 0xC4, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x05,
+ 0xC4, 0x85, 0x01, 0xC5, 0x20, 0xC2, 0x0A, 0x10,
+ 0x05, 0xC4, 0x85, 0x01, 0xC5, 0x20, 0xC2, 0x0A,
+ 0x10, 0x05, 0xC4, 0x85, 0x01, 0xC5, 0x20, 0xC2,
+ 0x0A, 0x10, 0x05, 0xC4, 0x85, 0x01, 0xC5, 0x20,
+ 0xC2, 0x0A, 0x10, 0x02, 0x45, 0x01, 0x10, 0x45,
+ 0x04, 0x20, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30,
+//ascii 0x0043
+ 0xC8, 0x0C, 0x0D, 0xC5, 0x0C, 0x0E, 0xCF, 0x99,
+ 0x10, 0x80, 0xC5, 0x94, 0x04, 0xC0, 0xCC, 0x03,
+ 0x20, 0x08, 0xC5, 0x04, 0x20, 0x09, 0xCA, 0x03,
+ 0x30, 0x08, 0xC5, 0x04, 0x30, 0x0A, 0xC8, 0x08,
+ 0x30, 0x07, 0x0D, 0xC5, 0x0B, 0x05, 0x20, 0x01,
+ 0x0E, 0xC7, 0x01, 0x10, 0x01, 0x0D, 0xC9, 0x09,
+ 0x20, 0x07, 0xC6, 0x0B, 0x20, 0x0B, 0xCB, 0x05,
+ 0x10, 0x01, 0xC6, 0x08, 0x10, 0x02, 0xCC, 0x0C,
+ 0x20, 0x0E, 0xC5, 0x06, 0x10, 0x04, 0xCD, 0x20,
+ 0x0C, 0xC5, 0x06, 0x10, 0x05, 0xCD, 0x20, 0x0C,
+ 0xC5, 0x07, 0x10, 0x02, 0xCC, 0x0D, 0x20, 0x0D,
+ 0xC5, 0x0A, 0x20, 0x0D, 0xCB, 0x07, 0x20, 0xC7,
+ 0x20, 0x03, 0xCA, 0x0D, 0x20, 0x04, 0xC7, 0x06,
+ 0x20, 0x03, 0x0D, 0xC7, 0x0A, 0x01, 0x20, 0x0B,
+ 0xC7, 0x0E, 0x01, 0x30, 0xA5, 0x9B, 0xDC, 0x8B,
+ 0x83, 0x30, 0x05, 0xC9, 0x0C, 0x01, 0x70, 0x50,
+ 0x03, 0xCB, 0x0D, 0x02, 0x70, 0x30, 0x05, 0xCE,
+ 0x09, 0x02, 0x70, 0x05, 0x0C, 0xD1, 0x8E, 0xB9,
+ 0x18, 0x09, 0x0C, 0xC0,
+//ascii 0x0044
+ 0xC8, 0xBE, 0x96, 0x43, 0x40, 0x85, 0x7B, 0xCC,
+ 0x0E, 0x05, 0x70, 0x80, 0x18, 0xC9, 0x0B, 0x01,
+ 0x70, 0x30, 0x03, 0x0E, 0xC6, 0x0B, 0x50, 0x01,
+ 0x12, 0x50, 0x02, 0xC6, 0x01, 0x20, 0x03, 0x0A,
+ 0xC4, 0x8D, 0x81, 0x20, 0x06, 0xC4, 0x08, 0x20,
+ 0x07, 0xC8, 0x0E, 0x03, 0x20, 0x0E, 0xC3, 0x02,
+ 0x10, 0x04, 0xCA, 0x0E, 0x20, 0x08, 0xC2, 0x0E,
+ 0x20, 0x0C, 0xCB, 0x06, 0x10, 0x04, 0xC2, 0x0C,
+ 0x20, 0xCC, 0x0A, 0x10, 0x01, 0xC2, 0x0A, 0x10,
+ 0x02, 0xCC, 0x0C, 0x20, 0xC2, 0x0A, 0x10, 0x03,
+ 0xCC, 0x0D, 0x20, 0xC2, 0x0A, 0x10, 0x03, 0xCC,
+ 0x0D, 0x20, 0xC2, 0x0A, 0x10, 0x03, 0xCC, 0x0D,
+ 0x20, 0xC2, 0x0A, 0x10, 0x01, 0x75, 0x45, 0x04,
+ 0x20, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x0045
+ 0xC3, 0x1C, 0x0D, 0xCD, 0x2B, 0xC2, 0x0A, 0x10,
+ 0x04, 0xC4, 0x09, 0x17, 0x0D, 0xC3, 0x0E, 0x20,
+ 0xC2, 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A,
+ 0xC3, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04, 0xC4,
+ 0x04, 0x10, 0x0A, 0xC3, 0x0E, 0x20, 0xC2, 0x0A,
+ 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xC3, 0x0E,
+ 0x20, 0xC2, 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10,
+ 0x0A, 0xC3, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04,
+ 0xC4, 0x04, 0x10, 0x0A, 0xC3, 0x0E, 0x20, 0xC2,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xC3,
+ 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04, 0xC4, 0x04,
+ 0x10, 0x0A, 0xC3, 0x0E, 0x20, 0xC2, 0x0A, 0x10,
+ 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xC3, 0x0E, 0x20,
+ 0xC2, 0x0A, 0x10, 0x01, 0x45, 0x01, 0x10, 0x03,
+ 0x35, 0x04, 0x20, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30,
+//ascii 0x0046
+ 0xDA, 0x0A, 0x10, 0x04, 0xC4, 0x0E, 0x1D, 0xCB,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x04, 0xC4, 0x04, 0x10, 0x0A, 0xCA,
+ 0x0A, 0x10, 0x01, 0x45, 0x01, 0x10, 0x03, 0x75,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x0047
+ 0xC8, 0x0B, 0xC2, 0x0A, 0x27, 0x09, 0x0C, 0xCF,
+ 0x98, 0x10, 0xE0, 0xC1, 0x05, 0x40, 0x02, 0x0B,
+ 0xCC, 0x03, 0x20, 0x0E, 0xC1, 0x05, 0x60, 0x07,
+ 0xCA, 0x04, 0x30, 0x0E, 0xC1, 0x05, 0x70, 0x08,
+ 0xC8, 0x09, 0x30, 0x06, 0xC2, 0x05, 0x10, 0x8C,
+ 0xD8, 0x30, 0x0D, 0xC7, 0x01, 0x10, 0x01, 0x0D,
+ 0xC3, 0x05, 0x10, 0x0C, 0xC1, 0x0C, 0x20, 0x06,
+ 0xC6, 0x0B, 0x20, 0x0B, 0xC4, 0x05, 0x10, 0x0C,
+ 0xC2, 0x07, 0x10, 0x01, 0xC6, 0x08, 0x10, 0x01,
+ 0xC5, 0x05, 0x10, 0x0C, 0xC2, 0x0D, 0x20, 0x0D,
+ 0xC5, 0x06, 0x10, 0x04, 0xC5, 0x09, 0x15, 0x0E,
+ 0xC3, 0x20, 0x0C, 0xC5, 0x06, 0x10, 0x05, 0xCD,
+ 0x20, 0x0C, 0xC5, 0x07, 0x10, 0x02, 0xCC, 0x0D,
+ 0x20, 0x0D, 0xC5, 0x0A, 0x20, 0x0D, 0xCB, 0x07,
+ 0x20, 0xC7, 0x20, 0x03, 0xCA, 0x0C, 0x20, 0x05,
+ 0xC7, 0x06, 0x20, 0x03, 0x0D, 0xC7, 0x0A, 0x01,
+ 0x20, 0x0B, 0xC7, 0x0E, 0x01, 0x30, 0xA5, 0x9B,
+ 0xDC, 0x8B, 0x82, 0x30, 0x05, 0xC9, 0x0C, 0x01,
+ 0x70, 0x50, 0x03, 0xCB, 0x0D, 0x02, 0x70, 0x30,
+ 0x05, 0xCE, 0x09, 0x03, 0x70, 0x05, 0x0C, 0xD1,
+ 0x8E, 0xB9, 0x18, 0x09, 0x0C, 0xC0,
+//ascii 0x0048
+ 0xC2, 0x0B, 0x73, 0x73, 0x33, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0B, 0x72, 0x01, 0x10, 0x01, 0x72, 0xCB, 0x04,
+ 0x10, 0x0A, 0xD3, 0x04, 0x10, 0x0A, 0xD3, 0x04,
+ 0x10, 0x0A, 0xD3, 0x04, 0x10, 0x0A, 0xD3, 0x04,
+ 0x10, 0x0A, 0xD3, 0x04, 0x10, 0x0A, 0xD3, 0x04,
+ 0x10, 0x0A, 0xD3, 0x04, 0x10, 0x0A, 0xD3, 0x04,
+ 0x10, 0x0A, 0xCA, 0x0C, 0x75, 0x01, 0x10, 0x03,
+ 0x75, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x0049
+ 0xC2, 0x0C, 0x75, 0x75, 0x35, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x004A
+ 0xC2, 0x0C, 0x75, 0x65, 0x07, 0x0C, 0xC9, 0x0A,
+ 0x70, 0x70, 0x80, 0x4E, 0xC7, 0x0A, 0x70, 0x70,
+ 0x10, 0x02, 0xC7, 0x0A, 0x71, 0x51, 0x40, 0x08,
+ 0xD6, 0x0D, 0x04, 0x10, 0x01, 0xD8, 0x01, 0x10,
+ 0x0D, 0xD7, 0x04, 0x10, 0x0C, 0xD7, 0x02, 0x10,
+ 0x0C, 0xD6, 0x0B, 0x20, 0x0E, 0xD4, 0x0D, 0x06,
+ 0x20, 0x02, 0xD5, 0x09, 0x30, 0x09, 0xD5, 0x09,
+ 0x20, 0x05, 0xD6, 0x99, 0x02, 0x80, 0xD8, 0x0E,
+//ascii 0x004B
+ 0xD6, 0x0E, 0xC2, 0x0A, 0x06, 0xD0, 0x0A, 0x01,
+ 0xC2, 0x8A, 0x04, 0xCE, 0x05, 0x10, 0xC2, 0x0A,
+ 0x10, 0x02, 0x0E, 0xCA, 0x0B, 0x01, 0x20, 0xC2,
+ 0x0A, 0x20, 0x01, 0x0C, 0xC8, 0x07, 0x40, 0xC2,
+ 0x0E, 0x03, 0x30, 0x0A, 0xC5, 0x0D, 0x03, 0x30,
+ 0x01, 0x0B, 0xC4, 0x05, 0x30, 0x08, 0xC3, 0x09,
+ 0x40, 0x05, 0xC7, 0x07, 0x30, 0x06, 0xC0, 0x0E,
+ 0x04, 0x30, 0x01, 0x0A, 0xC9, 0x0A, 0x30, 0x04,
+ 0x01, 0x30, 0x03, 0x0E, 0xCB, 0x0C, 0x01, 0x60,
+ 0x08, 0xCE, 0x0E, 0x02, 0x30, 0x02, 0x0D, 0xD1,
+ 0x04, 0x20, 0x04, 0xD3, 0x06, 0x20, 0x02, 0x0E,
+ 0xC8, 0x0C, 0x75, 0x05, 0x30, 0x01, 0x55, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x004C
+ 0xD4, 0x25, 0xD3, 0x0E, 0x20, 0xD3, 0x0E, 0x20,
+ 0xD3, 0x0E, 0x20, 0xD3, 0x0E, 0x20, 0xD3, 0x0E,
+ 0x20, 0xD3, 0x0E, 0x20, 0xD3, 0x0E, 0x20, 0xD3,
+ 0x0E, 0x20, 0xC2, 0x0C, 0x75, 0x75, 0x04, 0x20,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x004D
+ 0xC2, 0x0E, 0x7A, 0x7A, 0x3A, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x50, 0x06,
+ 0x0C, 0x7D, 0x3D, 0xC3, 0x08, 0x02, 0x50, 0x06,
+ 0x0C, 0xCF, 0x0B, 0x04, 0x50, 0x03, 0x09, 0xCF,
+ 0x8E, 0x71, 0x40, 0x81, 0x6D, 0xCF, 0x0A, 0x04,
+ 0x50, 0x03, 0x09, 0xCF, 0x8D, 0x61, 0x40, 0x81,
+ 0x6D, 0xCF, 0x09, 0x03, 0x40, 0x01, 0xD0, 0x0D,
+ 0x03, 0x30, 0x01, 0xCE, 0x0A, 0x03, 0x50, 0x03,
+ 0xCB, 0x8E, 0x71, 0x40, 0x81, 0x6C, 0xCA, 0x0B,
+ 0x04, 0x50, 0x03, 0x09, 0xCA, 0x8E, 0x82, 0x50,
+ 0x06, 0x0C, 0xCA, 0x0C, 0x05, 0x50, 0x02, 0x09,
+ 0xCB, 0x0D, 0x02, 0x50, 0x05, 0x0C, 0xCD, 0x0A,
+ 0x50, 0x06, 0x77, 0x47, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30,
+//ascii 0x004E
+ 0xC2, 0x0C, 0x74, 0x74, 0x34, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0B, 0x71, 0x51, 0x40, 0x02, 0xCF, 0x0D, 0x02,
+ 0x30, 0x07, 0xCF, 0x08, 0x30, 0x02, 0x0C, 0xCE,
+ 0x0D, 0x03, 0x30, 0x06, 0xCF, 0x09, 0x01, 0x20,
+ 0x01, 0x0B, 0xCE, 0x0E, 0x04, 0x30, 0x04, 0x0E,
+ 0xCE, 0x0A, 0x01, 0x20, 0x01, 0x09, 0xCF, 0x05,
+ 0x30, 0x03, 0x0E, 0xCE, 0x0B, 0x02, 0x30, 0x08,
+ 0xCF, 0x06, 0x30, 0x02, 0x0D, 0xCE, 0x0D, 0x02,
+ 0x40, 0x04, 0x75, 0x45, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30,
+//ascii 0x004F
+ 0xCB, 0x0E, 0x1D, 0x0E, 0xD3, 0x8E, 0x73, 0x40,
+ 0x81, 0x4A, 0xCF, 0x07, 0x70, 0x20, 0x02, 0x0B,
+ 0xCC, 0x03, 0x70, 0x50, 0x07, 0xCA, 0x03, 0x30,
+ 0xB1, 0x47, 0x87, 0x60, 0x03, 0x40, 0x09, 0xC8,
+ 0x08, 0x20, 0x01, 0x09, 0xC6, 0x0E, 0x05, 0x30,
+ 0x0E, 0xC7, 0x01, 0x10, 0x01, 0x0D, 0xC9, 0x09,
+ 0x20, 0x07, 0xC6, 0x0B, 0x20, 0x0A, 0xCB, 0x05,
+ 0x10, 0x01, 0xC6, 0x08, 0x10, 0x01, 0xCC, 0x0B,
+ 0x20, 0x0E, 0xC5, 0x06, 0x10, 0x04, 0xCD, 0x20,
+ 0x0C, 0xC5, 0x06, 0x10, 0x05, 0xCD, 0x20, 0x0C,
+ 0xC5, 0x07, 0x10, 0x02, 0xCC, 0x0D, 0x20, 0x0D,
+ 0xC5, 0x0A, 0x20, 0x0D, 0xCB, 0x07, 0x20, 0xC7,
+ 0x20, 0x03, 0xCA, 0x0D, 0x20, 0x05, 0xC7, 0x06,
+ 0x20, 0x04, 0x0E, 0xC7, 0x0A, 0x01, 0x20, 0x0C,
+ 0xC7, 0x0E, 0x01, 0x30, 0xA5, 0x9B, 0xDC, 0x8B,
+ 0x83, 0x30, 0x05, 0xC9, 0x0C, 0x01, 0x70, 0x50,
+ 0x03, 0xCB, 0x0D, 0x02, 0x70, 0x30, 0x06, 0xCE,
+ 0x09, 0x03, 0x70, 0x05, 0x0C, 0xD1, 0x8E, 0xB9,
+ 0x18, 0x09, 0x0C, 0xC0,
+//ascii 0x0050
+ 0xC6, 0xBC, 0x64, 0x34, 0x70, 0x0D, 0xCF, 0x04,
+ 0x60, 0x07, 0xCD, 0x03, 0x70, 0x00, 0x06, 0xCB,
+ 0x08, 0x40, 0x01, 0x40, 0x0C, 0xCA, 0x01, 0x10,
+ 0x01, 0x0A, 0xC2, 0x08, 0x20, 0x05, 0xC9, 0x0D,
+ 0x20, 0x0B, 0xC4, 0x08, 0x10, 0x01, 0xC9, 0x0B,
+ 0x10, 0x02, 0xC6, 0x20, 0xC9, 0x0A, 0x10, 0x04,
+ 0xC6, 0x01, 0x10, 0x0E, 0xC8, 0x0A, 0x10, 0x04,
+ 0xC6, 0x01, 0x10, 0x0E, 0xC8, 0x0A, 0x10, 0x04,
+ 0xC6, 0x01, 0x10, 0x0E, 0xC8, 0x0A, 0x10, 0x04,
+ 0xC6, 0x01, 0x10, 0x0E, 0xC8, 0x0A, 0x10, 0x01,
+ 0x65, 0x20, 0x04, 0x55, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30,
+//ascii 0x0051
+ 0xCB, 0x0E, 0x1D, 0x0E, 0xD3, 0x8E, 0x73, 0x40,
+ 0x81, 0x4A, 0xC5, 0x0B, 0xC8, 0x07, 0x70, 0x20,
+ 0x02, 0x0B, 0xC2, 0x14, 0xC7, 0x03, 0x70, 0x50,
+ 0xA7, 0xD2, 0x04, 0xC6, 0x03, 0x30, 0xB1, 0x47,
+ 0x87, 0x60, 0x03, 0x70, 0x04, 0xC5, 0x08, 0x20,
+ 0x01, 0x09, 0xC6, 0x0E, 0x05, 0x40, 0x03, 0x0E,
+ 0xC5, 0x01, 0x10, 0x01, 0x0D, 0xC9, 0x02, 0x20,
+ 0x03, 0xC6, 0x0B, 0x20, 0x0A, 0xC8, 0x0C, 0x02,
+ 0x30, 0x01, 0xC6, 0x08, 0x10, 0x01, 0xC9, 0x03,
+ 0x10, 0x01, 0x20, 0x0E, 0xC5, 0x06, 0x10, 0x04,
+ 0xC9, 0x92, 0x06, 0xE0, 0x20, 0x0C, 0xC5, 0x06,
+ 0x10, 0x05, 0xC9, 0x03, 0x0A, 0xC1, 0x20, 0x0C,
+ 0xC5, 0x07, 0x10, 0x02, 0xC9, 0x0E, 0xC1, 0x0D,
+ 0x20, 0x0D, 0xC5, 0x0A, 0x20, 0x0D, 0xCB, 0x07,
+ 0x20, 0xC7, 0x20, 0x03, 0xCA, 0x0D, 0x20, 0x05,
+ 0xC7, 0x06, 0x20, 0x04, 0x0E, 0xC7, 0x0A, 0x01,
+ 0x20, 0x0C, 0xC7, 0x0E, 0x01, 0x30, 0xA5, 0x9B,
+ 0xDC, 0x8B, 0x83, 0x30, 0x05, 0xC9, 0x0C, 0x01,
+ 0x70, 0x50, 0x03, 0xCB, 0x0D, 0x02, 0x70, 0x30,
+ 0x06, 0xCE, 0x09, 0x03, 0x70, 0x05, 0x0C, 0xD1,
+ 0x8E, 0xB9, 0x18, 0x09, 0x0C, 0xC0,
+//ascii 0x0052
+ 0xD6, 0x0B, 0xC6, 0x0A, 0x06, 0x13, 0x05, 0x09,
+ 0xC7, 0x8D, 0x40, 0xC4, 0x0E, 0x03, 0x50, 0x01,
+ 0x0B, 0xC3, 0x0E, 0x05, 0x20, 0xC4, 0x02, 0x70,
+ 0x00, 0x0D, 0xC1, 0x07, 0x40, 0xC3, 0x07, 0x40,
+ 0x01, 0x30, 0x83, 0x81, 0x40, 0x03, 0xC3, 0x01,
+ 0x10, 0x02, 0x0B, 0xC1, 0x0D, 0x04, 0x70, 0x02,
+ 0x0A, 0xC3, 0x0D, 0x20, 0x0C, 0xC4, 0x01, 0x40,
+ 0x01, 0x09, 0xC5, 0x0B, 0x10, 0x02, 0xC5, 0x06,
+ 0x20, 0x01, 0x08, 0xC7, 0x0A, 0x10, 0x04, 0xC5,
+ 0x07, 0x10, 0x04, 0xC9, 0x0A, 0x10, 0x04, 0xC5,
+ 0x08, 0x10, 0x07, 0xC9, 0x0A, 0x10, 0x04, 0xC5,
+ 0x08, 0x10, 0x07, 0xC9, 0x0A, 0x10, 0x04, 0xC5,
+ 0x08, 0x10, 0x07, 0xC9, 0x0A, 0x10, 0x01, 0x55,
+ 0x02, 0x10, 0x02, 0x65, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30,
+//ascii 0x0053
+ 0xC6, 0x8B, 0x7E, 0xC4, 0x0E, 0x06, 0x12, 0x04,
+ 0x08, 0xCB, 0x0E, 0x03, 0x10, 0x0C, 0xC3, 0x0B,
+ 0x01, 0x40, 0x02, 0x0E, 0xC8, 0x0E, 0x02, 0x20,
+ 0x0C, 0xC2, 0x0E, 0x01, 0x60, 0x02, 0xC8, 0x05,
+ 0x30, 0x0C, 0xC2, 0x05, 0x20, 0x01, 0x03, 0x30,
+ 0x09, 0xC6, 0x0E, 0x20, 0x04, 0x0E, 0xC2, 0x0E,
+ 0x20, 0x05, 0xC1, 0x0D, 0x02, 0x10, 0x02, 0xC6,
+ 0x0A, 0x10, 0x01, 0xC4, 0x09, 0x20, 0x0E, 0xC2,
+ 0x0B, 0x20, 0x0E, 0xC5, 0x07, 0x10, 0x06, 0xC4,
+ 0x05, 0x10, 0x05, 0xC4, 0x20, 0x0C, 0xC5, 0x06,
+ 0x10, 0x08, 0xC4, 0x01, 0x10, 0x09, 0xC4, 0x02,
+ 0x10, 0x0B, 0xC5, 0x06, 0x10, 0x07, 0xC3, 0x0D,
+ 0x20, 0x0E, 0xC4, 0x02, 0x10, 0x0B, 0xC5, 0x08,
+ 0x10, 0x04, 0xC3, 0x07, 0x10, 0x02, 0xC5, 0x20,
+ 0x0D, 0xC5, 0x0C, 0x20, 0x0B, 0xC1, 0x0D, 0x01,
+ 0x10, 0x06, 0xC4, 0x08, 0x20, 0xC7, 0x02, 0x20,
+ 0x85, 0x61, 0x20, 0x0C, 0xC3, 0x09, 0x20, 0x04,
+ 0xC7, 0x0A, 0x70, 0x04, 0xC3, 0x40, 0x0B, 0xC8,
+ 0x07, 0x50, 0x01, 0x0E, 0xC3, 0x30, 0x06, 0xCA,
+ 0x0A, 0x02, 0x20, 0x04, 0x0E, 0xC4, 0x20, 0x07,
+ 0xCD, 0x0E, 0x0D, 0xC7, 0x85, 0x8D, 0xC0,
+//ascii 0x0054
+ 0xC2, 0x0E, 0x1A, 0x0C, 0xD3, 0x0A, 0x10, 0x04,
+ 0xD3, 0x0A, 0x10, 0x04, 0xD3, 0x0A, 0x10, 0x04,
+ 0xD3, 0x0A, 0x10, 0x04, 0xD3, 0x0A, 0x10, 0x04,
+ 0xD3, 0x0A, 0x10, 0x04, 0xD3, 0x0A, 0x70, 0x70,
+ 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A,
+ 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x10, 0x02, 0x76,
+ 0x76, 0x06, 0xC2, 0x0A, 0x10, 0x04, 0xD3, 0x0A,
+ 0x10, 0x04, 0xD3, 0x0A, 0x10, 0x04, 0xD3, 0x0A,
+ 0x10, 0x04, 0xD3, 0x0A, 0x10, 0x04, 0xD3, 0x0B,
+ 0x12, 0x06, 0xC0,
+//ascii 0x0055
+ 0xC2, 0x0D, 0x77, 0x47, 0x88, 0xAE, 0xCA, 0x0A,
+ 0x70, 0x70, 0x05, 0xC9, 0x0A, 0x70, 0x70, 0x80,
+ 0x2E, 0xC7, 0x0A, 0x70, 0x70, 0x10, 0x03, 0xC8,
+ 0x7D, 0x4D, 0x8C, 0x71, 0x20, 0x09, 0xD6, 0x0D,
+ 0x01, 0x10, 0x03, 0xD7, 0x09, 0x20, 0xD7, 0x0E,
+ 0x20, 0x0C, 0xD7, 0x20, 0x0B, 0xD7, 0x20, 0x0C,
+ 0xD6, 0x0C, 0x20, 0x0D, 0xD6, 0x04, 0x10, 0x01,
+ 0xD5, 0x0E, 0x05, 0x20, 0x06, 0xC6, 0x0C, 0x75,
+ 0x45, 0x03, 0x40, 0x0D, 0xC6, 0x0A, 0x70, 0x70,
+ 0x10, 0x09, 0xC7, 0x0A, 0x70, 0x70, 0x00, 0x09,
+ 0xC8, 0x0A, 0x70, 0x40, 0x91, 0x37, 0xE0, 0xC0,
+//ascii 0x0056
+ 0xC2, 0x0D, 0x0B, 0xD5, 0xAA, 0x01, 0x7C, 0xD2,
+ 0x0A, 0x30, 0x82, 0x8D, 0xCF, 0x0A, 0x60, 0x83,
+ 0x9E, 0xCC, 0x0D, 0x04, 0x70, 0x80, 0x49, 0xCC,
+ 0x8E, 0x94, 0x70, 0x80, 0x5A, 0xCD, 0x09, 0x04,
+ 0x70, 0x81, 0x6B, 0xCD, 0x0A, 0x04, 0x70, 0x01,
+ 0x07, 0xCE, 0x0A, 0x04, 0x60, 0xD1, 0x0A, 0x04,
+ 0x30, 0xD0, 0x8B, 0x61, 0x30, 0xCD, 0x8B, 0x61,
+ 0x60, 0xCA, 0x8B, 0x51, 0x60, 0x81, 0x5B, 0xC7,
+ 0x8B, 0x51, 0x70, 0x04, 0x0A, 0xC7, 0x8A, 0x51,
+ 0x70, 0x03, 0x09, 0xC8, 0x0B, 0x01, 0x70, 0x83,
+ 0x8E, 0xCA, 0x0A, 0x50, 0x82, 0x7D, 0xCD, 0x0A,
+ 0x20, 0x81, 0x6C, 0xD0, 0x9A, 0x15, 0xB0, 0xC0,
+//ascii 0x0057
+ 0xC2, 0x8D, 0xAE, 0xD4, 0x0A, 0x10, 0x83, 0x7C,
+ 0xD1, 0x0A, 0x40, 0x91, 0x59, 0xE0, 0xCD, 0x0A,
+ 0x70, 0x90, 0x27, 0xB0, 0xCA, 0x8E, 0x73, 0x70,
+ 0x20, 0x84, 0x9D, 0xCA, 0x8C, 0x84, 0x70, 0x10,
+ 0x82, 0x6B, 0xCB, 0x8C, 0x84, 0x70, 0x10, 0xCE,
+ 0x9C, 0x84, 0x10, 0x40, 0xCF, 0x8C, 0x72, 0x40,
+ 0xCB, 0x8C, 0x84, 0x70, 0x02, 0xC7, 0x9D, 0x95,
+ 0x10, 0x70, 0x84, 0x9D, 0xC4, 0x9E, 0xA5, 0x10,
+ 0x70, 0x82, 0x6B, 0xC7, 0x0A, 0x70, 0x90, 0x49,
+ 0xD0, 0xCA, 0x0A, 0x40, 0x81, 0x6B, 0xCE, 0x0A,
+ 0x50, 0x83, 0x8C, 0xCD, 0x0C, 0x01, 0x70, 0x81,
+ 0x6A, 0xCC, 0x9D, 0x95, 0x10, 0x70, 0x83, 0x8C,
+ 0xCC, 0x8C, 0x84, 0x70, 0x81, 0x6A, 0xCD, 0x8B,
+ 0x73, 0x70, 0xD0, 0x0A, 0x03, 0x40, 0xCD, 0x9D,
+ 0x95, 0x10, 0x50, 0xC9, 0x9D, 0x95, 0x10, 0x70,
+ 0x00, 0x02, 0xC5, 0x9D, 0x95, 0x10, 0x70, 0xA0,
+ 0x15, 0x9E, 0xC3, 0x8D, 0x41, 0x70, 0x10, 0x83,
+ 0x7C, 0xC7, 0x0A, 0x70, 0x91, 0x5A, 0xE0, 0xCA,
+ 0x0A, 0x40, 0x83, 0x8C, 0xCE, 0xAA, 0x01, 0x6A,
+ 0xD2, 0x0E, 0x0D, 0xC0,
+//ascii 0x0058
+ 0xC2, 0x0E, 0xD2, 0x0C, 0xC2, 0x8A, 0x2B, 0xCF,
+ 0x06, 0x00, 0xC2, 0x0A, 0x10, 0x05, 0x0E, 0xCB,
+ 0x0A, 0x01, 0x10, 0xC2, 0x0A, 0x20, 0x01, 0x09,
+ 0xC8, 0x0E, 0x04, 0x30, 0xC2, 0x0B, 0x40, 0x03,
+ 0x0C, 0xC5, 0x08, 0x01, 0x30, 0x01, 0xC3, 0x0B,
+ 0x02, 0x40, 0x06, 0xC2, 0x0C, 0x03, 0x40, 0x06,
+ 0x0E, 0xC5, 0x08, 0x01, 0x30, 0x81, 0xA6, 0x40,
+ 0x02, 0x0C, 0xC8, 0x0E, 0x05, 0x70, 0x80, 0x18,
+ 0xCC, 0x0B, 0x02, 0x50, 0x05, 0x0E, 0xCE, 0x0C,
+ 0x40, 0x03, 0xCF, 0x06, 0x60, 0x01, 0x09, 0xCB,
+ 0x09, 0x01, 0x30, 0x01, 0x40, 0x03, 0x0D, 0xC7,
+ 0x0C, 0x03, 0x40, 0x06, 0xC0, 0x0C, 0x03, 0x40,
+ 0x07, 0xC5, 0x06, 0x40, 0x03, 0x0C, 0xC3, 0x08,
+ 0x40, 0x01, 0x0A, 0xC2, 0x0A, 0x30, 0x01, 0x08,
+ 0xC6, 0x0E, 0x04, 0x40, 0xC2, 0x0A, 0x20, 0x04,
+ 0x0E, 0xC9, 0x0A, 0x01, 0x20, 0xC2, 0x9A, 0x01,
+ 0xA0, 0xCD, 0x06, 0x10, 0xC2, 0x0A, 0x06, 0xD0,
+ 0x0C, 0x02,
+//ascii 0x0059
+ 0xDA, 0x0A, 0x06, 0xD5, 0x9A, 0x01, 0x90, 0xD3,
+ 0x0A, 0x20, 0x02, 0x0B, 0xD1, 0x0A, 0x40, 0x05,
+ 0x0E, 0xD0, 0x07, 0x01, 0x40, 0x07, 0xD0, 0x0E,
+ 0x06, 0x40, 0x01, 0x0A, 0xD0, 0x0D, 0x04, 0x40,
+ 0x03, 0x0C, 0xD0, 0x0B, 0x03, 0x40, 0x04, 0x65,
+ 0xCA, 0x0A, 0x01, 0x70, 0x20, 0xCA, 0x0E, 0x04,
+ 0x70, 0x20, 0xC9, 0x07, 0x70, 0x40, 0xC7, 0x08,
+ 0x01, 0x30, 0x01, 0x08, 0xCD, 0x0A, 0x02, 0x40,
+ 0x05, 0x0E, 0xCC, 0x0C, 0x03, 0x40, 0x03, 0x0C,
+ 0xCD, 0x0B, 0x40, 0x01, 0x09, 0xCF, 0x0A, 0x30,
+ 0x07, 0xD1, 0x0A, 0x10, 0x04, 0x0D, 0xD2, 0x8A,
+ 0x2B, 0xD4, 0x0E,
+//ascii 0x005A
+ 0xC2, 0x0C, 0x16, 0x0C, 0xCD, 0x25, 0xC2, 0x0A,
+ 0x20, 0x07, 0xCB, 0x0E, 0x20, 0xC2, 0x0A, 0x30,
+ 0x03, 0x0D, 0xC9, 0x0E, 0x20, 0xC2, 0x0A, 0x50,
+ 0x08, 0xC8, 0x0E, 0x20, 0xC2, 0x0A, 0x60, 0x04,
+ 0x0E, 0xC6, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04,
+ 0x09, 0x30, 0x01, 0x0A, 0xC5, 0x0E, 0x20, 0xC2,
+ 0x0A, 0x10, 0x04, 0xC0, 0x0D, 0x03, 0x30, 0x05,
+ 0xC4, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04, 0xC2,
+ 0x07, 0x30, 0x01, 0x0B, 0xC2, 0x0E, 0x20, 0xC2,
+ 0x0A, 0x10, 0x04, 0xC3, 0x0C, 0x02, 0x30, 0x07,
+ 0xC1, 0x0E, 0x20, 0xC2, 0x0A, 0x10, 0x04, 0xC5,
+ 0x06, 0x30, 0x82, 0xDE, 0x20, 0xC2, 0x0A, 0x10,
+ 0x04, 0xC6, 0x0A, 0x01, 0x30, 0x07, 0x20, 0xC2,
+ 0x0A, 0x10, 0x04, 0xC7, 0x0E, 0x04, 0x60, 0xC2,
+ 0x0A, 0x10, 0x04, 0xC9, 0x09, 0x50, 0xC2, 0x0A,
+ 0x10, 0x04, 0xCA, 0x0D, 0x03, 0x30, 0xC2, 0x0A,
+ 0x10, 0x04, 0xCC, 0x07, 0x20, 0xC2, 0x0E, 0x19,
+ 0x0B, 0xCD, 0x0D, 0x1A,
+//ascii 0x005B
+ 0xC2, 0x2C, 0xD2, 0x0E, 0x1C, 0xC6, 0x81, 0x03,
+ 0xD2, 0x09, 0x10, 0x0B, 0xC5, 0x81, 0x03, 0xD2,
+ 0x09, 0x10, 0x0B, 0xC5, 0x81, 0x03, 0xD2, 0x09,
+ 0x10, 0x0B, 0xC5, 0x81, 0x01, 0x77, 0x77, 0x27,
+ 0x04, 0x10, 0x0B, 0xC5, 0x01, 0x70, 0x70, 0x70,
+ 0x0B, 0xC5, 0x01, 0x70, 0x70, 0x70, 0x0B, 0xC5,
+ 0x02, 0x71, 0x71, 0x71, 0x0B, 0xC0,
+//ascii 0x005C
+ 0xF2, 0x9D, 0x94, 0x00, 0xD3, 0x9E, 0xA5, 0x10,
+ 0x30, 0xD0, 0x8B, 0x72, 0x70, 0xCC, 0x8C, 0x84,
+ 0x70, 0x91, 0x59, 0xE0, 0xC8, 0x9D, 0x95, 0x10,
+ 0x70, 0x84, 0x8D, 0xC9, 0x8A, 0x62, 0x70, 0x83,
+ 0x7B, 0xCA, 0x0D, 0x03, 0x70, 0x92, 0x6A, 0xE0,
+ 0xCD, 0x0B, 0x40, 0x91, 0x59, 0xD0, 0xD1, 0x0B,
+ 0x10, 0x83, 0x8C, 0xD5, 0x0D, 0x0B,
+//ascii 0x005D
+ 0xC2, 0x02, 0x71, 0x71, 0x71, 0x0B, 0xC5, 0x01,
+ 0x70, 0x70, 0x70, 0x0B, 0xC5, 0x01, 0x70, 0x70,
+ 0x70, 0x0B, 0xC5, 0x81, 0x01, 0x77, 0x77, 0x27,
+ 0x04, 0x10, 0x0B, 0xC5, 0x81, 0x03, 0xD2, 0x09,
+ 0x10, 0x0B, 0xC5, 0x81, 0x03, 0xD2, 0x09, 0x10,
+ 0x0B, 0xC5, 0x81, 0x03, 0xD2, 0x09, 0x10, 0x0B,
+ 0xC5, 0x1C, 0x0D, 0xD2, 0x0E, 0x1C,
+//ascii 0x005E
+ 0xC7, 0x0C, 0xC8, 0x8A, 0x32, 0xC6, 0x0A, 0x02,
+ 0x10, 0x02, 0xC4, 0x09, 0x02, 0x20, 0x01, 0x07,
+ 0xC2, 0x09, 0x01, 0x20, 0x01, 0x08, 0xC4, 0x02,
+ 0x10, 0x02, 0x0A, 0xC6, 0x92, 0x01, 0xB0, 0xC7,
+ 0x03, 0x20, 0x02, 0x09, 0xC6, 0x08, 0x01, 0x20,
+ 0x81, 0x7E, 0xC5, 0x09, 0x02, 0x20, 0x02, 0xC7,
+ 0x99, 0x20, 0x20, 0xC9, 0x0A, 0x05, 0xC0,
+//ascii 0x005F
+ 0x2E, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0,
+ 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02,
+ 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10,
+ 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0,
+ 0x10, 0x02, 0xC0, 0x10, 0x02, 0xC0, 0x10, 0x02,
+ 0xC0,
+//ascii 0x0060
+ 0xC4, 0x0C, 0x08, 0xC3, 0x9C, 0x40, 0x40, 0xC2,
+ 0x05, 0x20, 0x05, 0xC2, 0x03, 0x10, 0x05, 0xC3,
+ 0x83, 0x1A, 0xC4, 0x08, 0xC0,
+//ascii 0x0061
+ 0xC3, 0x0D, 0x7B, 0x2B, 0xC5, 0x0C, 0x02, 0x70,
+ 0x30, 0xC4, 0x0C, 0x70, 0x50, 0xC4, 0x03, 0x70,
+ 0x50, 0xC3, 0x0E, 0x20, 0xA7, 0xB4, 0x01, 0x1B,
+ 0xA9, 0x10, 0x8D, 0xC3, 0x0A, 0x10, 0x07, 0xC1,
+ 0x0C, 0x10, 0x0E, 0xC1, 0x9E, 0x10, 0xB0, 0xC3,
+ 0x09, 0x10, 0x0B, 0xC1, 0x0E, 0x10, 0x0B, 0xC2,
+ 0x87, 0x02, 0xC3, 0x09, 0x10, 0x0B, 0xC2, 0x10,
+ 0x09, 0xC2, 0x0A, 0x10, 0x0D, 0xC2, 0x0B, 0x10,
+ 0x06, 0xC2, 0x82, 0x05, 0xC2, 0x09, 0x10, 0x0B,
+ 0xC2, 0x0E, 0x20, 0x09, 0xC1, 0x95, 0x01, 0xE0,
+ 0xC1, 0x04, 0x10, 0x0C, 0xC3, 0x05, 0x20, 0x0E,
+ 0xC0, 0x09, 0x10, 0x81, 0x63, 0x20, 0xC4, 0x0E,
+ 0x01, 0x10, 0xC1, 0x0E, 0x01, 0x50, 0x05, 0xC5,
+ 0x8D, 0x32, 0xC2, 0x09, 0x40, 0x02, 0x0E, 0xC7,
+ 0x0D, 0xC3, 0xAB, 0x52, 0x37,
+//ascii 0x0062
+ 0xCD, 0xAC, 0xA9, 0xAC, 0xD3, 0x0C, 0x04, 0x60,
+ 0x05, 0x0D, 0xCF, 0x08, 0x70, 0x20, 0x0A, 0xCD,
+ 0x09, 0x70, 0x40, 0x0C, 0xCC, 0x01, 0x20, 0xB3,
+ 0x9B, 0xCB, 0x70, 0x02, 0x20, 0x03, 0xCB, 0x0B,
+ 0x20, 0x08, 0xC6, 0x05, 0x20, 0x0E, 0xCA, 0x09,
+ 0x10, 0x04, 0xC8, 0x01, 0x10, 0x0C, 0xCA, 0x09,
+ 0x10, 0x08, 0xC8, 0x04, 0x10, 0x0C, 0xCA, 0x0C,
+ 0x10, 0x07, 0xC8, 0x04, 0x10, 0xCC, 0x84, 0x02,
+ 0xC7, 0x0E, 0x10, 0x07, 0xCD, 0x94, 0x04, 0xE0,
+ 0xC4, 0x9C, 0x20, 0x60, 0xC7, 0x0C, 0x66, 0x01,
+ 0x10, 0x04, 0x17, 0x06, 0x03, 0x10, 0x02, 0x17,
+ 0xC6, 0x0A, 0x70, 0x70, 0x30, 0xC6, 0x0A, 0x70,
+ 0x70, 0x30, 0xC6, 0x0A, 0x70, 0x70, 0x30,
+//ascii 0x0063
+ 0xD6, 0x8B, 0x40, 0xC3, 0x9C, 0x15, 0xD0, 0xC7,
+ 0x07, 0x20, 0xC3, 0x0C, 0x20, 0x0A, 0xC5, 0x0A,
+ 0x30, 0xC3, 0x0C, 0x30, 0x0C, 0xC4, 0x02, 0x10,
+ 0x01, 0x07, 0xC4, 0x06, 0x20, 0x04, 0xC3, 0x0C,
+ 0x10, 0x01, 0x0D, 0xC6, 0x0B, 0x20, 0xC3, 0x0A,
+ 0x10, 0x07, 0xC8, 0x03, 0x10, 0x0C, 0xC2, 0x09,
+ 0x10, 0x09, 0xC8, 0x05, 0x10, 0x0B, 0xC2, 0x0A,
+ 0x10, 0x06, 0xC8, 0x03, 0x10, 0x0C, 0xC2, 0x0C,
+ 0x10, 0x01, 0x0D, 0xC6, 0x0A, 0x20, 0xC4, 0x02,
+ 0x10, 0x01, 0x09, 0xC3, 0x0E, 0x07, 0x20, 0x04,
+ 0xC4, 0x0A, 0x40, 0x12, 0x01, 0x40, 0x0C, 0xC5,
+ 0x07, 0x70, 0x20, 0x09, 0xC7, 0x09, 0x01, 0x60,
+ 0x02, 0x0B, 0xCA, 0xBA, 0x64, 0x34, 0x60, 0x0B,
+//ascii 0x0064
+ 0xC2, 0x0C, 0x75, 0x75, 0x35, 0xC6, 0x0A, 0x70,
+ 0x70, 0x30, 0xC6, 0x0A, 0x70, 0x70, 0x30, 0xC6,
+ 0x0A, 0x61, 0x30, 0x81, 0x21, 0x20, 0x01, 0x12,
+ 0xCD, 0x09, 0x11, 0x09, 0x0E, 0xC2, 0xAD, 0x70,
+ 0x1B, 0xCD, 0x98, 0x01, 0xD0, 0xC6, 0x0A, 0x10,
+ 0x0B, 0xCB, 0x0E, 0x10, 0x06, 0xC8, 0x83, 0x02,
+ 0xCB, 0x0A, 0x10, 0x08, 0xC8, 0x05, 0x10, 0x0D,
+ 0xCA, 0x09, 0x10, 0x06, 0xC8, 0x02, 0x10, 0x0C,
+ 0xCA, 0x0A, 0x20, 0x0D, 0xC6, 0x0A, 0x20, 0x0D,
+ 0xCA, 0x0E, 0x20, 0x81, 0x9E, 0xC2, 0x0D, 0x07,
+ 0x20, 0x01, 0xCC, 0x06, 0x40, 0x81, 0x21, 0x40,
+ 0x09, 0xCD, 0x03, 0x70, 0x20, 0x05, 0xCF, 0x06,
+ 0x70, 0x01, 0x08, 0xD1, 0x8E, 0x96, 0x24, 0x06,
+ 0x0A,
+//ascii 0x0065
+ 0xC5, 0x9C, 0xA9, 0xE0, 0xCC, 0x0D, 0x05, 0x30,
+ 0x0A, 0xC0, 0x8D, 0x07, 0xC7, 0x09, 0x50, 0x0A,
+ 0xC0, 0x0B, 0x10, 0x05, 0xC5, 0x0C, 0x60, 0x0A,
+ 0xC0, 0x0A, 0x20, 0x09, 0xC4, 0x03, 0x10, 0x82,
+ 0xBD, 0x10, 0x0A, 0xC0, 0x0E, 0x04, 0x10, 0x02,
+ 0xC3, 0x0D, 0x10, 0x02, 0xC2, 0x10, 0x0A, 0xC2,
+ 0x02, 0x10, 0x0E, 0xC2, 0x0A, 0x10, 0x08, 0xC2,
+ 0x10, 0x0A, 0xC2, 0x06, 0x10, 0x0C, 0xC2, 0x09,
+ 0x10, 0x0A, 0xC2, 0x10, 0x0A, 0xC2, 0x08, 0x10,
+ 0x0B, 0xC2, 0x09, 0x10, 0x09, 0xC2, 0x10, 0x0A,
+ 0xC2, 0x05, 0x10, 0x0C, 0xC2, 0x0C, 0x10, 0x02,
+ 0xC2, 0x10, 0x0A, 0xC1, 0x0E, 0x01, 0x10, 0xC4,
+ 0x02, 0x10, 0x04, 0x0E, 0xC0, 0x10, 0x0A, 0xC0,
+ 0x0C, 0x02, 0x10, 0x04, 0xC4, 0x0A, 0x30, 0x02,
+ 0x10, 0x12, 0x30, 0x0C, 0xC5, 0x07, 0x70, 0x20,
+ 0x08, 0xC7, 0x09, 0x01, 0x60, 0x01, 0x0A, 0xCA,
+ 0xBA, 0x64, 0x34, 0x60, 0x0A,
+//ascii 0x0066
+ 0xC2, 0x0D, 0xD5, 0x9E, 0x01, 0x60, 0xC1, 0x0E,
+ 0x17, 0x0B, 0xCD, 0x0C, 0x10, 0x05, 0xC1, 0x0C,
+ 0x10, 0x08, 0xCD, 0x0B, 0x10, 0x03, 0xC1, 0x0C,
+ 0x10, 0x08, 0xCD, 0x0D, 0x20, 0x86, 0x97, 0x10,
+ 0x04, 0x79, 0x39, 0xC2, 0x01, 0x70, 0x70, 0x30,
+ 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC3, 0x0A, 0x02,
+ 0x70, 0x70, 0x10, 0xC5, 0x8E, 0xD9, 0x10, 0x06,
+ 0x7D, 0x3D, 0xC7, 0x0C, 0x10, 0x08, 0xD3, 0x0E,
+ 0x19, 0x0C,
+//ascii 0x0067
+ 0x0D, 0x75, 0x65, 0x86, 0x7C, 0xC4, 0x0C, 0x70,
+ 0x70, 0x10, 0x05, 0xC3, 0x0C, 0x70, 0x70, 0x20,
+ 0x05, 0xC2, 0x0C, 0x12, 0x30, 0x01, 0x02, 0x30,
+ 0x31, 0x30, 0x0C, 0xC3, 0x09, 0x11, 0x09, 0x0E,
+ 0xC2, 0xAD, 0x50, 0x4E, 0xC1, 0x0E, 0x03, 0x10,
+ 0x06, 0xC2, 0x98, 0x01, 0xD0, 0xC6, 0x86, 0x02,
+ 0xC2, 0x0E, 0x10, 0x02, 0xC1, 0x0E, 0x10, 0x06,
+ 0xC7, 0x0D, 0x10, 0x09, 0xC2, 0x04, 0x10, 0xC1,
+ 0x0A, 0x10, 0x08, 0xC8, 0x10, 0x05, 0xC2, 0x05,
+ 0x10, 0xC1, 0x09, 0x10, 0x06, 0xC7, 0x0D, 0x10,
+ 0x04, 0xC2, 0x04, 0x10, 0xC1, 0x0A, 0x20, 0x0D,
+ 0xC6, 0x05, 0x10, 0x05, 0xC1, 0x0E, 0x10, 0x02,
+ 0xC1, 0x0E, 0x20, 0x81, 0x9E, 0xC2, 0x0C, 0x05,
+ 0x20, 0x09, 0xC0, 0x0E, 0x03, 0x10, 0x06, 0xC2,
+ 0x06, 0x40, 0x01, 0x02, 0x40, 0x01, 0xC1, 0x08,
+ 0x20, 0x0C, 0xC3, 0x03, 0x70, 0x20, 0x0B, 0xC1,
+ 0x0C, 0x10, 0x06, 0xC5, 0x06, 0x70, 0x02, 0x0C,
+ 0xC3, 0x01, 0x07, 0xC7, 0x8E, 0x96, 0x24, 0x07,
+ 0x0B,
+//ascii 0x0068
+ 0xCB, 0x0D, 0x0B, 0x7A, 0x1A, 0xC9, 0x0B, 0x02,
+ 0x70, 0x30, 0xC8, 0x0A, 0x70, 0x50, 0xC8, 0x01,
+ 0x70, 0x50, 0xC7, 0x0B, 0x20, 0x01, 0x09, 0x7C,
+ 0x1C, 0xC7, 0x09, 0x10, 0x01, 0x0E, 0xD2, 0x09,
+ 0x10, 0x05, 0xD3, 0x0C, 0x10, 0x06, 0xD4, 0x82,
+ 0x03, 0xD4, 0x9D, 0x10, 0x90, 0xCD, 0x0E, 0x5A,
+ 0xA9, 0x10, 0x48, 0x79, 0x09, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC3, 0x7D, 0x7D, 0x3D,
+//ascii 0x0069
+ 0xC2, 0x8A, 0x48, 0xC1, 0x0E, 0x79, 0x69, 0xC1,
+ 0x0D, 0x20, 0x0A, 0xC0, 0x0C, 0x70, 0x60, 0xC1,
+ 0x0B, 0x20, 0x07, 0xC0, 0x0C, 0x70, 0x60, 0xC2,
+ 0x01, 0x10, 0x0D, 0xC0, 0x0C, 0x70, 0x60, 0xC2,
+ 0x8E, 0xAD, 0xC2, 0x7D, 0x6D,
+//ascii 0x006A
+ 0xC2, 0x8B, 0x59, 0xC1, 0x0E, 0x79, 0x79, 0x09,
+ 0x0C, 0xC6, 0x0E, 0x20, 0x0A, 0xC0, 0x0C, 0x70,
+ 0x70, 0x10, 0x02, 0x0D, 0xC4, 0x0B, 0x20, 0x07,
+ 0xC0, 0x0C, 0x70, 0x70, 0x20, 0x02, 0xC5, 0x01,
+ 0x10, 0x0C, 0xC0, 0x0C, 0x70, 0x70, 0x30, 0x0A,
+ 0xC4, 0x8E, 0x9D, 0xC2, 0x7D, 0x7D, 0x0C, 0x03,
+ 0x10, 0x06, 0xDB, 0x0C, 0x10, 0x04, 0xDB, 0x0E,
+ 0x16, 0x09,
+//ascii 0x006B
+ 0xD6, 0x0A, 0xC7, 0x0C, 0x05, 0xCB, 0x06, 0x00,
+ 0xC7, 0x8C, 0x04, 0xC8, 0x0C, 0x02, 0x10, 0xC7,
+ 0x0C, 0x10, 0x03, 0x0E, 0xC5, 0x08, 0x30, 0xC7,
+ 0x0C, 0x20, 0x02, 0x0D, 0xC2, 0x0E, 0x04, 0x30,
+ 0x02, 0xC8, 0x08, 0x20, 0x01, 0x0C, 0xC0, 0x0B,
+ 0x01, 0x30, 0x06, 0xCA, 0x0A, 0x30, 0x05, 0x30,
+ 0x01, 0x0A, 0xCC, 0x0B, 0x01, 0x50, 0x04, 0x0E,
+ 0xCE, 0x0C, 0x01, 0x30, 0x08, 0xD1, 0x0E, 0x02,
+ 0x10, 0x04, 0xC8, 0x0D, 0x79, 0x19, 0x07, 0x20,
+ 0x04, 0x49, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70,
+ 0x30, 0xC3, 0x7D, 0x7D, 0x3D,
+//ascii 0x006C
+ 0xC2, 0x0D, 0x79, 0x79, 0x39, 0xC2, 0x0A, 0x70,
+ 0x70, 0x30, 0xC2, 0x0A, 0x70, 0x70, 0x30, 0xC2,
+ 0x0A, 0x70, 0x70, 0x30, 0xC3, 0x7D, 0x7D, 0x3D,
+//ascii 0x006D
+ 0xC3, 0x0C, 0x7B, 0x2B, 0xC1, 0x08, 0x01, 0x70,
+ 0x30, 0xC0, 0x07, 0x70, 0x50, 0x0E, 0x70, 0x60,
+ 0x0A, 0x20, 0x03, 0x0A, 0x7B, 0x1B, 0x09, 0x10,
+ 0x02, 0xCB, 0x0A, 0x10, 0x06, 0xCB, 0x0E, 0x10,
+ 0x06, 0xCC, 0x97, 0x01, 0xE0, 0xCC, 0x97, 0x02,
+ 0x80, 0x7A, 0x1A, 0xC1, 0x09, 0x01, 0x70, 0x30,
+ 0xC0, 0x07, 0x70, 0x50, 0x0E, 0x70, 0x60, 0x0A,
+ 0x20, 0x04, 0x0C, 0x7D, 0x1D, 0x09, 0x10, 0x02,
+ 0xCB, 0x0B, 0x10, 0x06, 0xCC, 0x81, 0x05, 0xCC,
+ 0x9C, 0x10, 0xC0, 0xCB, 0xBB, 0x91, 0x05, 0x80,
+ 0x79, 0x09, 0x0C, 0x70, 0x60, 0x0C, 0x70, 0x60,
+ 0x0C, 0x70, 0x60, 0xC0, 0x7D, 0x6D,
+//ascii 0x006E
+ 0xC4, 0x0D, 0x7C, 0x1C, 0xC1, 0x0D, 0x04, 0x70,
+ 0x30, 0xC0, 0x0C, 0x70, 0x50, 0xC0, 0x02, 0x70,
+ 0x50, 0x0B, 0x20, 0x01, 0x07, 0x7A, 0x1A, 0x09,
+ 0x20, 0x0D, 0xCA, 0x09, 0x10, 0x05, 0xCB, 0x0C,
+ 0x10, 0x06, 0xCC, 0x82, 0x03, 0xCC, 0x9D, 0x10,
+ 0xA0, 0xCB, 0xBB, 0x91, 0x04, 0x80, 0x79, 0x09,
+ 0x0C, 0x70, 0x60, 0x0C, 0x70, 0x60, 0x0C, 0x70,
+ 0x60, 0xC0, 0x7D, 0x6D,
+//ascii 0x006F
+ 0xC4, 0xBA, 0x64, 0x34, 0x60, 0x0A, 0xCA, 0x09,
+ 0x01, 0x60, 0x01, 0x0B, 0xC7, 0x06, 0x70, 0x20,
+ 0x09, 0xC5, 0x0A, 0x40, 0x82, 0x32, 0x40, 0x0C,
+ 0xC4, 0x02, 0x10, 0x02, 0x0A, 0xC3, 0x8E, 0x81,
+ 0x10, 0x04, 0xC3, 0x0C, 0x10, 0x01, 0x0E, 0xC6,
+ 0x0C, 0x20, 0xC3, 0x09, 0x10, 0x08, 0xC8, 0x04,
+ 0x10, 0x0C, 0xC2, 0x09, 0x10, 0x0A, 0xC8, 0x06,
+ 0x10, 0x0B, 0xC2, 0x0A, 0x10, 0x07, 0xC8, 0x04,
+ 0x10, 0x0C, 0xC2, 0x0C, 0x10, 0x01, 0x0E, 0xC6,
+ 0x0C, 0x20, 0xC4, 0x02, 0x10, 0x01, 0x09, 0xC3,
+ 0x0E, 0x08, 0x20, 0x04, 0xC4, 0x0A, 0x40, 0x12,
+ 0x01, 0x40, 0x0D, 0xC5, 0x07, 0x70, 0x20, 0x09,
+ 0xC7, 0x09, 0x01, 0x60, 0x02, 0x0B, 0xCA, 0xBA,
+ 0x64, 0x34, 0x60, 0x0B,
+//ascii 0x0070
+ 0xC5, 0x0E, 0x1C, 0x0D, 0xD0, 0x8E, 0x71, 0x40,
+ 0x02, 0x08, 0xCC, 0x0A, 0x70, 0x10, 0x02, 0x0C,
+ 0xC9, 0x0B, 0x70, 0x30, 0x01, 0x0E, 0xC8, 0x02,
+ 0x20, 0x01, 0x06, 0x19, 0x08, 0x05, 0x30, 0x05,
+ 0xC7, 0x0C, 0x20, 0x06, 0xC5, 0x0E, 0x03, 0x20,
+ 0xC7, 0x09, 0x10, 0x03, 0xC7, 0x0E, 0x01, 0x10,
+ 0x0C, 0xC6, 0x09, 0x10, 0x07, 0xC8, 0x04, 0x10,
+ 0x0C, 0xC6, 0x0B, 0x10, 0x07, 0xC8, 0x04, 0x10,
+ 0xC8, 0x83, 0x03, 0xC8, 0x81, 0x06, 0xC8, 0x9D,
+ 0x20, 0x70, 0xC5, 0x9E, 0x40, 0x40, 0xC8, 0xBE,
+ 0xA9, 0x10, 0x20, 0xB7, 0x9A, 0x95, 0x10, 0x80,
+ 0x28, 0x59, 0x0B, 0xC1, 0x0C, 0x70, 0x70, 0x30,
+ 0x04, 0xC1, 0x0C, 0x70, 0x70, 0x30, 0x04, 0xC1,
+ 0x0C, 0x70, 0x70, 0x30, 0x04, 0xC2, 0x7D, 0x7D,
+ 0x3D, 0x0E,
+//ascii 0x0071
+ 0x0D, 0x75, 0x75, 0x35, 0x08, 0xC1, 0x0C, 0x70,
+ 0x70, 0x30, 0x04, 0xC1, 0x0C, 0x70, 0x70, 0x30,
+ 0x04, 0xC1, 0x0C, 0x12, 0x30, 0x81, 0x21, 0x30,
+ 0x61, 0x05, 0xC3, 0x09, 0x11, 0x09, 0x0E, 0xC2,
+ 0xAD, 0x70, 0x1B, 0xC9, 0x98, 0x01, 0xD0, 0xC6,
+ 0x0A, 0x10, 0x0B, 0xC7, 0x0E, 0x10, 0x06, 0xC8,
+ 0x83, 0x02, 0xC7, 0x0A, 0x10, 0x08, 0xC8, 0x05,
+ 0x10, 0x0D, 0xC6, 0x09, 0x10, 0x06, 0xC8, 0x02,
+ 0x10, 0x0C, 0xC6, 0x0A, 0x20, 0x0D, 0xC6, 0x0A,
+ 0x20, 0x0D, 0xC6, 0x0E, 0x20, 0x81, 0x9E, 0xC2,
+ 0x0D, 0x07, 0x20, 0x01, 0xC8, 0x06, 0x40, 0x81,
+ 0x21, 0x40, 0x09, 0xC9, 0x03, 0x70, 0x20, 0x05,
+ 0xCB, 0x06, 0x70, 0x01, 0x08, 0xCD, 0x8E, 0x96,
+ 0x24, 0x06, 0x0A,
+//ascii 0x0072
+ 0x0C, 0x17, 0x08, 0xCB, 0x08, 0x10, 0x04, 0xCB,
+ 0x0A, 0x10, 0x04, 0xCB, 0x0E, 0x10, 0x01, 0xCC,
+ 0x0A, 0x10, 0x06, 0xCB, 0xBA, 0x81, 0x03, 0x80,
+ 0x79, 0x09, 0x0C, 0x70, 0x60, 0x0C, 0x70, 0x60,
+ 0x0C, 0x70, 0x60, 0xC0, 0x7D, 0x6D,
+//ascii 0x0073
+ 0xC9, 0x8E, 0xCE, 0xC9, 0x08, 0x05, 0xC3, 0x04,
+ 0x20, 0x05, 0xC7, 0x83, 0x01, 0xC2, 0x04, 0x40,
+ 0x03, 0xC5, 0x06, 0x20, 0xC1, 0x0C, 0x60, 0x08,
+ 0xC4, 0x20, 0x05, 0xC1, 0x07, 0x10, 0x81, 0x85,
+ 0x10, 0x02, 0xC3, 0x0B, 0x10, 0x05, 0xC2, 0x03,
+ 0x10, 0x0A, 0xC1, 0x03, 0x10, 0x0E, 0xC2, 0x09,
+ 0x10, 0x0B, 0xC2, 0x20, 0xC2, 0x08, 0x10, 0x0C,
+ 0xC2, 0x09, 0x10, 0x0C, 0xC1, 0x0C, 0x10, 0x03,
+ 0xC2, 0x09, 0x10, 0x0B, 0xC2, 0x0A, 0x10, 0x09,
+ 0xC1, 0x08, 0x10, 0x06, 0xC2, 0x06, 0x10, 0x0C,
+ 0xC2, 0x0D, 0x10, 0x01, 0x1B, 0x01, 0x10, 0x0A,
+ 0xC1, 0x0D, 0x01, 0x10, 0xC4, 0x02, 0x60, 0xC1,
+ 0x0A, 0x20, 0x04, 0xC4, 0x0B, 0x50, 0x07, 0xC1,
+ 0x0A, 0x20, 0x0B, 0xC5, 0x09, 0x30, 0x05, 0xC2,
+ 0x0B, 0x10, 0x08, 0xC8, 0x1A, 0x0D, 0xC3, 0x8D,
+ 0x5C,
+//ascii 0x0074
+ 0xC3, 0x0E, 0x18, 0x0C, 0xC8, 0x8C, 0x96, 0xC7,
+ 0x0C, 0x10, 0x08, 0xC8, 0x02, 0x10, 0x0E, 0xC6,
+ 0x0C, 0x10, 0x08, 0xC8, 0x01, 0x10, 0x0D, 0xC3,
+ 0x09, 0x18, 0x06, 0x10, 0x04, 0x78, 0x04, 0x20,
+ 0x0E, 0xC3, 0x01, 0x70, 0x70, 0x00, 0x02, 0xC4,
+ 0x01, 0x70, 0x70, 0x00, 0x0A, 0xC4, 0x01, 0x70,
+ 0x60, 0x01, 0x09, 0xC5, 0x2E, 0x0A, 0x10, 0x07,
+ 0x7E, 0x0E, 0xCA, 0x0C, 0x10, 0x08, 0xD4, 0x1B,
+ 0x0E,
+//ascii 0x0075
+ 0xC0, 0x7D, 0x6D, 0xC3, 0x0C, 0x70, 0x60, 0xC3,
+ 0x0C, 0x70, 0x60, 0xC3, 0x0C, 0x70, 0x60, 0xC3,
+ 0x0E, 0x79, 0xA9, 0x82, 0x04, 0x1B, 0xCF, 0x84,
+ 0x04, 0xD0, 0x0D, 0x10, 0x07, 0xD0, 0x81, 0x01,
+ 0xD0, 0x20, 0x0D, 0xCE, 0x06, 0x20, 0x0D, 0xC2,
+ 0x0E, 0x79, 0x89, 0x83, 0x30, 0xC3, 0x0C, 0x70,
+ 0x50, 0x06, 0xC3, 0x0C, 0x70, 0x40, 0x03, 0xC4,
+ 0x0C, 0x70, 0x20, 0x02, 0x08, 0xC6, 0x7D, 0x0D,
+ 0x0E, 0xC0,
+//ascii 0x0076
+ 0x0E, 0x0D, 0xCD, 0xAC, 0x02, 0x8E, 0xCA, 0x0C,
+ 0x30, 0x03, 0x09, 0xC8, 0x0C, 0x60, 0x05, 0x0A,
+ 0xC5, 0x8E, 0x72, 0x60, 0x81, 0x6B, 0xC5, 0x8D,
+ 0x83, 0x60, 0x81, 0x7C, 0xC5, 0x8E, 0x94, 0x60,
+ 0xC9, 0x0A, 0x05, 0x30, 0xC8, 0x8D, 0x83, 0x30,
+ 0xC5, 0x8C, 0x72, 0x60, 0xC2, 0x8B, 0x61, 0x60,
+ 0x03, 0x09, 0x1E, 0x05, 0x70, 0x82, 0x8D, 0xC2,
+ 0x0C, 0x50, 0x81, 0x7C, 0xC5, 0x0C, 0x20, 0x81,
+ 0x5B, 0xC8, 0x9C, 0x04, 0xA0, 0xCC, 0x0E,
+//ascii 0x0077
+ 0x8D, 0x7C, 0xCC, 0x0C, 0x10, 0x91, 0x59, 0xE0,
+ 0xC8, 0x0C, 0x50, 0x82, 0x7C, 0xC5, 0x0C, 0x70,
+ 0xA0, 0x15, 0x9E, 0xC2, 0x9E, 0xA7, 0x30, 0x70,
+ 0x80, 0x27, 0xC5, 0x8B, 0x73, 0x60, 0xC9, 0x0A,
+ 0x02, 0x30, 0xC6, 0x8B, 0x73, 0x50, 0xC2, 0x8C,
+ 0x84, 0x60, 0xA1, 0x59, 0xE4, 0x70, 0x83, 0x7C,
+ 0xC2, 0x0C, 0x40, 0x91, 0x5A, 0xE0, 0xC5, 0x0C,
+ 0x30, 0x82, 0x9E, 0xC7, 0x0C, 0x60, 0x82, 0x7B,
+ 0xC5, 0x8C, 0x83, 0x70, 0x84, 0x9D, 0xC5, 0x8B,
+ 0x73, 0x60, 0x02, 0xC8, 0x8B, 0x72, 0x30, 0xC7,
+ 0x8B, 0x73, 0x40, 0xC3, 0x8B, 0x73, 0x70, 0x90,
+ 0xE7, 0x30, 0x70, 0xB0, 0x15, 0x9E, 0xC0, 0x70,
+ 0x83, 0x7C, 0xC3, 0x0C, 0x30, 0x91, 0x5A, 0xE0,
+ 0xC6, 0xAC, 0x03, 0x8C, 0xCB, 0x0E,
+//ascii 0x0078
+ 0x0D, 0x0A, 0xCC, 0xA7, 0xC0, 0x4D, 0xC8, 0x9A,
+ 0x10, 0xC0, 0x20, 0x07, 0xC5, 0x0D, 0x04, 0x20,
+ 0x0C, 0x30, 0x02, 0x0B, 0xC2, 0x08, 0x40, 0xC0,
+ 0x09, 0x01, 0x30, 0x84, 0xA2, 0x30, 0x04, 0x0D,
+ 0xC2, 0x07, 0x70, 0x02, 0x0A, 0xC5, 0x0E, 0x06,
+ 0x40, 0x07, 0xC8, 0x09, 0x01, 0x20, 0x02, 0x0B,
+ 0xC6, 0x0B, 0x02, 0x60, 0x05, 0x0E, 0xC2, 0x0D,
+ 0x04, 0x30, 0x01, 0x06, 0x40, 0x07, 0xC0, 0x0C,
+ 0x40, 0x06, 0xC1, 0x0D, 0x04, 0x30, 0x01, 0x0C,
+ 0x20, 0x04, 0x0D, 0xC4, 0x0A, 0x01, 0x20, 0x9C,
+ 0x01, 0xA0, 0xC8, 0x06, 0x10, 0x0C, 0x07, 0xCB,
+ 0x0C, 0x03,
+//ascii 0x0079
+ 0x0E, 0x0D, 0xD5, 0xAC, 0x02, 0x8E, 0xD2, 0x0C,
+ 0x30, 0x03, 0x09, 0xD0, 0x0C, 0x60, 0x05, 0x0A,
+ 0xCD, 0x8E, 0x72, 0x60, 0x81, 0x6B, 0xCD, 0x8D,
+ 0x83, 0x60, 0x81, 0x7D, 0xCD, 0x8E, 0x95, 0x60,
+ 0x82, 0x8E, 0xCE, 0x8B, 0x61, 0x50, 0x07, 0xCC,
+ 0x8E, 0x94, 0x70, 0x06, 0xC8, 0x8D, 0x83, 0x60,
+ 0x01, 0x30, 0x0C, 0xC4, 0x8B, 0x62, 0x60, 0x83,
+ 0x8E, 0xC0, 0x0B, 0x02, 0x10, 0x07, 0xC1, 0x8E,
+ 0x51, 0x60, 0x82, 0x7D, 0xC4, 0x0A, 0x10, 0x05,
+ 0xC1, 0x0C, 0x50, 0x81, 0x6C, 0xC7, 0x0C, 0x10,
+ 0x05, 0xC1, 0x0C, 0x20, 0x81, 0x5B, 0xCA, 0x9D,
+ 0x50, 0x70, 0xC1, 0x9C, 0x04, 0xA0, 0xD4, 0x0E,
+//ascii 0x007A
+ 0xCC, 0x2D, 0x0C, 0x11, 0x05, 0xC8, 0x20, 0x0C,
+ 0x20, 0x02, 0x0D, 0xC6, 0x20, 0x0C, 0x30, 0x01,
+ 0x0A, 0xC5, 0x20, 0x0C, 0x50, 0x06, 0xC4, 0x20,
+ 0x0C, 0x10, 0x12, 0x20, 0x03, 0x0E, 0xC2, 0x20,
+ 0x0C, 0x10, 0x85, 0xE4, 0x20, 0x01, 0x0B, 0xC1,
+ 0x20, 0x0C, 0x10, 0x05, 0xC1, 0x07, 0x30, 0x08,
+ 0xC0, 0x20, 0x0C, 0x10, 0x05, 0xC2, 0x0A, 0x30,
+ 0x04, 0x20, 0x0C, 0x10, 0x05, 0xC3, 0x0D, 0x02,
+ 0x50, 0x0C, 0x10, 0x05, 0xC5, 0x04, 0x40, 0x0C,
+ 0x10, 0x05, 0xC6, 0x07, 0x30, 0x0C, 0x10, 0x05,
+ 0xC7, 0x0A, 0x20, 0xC0, 0x1E, 0xC9, 0x0D, 0x1A,
+//ascii 0x007B
+ 0xC2, 0x2C, 0xD2, 0x0E, 0x1C, 0xC6, 0x81, 0x02,
+ 0xD2, 0x08, 0x10, 0x0B, 0xC5, 0x03, 0x10, 0x0D,
+ 0xD1, 0x04, 0x10, 0x0C, 0xC5, 0x05, 0x10, 0x02,
+ 0x08, 0x4A, 0x0E, 0xC3, 0x0B, 0x3A, 0x09, 0x04,
+ 0x20, 0xC6, 0x0A, 0x70, 0x10, 0x0A, 0xC0, 0x0E,
+ 0x02, 0x70, 0x00, 0x04, 0xC7, 0x04, 0x70, 0x10,
+ 0x0E, 0x05, 0x70, 0x80, 0x1D, 0xC8, 0x08, 0x03,
+ 0x70, 0x08, 0x70, 0x81, 0x6D, 0xD0, 0x0C, 0x03,
+ 0x30, 0x09, 0x0E, 0xD8, 0x0D, 0x20, 0x06, 0xDB,
+ 0x20, 0x08, 0xDB, 0x0E, 0x1D, 0xC0,
+//ascii 0x007C
+ 0xC0, 0x06, 0x75, 0x75, 0x75, 0x75, 0x0A, 0xC1,
+ 0x01, 0x70, 0x70, 0x70, 0x70, 0x07, 0xC1, 0x01,
+ 0x70, 0x70, 0x70, 0x70, 0x07, 0xC1, 0x06, 0x75,
+ 0x75, 0x75, 0x75, 0x0A, 0xC0,
+//ascii 0x007D
+ 0xCD, 0x2D, 0xDC, 0x20, 0x08, 0xDA, 0x0C, 0x20,
+ 0x06, 0xD9, 0x0B, 0x03, 0x30, 0x09, 0x0E, 0xD0,
+ 0x08, 0x02, 0x70, 0x08, 0x70, 0x81, 0x5D, 0xC8,
+ 0x04, 0x70, 0x00, 0x01, 0xC0, 0x05, 0x70, 0x80,
+ 0x1D, 0xC6, 0x0A, 0x70, 0x10, 0x0A, 0xC0, 0x0E,
+ 0x02, 0x70, 0x00, 0x04, 0xC6, 0x05, 0x10, 0x02,
+ 0x08, 0x3A, 0x0B, 0x0E, 0xC3, 0x0C, 0x3A, 0x09,
+ 0x04, 0x20, 0xC6, 0x03, 0x10, 0x0D, 0xD1, 0x04,
+ 0x10, 0x0C, 0xC5, 0x81, 0x02, 0xD2, 0x08, 0x10,
+ 0x0B, 0xC5, 0x1C, 0x0D, 0xD2, 0x0E, 0x1C,
+//ascii 0x007E
+ 0xC0, 0x9A, 0x69, 0xE0, 0xC3, 0x06, 0x20, 0x09,
+ 0xC2, 0x06, 0x30, 0x0C, 0xC1, 0x8E, 0xA2, 0x10,
+ 0x05, 0xC3, 0x0B, 0x10, 0x03, 0xC3, 0x0A, 0x10,
+ 0x05, 0xC2, 0x0E, 0x01, 0x10, 0x0B, 0xC2, 0x03,
+ 0x10, 0x05, 0xC2, 0x08, 0x10, 0x03, 0xC3, 0x01,
+ 0x10, 0x0D, 0xC3, 0x20, 0xC4, 0x20, 0x06, 0x0E,
+ 0xC2, 0x06, 0x30, 0x0B, 0xC2, 0x03, 0x20, 0x0B,
+ 0xC3, 0x9A, 0x53, 0xC0, 0xC0,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_SEMIBOLD_28PX[95] = {
+ { 0, 0, 7,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 9,2, 4, 2, 4 }, //asciii 0x0021
+ { 42, 1, 11,1, 4, 1, 20 }, //asciii 0x0022
+ { 71, 1, 18,0, 4, 0, 8 }, //asciii 0x0023
+ { 221, 1, 18,1, 4, 1, 4 }, //asciii 0x0024
+ { 383, 1, 24,2, 4, 2, 4 }, //asciii 0x0025
+ { 562, 1, 19,1, 4, 0, 4 }, //asciii 0x0026
+ { 722, 1, 6,1, 4, 1, 20 }, //asciii 0x0027
+ { 737, 1, 11,2, 4, 0, 0 }, //asciii 0x0028
+ { 802, 1, 11,0, 4, 2, 0 }, //asciii 0x0029
+ { 867, 1, 15,2, 4, 1, 16 }, //asciii 0x002A
+ { 937, 1, 19,2, 12, 2, 8 }, //asciii 0x002B
+ { 1000, 1, 8,1, 24, 1, 0 }, //asciii 0x002C
+ { 1021, 1, 13,1, 16, 1, 12 }, //asciii 0x002D
+ { 1042, 1, 8,1, 20, 1, 4 }, //asciii 0x002E
+ { 1058, 1, 11,0, 4, 0, 4 }, //asciii 0x002F
+ { 1110, 1, 19,1, 4, 1, 4 }, //asciii 0x0030
+ { 1236, 1, 13,1, 4, 2, 8 }, //asciii 0x0031
+ { 1281, 1, 17,1, 4, 1, 8 }, //asciii 0x0032
+ { 1406, 1, 18,1, 4, 1, 4 }, //asciii 0x0033
+ { 1546, 1, 19,1, 4, 1, 8 }, //asciii 0x0034
+ { 1658, 1, 18,1, 4, 1, 4 }, //asciii 0x0035
+ { 1813, 1, 18,1, 4, 1, 4 }, //asciii 0x0036
+ { 1969, 1, 16,1, 4, 0, 8 }, //asciii 0x0037
+ { 2072, 1, 18,1, 4, 1, 4 }, //asciii 0x0038
+ { 2231, 1, 18,1, 4, 1, 4 }, //asciii 0x0039
+ { 2392, 1, 8,1, 12, 1, 4 }, //asciii 0x003A
+ { 2427, 1, 8,1, 12, 1, 0 }, //asciii 0x003B
+ { 2466, 1, 19,2, 12, 2, 8 }, //asciii 0x003C
+ { 2564, 1, 19,2, 12, 2, 8 }, //asciii 0x003D
+ { 2674, 1, 19,2, 12, 2, 8 }, //asciii 0x003E
+ { 2767, 1, 15,1, 4, 1, 4 }, //asciii 0x003F
+ { 2863, 1, 28,1, 4, 1, 0 }, //asciii 0x0040
+ { 3152, 1, 20,0, 4, 0, 8 }, //asciii 0x0041
+ { 3256, 1, 18,2, 4, 0, 8 }, //asciii 0x0042
+ { 3393, 1, 21,1, 4, 1, 4 }, //asciii 0x0043
+ { 3541, 1, 20,2, 4, 1, 8 }, //asciii 0x0044
+ { 3661, 1, 17,2, 4, 1, 8 }, //asciii 0x0045
+ { 3791, 1, 16,2, 4, 0, 8 }, //asciii 0x0046
+ { 3886, 1, 21,1, 4, 1, 4 }, //asciii 0x0047
+ { 4052, 1, 21,2, 4, 2, 8 }, //asciii 0x0048
+ { 4132, 1, 8,2, 4, 2, 8 }, //asciii 0x0049
+ { 4152, 1, 16,0, 4, 2, 4 }, //asciii 0x004A
+ { 4216, 1, 19,2, 4, 0, 8 }, //asciii 0x004B
+ { 4326, 1, 16,2, 4, 1, 8 }, //asciii 0x004C
+ { 4373, 1, 25,2, 4, 1, 8 }, //asciii 0x004D
+ { 4496, 1, 21,2, 4, 2, 8 }, //asciii 0x004E
+ { 4587, 1, 22,1, 4, 1, 4 }, //asciii 0x004F
+ { 4735, 1, 18,2, 4, 1, 8 }, //asciii 0x0050
+ { 4834, 1, 22,1, 4, 1, 4 }, //asciii 0x0051
+ { 5000, 1, 18,2, 4, 0, 8 }, //asciii 0x0052
+ { 5123, 1, 18,1, 4, 1, 4 }, //asciii 0x0053
+ { 5290, 1, 18,1, 4, 0, 8 }, //asciii 0x0054
+ { 5365, 1, 21,2, 4, 2, 4 }, //asciii 0x0055
+ { 5453, 1, 20,0, 4, 0, 8 }, //asciii 0x0056
+ { 5549, 1, 28,0, 4, 0, 8 }, //asciii 0x0057
+ { 5705, 1, 19,0, 4, 0, 8 }, //asciii 0x0058
+ { 5843, 1, 20,0, 4, 0, 8 }, //asciii 0x0059
+ { 5934, 1, 18,1, 4, 1, 8 }, //asciii 0x005A
+ { 6074, 1, 11,3, 4, 0, 0 }, //asciii 0x005B
+ { 6128, 1, 11,0, 4, 0, 4 }, //asciii 0x005C
+ { 6182, 1, 11,0, 4, 3, 0 }, //asciii 0x005D
+ { 6236, 1, 13,1, 8, 0, 16 }, //asciii 0x005E
+ { 6291, 1, 15,0, 28, 0, 4 }, //asciii 0x005F
+ { 6332, 1, 14,4, 4, 4, 24 }, //asciii 0x0060
+ { 6353, 1, 16,1, 12, 1, 4 }, //asciii 0x0061
+ { 6470, 1, 18,2, 4, 1, 4 }, //asciii 0x0062
+ { 6573, 1, 16,1, 12, 0, 4 }, //asciii 0x0063
+ { 6677, 1, 18,1, 4, 2, 4 }, //asciii 0x0064
+ { 6782, 1, 17,1, 12, 1, 4 }, //asciii 0x0065
+ { 6915, 1, 11,0, 4, 0, 8 }, //asciii 0x0066
+ { 6981, 1, 18,1, 12, 2, 0 }, //asciii 0x0067
+ { 7126, 1, 17,1, 4, 1, 8 }, //asciii 0x0068
+ { 7198, 1, 7,1, 4, 1, 8 }, //asciii 0x0069
+ { 7235, 1, 8,0, 4, 1, 0 }, //asciii 0x006A
+ { 7293, 1, 16,1, 4, 0, 8 }, //asciii 0x006B
+ { 7386, 1, 7,1, 4, 1, 8 }, //asciii 0x006C
+ { 7410, 1, 25,1, 12, 1, 8 }, //asciii 0x006D
+ { 7504, 1, 17,1, 12, 1, 8 }, //asciii 0x006E
+ { 7564, 1, 17,1, 12, 1, 4 }, //asciii 0x006F
+ { 7672, 1, 17,1, 12, 0, 0 }, //asciii 0x0070
+ { 7786, 1, 17,1, 12, 1, 0 }, //asciii 0x0071
+ { 7893, 1, 11,1, 12, 0, 8 }, //asciii 0x0072
+ { 7931, 1, 15,1, 12, 0, 4 }, //asciii 0x0073
+ { 8052, 1, 11,0, 8, 1, 4 }, //asciii 0x0074
+ { 8117, 1, 17,1, 12, 1, 4 }, //asciii 0x0075
+ { 8183, 1, 16,0, 12, 0, 8 }, //asciii 0x0076
+ { 8254, 1, 23,0, 12, 0, 8 }, //asciii 0x0077
+ { 8364, 1, 16,0, 12, 1, 8 }, //asciii 0x0078
+ { 8454, 1, 16,0, 12, 0, 0 }, //asciii 0x0079
+ { 8550, 1, 16,1, 12, 1, 8 }, //asciii 0x007A
+ { 8638, 1, 11,0, 4, 0, 0 }, //asciii 0x007B
+ { 8716, 1, 10,3, 0, 3, 0 }, //asciii 0x007C
+ { 8745, 1, 11,0, 4, 0, 0 }, //asciii 0x007D
+ { 8824, 1, 19,2, 16, 2, 12 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_SEMIBOLD_28PX= {
+ 8885, // bitmap len
+ BAGL_FONT_INTER_SEMIBOLD_28px, // font id
+ (uint8_t) NBGL_BPP_4, // bpp
+ 36, // height of all characters in pixels
+ 36, // line height in pixels
+ 0, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_SEMIBOLD_28PX,
+ bitmapINTER_SEMIBOLD_28PX
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.json b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.json
new file mode 100644
index 00000000..f8b0f6c2
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "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BhAEwgwgzAoQAcIKEALMDCDCChADzA0gwgoQA8wNIMIKEAPMDSDCChABdUUEIMIKcHAwwgpwcDDCCnBwMMMcDc0rwgoQBMQJFw3DDiDCChAExAQQCsMOIMIKEATEBBAKww4gwgoQBMQEEArDDiDCChAExAQQCsMOIMIKEATEBBAKww4gwgoQBMQEEArDDiDCChAExAQQCsMOIMIKEATEBBAKww4gwgoQAUUBEAM1BCDCCnBwMMIKcHAwwgpwcDDaChAExA4dywoQBMQEEArKChAExAQQCsoKEATEBBAKygoQBMQEEArKChAExAQQCsoKEATEBBAKygoQBMQEEArKChAExAQQCsoKEAFFARADdcIKcHAwwgpwcDDCCnBwMMgLwgonCQzPmBDgwQVAAgvMAyAOwQVgB8oEMA7BBXAIyAkwBsIFEIzYMA3HARABDcMFEAzBDCAGxgsgC8QFEAzCBxABxggQAcUFEAzCDSANxQYQBMUJFQ7DIAzFBhAFzSAMxQcQAswNIA3FCiANywcgxyADygwgBccGIAMNxwoBIAvHDgEwpZvci4IwBckMAXBQA8sNAnAwBc4JA3AFDNGOuRgJDMDCC3NzM8IKcHAwwgpwcDDCC3IBEAFyywQQCtMEEArTBBAK0wQQCtMEEArTBBAK0wQQCtMEEArTBBAKygx1ARADdcIKcHAwwgpwcDDCCnBwMMIMdXU1wgpwcDDCCnBwMMIKcHAwwgx1ZQcMyQpwcIBOxwpwcBACxwpxUUAI1g0EEAHYARAN1wQQDNcCEAzWCyAO1A0GIALVCTAJ1QkgBdaZAoDYDtYOwgoG0AoBwooEzgUQwgoQAg7KCwEgwgogAQzIB0DCDgMwCsUNAzABC8QFMAjDCUAFxwcwBsAOBDABCskKMAQBMAMOywwBYAjODgIwAg3RBCAE0wYgAg7IDHUFMAFVwgpwcDDCCnBwMMIKcHAw1CXTDiDTDiDTDiDTDiDTDiDTDiDTDiDTDiDCDHV1BCDCCnBwMMIKcHAwwgpwcDDCDnp6OsIKcHAwwgpwcDDCCnBwMMIKUAYMfT3DCAJQBgzPCwRQAwnPjnFAgW3PCgRQAwnPjWFAgW3PCQNAAdANAzABzgoDUAPLjnFAgWzKCwRQAwnKjoJQBgzKDAVQAgnLDQJQBQzNClAGd0fCCnBwMMIKcHAwwgpwcDDCDHR0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",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 42,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 20,
+ "char": 34,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 71,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 35,
+ "bitmap_byte_count": 150
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 221,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 162
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 383,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 179
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 562,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 160
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 722,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 20,
+ "char": 39,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 737,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 65
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 802,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 65
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 867,
+ "width": 15,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 16,
+ "char": 42,
+ "bitmap_byte_count": 70
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 937,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 63
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1000,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 24,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1021,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 45,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1042,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 20,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1058,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 52
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1110,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 126
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1236,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 49,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1281,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 50,
+ "bitmap_byte_count": 125
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1406,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 140
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1546,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 52,
+ "bitmap_byte_count": 112
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1658,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 155
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1813,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 156
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1969,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 55,
+ "bitmap_byte_count": 103
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2072,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 159
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2231,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 161
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2392,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2427,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2466,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 60,
+ "bitmap_byte_count": 98
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2564,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 110
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2674,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 62,
+ "bitmap_byte_count": 93
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2767,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2863,
+ "width": 28,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 289
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3152,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 65,
+ "bitmap_byte_count": 104
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3256,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 66,
+ "bitmap_byte_count": 137
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3393,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 67,
+ "bitmap_byte_count": 148
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3541,
+ "width": 20,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 68,
+ "bitmap_byte_count": 120
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3661,
+ "width": 17,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 69,
+ "bitmap_byte_count": 130
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3791,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 70,
+ "bitmap_byte_count": 95
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3886,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 166
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4052,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 72,
+ "bitmap_byte_count": 80
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4132,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 73,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4152,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 74,
+ "bitmap_byte_count": 64
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4216,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 75,
+ "bitmap_byte_count": 110
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4326,
+ "width": 16,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 76,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4373,
+ "width": 25,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 77,
+ "bitmap_byte_count": 123
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4496,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 78,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4587,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 148
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4735,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 80,
+ "bitmap_byte_count": 99
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 4834,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 81,
+ "bitmap_byte_count": 166
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5000,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 82,
+ "bitmap_byte_count": 123
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5123,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 167
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5290,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 84,
+ "bitmap_byte_count": 75
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5365,
+ "width": 21,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5453,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 86,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5549,
+ "width": 28,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 87,
+ "bitmap_byte_count": 156
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5705,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 88,
+ "bitmap_byte_count": 138
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5843,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 89,
+ "bitmap_byte_count": 91
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5934,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 90,
+ "bitmap_byte_count": 140
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6074,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6128,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6182,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6236,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 16,
+ "char": 94,
+ "bitmap_byte_count": 55
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6291,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 28,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 95,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6332,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 4,
+ "y_max_offset": 24,
+ "char": 96,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6353,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 117
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6470,
+ "width": 18,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 103
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6573,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 104
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6677,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 105
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6782,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 133
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6915,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 102,
+ "bitmap_byte_count": 66
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 6981,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 145
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7126,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 104,
+ "bitmap_byte_count": 72
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7198,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 105,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7235,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 58
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7293,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 107,
+ "bitmap_byte_count": 93
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7386,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 108,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7410,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 109,
+ "bitmap_byte_count": 94
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7504,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 110,
+ "bitmap_byte_count": 60
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7564,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 108
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7672,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 114
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7786,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 107
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7893,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 114,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 7931,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 121
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8052,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 65
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8117,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 66
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8183,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 118,
+ "bitmap_byte_count": 71
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8254,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 119,
+ "bitmap_byte_count": 110
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8364,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 120,
+ "bitmap_byte_count": 90
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8454,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 96
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8550,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 122,
+ "bitmap_byte_count": 88
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8638,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 78
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8716,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8745,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 79
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8824,
+ "width": 19,
+ "x_min_offset": 2,
+ "y_min_offset": 16,
+ "x_max_offset": 2,
+ "y_max_offset": 12,
+ "char": 126,
+ "bitmap_byte_count": 61
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.inc b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.inc
new file mode 100644
index 00000000..2e52f7f9
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.inc
@@ -0,0 +1,682 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapINTER_SEMIBOLD_28PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x11, 0xF0, 0x2E, 0x24, 0xF0, 0x1E, 0x24, 0xF0,
+ 0x1E, 0x24, 0xF0, 0x14, 0xD2, 0x60,
+//ascii 0x0022
+ 0x77, 0xF0, 0xE7, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0x27, 0xF0, 0xE7, 0x20,
+//ascii 0x0023
+ 0x41, 0xF0, 0xF0, 0x53, 0xF0, 0xD1, 0x43, 0x43,
+ 0xF0, 0x68, 0x43, 0xF0, 0x6F, 0xF0, 0x8F, 0x02,
+ 0xF0, 0x7F, 0xF0, 0x63, 0x48, 0xF0, 0x63, 0x43,
+ 0xF0, 0xB3, 0x43, 0xF0, 0x68, 0x43, 0xF0, 0x6F,
+ 0xF0, 0x7F, 0x02, 0xF0, 0x8F, 0xF0, 0x63, 0x48,
+ 0xF0, 0x63, 0x43, 0x41, 0xF0, 0xD3, 0xF0, 0xF0,
+ 0x51, 0x60,
+//ascii 0x0024
+ 0x01, 0x74, 0xF0, 0x73, 0x67, 0xF0, 0x44, 0x59,
+ 0xF0, 0x25, 0x4A, 0xF0, 0x24, 0x54, 0x34, 0xF0,
+ 0x13, 0x63, 0x53, 0xF4, 0x54, 0x53, 0xDF, 0x0B,
+ 0xAF, 0x0B, 0xD3, 0x44, 0x63, 0xF0, 0x13, 0x44,
+ 0x63, 0xF0, 0x1A, 0x64, 0xF0, 0x29, 0x45, 0xF0,
+ 0x38, 0x55, 0xF0, 0x55, 0x64, 0xF0, 0xF0, 0x22,
+//ascii 0x0025
+ 0x07, 0xF0, 0x11, 0xB9, 0xF0, 0x12, 0x93, 0x33,
+ 0xF0, 0x13, 0x82, 0x53, 0xF0, 0x14, 0x62, 0x53,
+ 0xF0, 0x33, 0x53, 0x33, 0xF0, 0x54, 0x39, 0xF0,
+ 0x64, 0x37, 0xF0, 0x94, 0xF0, 0xF0, 0x34, 0xF0,
+ 0xA6, 0x33, 0xF0, 0x88, 0x34, 0xF0, 0x5A, 0x43,
+ 0xF0, 0x43, 0x43, 0x54, 0xF0, 0x22, 0x62, 0x73,
+ 0xF0, 0x13, 0x43, 0x83, 0xF0, 0x18, 0xB1, 0xF0,
+ 0x18, 0xB1, 0xF0, 0x34, 0x60,
+//ascii 0x0026
+ 0x71, 0xF0, 0xB4, 0x42, 0xF0, 0xB6, 0x13, 0xF0,
+ 0xBA, 0xF0, 0xE6, 0xF0, 0x36, 0x66, 0xF0, 0x28,
+ 0x48, 0xF0, 0x19, 0x24, 0x23, 0xF4, 0x38, 0x33,
+ 0xF3, 0x56, 0x43, 0xF4, 0x45, 0x53, 0xF0, 0x13,
+ 0x36, 0x53, 0xF0, 0x1D, 0x34, 0xF0, 0x27, 0x2A,
+ 0xF0, 0x35, 0x39, 0xF0, 0xD7, 0xF0, 0xF0, 0x13,
+ 0x40,
+//ascii 0x0027
+ 0x77, 0xF0, 0xE7, 0x60,
+//ascii 0x0028
+ 0x31, 0xF0, 0xF0, 0x53, 0xF0, 0x52, 0xB6, 0xE5,
+ 0xBF, 0x0A, 0xDF, 0x07, 0xF0, 0x1F, 0x03, 0xF0,
+ 0x6C, 0x20,
+//ascii 0x0029
+ 0x2C, 0xF0, 0x6F, 0x03, 0xF0, 0x1F, 0x07, 0xCC,
+ 0x1C, 0xB6, 0xE5, 0xB3, 0xF0, 0x52, 0xB1, 0xF0,
+ 0x81, 0x40,
+//ascii 0x002A
+ 0x12, 0x31, 0xF0, 0xE3, 0x23, 0xF0, 0xE3, 0x12,
+ 0xF0, 0xF0, 0x15, 0xF0, 0xDB, 0xF0, 0xAB, 0xF0,
+ 0xA2, 0x23, 0x22, 0xF0, 0xD5, 0xF0, 0xF3, 0x12,
+ 0xF0, 0xE3, 0x23, 0xF0, 0xF1, 0x31, 0x10,
+//ascii 0x002B
+ 0x63, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xDE, 0xF0,
+ 0x7E, 0xF0, 0x7E, 0xF0, 0xC3, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0x70,
+//ascii 0x002C
+ 0x14, 0xF0, 0xF0, 0x27, 0xF0, 0xE8, 0xF0, 0xF0,
+ 0x24, 0x30,
+//ascii 0x002D
+ 0x23, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0x30,
+//ascii 0x002E
+ 0x74, 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x24, 0xF0,
+ 0xF0, 0x33, 0x10,
+//ascii 0x002F
+ 0x22, 0xF0, 0xF0, 0x46, 0xF0, 0xFA, 0xF0, 0xDB,
+ 0xF0, 0xDC, 0xF0, 0xDC, 0xF0, 0xDB, 0xF0, 0xD8,
+ 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x51, 0x20,
+//ascii 0x0030
+ 0x5A, 0xF0, 0x9E, 0xF0, 0x5F, 0x02, 0xF0, 0x4F,
+ 0x03, 0xF0, 0x25, 0xA5, 0xF0, 0x13, 0xD4, 0xF0,
+ 0x13, 0xE3, 0xF3, 0xF3, 0xF4, 0xE3, 0xF0, 0x13,
+ 0xE3, 0xF0, 0x14, 0xC4, 0xF0, 0x17, 0x66, 0xF0,
+ 0x3F, 0x03, 0xF0, 0x4F, 0x01, 0xF0, 0x7C, 0xF0,
+ 0xD3, 0x10,
+//ascii 0x0031
+ 0x3F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x14, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x43, 0xF0, 0xF0, 0x34, 0x30,
+//ascii 0x0032
+ 0x53, 0xF0, 0x37, 0x83, 0xF0, 0x29, 0x73, 0xF0,
+ 0x1B, 0x63, 0xF0, 0x14, 0x35, 0x53, 0xF0, 0x13,
+ 0x64, 0x43, 0xF4, 0x74, 0x33, 0xF3, 0x94, 0x23,
+ 0xF4, 0x94, 0x13, 0xF0, 0x13, 0xA7, 0xF0, 0x14,
+ 0xA6, 0xF0, 0x16, 0x95, 0xF0, 0x25, 0xA4, 0xF0,
+ 0x34, 0xB3, 0x40,
+//ascii 0x0033
+ 0x13, 0xF0, 0x84, 0x47, 0xF0, 0x47, 0x29, 0xF0,
+ 0x38, 0x19, 0xF0, 0x29, 0x13, 0x25, 0xF0, 0x13,
+ 0x45, 0x53, 0xF4, 0x53, 0x63, 0xF3, 0x63, 0x63,
+ 0xF3, 0x63, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0,
+ 0x13, 0xD4, 0xF0, 0x15, 0xA5, 0xF0, 0x24, 0x95,
+ 0xF0, 0x43, 0x94, 0xF0, 0x62, 0x93, 0x30,
+//ascii 0x0034
+ 0x43, 0xF0, 0xF0, 0x33, 0xF0, 0x5F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x15, 0x83, 0xF0, 0x65, 0x73, 0xF0, 0x76,
+ 0x53, 0xF0, 0x95, 0x43, 0xF0, 0xA6, 0x23, 0xF0,
+ 0xC9, 0xF0, 0xD8, 0xF0, 0xF6, 0xF0, 0xF0, 0x24,
+ 0xF0, 0xF0, 0x33, 0x50,
+//ascii 0x0035
+ 0x16, 0xF0, 0x53, 0x69, 0xF0, 0x33, 0x5B, 0xF0,
+ 0x23, 0x45, 0x25, 0xF0, 0x23, 0x44, 0x54, 0xF0,
+ 0x13, 0x43, 0x73, 0xF0, 0x13, 0x43, 0x73, 0xF0,
+ 0x13, 0x42, 0x83, 0xF0, 0x13, 0x43, 0x73, 0xF0,
+ 0x13, 0x52, 0x64, 0xF0, 0x1B, 0x45, 0xF0, 0x1B,
+ 0x35, 0xF0, 0x2A, 0x44, 0xF0, 0xB2, 0x43, 0x40,
+//ascii 0x0036
+ 0x03, 0xF0, 0x92, 0x48, 0xF0, 0x54, 0x3A, 0xF0,
+ 0x35, 0x2C, 0xF0, 0x24, 0x34, 0x45, 0xF0, 0x13,
+ 0x43, 0x73, 0xF4, 0x43, 0x73, 0xF4, 0x42, 0x83,
+ 0xF4, 0x43, 0x73, 0xF0, 0x13, 0x43, 0x73, 0xF0,
+ 0x14, 0x43, 0x54, 0xF0, 0x16, 0x34, 0x15, 0xF0,
+ 0x3F, 0x03, 0xF0, 0x4F, 0x01, 0xF0, 0x7C, 0xF0,
+ 0xE2, 0x50,
+//ascii 0x0037
+ 0x34, 0xF0, 0xF0, 0x26, 0xF0, 0xF8, 0xF0, 0xDA,
+ 0xF0, 0xB3, 0x18, 0xF0, 0x93, 0x38, 0xF0, 0x73,
+ 0x58, 0xF0, 0x53, 0x78, 0xF0, 0x33, 0x98, 0xF0,
+ 0x13, 0xB6, 0xF0, 0x13, 0xD4, 0xF0, 0x13, 0xF2,
+ 0xF0, 0x13, 0xF0, 0xF0, 0x33, 0x60,
+//ascii 0x0038
+ 0x22, 0xF0, 0x84, 0x47, 0xF0, 0x47, 0x29, 0xF0,
+ 0x38, 0x19, 0xF0, 0x2D, 0x34, 0xF0, 0x13, 0x45,
+ 0x53, 0xF4, 0x53, 0x63, 0xF3, 0x63, 0x63, 0xF3,
+ 0x63, 0x63, 0xF4, 0x53, 0x63, 0xF0, 0x13, 0x45,
+ 0x53, 0xF0, 0x19, 0x13, 0x34, 0xF0, 0x28, 0x19,
+ 0xF0, 0x37, 0x29, 0xF0, 0x54, 0x47, 0xF0, 0xF0,
+ 0x21, 0x10,
+//ascii 0x0039
+ 0x35, 0xF0, 0xCD, 0xF0, 0x7F, 0xF0, 0x5F, 0x03,
+ 0xF0, 0x25, 0x24, 0x35, 0xF0, 0x23, 0x63, 0x44,
+ 0xF0, 0x13, 0x72, 0x53, 0xF3, 0x83, 0x43, 0xF3,
+ 0x83, 0x43, 0xF0, 0x13, 0x73, 0x43, 0xF0, 0x13,
+ 0x64, 0x34, 0xF0, 0x15, 0x35, 0x25, 0xF0, 0x2B,
+ 0x25, 0xF0, 0x3A, 0x34, 0xF0, 0x67, 0x43, 0x30,
+//ascii 0x003A
+ 0x53, 0x74, 0xF0, 0x64, 0x74, 0xF0, 0x64, 0x74,
+ 0xF0, 0x73, 0x83, 0x10,
+//ascii 0x003B
+ 0x12, 0xF0, 0xF0, 0x34, 0x84, 0xF0, 0x54, 0x87,
+ 0xF0, 0x24, 0x88, 0xF0, 0x22, 0xD4, 0x40,
+//ascii 0x003C
+ 0x04, 0x84, 0xF0, 0x63, 0x74, 0xF0, 0x74, 0x63,
+ 0xF0, 0x93, 0x54, 0xF0, 0x94, 0x43, 0xF0, 0xB3,
+ 0x43, 0xF0, 0xB4, 0x24, 0xF0, 0xC3, 0x23, 0xF0,
+ 0xD3, 0x14, 0xF0, 0xE6, 0xF0, 0xF6, 0xF0, 0xF0,
+ 0x14, 0xF0, 0xF0, 0x24, 0x60,
+//ascii 0x003D
+ 0x33, 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43,
+ 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3,
+ 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0,
+ 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43,
+ 0xF0, 0xB3, 0x43, 0xF0, 0xB3, 0x43, 0x30,
+//ascii 0x003E
+ 0x64, 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x16, 0xF0,
+ 0xF6, 0xF0, 0xE8, 0xF0, 0xD3, 0x23, 0xF0, 0xC4,
+ 0x23, 0xF0, 0xC3, 0x43, 0xF0, 0xA4, 0x43, 0xF0,
+ 0xA3, 0x54, 0xF0, 0x93, 0x63, 0xF0, 0x84, 0x64,
+ 0xF0, 0x64, 0x84,
+//ascii 0x003F
+ 0x74, 0xF0, 0xF7, 0xF0, 0xD9, 0xF0, 0xCA, 0xF0,
+ 0xB3, 0x44, 0xF0, 0x94, 0x56, 0x24, 0xF3, 0x66,
+ 0x24, 0xF4, 0x65, 0x24, 0xF0, 0x13, 0x83, 0x24,
+ 0xF0, 0x15, 0xF0, 0xF0, 0x15, 0xF0, 0xF0, 0x24,
+ 0xF0, 0xF0, 0x42, 0x70,
+//ascii 0x0040
+ 0x46, 0xF0, 0xCC, 0xF0, 0x7F, 0xF0, 0x56, 0x65,
+ 0xF0, 0x35, 0xA3, 0xF0, 0x33, 0xC3, 0xF0, 0x23,
+ 0xD3, 0x23, 0xC3, 0x2E, 0x23, 0xB3, 0x3D, 0x33,
+ 0xB3, 0x3C, 0x52, 0xB3, 0x34, 0x63, 0x43, 0xA3,
+ 0x33, 0x83, 0x33, 0xA3, 0x33, 0x83, 0x33, 0xA3,
+ 0x33, 0x83, 0x33, 0xA3, 0x33, 0x83, 0x33, 0xA3,
+ 0x34, 0x64, 0x23, 0xB3, 0x45, 0x25, 0x33, 0xC3,
+ 0x4A, 0x43, 0xC3, 0x58, 0x44, 0xD3, 0x71, 0x83,
+ 0xE4, 0xD5, 0xF5, 0xA5, 0xF0, 0x2F, 0x03, 0xF0,
+ 0x4F, 0x01, 0xF0, 0x7C, 0x20,
+//ascii 0x0041
+ 0x21, 0xF0, 0xF0, 0x33, 0xF0, 0xF6, 0xF0, 0xC9,
+ 0xF0, 0x9C, 0xF0, 0x7B, 0xF0, 0x7C, 0xF0, 0x6B,
+ 0x13, 0xF0, 0x68, 0x43, 0xF0, 0x65, 0x73, 0xF0,
+ 0x65, 0x73, 0xF0, 0x68, 0x43, 0xF0, 0x7A, 0x13,
+ 0xF0, 0x9C, 0xF0, 0xCB, 0xF0, 0xDB, 0xF0, 0xD8,
+ 0xF0, 0xF0, 0x15, 0xF0, 0xF0, 0x42, 0x50,
+//ascii 0x0042
+ 0x75, 0xF0, 0x66, 0x37, 0xF0, 0x48, 0x19, 0xF0,
+ 0x29, 0x1A, 0xF0, 0x14, 0x26, 0x44, 0xF0, 0x13,
+ 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0, 0x13,
+ 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0, 0x13,
+ 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0, 0x1F,
+ 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0,
+ 0x1F, 0x05, 0x10,
+//ascii 0x0043
+ 0x43, 0x63, 0xF0, 0x75, 0x64, 0xF0, 0x56, 0x65,
+ 0xF0, 0x45, 0x85, 0xF0, 0x24, 0xC4, 0xF0, 0x13,
+ 0xD4, 0xF0, 0x13, 0xE3, 0xF4, 0xE3, 0xF4, 0xE3,
+ 0xF0, 0x13, 0xE3, 0xF0, 0x13, 0xD4, 0xF0, 0x14,
+ 0xC4, 0xF0, 0x15, 0xA4, 0xF0, 0x36, 0x57, 0xF0,
+ 0x4F, 0x01, 0xF0, 0x6E, 0xF0, 0x9A, 0xF0, 0xF2,
+ 0x10,
+//ascii 0x0044
+ 0x26, 0xF0, 0xCB, 0xF0, 0x9E, 0xF0, 0x6F, 0x01,
+ 0xF0, 0x45, 0x76, 0xF0, 0x25, 0xA4, 0xF0, 0x24,
+ 0xC3, 0xF0, 0x23, 0xD4, 0xF0, 0x13, 0xE3, 0xF0,
+ 0x13, 0xE3, 0xF0, 0x13, 0xE3, 0xF0, 0x13, 0xE3,
+ 0xF0, 0x13, 0xE3, 0xF0, 0x1F, 0x05, 0xF0, 0x1F,
+ 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x0045
+ 0x73, 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0,
+ 0x13, 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0,
+ 0x13, 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0,
+ 0x13, 0x53, 0x63, 0xF0, 0x13, 0x53, 0x63, 0xF0,
+ 0x13, 0x53, 0x63, 0xF0, 0x1F, 0x05, 0xF0, 0x1F,
+ 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x50,
+//ascii 0x0046
+ 0x33, 0xF0, 0xF0, 0x33, 0x53, 0xF0, 0xA3, 0x53,
+ 0xF0, 0xA3, 0x53, 0xF0, 0xA3, 0x53, 0xF0, 0xA3,
+ 0x53, 0xF0, 0xA3, 0x53, 0xF0, 0xA3, 0x53, 0xF0,
+ 0xA3, 0x53, 0xF0, 0xAF, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x0047
+ 0x54, 0xF0, 0xC2, 0x37, 0xF0, 0x74, 0x39, 0xF0,
+ 0x45, 0x3A, 0xF0, 0x35, 0x33, 0x25, 0xF0, 0x24,
+ 0x53, 0x44, 0xF0, 0x13, 0x63, 0x44, 0xF4, 0x63,
+ 0x53, 0xF4, 0x63, 0x53, 0xF4, 0xE3, 0xF4, 0xE3,
+ 0xF0, 0x13, 0xD4, 0xF0, 0x14, 0xC4, 0xF0, 0x15,
+ 0xA4, 0xF0, 0x36, 0x66, 0xF0, 0x4F, 0x01, 0xF0,
+ 0x6E, 0xF0, 0x9A, 0xF0, 0xF2, 0x10,
+//ascii 0x0048
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x93, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xAF, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F,
+ 0x05, 0x50,
+//ascii 0x0049
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x004A
+ 0x7F, 0x01, 0xF0, 0x5F, 0x03, 0xF0, 0x3F, 0x04,
+ 0xF0, 0x2F, 0x05, 0xF0, 0xF0, 0x24, 0xF0, 0xF0,
+ 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x15, 0xF0, 0xF0, 0x14,
+ 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x23, 0x70,
+//ascii 0x004B
+ 0x31, 0xF0, 0x31, 0xF0, 0x12, 0xF3, 0xF0, 0x13,
+ 0xD4, 0xF0, 0x14, 0xA6, 0xF0, 0x15, 0x86, 0xF0,
+ 0x36, 0x56, 0xF0, 0x56, 0x26, 0xF0, 0x9B, 0xF0,
+ 0xB9, 0xF0, 0xD6, 0xF0, 0xF0, 0x15, 0xF0, 0xF0,
+ 0x25, 0xF0, 0x8F, 0x05, 0xF0, 0x1F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x50,
+//ascii 0x004C
+ 0x43, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x004D
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x16, 0xF0, 0xF9, 0xF0, 0xF8, 0xF0, 0xF9,
+ 0xF0, 0xF8, 0xF0, 0xF9, 0xF0, 0xF7, 0xF0, 0xF6,
+ 0xF0, 0xD8, 0xF0, 0xA9, 0xF0, 0xA8, 0xF0, 0xA9,
+ 0xF0, 0xA8, 0xF0, 0xB8, 0xF0, 0xDF, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0x50,
+//ascii 0x004E
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0xE6, 0xF0, 0xE5, 0xF0,
+ 0xE6, 0xF0, 0xE5, 0xF0, 0xE6, 0xF0, 0xE5, 0xF0,
+ 0xE6, 0xF0, 0xE6, 0xF0, 0xD6, 0xF0, 0xEF, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F,
+ 0x05, 0x50,
+//ascii 0x004F
+ 0x59, 0xF0, 0xAD, 0xF0, 0x7F, 0x01, 0xF0, 0x4F,
+ 0x02, 0xF0, 0x44, 0x95, 0xF0, 0x24, 0xC4, 0xF0,
+ 0x13, 0xD4, 0xF4, 0xE3, 0xF4, 0xE3, 0xF4, 0xE3,
+ 0xF0, 0x13, 0xE3, 0xF0, 0x13, 0xD4, 0xF0, 0x14,
+ 0xC4, 0xF0, 0x15, 0xA4, 0xF0, 0x36, 0x57, 0xF0,
+ 0x4F, 0x01, 0xF0, 0x6E, 0xF0, 0x9A, 0xF0, 0xF2,
+ 0x50,
+//ascii 0x0050
+ 0x75, 0xF0, 0xE9, 0xF0, 0xBB, 0xF0, 0x9C, 0xF0,
+ 0x94, 0x54, 0xF0, 0x83, 0x73, 0xF0, 0x83, 0x73,
+ 0xF0, 0x83, 0x73, 0xF0, 0x83, 0x73, 0xF0, 0x83,
+ 0x73, 0xF0, 0x83, 0x73, 0xF0, 0x8F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0x10,
+//ascii 0x0051
+ 0x59, 0x71, 0xF0, 0x2D, 0x42, 0xF0, 0x1F, 0x01,
+ 0x13, 0xFF, 0x06, 0xF4, 0x97, 0xF4, 0xB5, 0xF0,
+ 0x13, 0xB6, 0xF4, 0xA7, 0xF4, 0xA3, 0x13, 0xF4,
+ 0xA1, 0x33, 0xF0, 0x13, 0xE3, 0xF0, 0x13, 0xD4,
+ 0xF0, 0x14, 0xC4, 0xF0, 0x15, 0xA4, 0xF0, 0x36,
+ 0x57, 0xF0, 0x4F, 0x01, 0xF0, 0x6E, 0xF0, 0x9A,
+ 0xF0, 0xF2, 0x50,
+//ascii 0x0052
+ 0x21, 0xF0, 0x54, 0xA2, 0xF0, 0x38, 0x64, 0xF0,
+ 0x2A, 0x36, 0xF0, 0x1C, 0x17, 0xF0, 0x14, 0x4A,
+ 0xF0, 0x33, 0x67, 0xF0, 0x53, 0x66, 0xF0, 0x63,
+ 0x64, 0xF0, 0x83, 0x64, 0xF0, 0x83, 0x64, 0xF0,
+ 0x83, 0x64, 0xF0, 0x8F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x0053
+ 0x01, 0x74, 0xF0, 0x73, 0x67, 0xF0, 0x44, 0x59,
+ 0xF0, 0x25, 0x4A, 0xF0, 0x24, 0x54, 0x34, 0xF0,
+ 0x13, 0x63, 0x53, 0xF4, 0x54, 0x53, 0xF4, 0x53,
+ 0x63, 0xF4, 0x53, 0x63, 0xF0, 0x13, 0x44, 0x63,
+ 0xF0, 0x13, 0x44, 0x63, 0xF0, 0x1A, 0x64, 0xF0,
+ 0x29, 0x45, 0xF0, 0x38, 0x55, 0xF0, 0x55, 0x64,
+ 0xF0, 0xF0, 0x22,
+//ascii 0x0054
+ 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x3F, 0x05, 0xF0, 0x1F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x13, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0x60,
+//ascii 0x0055
+ 0x7E, 0xF0, 0x7F, 0x02, 0xF0, 0x4F, 0x03, 0xF0,
+ 0x3F, 0x04, 0xF0, 0xF0, 0x15, 0xF0, 0xF0, 0x34,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x24, 0xF0, 0xF0, 0x15, 0xF0, 0x1F, 0x04,
+ 0xF0, 0x2F, 0x03, 0xF0, 0x3F, 0x02, 0xF0, 0x4F,
+ 0x01, 0x10,
+//ascii 0x0056
+ 0x71, 0xF0, 0xF0, 0x53, 0xF0, 0xF0, 0x36, 0xF0,
+ 0xF8, 0xF0, 0xDB, 0xF0, 0xDB, 0xF0, 0xDB, 0xF0,
+ 0xDB, 0xF0, 0xD8, 0xF0, 0xF0, 0x15, 0xF0, 0xF6,
+ 0xF0, 0xC9, 0xF0, 0x9B, 0xF0, 0x7B, 0xF0, 0x7B,
+ 0xF0, 0x8A, 0xF0, 0xB8, 0xF0, 0xD5, 0xF0, 0xF0,
+ 0x12, 0x70,
+//ascii 0x0057
+ 0x71, 0xF0, 0xF0, 0x54, 0xF0, 0xF0, 0x27, 0xF0,
+ 0xEB, 0xF0, 0xAE, 0xF0, 0xBE, 0xF0, 0xBC, 0xF0,
+ 0xE7, 0xF0, 0xE7, 0xF0, 0xBA, 0xF0, 0x7B, 0xF0,
+ 0x6C, 0xF0, 0x7A, 0xF0, 0xB7, 0xF0, 0xE8, 0xF0,
+ 0xDB, 0xF0, 0xDC, 0xF0, 0xCC, 0xF0, 0xDA, 0xF0,
+ 0xF6, 0xF0, 0xD8, 0xF0, 0x9C, 0xF0, 0x5D, 0xF0,
+ 0x4E, 0xF0, 0x7A, 0xF0, 0xB7, 0xF0, 0xE3, 0x60,
+//ascii 0x0058
+ 0x21, 0xF0, 0x11, 0xF0, 0x22, 0xF0, 0x13, 0xE3,
+ 0xF0, 0x14, 0xB5, 0xF0, 0x16, 0x86, 0xF0, 0x27,
+ 0x47, 0xF0, 0x47, 0x17, 0xF0, 0x8B, 0xF0, 0xC8,
+ 0xF0, 0xE6, 0xF0, 0xD9, 0xF0, 0xBC, 0xF0, 0x77,
+ 0x27, 0xF0, 0x37, 0x66, 0xF0, 0x25, 0x96, 0xF0,
+ 0x14, 0xC4, 0xF0, 0x12, 0xF3, 0xF0, 0x11, 0xF0,
+ 0x31, 0x10,
+//ascii 0x0059
+ 0x31, 0xF0, 0xF0, 0x52, 0xF0, 0xF0, 0x44, 0xF0,
+ 0xF0, 0x26, 0xF0, 0xF8, 0xF0, 0xF7, 0xF0, 0xF0,
+ 0x17, 0xF0, 0xF0, 0x1E, 0xF0, 0x9C, 0xF0, 0x9C,
+ 0xF0, 0x7E, 0xF0, 0x67, 0xF0, 0xC7, 0xF0, 0xC7,
+ 0xF0, 0xD6, 0xF0, 0xF5, 0xF0, 0xF0, 0x13, 0xF0,
+ 0xF0, 0x31,
+//ascii 0x005A
+ 0x32, 0xF3, 0xF0, 0x14, 0xD3, 0xF0, 0x15, 0xC3,
+ 0xF0, 0x16, 0xB3, 0xF0, 0x18, 0x93, 0xF0, 0x13,
+ 0x15, 0x83, 0xF0, 0x13, 0x26, 0x63, 0xF0, 0x13,
+ 0x36, 0x53, 0xF0, 0x13, 0x56, 0x33, 0xF0, 0x13,
+ 0x66, 0x23, 0xF0, 0x13, 0x89, 0xF0, 0x13, 0x98,
+ 0xF0, 0x13, 0xB6, 0xF0, 0x13, 0xC5, 0xF0, 0x13,
+ 0xD4, 0x10,
+//ascii 0x005B
+ 0x33, 0xF0, 0x52, 0xB3, 0xF0, 0x52, 0xB3, 0xF0,
+ 0x52, 0xBF, 0x0A, 0xBF, 0x0A, 0xBF, 0x0A, 0xBF,
+ 0x0A, 0x40,
+//ascii 0x005C
+ 0x02, 0xF0, 0xF6, 0xF0, 0xBA, 0xF0, 0x7C, 0xF0,
+ 0x6B, 0xF0, 0x6C, 0xF0, 0x6B, 0xF0, 0xA7, 0xF0,
+ 0xE4, 0xF0, 0xF0, 0x21, 0x10,
+//ascii 0x005D
+ 0x3F, 0x0A, 0xBF, 0x0A, 0xBF, 0x0A, 0xBF, 0x0A,
+ 0xB3, 0xF0, 0x52, 0xB3, 0xF0, 0x52, 0xB3, 0xF0,
+ 0x52, 0x40,
+//ascii 0x005E
+ 0x32, 0xF0, 0xF0, 0x24, 0xF0, 0xF6, 0xF0, 0xC6,
+ 0xF0, 0xF4, 0xF0, 0xF0, 0x23, 0xF0, 0xF0, 0x35,
+ 0xF0, 0xF0, 0x27, 0xF0, 0xF0, 0x25, 0xF0, 0xF0,
+ 0x33, 0xF0, 0xF0, 0x51, 0x30,
+//ascii 0x005F
+ 0x43, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0,
+ 0x33, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0x10,
+//ascii 0x0060
+ 0x21, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x15, 0xF0,
+ 0xF0, 0x14, 0xF0, 0xF0, 0x22, 0xF0, 0xF0, 0x41,
+ 0x50,
+//ascii 0x0061
+ 0x6D, 0xF0, 0x7E, 0xF0, 0x6F, 0xF0, 0x64, 0x13,
+ 0x32, 0xF0, 0x83, 0x32, 0x42, 0xF0, 0x72, 0x42,
+ 0x43, 0xF0, 0x62, 0x42, 0x52, 0xF0, 0x63, 0x33,
+ 0x42, 0xF0, 0x63, 0x33, 0x33, 0xF0, 0x64, 0x38,
+ 0xF0, 0x73, 0x38, 0xF0, 0x82, 0x46, 0xF0, 0xF0,
+ 0x14, 0x70,
+//ascii 0x0062
+ 0x79, 0xF0, 0xAC, 0xF0, 0x9D, 0xF0, 0x75, 0x46,
+ 0xF0, 0x63, 0x84, 0xF0, 0x63, 0x93, 0xF0, 0x63,
+ 0x93, 0xF0, 0x63, 0x93, 0xF0, 0x63, 0x93, 0xF0,
+ 0x73, 0x73, 0xF0, 0x2F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x0063
+ 0x32, 0x52, 0xF0, 0xA4, 0x53, 0xF0, 0x94, 0x54,
+ 0xF0, 0x75, 0x55, 0xF0, 0x63, 0x93, 0xF0, 0x63,
+ 0x93, 0xF0, 0x62, 0xA3, 0xF0, 0x63, 0x93, 0xF0,
+ 0x63, 0x93, 0xF0, 0x64, 0x65, 0xF0, 0x7D, 0xF0,
+ 0x8D, 0xF0, 0xA9, 0xF0, 0xE5, 0x20,
+//ascii 0x0064
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x82, 0x63, 0xF0, 0x83,
+ 0x92, 0xF0, 0x73, 0x93, 0xF0, 0x62, 0xA3, 0xF0,
+ 0x63, 0x93, 0xF0, 0x63, 0x93, 0xF0, 0x64, 0x65,
+ 0xF0, 0x6E, 0xF0, 0x8D, 0xF0, 0x9B, 0xF0, 0xD5,
+ 0x20,
+//ascii 0x0065
+ 0x75, 0x32, 0xF0, 0xA6, 0x33, 0xF0, 0x87, 0x33,
+ 0xF0, 0x74, 0x22, 0x34, 0xF0, 0x63, 0x32, 0x43,
+ 0xF0, 0x63, 0x32, 0x43, 0xF0, 0x62, 0x42, 0x43,
+ 0xF0, 0x62, 0x42, 0x43, 0xF0, 0x63, 0x32, 0x43,
+ 0xF0, 0x64, 0x22, 0x34, 0xF0, 0x7D, 0xF0, 0x8D,
+ 0xF0, 0xA9, 0xF0, 0xE5, 0x60,
+//ascii 0x0066
+ 0x23, 0x33, 0xF0, 0xC3, 0x33, 0xF0, 0xC3, 0x33,
+ 0xF0, 0xC4, 0x23, 0xF0, 0xCF, 0x06, 0xF0, 0x1F,
+ 0x05, 0xF0, 0x2F, 0x04, 0xF0, 0x63, 0xF0, 0xF0,
+ 0x33, 0x50,
+//ascii 0x0067
+ 0x4F, 0x02, 0xF0, 0x4F, 0x04, 0xF0, 0x2F, 0x05,
+ 0xF0, 0x1F, 0x05, 0xF0, 0x32, 0x63, 0x44, 0xF3,
+ 0x83, 0x43, 0xF3, 0x92, 0x43, 0xF2, 0xA3, 0x33,
+ 0xF3, 0x93, 0x33, 0xF3, 0x84, 0x33, 0xF4, 0x64,
+ 0x34, 0xFE, 0x24, 0xF0, 0x2C, 0x43, 0xF0, 0x3A,
+ 0x52, 0xF0, 0x75, 0x20,
+//ascii 0x0068
+ 0x6D, 0xF0, 0x7E, 0xF0, 0x6F, 0xF0, 0x64, 0xF0,
+ 0xF0, 0x23, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x42, 0xF0, 0xF0,
+ 0x53, 0xF0, 0xBF, 0x05, 0xF0, 0x1F, 0x05, 0xF0,
+ 0x1F, 0x05, 0x50,
+//ascii 0x0069
+ 0x32, 0xF0, 0xF0, 0x33, 0x3F, 0xF4, 0x2F, 0xF3,
+ 0x3F, 0x50,
+//ascii 0x006A
+ 0x31, 0xF0, 0xF0, 0x43, 0x3F, 0x04, 0xB4, 0x2F,
+ 0x05, 0xA3, 0x3F, 0x05, 0xF0, 0xF0, 0x34, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0x30,
+//ascii 0x006B
+ 0x21, 0xF0, 0x61, 0xC2, 0xF0, 0x62, 0xA3, 0xF0,
+ 0x63, 0x84, 0xF0, 0x64, 0x56, 0xF0, 0x65, 0x36,
+ 0xF0, 0x9A, 0xF0, 0xC8, 0xF0, 0xE6, 0xF0, 0xF0,
+ 0x14, 0xF0, 0xF0, 0x34, 0xF0, 0x6F, 0x05, 0xF0,
+ 0x1F, 0x05, 0xF0, 0x1F, 0x05, 0x10,
+//ascii 0x006C
+ 0x7F, 0x05, 0xF0, 0x1F, 0x05, 0xF0, 0x1F, 0x05,
+ 0x50,
+//ascii 0x006D
+ 0x6D, 0xF0, 0x6F, 0xF0, 0x6F, 0xF0, 0x64, 0xF0,
+ 0xF0, 0x23, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x44, 0xF0, 0xF0,
+ 0x3D, 0xF0, 0x6F, 0xF0, 0x6F, 0xF0, 0x64, 0xF0,
+ 0xF0, 0x23, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x42, 0xF0, 0xF0, 0x54, 0xF0, 0xFF,
+ 0xF0, 0x6F, 0xF0, 0x6F, 0x50,
+//ascii 0x006E
+ 0x6D, 0xF0, 0x7E, 0xF0, 0x6F, 0xF0, 0x65, 0xF0,
+ 0xF0, 0x13, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x42, 0xF0, 0xF0,
+ 0x53, 0xF0, 0xF0, 0x1F, 0xF0, 0x6F, 0xF0, 0x6F,
+ 0x50,
+//ascii 0x006F
+ 0x55, 0xF0, 0xE9, 0xF0, 0xAD, 0xF0, 0x8D, 0xF0,
+ 0x74, 0x74, 0xF0, 0x63, 0x93, 0xF0, 0x63, 0x93,
+ 0xF0, 0x62, 0xA3, 0xF0, 0x63, 0x93, 0xF0, 0x63,
+ 0x93, 0xF0, 0x64, 0x74, 0xF0, 0x7D, 0xF0, 0x8C,
+ 0xF0, 0xB9, 0xF0, 0xE5, 0x60,
+//ascii 0x0070
+ 0x39, 0xF0, 0xBB, 0xF0, 0x9D, 0xF0, 0x76, 0x27,
+ 0xF0, 0x64, 0x74, 0xF0, 0x63, 0x93, 0xF0, 0x63,
+ 0x93, 0xF0, 0x63, 0x93, 0xF0, 0x63, 0x93, 0xF0,
+ 0x73, 0x73, 0xF0, 0x94, 0x34, 0xF0, 0x8F, 0x06,
+ 0xFF, 0x06, 0xFF, 0x06, 0x70,
+//ascii 0x0071
+ 0x0F, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06,
+ 0xF0, 0x22, 0x63, 0xF0, 0x83, 0x92, 0xF0, 0x73,
+ 0x93, 0xF0, 0x62, 0xA3, 0xF0, 0x63, 0x93, 0xF0,
+ 0x63, 0x93, 0xF0, 0x64, 0x65, 0xF0, 0x6E, 0xF0,
+ 0x8D, 0xF0, 0x9B, 0xF0, 0xD5, 0x60,
+//ascii 0x0072
+ 0x43, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x33, 0xF0, 0xF0, 0x43, 0xF0, 0xF0, 0x43,
+ 0xF0, 0xF0, 0x1F, 0xF0, 0x6F, 0xF0, 0x6F, 0x50,
+//ascii 0x0073
+ 0x22, 0x45, 0xF0, 0x93, 0x37, 0xF0, 0x74, 0x37,
+ 0xF0, 0x74, 0x24, 0x14, 0xF0, 0x63, 0x33, 0x33,
+ 0xF0, 0x62, 0x43, 0x33, 0xF0, 0x62, 0x43, 0x42,
+ 0xF0, 0x63, 0x24, 0x33, 0xF0, 0x63, 0x23, 0x43,
+ 0xF0, 0x68, 0x25, 0xF0, 0x77, 0x33, 0xF0, 0x95,
+ 0x43, 0xF0, 0xF0, 0x31, 0x40,
+//ascii 0x0074
+ 0x71, 0xF0, 0x63, 0x93, 0xF0, 0x63, 0x93, 0xF0,
+ 0x63, 0x84, 0xF0, 0x2F, 0x04, 0xF0, 0x2F, 0x03,
+ 0xF0, 0x3F, 0x02, 0xF0, 0x83, 0xF0, 0xF0, 0x33,
+ 0x40,
+//ascii 0x0075
+ 0x4F, 0xF0, 0x6F, 0xF0, 0x6F, 0xF0, 0xF3, 0xF0,
+ 0xF0, 0x53, 0xF0, 0xF0, 0x43, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x24, 0xF0, 0xF0,
+ 0x15, 0xF0, 0x6F, 0xF0, 0x6E, 0xF0, 0x7D, 0x70,
+//ascii 0x0076
+ 0x03, 0xF0, 0xF0, 0x35, 0xF0, 0xF0, 0x18, 0xF0,
+ 0xDB, 0xF0, 0xDB, 0xF0, 0xE8, 0xF0, 0xF0, 0x15,
+ 0xF0, 0xF6, 0xF0, 0xC9, 0xF0, 0x9A, 0xF0, 0x8B,
+ 0xF0, 0xA8, 0xF0, 0xD5, 0xF0, 0xF0, 0x12, 0x20,
+//ascii 0x0077
+ 0x41, 0xF0, 0xF0, 0x54, 0xF0, 0xF0, 0x28, 0xF0,
+ 0xDB, 0xF0, 0xCD, 0xF0, 0xC9, 0xF0, 0xF0, 0x15,
+ 0xF0, 0xD8, 0xF0, 0x9B, 0xF0, 0x7B, 0xF0, 0xA7,
+ 0xF0, 0xE5, 0xF0, 0xF0, 0x19, 0xF0, 0xDB, 0xF0,
+ 0xEA, 0xF0, 0xF6, 0xF0, 0xE7, 0xF0, 0xAB, 0xF0,
+ 0x6D, 0xF0, 0x8A, 0xF0, 0xB6, 0xF0, 0xF3, 0x50,
+//ascii 0x0078
+ 0x01, 0xD1, 0xF0, 0x62, 0xB2, 0xF0, 0x64, 0x74,
+ 0xF0, 0x65, 0x46, 0xF0, 0x76, 0x16, 0xF0, 0x9A,
+ 0xF0, 0xD7, 0xF0, 0xF5, 0xF0, 0xE9, 0xF0, 0xAD,
+ 0xF0, 0x76, 0x36, 0xF0, 0x64, 0x74, 0xF0, 0x62,
+ 0xA3, 0xF0, 0x61, 0xD1, 0x50,
+//ascii 0x0079
+ 0x03, 0xF0, 0xF0, 0x35, 0xF0, 0xF0, 0x18, 0xF0,
+ 0xDB, 0xF0, 0xDB, 0xF0, 0xEA, 0xF0, 0xE9, 0xF0,
+ 0xCA, 0xF0, 0x7E, 0xF0, 0x4A, 0x43, 0xF0, 0x1B,
+ 0x73, 0xF8, 0xA3, 0xF5, 0xD3, 0xF2, 0x20,
+//ascii 0x007A
+ 0x43, 0x93, 0xF0, 0x64, 0x83, 0xF0, 0x65, 0x73,
+ 0xF0, 0x67, 0x53, 0xF0, 0x68, 0x43, 0xF0, 0x63,
+ 0x15, 0x33, 0xF0, 0x63, 0x26, 0x13, 0xF0, 0x63,
+ 0x48, 0xF0, 0x63, 0x57, 0xF0, 0x63, 0x66, 0xF0,
+ 0x63, 0x75, 0xF0, 0x63, 0x93, 0x10,
+//ascii 0x007B
+ 0x33, 0xF0, 0x43, 0xB3, 0xF0, 0x43, 0xB5, 0xF0,
+ 0x14, 0xCA, 0x3B, 0xCB, 0x1B, 0xEA, 0x1A, 0xF0,
+ 0x85, 0xF0, 0xF0, 0x24, 0xF0, 0xF0, 0x23, 0x70,
+//ascii 0x007C
+ 0x5F, 0x0F, 0x04, 0x2F, 0x0F, 0x04, 0x2F, 0x0F,
+ 0x04, 0x2F, 0x0F, 0x04, 0x50,
+//ascii 0x007D
+ 0x63, 0xF0, 0xF0, 0x34, 0xF0, 0xF0, 0x15, 0xF0,
+ 0x8A, 0x1A, 0xEB, 0x1B, 0xDA, 0x3B, 0xB5, 0xF0,
+ 0x14, 0xB3, 0xF0, 0x43, 0xB3, 0xF0, 0x43, 0x40,
+//ascii 0x007E
+ 0x02, 0xF0, 0xF0, 0x44, 0xF0, 0xF0, 0x25, 0xF0,
+ 0xF0, 0x34, 0xF0, 0xF0, 0x33, 0xF0, 0xF0, 0x33,
+ 0xF0, 0xF0, 0x23, 0xF0, 0xF0, 0x24, 0xF0, 0xF0,
+ 0x14, 0xF0, 0xF0, 0x23, 0xF0, 0xF0, 0x33, 0xF0,
+ 0xF0, 0x34, 0xF0, 0xF0, 0x25, 0xF0, 0xF0, 0x24,
+ 0xF0, 0xF0, 0x42, 0x30,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersINTER_SEMIBOLD_28PX_1BPP[95] = {
+ { 0, 0, 7,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 9,1, 4, 0, 0 }, //asciii 0x0021
+ { 14, 1, 11,1, 1, 0, 0 }, //asciii 0x0022
+ { 30, 1, 18,0, 1, 0, 0 }, //asciii 0x0023
+ { 80, 1, 18,0, 6, 0, 0 }, //asciii 0x0024
+ { 128, 1, 24,2, 0, 0, 0 }, //asciii 0x0025
+ { 189, 1, 19,0, 7, 0, 0 }, //asciii 0x0026
+ { 238, 1, 6,1, 1, 0, 0 }, //asciii 0x0027
+ { 242, 1, 11,0, 5, 0, 0 }, //asciii 0x0028
+ { 260, 1, 11,1, 7, 0, 0 }, //asciii 0x0029
+ { 278, 1, 15,1, 2, 0, 0 }, //asciii 0x002A
+ { 309, 1, 19,1, 7, 0, 0 }, //asciii 0x002B
+ { 343, 1, 8,1, 4, 0, 0 }, //asciii 0x002C
+ { 353, 1, 13,1, 3, 0, 0 }, //asciii 0x002D
+ { 379, 1, 8,1, 3, 0, 0 }, //asciii 0x002E
+ { 390, 1, 11,0, 5, 0, 0 }, //asciii 0x002F
+ { 413, 1, 19,1, 2, 0, 0 }, //asciii 0x0030
+ { 455, 1, 13,1, 6, 0, 0 }, //asciii 0x0031
+ { 478, 1, 17,0, 7, 0, 0 }, //asciii 0x0032
+ { 521, 1, 18,0, 7, 0, 0 }, //asciii 0x0033
+ { 568, 1, 19,1, 3, 0, 0 }, //asciii 0x0034
+ { 612, 1, 18,1, 3, 0, 0 }, //asciii 0x0035
+ { 660, 1, 18,0, 7, 0, 0 }, //asciii 0x0036
+ { 710, 1, 16,0, 5, 0, 0 }, //asciii 0x0037
+ { 748, 1, 18,0, 7, 0, 0 }, //asciii 0x0038
+ { 798, 1, 18,0, 6, 0, 0 }, //asciii 0x0039
+ { 846, 1, 8,1, 2, 0, 0 }, //asciii 0x003A
+ { 858, 1, 8,0, 6, 0, 0 }, //asciii 0x003B
+ { 873, 1, 19,1, 7, 0, 0 }, //asciii 0x003C
+ { 910, 1, 19,1, 7, 0, 0 }, //asciii 0x003D
+ { 949, 1, 19,1, 7, 0, 0 }, //asciii 0x003E
+ { 984, 1, 15,0, 5, 0, 0 }, //asciii 0x003F
+ { 1020, 1, 28,0, 6, 0, 0 }, //asciii 0x0040
+ { 1097, 1, 20,0, 3, 0, 0 }, //asciii 0x0041
+ { 1144, 1, 18,0, 6, 0, 0 }, //asciii 0x0042
+ { 1195, 1, 21,1, 2, 0, 0 }, //asciii 0x0043
+ { 1244, 1, 20,0, 6, 0, 0 }, //asciii 0x0044
+ { 1292, 1, 17,1, 1, 0, 0 }, //asciii 0x0045
+ { 1340, 1, 16,0, 5, 0, 0 }, //asciii 0x0046
+ { 1379, 1, 21,0, 6, 0, 0 }, //asciii 0x0047
+ { 1433, 1, 21,1, 1, 0, 0 }, //asciii 0x0048
+ { 1483, 1, 8,1, 1, 0, 0 }, //asciii 0x0049
+ { 1495, 1, 16,1, 1, 0, 0 }, //asciii 0x004A
+ { 1534, 1, 19,0, 5, 0, 0 }, //asciii 0x004B
+ { 1580, 1, 16,0, 7, 0, 0 }, //asciii 0x004C
+ { 1618, 1, 25,1, 1, 0, 0 }, //asciii 0x004D
+ { 1667, 1, 21,1, 1, 0, 0 }, //asciii 0x004E
+ { 1709, 1, 22,1, 2, 0, 0 }, //asciii 0x004F
+ { 1758, 1, 18,0, 5, 0, 0 }, //asciii 0x0050
+ { 1799, 1, 22,1, 2, 0, 0 }, //asciii 0x0051
+ { 1850, 1, 18,0, 3, 0, 0 }, //asciii 0x0052
+ { 1897, 1, 18,0, 6, 0, 0 }, //asciii 0x0053
+ { 1948, 1, 18,0, 5, 0, 0 }, //asciii 0x0054
+ { 1995, 1, 21,1, 1, 0, 0 }, //asciii 0x0055
+ { 2045, 1, 20,0, 0, 0, 0 }, //asciii 0x0056
+ { 2087, 1, 28,0, 0, 0, 0 }, //asciii 0x0057
+ { 2143, 1, 19,0, 3, 0, 0 }, //asciii 0x0058
+ { 2193, 1, 20,0, 5, 0, 0 }, //asciii 0x0059
+ { 2235, 1, 18,0, 5, 0, 0 }, //asciii 0x005A
+ { 2285, 1, 11,0, 5, 0, 0 }, //asciii 0x005B
+ { 2303, 1, 11,1, 0, 0, 0 }, //asciii 0x005C
+ { 2324, 1, 11,1, 6, 0, 0 }, //asciii 0x005D
+ { 2342, 1, 13,0, 6, 0, 0 }, //asciii 0x005E
+ { 2371, 1, 15,1, 4, 0, 0 }, //asciii 0x005F
+ { 2409, 1, 14,2, 3, 0, 0 }, //asciii 0x0060
+ { 2426, 1, 16,1, 2, 0, 0 }, //asciii 0x0061
+ { 2468, 1, 18,1, 2, 0, 0 }, //asciii 0x0062
+ { 2507, 1, 16,0, 6, 0, 0 }, //asciii 0x0063
+ { 2545, 1, 18,1, 1, 0, 0 }, //asciii 0x0064
+ { 2586, 1, 17,1, 2, 0, 0 }, //asciii 0x0065
+ { 2631, 1, 11,0, 5, 0, 0 }, //asciii 0x0066
+ { 2657, 1, 18,1, 2, 0, 0 }, //asciii 0x0067
+ { 2701, 1, 17,1, 2, 0, 0 }, //asciii 0x0068
+ { 2736, 1, 7,0, 5, 0, 0 }, //asciii 0x0069
+ { 2746, 1, 8,0, 5, 0, 0 }, //asciii 0x006A
+ { 2768, 1, 16,0, 3, 0, 0 }, //asciii 0x006B
+ { 2806, 1, 7,1, 1, 0, 0 }, //asciii 0x006C
+ { 2815, 1, 25,1, 2, 0, 0 }, //asciii 0x006D
+ { 2868, 1, 17,1, 2, 0, 0 }, //asciii 0x006E
+ { 2901, 1, 17,0, 6, 0, 0 }, //asciii 0x006F
+ { 2938, 1, 17,0, 6, 0, 0 }, //asciii 0x0070
+ { 2975, 1, 17,0, 6, 0, 0 }, //asciii 0x0071
+ { 3013, 1, 11,0, 1, 0, 0 }, //asciii 0x0072
+ { 3037, 1, 15,0, 6, 0, 0 }, //asciii 0x0073
+ { 3082, 1, 11,0, 7, 0, 0 }, //asciii 0x0074
+ { 3107, 1, 17,1, 2, 0, 0 }, //asciii 0x0075
+ { 3139, 1, 16,0, 6, 0, 0 }, //asciii 0x0076
+ { 3171, 1, 23,0, 1, 0, 0 }, //asciii 0x0077
+ { 3219, 1, 16,0, 6, 0, 0 }, //asciii 0x0078
+ { 3256, 1, 16,0, 6, 0, 0 }, //asciii 0x0079
+ { 3287, 1, 16,1, 2, 0, 0 }, //asciii 0x007A
+ { 3325, 1, 11,0, 5, 0, 0 }, //asciii 0x007B
+ { 3349, 1, 10,1, 5, 0, 0 }, //asciii 0x007C
+ { 3362, 1, 11,0, 6, 0, 0 }, //asciii 0x007D
+ { 3386, 1, 19,1, 3, 0, 0 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontINTER_SEMIBOLD_28PX_1BPP= {
+ 3430, // bitmap len
+ BAGL_FONT_INTER_SEMIBOLD_28px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 36, // height of all characters in pixels
+ 36, // line height in pixels
+ 0, // kerning
+ 0, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersINTER_SEMIBOLD_28PX_1BPP,
+ bitmapINTER_SEMIBOLD_28PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.json b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.json
new file mode 100644
index 00000000..5868d69a
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_inter_semibold_28_1bpp.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "EfAuJPAeJPAeJPAU0mB38Ofw8PDw8PDw8PAn8OcgQfDwU/DRQ0PwaEPwb/CPAvB/8GNI8GND8LND8GhD8G/wfwLwj/BjSPBjQ0Hw0/DwUWABdPBzZ/BEWfAlSvAkVDTwE2NT9FRT3wuvC9NEY/ATRGPwGmTwKUXwOFXwVWTw8CIH8BG58BKTM/ATglPwFGJT8DNTM/BUOfBkN/CU8PA08KYz8Ig08FpD8ENDVPAiYnPwE0OD8Bix8Bix8DRgcfC0QvC2E/C68ObwNmbwKEjwGSQj9Dgz81ZD9EVT8BM2U/AdNPAnKvA1OfDX8PATQHfw52Ax8PBT8FK25b8K3wfwHwPwbCAs8G8D8B8HzBy25bPwUrHwgUASMfDjI/DjEvDwFfDb8KvwoiMi8NXw8xLw4yPw8TEQY/DwM/DwM/DwM/DwM/De8H7wfvDD8PAz8PAz8PAz8PAzcBTw8Cfw6PDwJDAj8PAz8PAz8PAz8PAz8PAz8PAz8PAz8PAzMHTw8CTw8CTw8DMQIvDwRvD68Nvw3PDc8Nvw2PDwJPDwUSBa8J7wXwLwTwPwJaXwE9TwE+Pz8/Tj8BPj8BTE8Bdm8D8D8E8B8Hzw0xA/BfAfBfAfBfAfBfAU8PAz8PBD8PA0MFPwN4PwKXPwG2PwFDVT8BNkQ/R0M/OUI/SUE/ATp/AUpvAWlfAlpPA0s0AT8IRH8Ecp8DgZ8CkTJfATRVP0U2PzY2PzY2PwE1Nj8BPU8BWl8CSV8EOU8GKTMEPw8DPwXwXwHwXwHwXwHwXwFYPwZXPwdlPwlUPwpiPwyfDY8Pbw8CTw8DNQFvBTafAzW/AjRSXwI0RU8BNDc/ATQ3PwE0KD8BNDc/ATUmTwG0XwGzXwKkTwskNAA/CSSPBUOvA1LPAkNEXwE0Nz9ENz9EKD9ENz8BNDc/AUQ1TwFjQV8D8D8E8B8Hzw4lA08PAm8Pjw2vCzGPCTOPBzWPBTePAzmPATtvAT1PAT8vAT8PAzYCLwhEfwRynwOBnwLTTwE0VT9FNj82Nj82Nj9FNj8BNFU/AZEzTwKBnwNynwVEfw8CEQNfDN8H/wXwPwJSQ18CNjRPATclPzg0Pzg0PwE3ND8BNkNPAVNSXwKyXwOjTwZ0MwU3TwZHTwZHTwc4MQEvDwNITwVIfwJIjwItRABITwY3TwdGPwk1TwlEPws0PwtCTwwyPw0xTw5vD28PAU8PAkYDND8LND8LND8LND8LND8LND8LND8LND8LND8LND8LND8LND8LNDMGTw8CTw8Bbw9vDo8NMj8MQj8MND8KRD8KNU8JNj8IRk8GSEdPD38NnwyvCzRPCUViTzZiT0ZSTwE4Mk8BXw8BXw8CTw8EJwRvDM8H/wVmXwNaPwM8PwI9Mjwy4jsz0zszxSszRjQ6MzgzOjM4MzozODM6MzgzOjNGQjs0UlM8NKQ8NYRNNxg+TV9aXwLwPwTwHwfCAh8PAz8PbwyfCc8HvwfPBrE/BoQ/Blc/Blc/BoQ/B6E/Cc8Mvw2/DY8PAV8PBCUHXwZjfwSBnwKRrwFCZE8BNTY/ATU2PwE1Nj8BNTY/ATU2PwE1Nj8B8F8B8F8B8F8B8FEENj8HVk8FZl8EWF8CTE8BPU8BPj9OP04/AT4/AT1PAUxPAVpPA2V/BPAfBu8Jrw8hAm8MvwnvBvAfBFdvAlpPAkw/Aj1PAT4/AT4/AT4/AT4/AT4/AfBfAfBfAfBfAfBRBzU2PwE1Nj8BNTY/ATU2PwE1Nj8BNTY/ATU2PwE1Nj8BNTY/AfBfAfBfAfBfAfBVAz8PAzU/CjU/CjU/CjU/CjU/CjU/CjU/CjU/CvBfAfBfAfBfAfBRBU8MI38HQ58EU68DUzJfAkU0TwE2NE9GNT9GNT9OP04/AT1PAUxPAVpPA2ZvBPAfBu8Jrw8hB/BfAfBfAfBfAfBfCT8PAz8PAz8PAz8PAz8PAz8PAz8PAz8PAz8K8F8B8F8B8F8B8FUH8F8B8F8B8F8B8FEH8B8F8D8D8E8C8F8PAk8PAz8PAz8PAz8PAz8PAV8PAU8PAk8PAjcDHwMfAS8/AT1PAUpvAVhvA2VvBWJvCb8Lnw1vDwFfDwJfCPBfAfBfAfBfAfBVBD8PAz8PAz8PAz8PAz8PAz8PAz8PAz8PAz8B8F8B8F8B8F8B8FEH8F8B8F8B8F8Bbw+fD48Pnw+PD58Pfw9vDY8KnwqPCp8KjwuPDfBfAfBfAfBfAfBVB/BfAfBfAfBfAfBfDm8OXw5vDl8Obw5fDm8Obw1vDvBfAfBfAfBfAfBVBZ8K3wfwHwTwLwRJXwJMTwE9T04/Tj9OPwE+PwE9TwFMTwFaTwNlfwTwHwbvCa8PJQdfDp8LvwnPCUVPCDc/CDc/CDc/CDc/CDc/CDc/CPBfAfBfAfBfAfBRBZcfAtQvAfARP/BvSX9LXwE7b0p/SjE/ShM/AT4/AT1PAUxPAVpPA2V/BPAfBu8Jrw8lAh8FSi8Dhk8Co28BwX8BRK8DNn8FNm8GNk8INk8INk8INk8I8F8B8F8B8F8B8FEAF08HNn8ERZ8CVK8CRUNPATY1P0VFP0U2P0U2PwE0Rj8BNEY/AaZPApRfA4VfBVZPDwIjPw8DPw8DPw8DPw8DPw8DPw8D8F8B8F8B8F8B8F8BPw8DPw8DPw8DPw8DPw8DNgfvB/AvBPA/A/BPDwFfDwNPDwM/DwM/DwM/DwM/DwM/DwJPDwFfAfBPAvA/A/AvBPARBx8PBT8PA28Pjw2/Db8Nvw2/DY8PAV8PbwyfCb8Hvwe/CK8Ljw1fDwEnBx8PBU8PAn8OvwrvC+8Lzw5/Dn8Lrwe/Bs8Hrwt/Do8Nvw3PDM8Nrw9vDY8JzwXfBO8Hrwt/DjYCHwEfAi8BPj8BS18BaG8CdH8EcX8IvwyPDm8NnwvPB3J/A3ZvAllvAUxPAS8/AR8DEQMfDwUvDwRPDwJvD48Pfw8Bfw8B7wnPCc8H7wZ/DH8Mfw1vD18PAT8PAxMvPwFNPwFcPwFrPwGJPwExWD8BMmY/ATNlPwE1Yz8BNmI/ATifATmPATtvATxfAT1BAz8FKz8FKz8FK/Cr8Kvwq/CkAC8PbwuvB88GvwbPBr8Kfw5PDwIRA/Cr8Kvwq/CrPwUrPwUrPwUkAy8PAk8PbwxvD08PAj8PA18PAn8PAl8PAz8PBRMEPw8DPw8DPw8DPw8DPw8DPw8DPw8DPw8DPw8DPw8DPw8DPw8DMQIfDwM/DwFfDwFPDwIvDwQVBt8H7wb/BkEzLwgzJC8HJCQ/BiQlLwYzNC8GMzM/BkOPBzOPCCRvDwFHB58KzwnfB1RvBjhPBjk/Bjk/Bjk/Bjk/Bzc/AvBfAfBfAfBfAfBRAyUvCkU/CUVPB1VfBjk/Bjk/Bio/Bjk/Bjk/BkZfB98I3wqfDlIH8F8B8F8B8F8B8F8IJj8IOS8HOT8GKj8GOT8GOT8GRl8G7wjfCb8NUgdTLwpjPwhzPwdCI08GMyQ/BjMkPwYkJD8GJCQ/BjMkPwZCI08H3wjfCp8OVgIzPwwzPwwzPwxCPwzwbwHwXwLwTwY/DwM1BPAvBPBPAvBfAfBfAyY0Tzg0PzkkPyozPzkzPzhDP0ZDT+JPAsQ/A6UvB1IG3wfvBv8GTw8CPw8DPw8DPw8DPw8ELw8FPwvwXwHwXwHwVQMvDwMz/0L/M/UDHw8EM/BLQvBaM/BfDwNPDwM/DwMzAh8GHC8GKj8GOE8GRW8GU28JrwyPDm8PAU8PA08G8F8B8F8B8FEH8F8B8F8B8FUG3wb/Bv8GTw8CPw8DPw8DPw8DPw8ETw8D3wb/Bv8GTw8CPw8DPw8DPw8ELw8FTw//Bv8G9QbfB+8G/wZfDwE/DwM/DwM/DwM/DwQvDwU/DwH/Bv8G9QVfDp8K3wjfB0dPBjk/Bjk/Bio/Bjk/Bjk/BkdPB98IzwufDlYDnwu/Cd8HYn8GR08GOT8GOT8GOT8GOT8HNz8JQ08I8G/wb/BnAPBv8G/wb/BvAiY/CDkvBzk/Bio/Bjk/Bjk/BkZfBu8I3wm/DVYEPw8DPw8DPw8DPw8EPw8EPw8B/wb/BvUCJF8JM38HQ38HQkFPBjMzPwYkMz8GJDQvBjJDPwYyND8Ggl8Hcz8JVD8PAxQHHwY5PwY5PwY4TwLwTwLwPwPwLwg/DwM0BP8G/wb/Dz8PBT8PBD8PAz8PAz8PAk8PAV8G/wbvB9cAPw8DXw8Bjw2/Db8Ojw8BXw9vDJ8Jrwi/Co8NXw8BIgQfDwVPDwKPDb8M3wyfDwFfDY8Jvwe/Cn8OXw8Bnw2/Dq8Pbw5/Cr8G3wivC28PNQAdHwYrLwZHTwZUbwdhbwmvDX8PXw6fCt8HY28GR08GKj8GHRUAPw8DXw8Bjw2/Db8Orw6fDK8H7wSkPwG3P4o/XT8iBDk/Bkg/Blc/BnU/BoQ/BjFTPwYyYT8GNI8GNX8GNm8GN18GOTEDPwQ7PwQ7XwFMo7yxvqGvCF8PAk8PAjcF8PBC8PBC8PBC8PBFBj8PA08PAV8Ioa6xvaO7XwFLPwQ7PwQ0AC8PBE8PAl8PA08PAz8PAz8PAj8PAk8PAU8PAj8PAz8PA08PAl8PAk8PBCMA==",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 33,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 14,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 34,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 30,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 35,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 80,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 128,
+ "width": 24,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 37,
+ "bitmap_byte_count": 61
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 189,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 38,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 238,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 39,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 242,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 260,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 278,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 42,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 309,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 43,
+ "bitmap_byte_count": 34
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 343,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 353,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 45,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 379,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 46,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 390,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 47,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 413,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 48,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 455,
+ "width": 13,
+ "x_min_offset": 1,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 49,
+ "bitmap_byte_count": 23
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 478,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 50,
+ "bitmap_byte_count": 43
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 521,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 51,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 568,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 52,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 612,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 53,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 660,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 54,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 710,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 55,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 748,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 56,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 798,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 57,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 846,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 58,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 858,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 873,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 60,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 910,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 61,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 949,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 62,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 984,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 63,
+ "bitmap_byte_count": 36
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1020,
+ "width": 28,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 77
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1097,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 65,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1144,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 66,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1195,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 67,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1244,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 68,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1292,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 69,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1340,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 70,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1379,
+ "width": 21,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 71,
+ "bitmap_byte_count": 54
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1433,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 72,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1483,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 73,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1495,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 74,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1534,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 75,
+ "bitmap_byte_count": 46
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1580,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 76,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1618,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 77,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1667,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 78,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1709,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 79,
+ "bitmap_byte_count": 49
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1758,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 80,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1799,
+ "width": 22,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 81,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1850,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 82,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1897,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 83,
+ "bitmap_byte_count": 51
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1948,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 84,
+ "bitmap_byte_count": 47
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 1995,
+ "width": 21,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 85,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2045,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 86,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2087,
+ "width": 28,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 87,
+ "bitmap_byte_count": 56
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2143,
+ "width": 19,
+ "x_min_offset": 0,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 88,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2193,
+ "width": 20,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 89,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2235,
+ "width": 18,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 90,
+ "bitmap_byte_count": 50
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2285,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2303,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 92,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2324,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2342,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 94,
+ "bitmap_byte_count": 29
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2371,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 95,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2409,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 96,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2426,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 97,
+ "bitmap_byte_count": 42
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2468,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 98,
+ "bitmap_byte_count": 39
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2507,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 99,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2545,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 100,
+ "bitmap_byte_count": 41
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2586,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 101,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2631,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 102,
+ "bitmap_byte_count": 26
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2657,
+ "width": 18,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 44
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2701,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 104,
+ "bitmap_byte_count": 35
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2736,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 105,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2746,
+ "width": 8,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 22
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2768,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 107,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2806,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 108,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2815,
+ "width": 25,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 109,
+ "bitmap_byte_count": 53
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2868,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 110,
+ "bitmap_byte_count": 33
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2901,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 111,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2938,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2975,
+ "width": 17,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3013,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 114,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3037,
+ "width": 15,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 115,
+ "bitmap_byte_count": 45
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3082,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 7,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 116,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3107,
+ "width": 17,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 117,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3139,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 118,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3171,
+ "width": 23,
+ "x_min_offset": 0,
+ "y_min_offset": 1,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 119,
+ "bitmap_byte_count": 48
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3219,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 120,
+ "bitmap_byte_count": 37
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3256,
+ "width": 16,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 31
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3287,
+ "width": 16,
+ "x_min_offset": 1,
+ "y_min_offset": 2,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 122,
+ "bitmap_byte_count": 38
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3325,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3349,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 5,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3362,
+ "width": 11,
+ "x_min_offset": 0,
+ "y_min_offset": 6,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 24
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3386,
+ "width": 19,
+ "x_min_offset": 1,
+ "y_min_offset": 3,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 126,
+ "bitmap_byte_count": 44
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.inc b/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.inc
new file mode 100644
index 00000000..c0d4fb9a
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.inc
@@ -0,0 +1,333 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapOPEN_SANS_EXTRABOLD_11PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x05, 0x17, 0x12,
+//ascii 0x0022
+ 0x01, 0x33, 0x51, 0x33, 0x50,
+//ascii 0x0023
+ 0x21, 0x11, 0x33, 0x11, 0x56, 0x21, 0x11, 0x35,
+ 0x51, 0x14, 0x41, 0x30,
+//ascii 0x0024
+ 0x92, 0x91, 0x31, 0x21, 0x7A, 0x71, 0x22, 0x21,
+ 0x84, 0x31, 0x92, 0x32, 0x40,
+//ascii 0x0025
+ 0x43, 0x45, 0x31, 0x33, 0x15, 0x14, 0x64, 0x19,
+ 0x31, 0x35, 0x43, 0x40,
+//ascii 0x0026
+ 0x71, 0x44, 0x43, 0x13, 0x2C, 0x22, 0x29, 0x12,
+ 0x14, 0x51, 0x20,
+//ascii 0x0027
+ 0x01, 0x33, 0x10,
+//ascii 0x0028
+ 0x03, 0x43, 0x38, 0x64, 0x10,
+//ascii 0x0029
+ 0x34, 0x68, 0x33, 0x43, 0x60,
+//ascii 0x002A
+ 0x12, 0x73, 0x35, 0x35, 0x53, 0x42, 0x50,
+//ascii 0x002B
+ 0x31, 0x71, 0x55, 0x35, 0x51, 0x71, 0x40,
+//ascii 0x002C
+ 0x21, 0x73, 0x71, 0x30,
+//ascii 0x002D
+ 0x02, 0x22, 0x22, 0x22, 0x20,
+//ascii 0x002E
+ 0x22, 0x22,
+//ascii 0x002F
+ 0x01, 0x74, 0x64, 0x64, 0x71,
+//ascii 0x0030
+ 0x16, 0x19, 0x62, 0x69, 0x16, 0x10,
+//ascii 0x0031
+ 0x0F, 0x01, 0x12, 0x71, 0x50,
+//ascii 0x0032
+ 0x13, 0x37, 0x12, 0x36, 0x33, 0x11, 0x51,
+//ascii 0x0033
+ 0x12, 0x13, 0x19, 0x21, 0x32, 0x21, 0x32, 0x61,
+//ascii 0x0034
+ 0x51, 0x2F, 0x01, 0x12, 0x21, 0x53, 0x71, 0x20,
+//ascii 0x0035
+ 0x01, 0x26, 0x29, 0x35, 0x31,
+//ascii 0x0036
+ 0x43, 0x11, 0x26, 0x21, 0x33, 0x11, 0x31, 0x17,
+ 0x34, 0x10,
+//ascii 0x0037
+ 0x04, 0x47, 0x11, 0x35, 0x62, 0x70,
+//ascii 0x0038
+ 0x12, 0x13, 0x19, 0x21, 0x32, 0x21, 0x39, 0x12,
+ 0x13, 0x10,
+//ascii 0x0039
+ 0x15, 0x27, 0x11, 0x31, 0x13, 0x31, 0x26, 0x21,
+ 0x13, 0x40,
+//ascii 0x003A
+ 0x22, 0x22, 0x22, 0x22,
+//ascii 0x003B
+ 0x22, 0x21, 0x72, 0x23, 0xB1, 0x70,
+//ascii 0x003C
+ 0x11, 0x51, 0x12, 0x32, 0x22, 0x12, 0x43, 0x61,
+ 0x30,
+//ascii 0x003D
+ 0x31, 0x11, 0x51, 0x11, 0x51, 0x11, 0x51, 0x11,
+ 0x51, 0x11, 0x51, 0x11, 0x20,
+//ascii 0x003E
+ 0x41, 0x63, 0x42, 0x12, 0x22, 0x32, 0x11, 0x51,
+//ascii 0x003F
+ 0x12, 0x54, 0x41, 0x22, 0x13, 0x22, 0x13, 0x70,
+//ascii 0x0040
+ 0x24, 0x76, 0x11, 0x32, 0x41, 0x11, 0x31, 0x15,
+ 0x11, 0x31, 0x11, 0x22, 0x11, 0x31, 0x12, 0x21,
+ 0x11, 0x32, 0x14, 0x11, 0x42, 0x41, 0x66, 0x74,
+ 0x50,
+//ascii 0x0041
+ 0x62, 0x35, 0x16, 0x14, 0x11, 0x24, 0x11, 0x36,
+ 0x45, 0x62,
+//ascii 0x0042
+ 0x03, 0x1D, 0x21, 0x3F, 0x02,
+//ascii 0x0043
+ 0x01, 0x62, 0x62, 0x69, 0x16, 0x10,
+//ascii 0x0044
+ 0x16, 0x19, 0x62, 0x6F, 0x02,
+//ascii 0x0045
+ 0x01, 0x21, 0x32, 0x21, 0x3F, 0x02,
+//ascii 0x0046
+ 0x01, 0x71, 0x21, 0x41, 0x21, 0x4F, 0x01,
+//ascii 0x0047
+ 0x01, 0x26, 0x26, 0x21, 0x32, 0x69, 0x16, 0x10,
+//ascii 0x0048
+ 0x0F, 0x01, 0x31, 0x71, 0x4F, 0x01,
+//ascii 0x0049
+ 0x0F, 0x01,
+//ascii 0x004A
+ 0x0A, 0x2B, 0xB1, 0xB1, 0x10,
+//ascii 0x004B
+ 0x01, 0x63, 0x45, 0x14, 0x24, 0x52, 0x3F, 0x01,
+//ascii 0x004C
+ 0x71, 0x71, 0x7F, 0x02,
+//ascii 0x004D
+ 0x0F, 0x06, 0x56, 0x62, 0x2B, 0x3F, 0x01,
+//ascii 0x004E
+ 0x0F, 0x01, 0x44, 0x24, 0x24, 0x4F, 0x01,
+//ascii 0x004F
+ 0x16, 0x19, 0x62, 0x62, 0x69, 0x16, 0x10,
+//ascii 0x0050
+ 0x05, 0x35, 0x31, 0x31, 0x3F, 0x01,
+//ascii 0x0051
+ 0x16, 0x21, 0x2A, 0x21, 0x62, 0x31, 0x61, 0x41,
+ 0x61, 0x48, 0x56, 0x10,
+//ascii 0x0052
+ 0x71, 0x13, 0x1A, 0x11, 0x31, 0x3F, 0x01,
+//ascii 0x0053
+ 0x01, 0x42, 0x11, 0x35, 0x2A, 0x21, 0x13, 0x31,
+//ascii 0x0054
+ 0x01, 0x71, 0x7F, 0x02, 0x71, 0x70,
+//ascii 0x0055
+ 0x07, 0x18, 0x71, 0x7F, 0x01, 0x10,
+//ascii 0x0056
+ 0x04, 0x47, 0x54, 0x4B, 0x14, 0x40,
+//ascii 0x0057
+ 0x01, 0x75, 0x46, 0x6E, 0x58, 0x53, 0x16, 0x15,
+ 0x31, 0x70,
+//ascii 0x0058
+ 0x01, 0x63, 0x42, 0x16, 0x34, 0x44, 0x36, 0x12,
+ 0x43, 0x61,
+//ascii 0x0059
+ 0x01, 0x73, 0x67, 0x35, 0x13, 0x43, 0x51, 0x70,
+//ascii 0x005A
+ 0x01, 0x64, 0x45, 0x32, 0x14, 0x12, 0x35, 0x44,
+ 0x61,
+//ascii 0x005B
+ 0x01, 0x81, 0x21, 0x81, 0x2A, 0x2A, 0x20,
+//ascii 0x005C
+ 0x71, 0x44, 0x24, 0x24, 0x41, 0x70,
+//ascii 0x005D
+ 0x0A, 0x2A, 0x21, 0x81, 0x21, 0x81, 0x20,
+//ascii 0x005E
+ 0x41, 0x53, 0x33, 0x53, 0x73, 0x71, 0x30,
+//ascii 0x005F
+ 0x11, 0x31, 0x31, 0x31, 0x31, 0x31, 0x20,
+//ascii 0x0060
+ 0x41, 0x62, 0x61, 0x40,
+//ascii 0x0061
+ 0x35, 0x26, 0x21, 0x11, 0x21, 0x21, 0x11, 0x21,
+ 0x21, 0x14, 0x52, 0x10,
+//ascii 0x0062
+ 0x42, 0x46, 0x26, 0x21, 0x4F, 0x02,
+//ascii 0x0063
+ 0x21, 0x41, 0x21, 0x41, 0x21, 0x41, 0x26, 0x34,
+ 0x52, 0x20,
+//ascii 0x0064
+ 0x0F, 0x01, 0x21, 0x41, 0x26, 0x34, 0x52, 0x20,
+//ascii 0x0065
+ 0x32, 0x53, 0x21, 0x21, 0x11, 0x21, 0x21, 0x11,
+ 0x21, 0x26, 0x34, 0x52, 0x20,
+//ascii 0x0066
+ 0x01, 0x11, 0x51, 0x11, 0x58, 0x17, 0x21, 0x50,
+//ascii 0x0067
+ 0x21, 0x52, 0x43, 0x24, 0x34, 0x11, 0x21, 0x31,
+ 0x21, 0x11, 0x21, 0x36, 0x21, 0x39, 0x92, 0x60,
+//ascii 0x0068
+ 0x26, 0x26, 0x21, 0x5F, 0x01,
+//ascii 0x0069
+ 0x01, 0x17, 0x16,
+//ascii 0x006A
+ 0x01, 0x18, 0x21, 0x19, 0xB1, 0xB1, 0x10,
+//ascii 0x006B
+ 0x71, 0x22, 0x22, 0x26, 0x33, 0x2F, 0x01,
+//ascii 0x006C
+ 0x0F, 0x01,
+//ascii 0x006D
+ 0x26, 0x26, 0x21, 0x85, 0x26, 0x21, 0x85, 0x26,
+//ascii 0x006E
+ 0x26, 0x26, 0x21, 0x85, 0x26,
+//ascii 0x006F
+ 0x42, 0x54, 0x36, 0x21, 0x41, 0x26, 0x34, 0x52,
+ 0x20,
+//ascii 0x0070
+ 0x42, 0x86, 0x66, 0x61, 0x41, 0x69, 0x39, 0x10,
+//ascii 0x0071
+ 0x29, 0x39, 0x31, 0x41, 0x66, 0x66, 0x82, 0x60,
+//ascii 0x0072
+ 0x22, 0x62, 0x75, 0x26,
+//ascii 0x0073
+ 0x52, 0x31, 0x14, 0x21, 0x12, 0x11, 0x24, 0x11,
+ 0x23, 0x21,
+//ascii 0x0074
+ 0x21, 0x41, 0x21, 0x41, 0x17, 0x16, 0x31, 0x50,
+//ascii 0x0075
+ 0x26, 0x25, 0x81, 0x26, 0x26,
+//ascii 0x0076
+ 0x21, 0x74, 0x55, 0x62, 0x35, 0x24, 0x41, 0x50,
+//ascii 0x0077
+ 0x21, 0x74, 0x55, 0x44, 0x24, 0x44, 0x64, 0x35,
+ 0x24, 0x41, 0x50,
+//ascii 0x0078
+ 0x21, 0x41, 0x22, 0x22, 0x26, 0x42, 0x46, 0x22,
+ 0x22, 0x21, 0x41,
+//ascii 0x0079
+ 0x21, 0xB4, 0x95, 0xA4, 0x58, 0x33, 0x51, 0x31,
+ 0x50,
+//ascii 0x007A
+ 0x21, 0x41, 0x22, 0x31, 0x24, 0x11, 0x21, 0x14,
+ 0x21, 0x32, 0x21, 0x41,
+//ascii 0x007B
+ 0x01, 0x81, 0x24, 0x24, 0x2A, 0x62, 0xA2, 0x20,
+//ascii 0x007C
+ 0x0B, 0x1B, 0x10,
+//ascii 0x007D
+ 0x42, 0xA2, 0x6A, 0x24, 0x24, 0x21, 0x81, 0x60,
+//ascii 0x007E
+ 0x32, 0x71, 0x62, 0x62, 0x61, 0x72, 0x30,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersOPEN_SANS_EXTRABOLD_11PX_1BPP[95] = {
+ { 0, 0, 4,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 4,2, 4, 0, 4 }, //asciii 0x0021
+ { 3, 1, 7,2, 4, 0, 8 }, //asciii 0x0022
+ { 8, 1, 8,1, 4, 0, 4 }, //asciii 0x0023
+ { 20, 1, 7,1, 0, 0, 0 }, //asciii 0x0024
+ { 33, 1, 12,1, 4, 1, 4 }, //asciii 0x0025
+ { 45, 1, 10,1, 4, 0, 4 }, //asciii 0x0026
+ { 56, 1, 4,2, 4, 0, 8 }, //asciii 0x0027
+ { 59, 1, 5,1, 4, 1, 0 }, //asciii 0x0028
+ { 64, 1, 5,2, 4, 0, 0 }, //asciii 0x0029
+ { 69, 1, 7,1, 4, 0, 4 }, //asciii 0x002A
+ { 76, 1, 7,1, 4, 0, 4 }, //asciii 0x002B
+ { 83, 1, 4,1, 8, 0, 0 }, //asciii 0x002C
+ { 87, 1, 5,1, 8, 0, 4 }, //asciii 0x002D
+ { 92, 1, 4,2, 8, 0, 4 }, //asciii 0x002E
+ { 94, 1, 6,1, 4, 0, 4 }, //asciii 0x002F
+ { 99, 1, 9,2, 4, 1, 4 }, //asciii 0x0030
+ { 105, 1, 7,2, 4, 1, 4 }, //asciii 0x0031
+ { 110, 1, 8,2, 4, 1, 4 }, //asciii 0x0032
+ { 117, 1, 8,2, 4, 1, 4 }, //asciii 0x0033
+ { 125, 1, 9,2, 4, 1, 4 }, //asciii 0x0034
+ { 133, 1, 7,2, 4, 1, 4 }, //asciii 0x0035
+ { 138, 1, 9,2, 4, 1, 4 }, //asciii 0x0036
+ { 148, 1, 8,2, 4, 1, 4 }, //asciii 0x0037
+ { 154, 1, 9,2, 4, 1, 4 }, //asciii 0x0038
+ { 164, 1, 9,2, 4, 1, 4 }, //asciii 0x0039
+ { 174, 1, 4,2, 4, 0, 4 }, //asciii 0x003A
+ { 178, 1, 4,1, 4, 0, 0 }, //asciii 0x003B
+ { 184, 1, 6,1, 4, 0, 4 }, //asciii 0x003C
+ { 193, 1, 7,1, 4, 0, 4 }, //asciii 0x003D
+ { 206, 1, 6,1, 4, 0, 4 }, //asciii 0x003E
+ { 214, 1, 7,1, 4, 1, 4 }, //asciii 0x003F
+ { 222, 1, 11,1, 4, 0, 0 }, //asciii 0x0040
+ { 247, 1, 9,1, 4, 0, 4 }, //asciii 0x0041
+ { 257, 1, 8,2, 4, 1, 4 }, //asciii 0x0042
+ { 262, 1, 8,2, 4, 1, 4 }, //asciii 0x0043
+ { 268, 1, 9,2, 4, 1, 4 }, //asciii 0x0044
+ { 273, 1, 7,2, 4, 1, 4 }, //asciii 0x0045
+ { 279, 1, 7,2, 4, 0, 4 }, //asciii 0x0046
+ { 286, 1, 9,2, 4, 1, 4 }, //asciii 0x0047
+ { 294, 1, 9,2, 4, 1, 4 }, //asciii 0x0048
+ { 300, 1, 5,2, 4, 1, 4 }, //asciii 0x0049
+ { 302, 1, 5,0, 4, 1, 0 }, //asciii 0x004A
+ { 307, 1, 9,2, 4, 0, 4 }, //asciii 0x004B
+ { 315, 1, 7,2, 4, 0, 4 }, //asciii 0x004C
+ { 319, 1, 12,2, 4, 1, 4 }, //asciii 0x004D
+ { 326, 1, 10,2, 4, 1, 4 }, //asciii 0x004E
+ { 333, 1, 10,2, 4, 1, 4 }, //asciii 0x004F
+ { 340, 1, 8,2, 4, 1, 4 }, //asciii 0x0050
+ { 346, 1, 10,2, 4, 1, 0 }, //asciii 0x0051
+ { 358, 1, 9,2, 4, 1, 4 }, //asciii 0x0052
+ { 365, 1, 7,2, 4, 0, 4 }, //asciii 0x0053
+ { 373, 1, 7,1, 4, 0, 4 }, //asciii 0x0054
+ { 379, 1, 9,2, 4, 1, 4 }, //asciii 0x0055
+ { 385, 1, 7,1, 4, 0, 4 }, //asciii 0x0056
+ { 391, 1, 12,1, 4, 0, 4 }, //asciii 0x0057
+ { 401, 1, 9,1, 4, 0, 4 }, //asciii 0x0058
+ { 411, 1, 8,1, 4, 0, 4 }, //asciii 0x0059
+ { 419, 1, 8,1, 4, 0, 4 }, //asciii 0x005A
+ { 428, 1, 6,2, 4, 0, 0 }, //asciii 0x005B
+ { 435, 1, 6,1, 4, 0, 4 }, //asciii 0x005C
+ { 441, 1, 6,1, 4, 1, 0 }, //asciii 0x005D
+ { 448, 1, 7,0, 4, 1, 4 }, //asciii 0x005E
+ { 455, 1, 7,0, 12, 1, 0 }, //asciii 0x005F
+ { 462, 1, 8,3, 0, 2, 8 }, //asciii 0x0060
+ { 466, 1, 8,1, 4, 1, 4 }, //asciii 0x0061
+ { 478, 1, 8,2, 4, 0, 4 }, //asciii 0x0062
+ { 484, 1, 7,1, 4, 0, 4 }, //asciii 0x0063
+ { 494, 1, 8,1, 4, 1, 4 }, //asciii 0x0064
+ { 502, 1, 8,1, 4, 0, 4 }, //asciii 0x0065
+ { 515, 1, 7,1, 4, 1, 4 }, //asciii 0x0066
+ { 523, 1, 8,1, 4, 0, 0 }, //asciii 0x0067
+ { 539, 1, 8,2, 4, 1, 4 }, //asciii 0x0068
+ { 544, 1, 5,2, 4, 1, 4 }, //asciii 0x0069
+ { 547, 1, 5,0, 4, 1, 0 }, //asciii 0x006A
+ { 554, 1, 8,2, 4, 0, 4 }, //asciii 0x006B
+ { 561, 1, 5,2, 4, 1, 4 }, //asciii 0x006C
+ { 563, 1, 11,2, 4, 1, 4 }, //asciii 0x006D
+ { 571, 1, 8,2, 4, 1, 4 }, //asciii 0x006E
+ { 576, 1, 8,1, 4, 0, 4 }, //asciii 0x006F
+ { 585, 1, 8,2, 4, 0, 0 }, //asciii 0x0070
+ { 593, 1, 8,1, 4, 1, 0 }, //asciii 0x0071
+ { 601, 1, 6,2, 4, 0, 4 }, //asciii 0x0072
+ { 605, 1, 7,2, 4, 0, 4 }, //asciii 0x0073
+ { 615, 1, 6,1, 4, 0, 4 }, //asciii 0x0074
+ { 623, 1, 8,2, 4, 1, 4 }, //asciii 0x0075
+ { 628, 1, 8,1, 4, 0, 4 }, //asciii 0x0076
+ { 636, 1, 11,1, 4, 0, 4 }, //asciii 0x0077
+ { 647, 1, 8,1, 4, 0, 4 }, //asciii 0x0078
+ { 658, 1, 8,1, 4, 0, 0 }, //asciii 0x0079
+ { 667, 1, 7,1, 4, 0, 4 }, //asciii 0x007A
+ { 679, 1, 6,1, 4, 0, 0 }, //asciii 0x007B
+ { 687, 1, 7,3, 4, 2, 0 }, //asciii 0x007C
+ { 690, 1, 6,1, 4, 0, 0 }, //asciii 0x007D
+ { 698, 1, 7,1, 4, 0, 4 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontOPEN_SANS_EXTRABOLD_11PX_1BPP= {
+ 705, // bitmap len
+ BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 16, // height of all characters in pixels
+ 14, // line height in pixels
+ 1, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersOPEN_SANS_EXTRABOLD_11PX_1BPP,
+ bitmapOPEN_SANS_EXTRABOLD_11PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.json b/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.json
new file mode 100644
index 00000000..e4f17cfe
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_extrabold_11.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "BRcSATNRM1AhETMRViERNVEUQTCSkTEhenEiIYQxkjJAQ0UxMxUUZBkxNUNAcURDEywiKRIUUSABMxADQzhkEDRoM0NgEnM1NVNCUDFxVTVRcUAhc3EwAiIiIiAiIgF0ZGRxFhliaRYQDwEScVATNxI2MxFREhMZITIhMmFRLwESIVNxIAEmKTUxQxEmITMRMRc0EARHETVicBITGSEyITkSExAVJxExEzEmIRNAIiIiIiIhciOxcBFREjIiEkNhMDERURFREVERURFRESBBY0ISIjIRURJUQSITIhNwJHYRMkERMRURMREiETESIREyFBFCQWZ0UGI1FhQRJBE2RWIDHSE/AgFiYmkWEBYZYm8CASEyIT8CAXEhQSFPAQEmJiEyaRYQDwExcU8BDwEKK7GxEAFjRRQkUj8BcXF/Ag8GVmIrPwEPAUQkJE8BFhliYmkWEAU1MTE/ARYhKiFiMWFBYUhWEHETGhExPwEBQhE1KiETMQFxfwJxcAcYcX8BEARHVEsUQAF1Rm5YUxYVMXABY0IWNEQ2EkNhAXNnNRNDUXABZEUyFBI1RGEBgSGBKiogcUQkJEFwCiohgSGBIEFTM1NzcTARMTExMTEgQWJhQDUmIREhIREhIRRSEEJGJiFPAiFBIUEhQSY0UiAPASFBJjRSIDJTISERISERISY0UiABEVERWBchUCFSQyQ0ESExIREhNiE5kmAmJiFfAQEXFgEYIRmxsRBxIiImMy8BDwEmJiGFJiGFJiYmIYUmQlQ2IUEmNFIgQoZmYUFpORApOTFBZmaCYCJidSZSMRQhEhEkESMhIUEhQRcWMVAmJYEmJiF0VWI1JEFQIXRVRCREZDUkQVAhQSIiJkJGIiIhQSG0laRYM1ExUCFBIjEkESEUITIhQQGBJCQqYqIgCxsQQqJqJCQhgWAycWJiYXIw",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 4,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 34,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 8,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 35,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 20,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 33,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 45,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 56,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 39,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 59,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 64,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 69,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 42,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 76,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 43,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 83,
+ "width": 4,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 87,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 45,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 92,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 94,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 99,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 105,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 49,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 110,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 50,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 117,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 125,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 52,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 133,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 138,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 148,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 55,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 154,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 164,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 174,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 178,
+ "width": 4,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 184,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 60,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 193,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 61,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 206,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 62,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 214,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 222,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 25
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 247,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 65,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 257,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 66,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 262,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 67,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 268,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 68,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 273,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 69,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 279,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 70,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 286,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 294,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 72,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 300,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 73,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 302,
+ "width": 5,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 74,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 307,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 75,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 315,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 76,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 319,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 77,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 326,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 78,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 333,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 340,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 80,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 346,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 81,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 358,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 82,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 365,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 373,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 84,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 379,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 385,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 86,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 391,
+ "width": 12,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 87,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 401,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 88,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 411,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 89,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 419,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 90,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 428,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 435,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 441,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 448,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 94,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 455,
+ "width": 7,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 95,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 462,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 96,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 466,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 478,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 484,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 494,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 502,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 515,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 102,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 523,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 539,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 104,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 544,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 105,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 547,
+ "width": 5,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 554,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 107,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 561,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 108,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 563,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 109,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 571,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 110,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 576,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 585,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 593,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 601,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 114,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 605,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 615,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 623,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 628,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 118,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 636,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 119,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 647,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 120,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 658,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 667,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 122,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 679,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 687,
+ "width": 7,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 690,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 698,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 126,
+ "bitmap_byte_count": 7
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.inc b/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.inc
new file mode 100644
index 00000000..0bf56ce4
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.inc
@@ -0,0 +1,375 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapOPEN_SANS_LIGHT_16PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x08, 0x22, 0x40,
+//ascii 0x0022
+ 0x04, 0x84,
+//ascii 0x0023
+ 0x41, 0xB1, 0x21, 0x45, 0x21, 0x86, 0x61, 0x21,
+ 0x24, 0x21, 0x21, 0x66, 0x81, 0x25, 0x41, 0x21,
+ 0xB1, 0x40,
+//ascii 0x0024
+ 0x82, 0x71, 0x51, 0x21, 0x61, 0x42, 0x31, 0x4D,
+ 0x41, 0x41, 0x41, 0x61, 0x21, 0x51, 0x72, 0x51,
+ 0x50,
+//ascii 0x0025
+ 0x65, 0x61, 0x52, 0x41, 0x51, 0x12, 0x35, 0x42,
+ 0xC2, 0xC2, 0x45, 0x32, 0x11, 0x51, 0x42, 0x51,
+ 0x65, 0x20,
+//ascii 0x0026
+ 0x63, 0x21, 0x92, 0x91, 0x11, 0x23, 0x31, 0x32,
+ 0x31, 0x11, 0x42, 0x41, 0x52, 0x32, 0x51, 0x13,
+ 0x21, 0x32, 0x74, 0x50,
+//ascii 0x0027
+ 0x04, 0x40,
+//ascii 0x0028
+ 0x02, 0xB2, 0x3B, 0x30,
+//ascii 0x0029
+ 0x2B, 0x32, 0xB2, 0x10,
+//ascii 0x002A
+ 0x61, 0xB1, 0x21, 0x83, 0x64, 0xB3, 0x91, 0x21,
+ 0x81, 0x10,
+//ascii 0x002B
+ 0x41, 0x71, 0x71, 0x47, 0x41, 0x71, 0x71, 0x30,
+//ascii 0x002C
+ 0x23, 0x81, 0x20,
+//ascii 0x002D
+ 0x31, 0x31, 0x31, 0x40,
+//ascii 0x002E
+ 0x22, 0x22,
+//ascii 0x002F
+ 0x01, 0xC3, 0xC4, 0xC3, 0xC1, 0x40,
+//ascii 0x0030
+ 0x28, 0x31, 0x81, 0x11, 0xA2, 0xA2, 0xA1, 0x11,
+ 0x81, 0x38, 0x60,
+//ascii 0x0031
+ 0x0C, 0x11, 0xC1, 0x50,
+//ascii 0x0032
+ 0xB1, 0x15, 0x52, 0x51, 0x42, 0x61, 0x32, 0x71,
+ 0x22, 0x81, 0x11, 0x11, 0x82, 0x40,
+//ascii 0x0033
+ 0x21, 0x43, 0x31, 0x12, 0x11, 0x31, 0x11, 0x32,
+ 0x52, 0x41, 0x52, 0x41, 0x52, 0x41, 0x51, 0x11,
+ 0x91, 0x40,
+//ascii 0x0034
+ 0x81, 0xB1, 0x3C, 0x11, 0x61, 0x51, 0x51, 0x62,
+ 0x31, 0x81, 0x21, 0x93, 0xB1, 0x70,
+//ascii 0x0035
+ 0x64, 0x21, 0x51, 0x31, 0x11, 0x41, 0x52, 0x41,
+ 0x52, 0x41, 0x55, 0x11, 0x51, 0x42, 0x41, 0x50,
+//ascii 0x0036
+ 0x65, 0x11, 0x41, 0x52, 0x41, 0x52, 0x41, 0x51,
+ 0x11, 0x31, 0x51, 0x12, 0x31, 0x31, 0x47, 0x60,
+//ascii 0x0037
+ 0x02, 0xA1, 0x13, 0x71, 0x42, 0x51, 0x63, 0x21,
+ 0x93, 0xB1, 0x70,
+//ascii 0x0038
+ 0x22, 0x34, 0x21, 0x21, 0x11, 0x42, 0x41, 0x52,
+ 0x41, 0x52, 0x41, 0x51, 0x11, 0x21, 0x11, 0x41,
+ 0x22, 0x34, 0x50,
+//ascii 0x0039
+ 0x27, 0x41, 0x31, 0x32, 0x11, 0x51, 0x31, 0x11,
+ 0x51, 0x42, 0x51, 0x42, 0x51, 0x41, 0x15, 0x20,
+//ascii 0x003A
+ 0x32, 0x52, 0x32, 0x52,
+//ascii 0x003B
+ 0x32, 0xE2, 0x53, 0x30,
+//ascii 0x003C
+ 0x21, 0x51, 0x61, 0x31, 0x71, 0x31, 0x81, 0x11,
+ 0x91, 0x11, 0xA1, 0xB1, 0x20,
+//ascii 0x003D
+ 0x01, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21,
+ 0x40,
+//ascii 0x003E
+ 0x51, 0xB1, 0xA1, 0x11, 0x91, 0x11, 0x81, 0x31,
+ 0x71, 0x31, 0x61, 0x51, 0x70,
+//ascii 0x003F
+ 0x14, 0x71, 0x41, 0x61, 0x51, 0x51, 0x62, 0x13,
+ 0x70,
+//ascii 0x0040
+ 0x36, 0x91, 0x61, 0x71, 0x71, 0x61, 0x27, 0x61,
+ 0x21, 0x41, 0x41, 0x21, 0x21, 0x51, 0x31, 0x21,
+ 0x21, 0x51, 0x31, 0x21, 0x31, 0x41, 0x31, 0x31,
+ 0x34, 0x41, 0x31, 0xA1, 0x52, 0x71, 0x87, 0x50,
+//ascii 0x0041
+ 0xB1, 0x83, 0x72, 0x73, 0x11, 0x43, 0x41, 0x43,
+ 0x41, 0x73, 0x11, 0xA2, 0xC3, 0xC1,
+//ascii 0x0042
+ 0x22, 0x33, 0x31, 0x21, 0x11, 0x31, 0x11, 0x41,
+ 0x52, 0x41, 0x52, 0x41, 0x52, 0x41, 0x5D, 0x40,
+//ascii 0x0043
+ 0x01, 0xA2, 0xA2, 0xA2, 0xA2, 0xA1, 0x11, 0x81,
+ 0x31, 0x61, 0x56, 0x30,
+//ascii 0x0044
+ 0x36, 0x51, 0x61, 0x31, 0x81, 0x11, 0xA2, 0xA2,
+ 0xA2, 0xAD,
+//ascii 0x0045
+ 0x01, 0x41, 0x52, 0x41, 0x52, 0x41, 0x52, 0x41,
+ 0x52, 0x41, 0x5D,
+//ascii 0x0046
+ 0x01, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51,
+ 0x51, 0x51, 0x5C,
+//ascii 0x0047
+ 0x65, 0x11, 0x51, 0x42, 0x51, 0x42, 0x51, 0x42,
+ 0x51, 0x42, 0xA2, 0xA1, 0x11, 0x81, 0x31, 0x61,
+ 0x56, 0x30,
+//ascii 0x0048
+ 0x0C, 0x51, 0xB1, 0xB1, 0xB1, 0xB1, 0xB1, 0x6C,
+//ascii 0x0049
+ 0x0C, 0x40,
+//ascii 0x004A
+ 0x0E, 0xF0, 0x11, 0xF1, 0x10,
+//ascii 0x004B
+ 0x01, 0xA1, 0x11, 0x81, 0x31, 0x52, 0x51, 0x31,
+ 0x81, 0x11, 0xA1, 0x6C, 0x40,
+//ascii 0x004C
+ 0xB1, 0xB1, 0xB1, 0xB1, 0xBD,
+//ascii 0x004D
+ 0x0C, 0x13, 0xC3, 0xC2, 0xC2, 0xA2, 0x82, 0x73,
+ 0x72, 0x8C,
+//ascii 0x004E
+ 0x0C, 0x92, 0x91, 0x92, 0x91, 0x92, 0x82, 0x9C,
+//ascii 0x004F
+ 0x36, 0x51, 0x61, 0x31, 0x81, 0x11, 0xA2, 0xA2,
+ 0xA2, 0xA1, 0x11, 0x81, 0x31, 0x61, 0x56, 0x30,
+//ascii 0x0050
+ 0x15, 0x61, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51,
+ 0x51, 0x5C,
+//ascii 0x0051
+ 0x36, 0x91, 0x61, 0x41, 0x21, 0x81, 0x22, 0x11,
+ 0xA2, 0x31, 0xA1, 0x41, 0xA1, 0x41, 0xA1, 0x51,
+ 0x81, 0x71, 0x61, 0x96, 0x70,
+//ascii 0x0052
+ 0x23, 0x52, 0x11, 0x31, 0x31, 0x21, 0x53, 0x31,
+ 0x51, 0x51, 0x51, 0x51, 0x51, 0x5C, 0x40,
+//ascii 0x0053
+ 0x11, 0x54, 0x11, 0x51, 0x42, 0x51, 0x42, 0x41,
+ 0x52, 0x41, 0x52, 0x41, 0x51, 0x14, 0x61, 0x40,
+//ascii 0x0054
+ 0x01, 0xB1, 0xB1, 0xBD, 0xB1, 0xB1, 0x70,
+//ascii 0x0055
+ 0x0A, 0xC1, 0xC1, 0xB1, 0xB1, 0xB1, 0xA1, 0x1A,
+ 0x20,
+//ascii 0x0056
+ 0x02, 0xC3, 0xC3, 0xC2, 0xC2, 0x82, 0x73, 0x63,
+ 0x72, 0x60,
+//ascii 0x0057
+ 0x01, 0xC4, 0xC4, 0xC3, 0x74, 0x44, 0x53, 0x93,
+ 0xC4, 0xC4, 0xA3, 0x54, 0x44, 0x71, 0x30,
+//ascii 0x0058
+ 0xB3, 0x81, 0x32, 0x42, 0x61, 0x12, 0x91, 0x92,
+ 0x12, 0x61, 0x52, 0x22, 0x81, 0xC1, 0x40,
+//ascii 0x0059
+ 0x01, 0xC2, 0xC2, 0xC7, 0x52, 0x82, 0x82, 0x91,
+ 0x30,
+//ascii 0x005A
+ 0x02, 0x92, 0x12, 0x72, 0x31, 0x62, 0x42, 0x42,
+ 0x61, 0x32, 0x72, 0x12, 0x92, 0x40,
+//ascii 0x005B
+ 0x01, 0xD1, 0x11, 0xD1, 0x11, 0xD1, 0x1F, 0x10,
+//ascii 0x005C
+ 0xB1, 0x83, 0x54, 0x53, 0x81, 0x70,
+//ascii 0x005D
+ 0x0F, 0x11, 0xD1, 0x11, 0xD1, 0x11, 0xD1, 0x10,
+//ascii 0x005E
+ 0x52, 0x42, 0x42, 0x51, 0x82, 0x82, 0x82, 0x10,
+//ascii 0x005F
+ 0x11, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x60,
+//ascii 0x0060
+ 0x51, 0x61, 0x61, 0x40,
+//ascii 0x0061
+ 0x48, 0x31, 0x31, 0x21, 0x41, 0x31, 0x31, 0x31,
+ 0x31, 0x31, 0x31, 0x31, 0x31, 0x83, 0x10,
+//ascii 0x0062
+ 0x95, 0xA1, 0x51, 0x81, 0x71, 0x71, 0x71, 0x71,
+ 0x71, 0x71, 0x71, 0x81, 0x51, 0x4D,
+//ascii 0x0063
+ 0x31, 0x71, 0x31, 0x71, 0x31, 0x71, 0x31, 0x71,
+ 0x41, 0x51, 0x65, 0x20,
+//ascii 0x0064
+ 0x3D, 0x81, 0x51, 0x81, 0x71, 0x71, 0x71, 0x71,
+ 0x71, 0x71, 0x71, 0x81, 0x51, 0xA5, 0x20,
+//ascii 0x0065
+ 0x53, 0x21, 0x51, 0x21, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x41, 0x21,
+ 0x21, 0x65, 0x60,
+//ascii 0x0066
+ 0x31, 0xF1, 0x31, 0xB1, 0x31, 0xCC, 0x71, 0xF1,
+//ascii 0x0067
+ 0x31, 0x91, 0x51, 0x12, 0x42, 0x11, 0x42, 0x22,
+ 0x21, 0x31, 0x31, 0x41, 0x21, 0x31, 0x31, 0x41,
+ 0x21, 0x31, 0x31, 0x42, 0x11, 0x31, 0x44, 0x21,
+ 0x11, 0x12, 0xD2, 0x10,
+//ascii 0x0068
+ 0x97, 0x81, 0xE1, 0xF1, 0xF1, 0xF0, 0x11, 0xAD,
+//ascii 0x0069
+ 0x11, 0x28, 0x40,
+//ascii 0x006A
+ 0x11, 0x2C, 0xF1, 0xF1,
+//ascii 0x006B
+ 0xF1, 0x71, 0x61, 0x91, 0x41, 0xB1, 0x21, 0xD2,
+ 0xF0, 0x11, 0x6D,
+//ascii 0x006C
+ 0x3D,
+//ascii 0x006D
+ 0x57, 0x41, 0xA1, 0xB1, 0xB1, 0xC8, 0x41, 0xA1,
+ 0xB1, 0xB1, 0xC1, 0xA9,
+//ascii 0x006E
+ 0x57, 0x41, 0xA1, 0xB1, 0xB1, 0xC1, 0xA9, 0x40,
+//ascii 0x006F
+ 0x55, 0x61, 0x51, 0x41, 0x71, 0x31, 0x71, 0x31,
+ 0x71, 0x41, 0x51, 0x65, 0x60,
+//ascii 0x0070
+ 0x55, 0xA1, 0x51, 0x81, 0x71, 0x71, 0x71, 0x71,
+ 0x71, 0x71, 0x71, 0x81, 0x51, 0x8D,
+//ascii 0x0071
+ 0x3D, 0x41, 0x51, 0x81, 0x71, 0x71, 0x71, 0x71,
+ 0x71, 0x71, 0x71, 0x81, 0x51, 0xA5, 0x60,
+//ascii 0x0072
+ 0x31, 0xB1, 0xB1, 0xC1, 0xA9, 0x40,
+//ascii 0x0073
+ 0x31, 0x43, 0x41, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x31, 0x21, 0x41, 0x43, 0x41, 0x40,
+//ascii 0x0074
+ 0xB1, 0x31, 0x71, 0x31, 0x71, 0x29, 0x41, 0x40,
+//ascii 0x0075
+ 0x39, 0xA1, 0xC1, 0xB1, 0xB1, 0xA2, 0x37, 0x60,
+//ascii 0x0076
+ 0x32, 0xC3, 0xC3, 0xC1, 0x83, 0x63, 0x72, 0x30,
+//ascii 0x0077
+ 0x31, 0xC4, 0xC2, 0xB3, 0x63, 0x63, 0x93, 0xC3,
+ 0xC3, 0x82, 0x64, 0x71,
+//ascii 0x0078
+ 0x32, 0x52, 0x51, 0x31, 0x83, 0x93, 0x81, 0x31,
+ 0x52, 0x52,
+//ascii 0x0079
+ 0x32, 0xF0, 0x13, 0xF0, 0x13, 0xF0, 0x12, 0xB3,
+ 0x22, 0x63, 0x71, 0x32, 0xA1,
+//ascii 0x007A
+ 0x32, 0x61, 0x31, 0x12, 0x41, 0x31, 0x31, 0x31,
+ 0x31, 0x42, 0x11, 0x31, 0x62, 0x40,
+//ascii 0x007B
+ 0x01, 0xD1, 0x11, 0xD1, 0x26, 0x16, 0x91, 0xF1,
+//ascii 0x007C
+ 0x3F, 0x02, 0x40,
+//ascii 0x007D
+ 0x71, 0xF1, 0xA5, 0x15, 0x32, 0xB2, 0x11, 0xD1,
+ 0x10,
+//ascii 0x007E
+ 0x21, 0x31, 0x31, 0x31, 0x21, 0x31, 0x31, 0x60,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersOPEN_SANS_LIGHT_16PX_1BPP[95] = {
+ { 0, 0, 6,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 5,3, 4, 1, 4 }, //asciii 0x0021
+ { 3, 1, 8,3, 4, 1, 12 }, //asciii 0x0022
+ { 5, 1, 12,2, 4, 0, 4 }, //asciii 0x0023
+ { 23, 1, 11,3, 4, 1, 0 }, //asciii 0x0024
+ { 40, 1, 15,3, 4, 1, 4 }, //asciii 0x0025
+ { 58, 1, 13,3, 4, 1, 4 }, //asciii 0x0026
+ { 78, 1, 5,3, 4, 1, 12 }, //asciii 0x0027
+ { 80, 1, 6,3, 4, 1, 0 }, //asciii 0x0028
+ { 84, 1, 6,3, 4, 1, 0 }, //asciii 0x0029
+ { 88, 1, 11,3, 0, 1, 8 }, //asciii 0x002A
+ { 98, 1, 11,3, 4, 1, 8 }, //asciii 0x002B
+ { 106, 1, 5,2, 12, 1, 0 }, //asciii 0x002C
+ { 109, 1, 7,3, 8, 1, 8 }, //asciii 0x002D
+ { 113, 1, 6,3, 12, 1, 4 }, //asciii 0x002E
+ { 115, 1, 8,2, 4, 1, 4 }, //asciii 0x002F
+ { 121, 1, 11,3, 4, 1, 4 }, //asciii 0x0030
+ { 132, 1, 11,4, 4, 4, 4 }, //asciii 0x0031
+ { 136, 1, 11,3, 4, 1, 4 }, //asciii 0x0032
+ { 150, 1, 11,3, 4, 1, 4 }, //asciii 0x0033
+ { 168, 1, 11,2, 4, 0, 4 }, //asciii 0x0034
+ { 182, 1, 11,3, 4, 1, 4 }, //asciii 0x0035
+ { 198, 1, 11,3, 4, 1, 4 }, //asciii 0x0036
+ { 214, 1, 11,3, 4, 1, 4 }, //asciii 0x0037
+ { 225, 1, 11,3, 4, 1, 4 }, //asciii 0x0038
+ { 244, 1, 11,3, 4, 1, 4 }, //asciii 0x0039
+ { 260, 1, 6,3, 4, 1, 4 }, //asciii 0x003A
+ { 264, 1, 6,3, 4, 1, 0 }, //asciii 0x003B
+ { 268, 1, 11,3, 4, 1, 4 }, //asciii 0x003C
+ { 281, 1, 11,3, 8, 1, 8 }, //asciii 0x003D
+ { 290, 1, 11,3, 4, 1, 4 }, //asciii 0x003E
+ { 303, 1, 9,3, 4, 1, 4 }, //asciii 0x003F
+ { 312, 1, 13,0, 4, 1, 0 }, //asciii 0x0040
+ { 344, 1, 12,2, 4, 0, 4 }, //asciii 0x0041
+ { 358, 1, 12,4, 4, 1, 4 }, //asciii 0x0042
+ { 374, 1, 12,3, 4, 1, 4 }, //asciii 0x0043
+ { 386, 1, 13,4, 4, 1, 4 }, //asciii 0x0044
+ { 396, 1, 11,4, 4, 1, 4 }, //asciii 0x0045
+ { 407, 1, 10,4, 4, 0, 4 }, //asciii 0x0046
+ { 418, 1, 14,3, 4, 1, 4 }, //asciii 0x0047
+ { 436, 1, 14,4, 4, 2, 4 }, //asciii 0x0048
+ { 444, 1, 6,4, 4, 1, 4 }, //asciii 0x0049
+ { 446, 1, 6,0, 4, 3, 0 }, //asciii 0x004A
+ { 451, 1, 11,4, 4, 0, 4 }, //asciii 0x004B
+ { 464, 1, 10,4, 4, 0, 4 }, //asciii 0x004C
+ { 469, 1, 14,2, 4, 2, 4 }, //asciii 0x004D
+ { 479, 1, 14,4, 4, 2, 4 }, //asciii 0x004E
+ { 487, 1, 14,3, 4, 1, 4 }, //asciii 0x004F
+ { 503, 1, 11,4, 4, 1, 4 }, //asciii 0x0050
+ { 513, 1, 14,3, 4, 1, 0 }, //asciii 0x0051
+ { 534, 1, 12,4, 4, 1, 4 }, //asciii 0x0052
+ { 549, 1, 11,3, 4, 1, 4 }, //asciii 0x0053
+ { 565, 1, 9,2, 4, 0, 4 }, //asciii 0x0054
+ { 572, 1, 14,4, 4, 2, 4 }, //asciii 0x0055
+ { 581, 1, 12,2, 4, 1, 4 }, //asciii 0x0056
+ { 591, 1, 15,1, 4, 0, 4 }, //asciii 0x0057
+ { 606, 1, 11,2, 4, 0, 4 }, //asciii 0x0058
+ { 621, 1, 11,2, 4, 1, 4 }, //asciii 0x0059
+ { 630, 1, 11,3, 4, 1, 4 }, //asciii 0x005A
+ { 644, 1, 7,3, 4, 0, 0 }, //asciii 0x005B
+ { 652, 1, 8,2, 4, 1, 4 }, //asciii 0x005C
+ { 658, 1, 7,2, 4, 1, 0 }, //asciii 0x005D
+ { 666, 1, 11,3, 4, 1, 8 }, //asciii 0x005E
+ { 674, 1, 9,1, 16, 1, 0 }, //asciii 0x005F
+ { 682, 1, 11,5, 0, 3, 12 }, //asciii 0x0060
+ { 686, 1, 10,3, 4, 1, 4 }, //asciii 0x0061
+ { 701, 1, 12,3, 0, 1, 4 }, //asciii 0x0062
+ { 715, 1, 10,3, 4, 1, 4 }, //asciii 0x0063
+ { 727, 1, 12,3, 0, 1, 4 }, //asciii 0x0064
+ { 742, 1, 11,3, 4, 1, 4 }, //asciii 0x0065
+ { 761, 1, 8,2, 0, 0, 4 }, //asciii 0x0066
+ { 769, 1, 10,2, 4, 0, 0 }, //asciii 0x0067
+ { 797, 1, 11,3, 0, 1, 4 }, //asciii 0x0068
+ { 805, 1, 6,3, 4, 2, 4 }, //asciii 0x0069
+ { 808, 1, 7,2, 4, 2, 0 }, //asciii 0x006A
+ { 812, 1, 10,3, 0, 0, 4 }, //asciii 0x006B
+ { 823, 1, 6,3, 0, 2, 4 }, //asciii 0x006C
+ { 824, 1, 14,1, 4, 1, 4 }, //asciii 0x006D
+ { 836, 1, 11,3, 4, 1, 4 }, //asciii 0x006E
+ { 844, 1, 11,3, 4, 1, 4 }, //asciii 0x006F
+ { 857, 1, 12,3, 4, 1, 0 }, //asciii 0x0070
+ { 871, 1, 12,3, 4, 1, 0 }, //asciii 0x0071
+ { 886, 1, 8,3, 4, 0, 4 }, //asciii 0x0072
+ { 892, 1, 9,3, 4, 1, 4 }, //asciii 0x0073
+ { 906, 1, 7,2, 4, 0, 4 }, //asciii 0x0074
+ { 914, 1, 11,3, 4, 1, 4 }, //asciii 0x0075
+ { 922, 1, 10,2, 4, 1, 4 }, //asciii 0x0076
+ { 930, 1, 14,2, 4, 0, 4 }, //asciii 0x0077
+ { 942, 1, 10,3, 4, 1, 4 }, //asciii 0x0078
+ { 952, 1, 10,2, 4, 1, 0 }, //asciii 0x0079
+ { 965, 1, 9,3, 4, 1, 4 }, //asciii 0x007A
+ { 979, 1, 8,2, 4, 1, 0 }, //asciii 0x007B
+ { 987, 1, 8,3, 0, 4, 0 }, //asciii 0x007C
+ { 990, 1, 8,3, 4, 0, 0 }, //asciii 0x007D
+ { 999, 1, 11,3, 8, 1, 8 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontOPEN_SANS_LIGHT_16PX_1BPP= {
+ 1007, // bitmap len
+ BAGL_FONT_OPEN_SANS_LIGHT_16px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 24, // height of all characters in pixels
+ 21, // line height in pixels
+ 2, // kerning
+ 1, // crop enabled (1) or not (0)
+ 4, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersOPEN_SANS_LIGHT_16PX_1BPP,
+ bitmapOPEN_SANS_LIGHT_16PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.json b/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.json
new file mode 100644
index 00000000..e61c2c1c
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_light_16.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "CCJABIRBsSFFIYZhISQhIWaBJUEhsUCCcVEhYUIxTUFBQWEhUXJRUGVhUkFREjVCwsJFMhFRQlFlIGMhkpERIzEyMRFCQVIyURMhMnRQBEACsjswKzKyEGGxIYNks5EhgRBBcXFHQXFxMCOBIDExMUAiIgHDxMPBQCgxgRGioqERgThgDBHBULEVUlFCYTJxIoEREYJAIUMxEhExETJSQVJBUkFREZFAgbE8EWFRUWIxgSGTsXBkIVExEUFSQVJBVRFRQkFQZRFBUkFSQVERMVESMTFHYAKhE3FCUWMhk7FwIjQhIRFCQVJBUkFRESERQSI0UCdBMTIRUTERUUJRQlFBFSAyUjJSMuJTMCFRYTFxMYERkRGhsSABIiIiIiIiIUBRsaERkRGBMXExYVFwFHFBYVFRYhNwNpFhcXFhJ2EhQUEhIVExISFRMSExQTExNEExoVJxh1Cxg3JzEUNBQ0FzEaLDwSIzMSERMRFBUkFSQVJBXUABoqKioqERgTFhVjA2UWExgRGioqKtAUFSQVJBUkFSQV0BUVFRUVFRUVFRXGURUUJRQlFCUUKioRGBMWFWMAxRsbGxsbFsDEAO8BHxEAGhEYExUlExgRGhbECxsbGxvQwTw8LCooJzcowMkpGSkZKCnDZRYTGBEaKioqERgTFhVjAVYVFRUVFRUVFcNpFhQSGBIhGiMaFBoUGhUYFxYZZwI1IRMTEhUzFRUVFRUVxAEVQRUUJRQkFSQVJBURRhQAGxsb2xsXAKwcGxsbGhGiACw8PCwoJzY3JgAcTEw3REU5PExKNURHEws4EyQmESkZISYVIigcFAAcLCx1KCgpEwApIScjFiQkJhMnISkkAB0RHREdEfELGDVFOBcA8R0RHREdEQUkJCUYKCghARMTExMTExYFFhYUBIMTEhQTExMTExMTExgxCVoVGBcXFxcXFxcYFRTTFxMXExcTFxQVFlID2BUYFxcXFxcXFxgVGlIFMhUSExMTExMTExMTExQSEhZWAx8TGxMcxx8TGRURJCEUIiITExQSExMUEhMTFCETFEIRES0hCXgeHx8fARrREoQBEs8fHxcWGRQbEh0vARbT1XQaGxschBobGxwalXQaGxscGpQFVhUUFxMXExcUFRZWBVoVGBcXFxcXFxcYFRjT1BUYFxcXFxcXFxgVGlYDGxscGpQDFDQTExMTExMSFBQ0FAsTFxMXEpQUA5ocGxsaI3YDLDw8GDY3IwMcTCs2Njk8PDgmRxMlJRMYOTgTFSUjLwE/AT8BKzImNxMqEyYTESQTExMTFCETFiQAHREdEmFpHxPwJAcfGlFTKyEdEQITExMSExMWA=",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 5,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 3,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 34,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 35,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 23,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 36,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 40,
+ "width": 15,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 58,
+ "width": 13,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 20
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 78,
+ "width": 5,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 12,
+ "char": 39,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 80,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 84,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 88,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 42,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 98,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 43,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 106,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 109,
+ "width": 7,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 45,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 113,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 115,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 121,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 132,
+ "width": 11,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 4,
+ "y_max_offset": 4,
+ "char": 49,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 136,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 50,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 150,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 168,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 52,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 182,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 198,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 214,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 55,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 225,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 244,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 260,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 264,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 268,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 60,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 281,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 61,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 290,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 62,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 303,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 312,
+ "width": 13,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 32
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 344,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 65,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 358,
+ "width": 12,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 66,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 374,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 67,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 386,
+ "width": 13,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 68,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 396,
+ "width": 11,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 69,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 407,
+ "width": 10,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 70,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 418,
+ "width": 14,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 18
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 436,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 72,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 444,
+ "width": 6,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 73,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 446,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 3,
+ "y_max_offset": 0,
+ "char": 74,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 451,
+ "width": 11,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 75,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 464,
+ "width": 10,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 76,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 469,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 77,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 479,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 78,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 487,
+ "width": 14,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 503,
+ "width": 11,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 80,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 513,
+ "width": 14,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 81,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 534,
+ "width": 12,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 82,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 549,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 16
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 565,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 84,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 572,
+ "width": 14,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 581,
+ "width": 12,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 86,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 591,
+ "width": 15,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 87,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 606,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 88,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 621,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 89,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 630,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 90,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 644,
+ "width": 7,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 652,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 658,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 666,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 94,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 674,
+ "width": 9,
+ "x_min_offset": 1,
+ "y_min_offset": 16,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 95,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 682,
+ "width": 11,
+ "x_min_offset": 5,
+ "y_min_offset": 0,
+ "x_max_offset": 3,
+ "y_max_offset": 12,
+ "char": 96,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 686,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 701,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 715,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 727,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 742,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 19
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 761,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 102,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 769,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 28
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 797,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 104,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 805,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 105,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 808,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 812,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 107,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 823,
+ "width": 6,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 108,
+ "bitmap_byte_count": 1
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 824,
+ "width": 14,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 109,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 836,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 110,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 844,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 857,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 871,
+ "width": 12,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 15
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 886,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 114,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 892,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 906,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 914,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 922,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 118,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 930,
+ "width": 14,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 119,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 942,
+ "width": 10,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 120,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 952,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 13
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 965,
+ "width": 9,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 122,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 979,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 987,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 4,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 990,
+ "width": 8,
+ "x_min_offset": 3,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 999,
+ "width": 11,
+ "x_min_offset": 3,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 126,
+ "bitmap_byte_count": 8
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.inc b/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.inc
new file mode 100644
index 00000000..9974ee43
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.inc
@@ -0,0 +1,336 @@
+#include "nbgl_fonts.h"
+
+__attribute__ ((section("._nbgl_fonts_"))) const unsigned char bitmapOPEN_SANS_REGULAR_11PX_1BPP[] = {
+//ascii 0x0020
+//ascii 0x0021
+ 0x06, 0x11,
+//ascii 0x0022
+ 0x02, 0x22, 0x20,
+//ascii 0x0023
+ 0x21, 0x53, 0x21, 0x45, 0x31, 0x21, 0x35, 0x41,
+ 0x23, 0x51, 0x20,
+//ascii 0x0024
+ 0x11, 0x33, 0x17, 0x11, 0x21, 0x21, 0x13, 0x31,
+//ascii 0x0025
+ 0x36, 0x21, 0x31, 0x12, 0x13, 0x42, 0x43, 0x12,
+ 0x11, 0x31, 0x26, 0x30,
+//ascii 0x0026
+ 0x42, 0x11, 0x61, 0x13, 0x21, 0x12, 0x22, 0x22,
+ 0x21, 0x31, 0x12, 0x14,
+//ascii 0x0027
+ 0x02, 0x60,
+//ascii 0x0028
+ 0x03, 0x43, 0x54, 0x50,
+//ascii 0x0029
+ 0x34, 0x53, 0x43, 0x20,
+//ascii 0x002A
+ 0x21, 0x71, 0x11, 0x52, 0x44, 0x61, 0x11, 0x51,
+ 0x50,
+//ascii 0x002B
+ 0x41, 0x71, 0x63, 0x61, 0x71, 0x71, 0x30,
+//ascii 0x002C
+ 0x32, 0x81, 0x20,
+//ascii 0x002D
+ 0x11, 0x31, 0x20,
+//ascii 0x002E
+ 0x31, 0x40,
+//ascii 0x002F
+ 0x01, 0x83, 0x83, 0x81,
+//ascii 0x0030
+ 0x16, 0x11, 0x62, 0x61, 0x16, 0x10,
+//ascii 0x0031
+ 0x09, 0x81, 0x60,
+//ascii 0x0032
+ 0x13, 0x32, 0x31, 0x22, 0x41, 0x12, 0x52,
+//ascii 0x0033
+ 0x12, 0x13, 0x11, 0x21, 0x32, 0x21, 0x32, 0x61,
+//ascii 0x0034
+ 0x51, 0x28, 0x11, 0x31, 0x41, 0x21, 0x53, 0x71,
+ 0x20,
+//ascii 0x0035
+ 0x01, 0x24, 0x11, 0x21, 0x32, 0x21, 0x35, 0x31,
+//ascii 0x0036
+ 0x01, 0x24, 0x11, 0x21, 0x32, 0x21, 0x31, 0x16,
+ 0x10,
+//ascii 0x0037
+ 0x03, 0x51, 0x22, 0x31, 0x44, 0x70,
+//ascii 0x0038
+ 0x12, 0x13, 0x11, 0x21, 0x32, 0x21, 0x31, 0x12,
+ 0x13, 0x10,
+//ascii 0x0039
+ 0x16, 0x11, 0x31, 0x22, 0x31, 0x21, 0x14, 0x21,
+//ascii 0x003A
+ 0x21, 0x41,
+//ascii 0x003B
+ 0x21, 0x42, 0xC1, 0x20,
+//ascii 0x003C
+ 0x11, 0x41, 0x31, 0x21, 0x52, 0x62, 0x30,
+//ascii 0x003D
+ 0x31, 0x11, 0x51, 0x11, 0x51, 0x11, 0x51, 0x11,
+ 0x20,
+//ascii 0x003E
+ 0x32, 0x62, 0x51, 0x21, 0x31, 0x41, 0x10,
+//ascii 0x003F
+ 0x12, 0x51, 0x21, 0x41, 0x32, 0x12, 0x70,
+//ascii 0x0040
+ 0x16, 0x51, 0x51, 0x51, 0x15, 0x11, 0x31, 0x11,
+ 0x31, 0x11, 0x31, 0x11, 0x31, 0x11, 0x31, 0x24,
+ 0x11, 0x41, 0x61, 0x56, 0x40,
+//ascii 0x0041
+ 0x71, 0x43, 0x23, 0x11, 0x21, 0x41, 0x33, 0x11,
+ 0x63, 0x81,
+//ascii 0x0042
+ 0x03, 0x15, 0x21, 0x32, 0x21, 0x32, 0x21, 0x39,
+//ascii 0x0043
+ 0x01, 0x62, 0x62, 0x63, 0x42, 0x16, 0x10,
+//ascii 0x0044
+ 0x16, 0x11, 0x62, 0x62, 0x62, 0x69,
+//ascii 0x0045
+ 0x01, 0x21, 0x32, 0x21, 0x32, 0x21, 0x39,
+//ascii 0x0046
+ 0x01, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
+ 0x38,
+//ascii 0x0047
+ 0x01, 0x35, 0x31, 0x22, 0x62, 0x62, 0x61, 0x16,
+ 0x10,
+//ascii 0x0048
+ 0x08, 0x31, 0x71, 0x71, 0x71, 0x48,
+//ascii 0x0049
+ 0x08,
+//ascii 0x004A
+ 0x09, 0xC1, 0xB1, 0x60,
+//ascii 0x004B
+ 0x72, 0x51, 0x21, 0x31, 0x41, 0x11, 0x61, 0x48,
+//ascii 0x004C
+ 0x71, 0x71, 0x71, 0x79,
+//ascii 0x004D
+ 0x0B, 0x82, 0x83, 0x53, 0x32, 0x33, 0x58,
+//ascii 0x004E
+ 0x08, 0x61, 0x52, 0x42, 0x51, 0x68,
+//ascii 0x004F
+ 0x16, 0x11, 0x62, 0x62, 0x62, 0x62, 0x61, 0x16,
+ 0x10,
+//ascii 0x0050
+ 0x13, 0x41, 0x31, 0x31, 0x31, 0x31, 0x31, 0x38,
+//ascii 0x0051
+ 0x16, 0x51, 0x61, 0x11, 0x21, 0x62, 0x31, 0x61,
+ 0x41, 0x61, 0x41, 0x61, 0x56, 0x10,
+//ascii 0x0052
+ 0x13, 0x23, 0x32, 0x21, 0x31, 0x31, 0x31, 0x38,
+//ascii 0x0053
+ 0x01, 0x33, 0x11, 0x31, 0x22, 0x21, 0x31, 0x13,
+ 0x31,
+//ascii 0x0054
+ 0x01, 0x71, 0x79, 0x71, 0x70,
+//ascii 0x0055
+ 0x07, 0x81, 0x71, 0x71, 0x78, 0x10,
+//ascii 0x0056
+ 0x01, 0x83, 0x83, 0x81, 0x43, 0x23, 0x41, 0x70,
+//ascii 0x0057
+ 0x01, 0x85, 0x82, 0x33, 0x23, 0x53, 0x83, 0x82,
+ 0x15, 0x21, 0x70,
+//ascii 0x0058
+ 0x01, 0x61, 0x11, 0x32, 0x33, 0x53, 0x41, 0x32,
+ 0x11, 0x61,
+//ascii 0x0059
+ 0x01, 0x82, 0x85, 0x31, 0x52, 0x51, 0x70,
+//ascii 0x005A
+ 0x02, 0x52, 0x12, 0x32, 0x31, 0x22, 0x43,
+//ascii 0x005B
+ 0x01, 0x81, 0x21, 0x81, 0x2A, 0x60,
+//ascii 0x005C
+ 0x71, 0x43, 0x23, 0x41, 0x70,
+//ascii 0x005D
+ 0x0A, 0x21, 0x81, 0x21, 0x81, 0x60,
+//ascii 0x005E
+ 0x41, 0x52, 0x42, 0x62, 0x82, 0x81, 0x30,
+//ascii 0x005F
+ 0x11, 0x31, 0x31, 0x31, 0x31, 0x60,
+//ascii 0x0060
+ 0x41, 0x61, 0x40,
+//ascii 0x0061
+ 0x26, 0x21, 0x11, 0x21, 0x21, 0x11, 0x21, 0x21,
+ 0x14,
+//ascii 0x0062
+ 0x34, 0x31, 0x41, 0x21, 0x41, 0x21, 0x49,
+//ascii 0x0063
+ 0x21, 0x41, 0x21, 0x41, 0x21, 0x41, 0x34, 0x10,
+//ascii 0x0064
+ 0x08, 0x21, 0x41, 0x21, 0x41, 0x21, 0x41, 0x34,
+ 0x10,
+//ascii 0x0065
+ 0x23, 0x21, 0x21, 0x11, 0x21, 0x21, 0x11, 0x21,
+ 0x34, 0x10,
+//ascii 0x0066
+ 0x01, 0x11, 0x51, 0x11, 0x67, 0x21, 0x50,
+//ascii 0x0067
+ 0x21, 0x52, 0x43, 0x21, 0x21, 0x31, 0x21, 0x11,
+ 0x21, 0x31, 0x21, 0x11, 0x21, 0x36, 0x21, 0x92,
+ 0x20,
+//ascii 0x0068
+ 0x35, 0x21, 0x71, 0x71, 0x58,
+//ascii 0x0069
+ 0x01, 0x16,
+//ascii 0x006A
+ 0x01, 0x19, 0xB1, 0xB1, 0x50,
+//ascii 0x006B
+ 0x21, 0x32, 0x31, 0x11, 0x61, 0x38,
+//ascii 0x006C
+ 0x08,
+//ascii 0x006D
+ 0x26, 0x21, 0x71, 0x85, 0x21, 0x71, 0x71, 0x76,
+//ascii 0x006E
+ 0x35, 0x21, 0x71, 0x71, 0x76,
+//ascii 0x006F
+ 0x34, 0x31, 0x41, 0x21, 0x41, 0x21, 0x41, 0x34,
+ 0x10,
+//ascii 0x0070
+ 0x34, 0x71, 0x41, 0x61, 0x41, 0x61, 0x41, 0x69,
+ 0x50,
+//ascii 0x0071
+ 0x29, 0x31, 0x41, 0x61, 0x41, 0x61, 0x41, 0x74,
+ 0x10,
+//ascii 0x0072
+ 0x21, 0x71, 0x76,
+//ascii 0x0073
+ 0x61, 0x31, 0x21, 0x11, 0x21, 0x11, 0x21, 0x23,
+ 0x21,
+//ascii 0x0074
+ 0x21, 0x41, 0x21, 0x41, 0x17, 0x21, 0x50,
+//ascii 0x0075
+ 0x26, 0x71, 0x71, 0x71, 0x26,
+//ascii 0x0076
+ 0x21, 0x83, 0x82, 0x62, 0x33, 0x41, 0x50,
+//ascii 0x0077
+ 0x21, 0x83, 0x82, 0x33, 0x41, 0x83, 0x82, 0x33,
+ 0x41, 0x50,
+//ascii 0x0078
+ 0x22, 0x22, 0x42, 0x62, 0x42, 0x22,
+//ascii 0x0079
+ 0x21, 0xC3, 0xC2, 0xA4, 0x53, 0x41, 0x31, 0x71,
+ 0x10,
+//ascii 0x007A
+ 0x21, 0x41, 0x22, 0x31, 0x21, 0x12, 0x11, 0x21,
+ 0x32, 0x21, 0x41,
+//ascii 0x007B
+ 0x01, 0x81, 0x24, 0x24, 0x62, 0x20,
+//ascii 0x007C
+ 0x0B, 0x50,
+//ascii 0x007D
+ 0x42, 0x64, 0x24, 0x21, 0x81, 0x60,
+//ascii 0x007E
+ 0x41, 0x71, 0x61, 0x71, 0x40,
+};
+
+ __attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_character_t charactersOPEN_SANS_REGULAR_11PX_1BPP[95] = {
+ { 0, 0, 4,0, 0, 0, 0 }, //asciii 0x0020
+ { 0, 1, 4,2, 4, 1, 4 }, //asciii 0x0021
+ { 2, 1, 5,2, 4, 1, 8 }, //asciii 0x0022
+ { 5, 1, 8,1, 4, 0, 4 }, //asciii 0x0023
+ { 16, 1, 7,2, 4, 1, 4 }, //asciii 0x0024
+ { 24, 1, 10,2, 4, 1, 4 }, //asciii 0x0025
+ { 36, 1, 10,2, 4, 2, 4 }, //asciii 0x0026
+ { 48, 1, 3,2, 4, 0, 8 }, //asciii 0x0027
+ { 50, 1, 4,1, 4, 1, 0 }, //asciii 0x0028
+ { 54, 1, 4,2, 4, 0, 0 }, //asciii 0x0029
+ { 58, 1, 7,1, 4, 0, 4 }, //asciii 0x002A
+ { 67, 1, 7,1, 4, 0, 4 }, //asciii 0x002B
+ { 74, 1, 4,1, 8, 1, 0 }, //asciii 0x002C
+ { 77, 1, 5,2, 8, 1, 4 }, //asciii 0x002D
+ { 80, 1, 4,2, 8, 1, 4 }, //asciii 0x002E
+ { 82, 1, 5,1, 4, 0, 4 }, //asciii 0x002F
+ { 86, 1, 7,2, 4, 1, 4 }, //asciii 0x0030
+ { 92, 1, 7,2, 4, 2, 4 }, //asciii 0x0031
+ { 95, 1, 7,2, 4, 1, 4 }, //asciii 0x0032
+ { 102, 1, 7,2, 4, 1, 4 }, //asciii 0x0033
+ { 110, 1, 9,2, 4, 1, 4 }, //asciii 0x0034
+ { 119, 1, 7,2, 4, 1, 4 }, //asciii 0x0035
+ { 127, 1, 7,2, 4, 1, 4 }, //asciii 0x0036
+ { 136, 1, 7,2, 4, 1, 4 }, //asciii 0x0037
+ { 142, 1, 7,2, 4, 1, 4 }, //asciii 0x0038
+ { 152, 1, 7,2, 4, 1, 4 }, //asciii 0x0039
+ { 160, 1, 4,2, 4, 1, 4 }, //asciii 0x003A
+ { 162, 1, 4,1, 4, 1, 0 }, //asciii 0x003B
+ { 166, 1, 7,2, 4, 1, 4 }, //asciii 0x003C
+ { 173, 1, 7,2, 4, 1, 4 }, //asciii 0x003D
+ { 182, 1, 7,2, 4, 1, 4 }, //asciii 0x003E
+ { 189, 1, 6,2, 4, 0, 4 }, //asciii 0x003F
+ { 196, 1, 11,2, 4, 1, 0 }, //asciii 0x0040
+ { 217, 1, 8,1, 4, 0, 4 }, //asciii 0x0041
+ { 227, 1, 8,2, 4, 1, 4 }, //asciii 0x0042
+ { 235, 1, 8,2, 4, 1, 4 }, //asciii 0x0043
+ { 242, 1, 9,2, 4, 1, 4 }, //asciii 0x0044
+ { 248, 1, 7,2, 4, 1, 4 }, //asciii 0x0045
+ { 255, 1, 7,2, 4, 0, 4 }, //asciii 0x0046
+ { 264, 1, 9,2, 4, 1, 4 }, //asciii 0x0047
+ { 273, 1, 9,2, 4, 1, 4 }, //asciii 0x0048
+ { 279, 1, 4,2, 4, 1, 4 }, //asciii 0x0049
+ { 280, 1, 4,0, 4, 1, 0 }, //asciii 0x004A
+ { 284, 1, 8,2, 4, 0, 4 }, //asciii 0x004B
+ { 292, 1, 7,2, 4, 0, 4 }, //asciii 0x004C
+ { 296, 1, 11,2, 4, 1, 4 }, //asciii 0x004D
+ { 303, 1, 9,2, 4, 1, 4 }, //asciii 0x004E
+ { 309, 1, 10,2, 4, 1, 4 }, //asciii 0x004F
+ { 318, 1, 8,2, 4, 1, 4 }, //asciii 0x0050
+ { 326, 1, 10,2, 4, 1, 0 }, //asciii 0x0051
+ { 340, 1, 8,2, 4, 1, 4 }, //asciii 0x0052
+ { 348, 1, 7,2, 4, 1, 4 }, //asciii 0x0053
+ { 357, 1, 8,2, 4, 1, 4 }, //asciii 0x0054
+ { 362, 1, 9,2, 4, 1, 4 }, //asciii 0x0055
+ { 368, 1, 8,1, 4, 0, 4 }, //asciii 0x0056
+ { 376, 1, 11,1, 4, 0, 4 }, //asciii 0x0057
+ { 387, 1, 8,1, 4, 1, 4 }, //asciii 0x0058
+ { 397, 1, 7,1, 4, 0, 4 }, //asciii 0x0059
+ { 404, 1, 7,2, 4, 1, 4 }, //asciii 0x005A
+ { 411, 1, 5,2, 4, 0, 0 }, //asciii 0x005B
+ { 417, 1, 5,1, 4, 0, 4 }, //asciii 0x005C
+ { 422, 1, 5,1, 4, 1, 0 }, //asciii 0x005D
+ { 428, 1, 7,1, 4, 0, 4 }, //asciii 0x005E
+ { 435, 1, 6,0, 12, 1, 0 }, //asciii 0x005F
+ { 441, 1, 7,3, 0, 2, 8 }, //asciii 0x0060
+ { 444, 1, 7,2, 4, 1, 4 }, //asciii 0x0061
+ { 453, 1, 8,2, 4, 1, 4 }, //asciii 0x0062
+ { 460, 1, 6,2, 4, 0, 4 }, //asciii 0x0063
+ { 468, 1, 8,2, 4, 1, 4 }, //asciii 0x0064
+ { 477, 1, 7,2, 4, 1, 4 }, //asciii 0x0065
+ { 487, 1, 6,1, 4, 1, 4 }, //asciii 0x0066
+ { 494, 1, 7,1, 4, 0, 0 }, //asciii 0x0067
+ { 511, 1, 8,2, 4, 1, 4 }, //asciii 0x0068
+ { 516, 1, 4,2, 4, 1, 4 }, //asciii 0x0069
+ { 518, 1, 4,0, 4, 1, 0 }, //asciii 0x006A
+ { 523, 1, 7,2, 4, 1, 4 }, //asciii 0x006B
+ { 529, 1, 4,2, 4, 1, 4 }, //asciii 0x006C
+ { 530, 1, 11,2, 4, 1, 4 }, //asciii 0x006D
+ { 538, 1, 8,2, 4, 1, 4 }, //asciii 0x006E
+ { 543, 1, 8,2, 4, 1, 4 }, //asciii 0x006F
+ { 552, 1, 8,2, 4, 1, 0 }, //asciii 0x0070
+ { 561, 1, 8,2, 4, 1, 0 }, //asciii 0x0071
+ { 570, 1, 5,2, 4, 0, 4 }, //asciii 0x0072
+ { 573, 1, 6,2, 4, 0, 4 }, //asciii 0x0073
+ { 582, 1, 5,1, 4, 0, 4 }, //asciii 0x0074
+ { 589, 1, 8,2, 4, 1, 4 }, //asciii 0x0075
+ { 594, 1, 7,1, 4, 0, 4 }, //asciii 0x0076
+ { 601, 1, 10,1, 4, 0, 4 }, //asciii 0x0077
+ { 611, 1, 7,2, 4, 1, 4 }, //asciii 0x0078
+ { 617, 1, 7,1, 4, 0, 0 }, //asciii 0x0079
+ { 626, 1, 6,1, 4, 0, 4 }, //asciii 0x007A
+ { 637, 1, 5,2, 4, 0, 0 }, //asciii 0x007B
+ { 643, 1, 7,4, 4, 2, 0 }, //asciii 0x007C
+ { 645, 1, 5,1, 4, 1, 0 }, //asciii 0x007D
+ { 651, 1, 7,2, 4, 1, 4 }, //asciii 0x007E
+};
+
+__attribute__ ((section("._nbgl_fonts_"))) const nbgl_font_t fontOPEN_SANS_REGULAR_11PX_1BPP= {
+ 656, // bitmap len
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, // font id
+ (uint8_t) NBGL_BPP_1, // bpp
+ 16, // height of all characters in pixels
+ 14, // line height in pixels
+ 1, // kerning
+ 1, // crop enabled (1) or not (0)
+ 0, // Most top Y coordinate of any char
+ 0x20, // first character
+ 0x7E, // last character
+ charactersOPEN_SANS_REGULAR_11PX_1BPP,
+ bitmapOPEN_SANS_REGULAR_11PX_1BPP
+};
diff --git a/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.json b/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.json
new file mode 100644
index 00000000..8db4ae33
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_open_sans_regular_11.json
@@ -0,0 +1,1052 @@
+[
+ {
+ "bitmap": "BhECIiAhUyFFMSE1QSNRIBEzFxEhIRMxNiExEhNCQxIRMSYwQhFhEyESIiIhMRIUAmADQ1RQNFNDICFxEVJEYRFRUEFxY2FxcTAygSARMSAxQAGDg4EWEWJhFhAJgWATMjEiQRJSEhMRITIhMmFRKBExQSFTcSABJBEhMiE1MQEkESEyITEWEANRIjFEcBITESEyITESExAWETEiMSEUISFBIULBIBFBMSFSYjAxEVERURFRESAyYlEhMUEQElEhQTIScBZRUVEVETERMRExETERMSQRQWFWQHFDIxEhQTMRY4EDFSEyITIhOQFiYmNCFhAWEWJiYmkBITIhMiE5ATExMTExMTE4ATUxImJiYRYQCDFxcXFICAnBsWByUSExQRFhSHFxcXkLgoNTMjNYCGFSQlFoFhFiYmJiYRYQE0ExMTExMTgWUWERIWIxYUFhQWFWEBMjMiExMTE4ATMRMSIhMRMxAXF5cXAHgXFxeBABg4OBQyNBcAGFgjMjU4OCFSFwAWERMjNTQTIRYQGChTFSUXACUhIyMSJDAYEhgSpgcUMjQXAKIYEhgWBBUkJigoEwETExMTFgQWFAJiERISERISEUNDFBIUEhSSFBIUEhQTQQCCFBIUEhQTQQIyEhESEhESE0EAERURFnIVAhUkMhITEhESExIREhNiGSIDUhcXFYARYBGbGxUCEyMRFhOAgmIXGFIXFxdjUhcXF2NDFBIUEhQTQQNHFBYUFhQWlQKTFBYUFhQXQQIXF2YTEhESERISMhIUEhQRchUCZxcXEmIYOCYjNBUCGDgjNBg4IzQVAiIkJiQiIhw8KkU0ExcRAhQSIxIRIRITIhQQGBJCRiIAtQQmQkIYFgQXFhcUA=",
+ "nbgl_font_character": [
+ {
+ "encoding": 0,
+ "bitmap_offset": 0,
+ "width": 4,
+ "x_min_offset": 0,
+ "y_min_offset": 0,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 32,
+ "bitmap_byte_count": 0
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 0,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 33,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 2,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 8,
+ "char": 34,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 5,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 35,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 16,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 36,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 24,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 37,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 36,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 38,
+ "bitmap_byte_count": 12
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 48,
+ "width": 3,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 8,
+ "char": 39,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 50,
+ "width": 4,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 40,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 54,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 41,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 58,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 42,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 67,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 43,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 74,
+ "width": 4,
+ "x_min_offset": 1,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 44,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 77,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 45,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 80,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 8,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 46,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 82,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 47,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 86,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 48,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 92,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 4,
+ "char": 49,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 95,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 50,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 102,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 51,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 110,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 52,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 119,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 53,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 127,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 54,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 136,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 55,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 142,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 56,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 152,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 57,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 160,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 58,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 162,
+ "width": 4,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 59,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 166,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 60,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 173,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 61,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 182,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 62,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 189,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 63,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 196,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 64,
+ "bitmap_byte_count": 21
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 217,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 65,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 227,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 66,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 235,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 67,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 242,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 68,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 248,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 69,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 255,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 70,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 264,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 71,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 273,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 72,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 279,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 73,
+ "bitmap_byte_count": 1
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 280,
+ "width": 4,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 74,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 284,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 75,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 292,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 76,
+ "bitmap_byte_count": 4
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 296,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 77,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 303,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 78,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 309,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 79,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 318,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 80,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 326,
+ "width": 10,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 81,
+ "bitmap_byte_count": 14
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 340,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 82,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 348,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 83,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 357,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 84,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 362,
+ "width": 9,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 85,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 368,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 86,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 376,
+ "width": 11,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 87,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 387,
+ "width": 8,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 88,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 397,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 89,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 404,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 90,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 411,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 91,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 417,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 92,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 422,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 93,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 428,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 94,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 435,
+ "width": 6,
+ "x_min_offset": 0,
+ "y_min_offset": 12,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 95,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 441,
+ "width": 7,
+ "x_min_offset": 3,
+ "y_min_offset": 0,
+ "x_max_offset": 2,
+ "y_max_offset": 8,
+ "char": 96,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 444,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 97,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 453,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 98,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 460,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 99,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 468,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 100,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 477,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 101,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 487,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 102,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 494,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 103,
+ "bitmap_byte_count": 17
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 511,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 104,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 516,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 105,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 518,
+ "width": 4,
+ "x_min_offset": 0,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 106,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 523,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 107,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 529,
+ "width": 4,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 108,
+ "bitmap_byte_count": 1
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 530,
+ "width": 11,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 109,
+ "bitmap_byte_count": 8
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 538,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 110,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 543,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 111,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 552,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 112,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 561,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 113,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 570,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 114,
+ "bitmap_byte_count": 3
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 573,
+ "width": 6,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 115,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 582,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 116,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 589,
+ "width": 8,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 117,
+ "bitmap_byte_count": 5
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 594,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 118,
+ "bitmap_byte_count": 7
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 601,
+ "width": 10,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 119,
+ "bitmap_byte_count": 10
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 611,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 120,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 617,
+ "width": 7,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 121,
+ "bitmap_byte_count": 9
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 626,
+ "width": 6,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 4,
+ "char": 122,
+ "bitmap_byte_count": 11
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 637,
+ "width": 5,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 0,
+ "y_max_offset": 0,
+ "char": 123,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 643,
+ "width": 7,
+ "x_min_offset": 4,
+ "y_min_offset": 4,
+ "x_max_offset": 2,
+ "y_max_offset": 0,
+ "char": 124,
+ "bitmap_byte_count": 2
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 645,
+ "width": 5,
+ "x_min_offset": 1,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 0,
+ "char": 125,
+ "bitmap_byte_count": 6
+ },
+ {
+ "encoding": 1,
+ "bitmap_offset": 651,
+ "width": 7,
+ "x_min_offset": 2,
+ "y_min_offset": 4,
+ "x_max_offset": 1,
+ "y_max_offset": 4,
+ "char": 126,
+ "bitmap_byte_count": 5
+ }
+ ]
+ }
+]
diff --git a/sdk_lib_nbgl/include/nbgl_font_rom.inc b/sdk_lib_nbgl/include/nbgl_font_rom.inc
new file mode 100644
index 00000000..41e7ac91
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_rom.inc
@@ -0,0 +1,43 @@
+
+/*******************************************************************************
+* Ledger Nano S - Secure firmware
+* (c) 2022 Ledger
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+********************************************************************************/
+
+#ifdef HAVE_SE_TOUCH
+#include "nbgl_font_inter_regular_24.inc"
+#include "nbgl_font_inter_semibold_24.inc"
+#include "nbgl_font_inter_medium_32.inc"
+#include "nbgl_font_inter_regular_24_1bpp.inc"
+#include "nbgl_font_inter_semibold_24_1bpp.inc"
+#include "nbgl_font_inter_medium_32_1bpp.inc"
+#else // HAVE_SE_TOUCH
+#include "nbgl_font_open_sans_extrabold_11.inc"
+#include "nbgl_font_open_sans_regular_11.inc"
+#include "nbgl_font_open_sans_light_16.inc"
+#endif // HAVE_SE_TOUCH
+#if (defined(HAVE_BOLOS) && !defined(BOLOS_OS_UPGRADER_APP))
+#if !defined(HAVE_LANGUAGE_PACK)
+ #if (OS_LANGUAGE==LANG_ENGLISH)
+ #include "bolos_pack_en_glyphes.inc"
+ #elif (OS_LANGUAGE==LANG_FRENCH)
+ #include "bolos_pack_fr_glyphes.inc"
+ #elif (OS_LANGUAGE==LANG_SPANISH)
+ #include "bolos_pack_es_glyphes.inc"
+ #else //OS_LANGUAGE
+ #error No default language defined!
+ #endif //OS_LANGUAGE
+#endif //!defined(HAVE_LANGUAGE_PACK)
+#endif //HAVE_BOLOS
diff --git a/sdk_lib_nbgl/include/nbgl_font_rom_struct.inc b/sdk_lib_nbgl/include/nbgl_font_rom_struct.inc
new file mode 100644
index 00000000..ae3fc1bf
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_font_rom_struct.inc
@@ -0,0 +1,77 @@
+
+/*******************************************************************************
+* Ledger Nano S - Secure firmware
+* (c) 2022 Ledger
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+********************************************************************************/
+
+#ifdef HAVE_BAGL_FONT_INTER_REGULAR_24PX
+ &fontINTER_REGULAR_24PX,
+#endif // HAVE_BAGL_FONT_INTER_REGULAR_24PX
+
+#ifdef HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX
+ &fontINTER_SEMIBOLD_24PX,
+#endif // HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX
+
+#ifdef HAVE_BAGL_FONT_INTER_MEDIUM_32PX
+ &fontINTER_MEDIUM_32PX,
+#endif // HAVE_BAGL_FONT_INTER_MEDIUM_32PX
+
+#ifdef HAVE_BAGL_FONT_INTER_REGULAR_24PX
+ &fontINTER_REGULAR_24PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_REGULAR_24PX
+
+#ifdef HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX
+ &fontINTER_SEMIBOLD_24PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_SEMIBOLD_24PX
+
+#ifdef HAVE_BAGL_FONT_INTER_MEDIUM_32PX
+ &fontINTER_MEDIUM_32PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_MEDIUM_32PX
+
+#ifdef HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX
+ &fontOPEN_SANS_EXTRABOLD_11PX_1BPP,
+#endif // HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX
+
+#ifdef HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX
+ &fontOPEN_SANS_LIGHT_16PX_1BPP,
+#endif // HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX
+
+#ifdef HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX
+ &fontOPEN_SANS_REGULAR_11PX_1BPP,
+#endif // HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX
+
+#ifdef HAVE_BAGL_FONT_INTER_REGULAR_28PX
+ &fontINTER_REGULAR_28PX,
+#endif // HAVE_BAGL_FONT_INTER_REGULAR_28PX
+
+#ifdef HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX
+ &fontINTER_SEMIBOLD_28PX,
+#endif // HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX
+
+#ifdef HAVE_BAGL_FONT_INTER_MEDIUM_36PX
+ &fontINTER_MEDIUM_36PX,
+#endif // HAVE_BAGL_FONT_INTER_MEDIUM_36PX
+
+#ifdef HAVE_BAGL_FONT_INTER_REGULAR_28PX
+ &fontINTER_REGULAR_28PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_REGULAR_28PX
+
+#ifdef HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX
+ &fontINTER_SEMIBOLD_28PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_SEMIBOLD_28PX
+
+#ifdef HAVE_BAGL_FONT_INTER_MEDIUM_36PX
+ &fontINTER_MEDIUM_36PX_1BPP,
+#endif // HAVE_BAGL_FONT_INTER_MEDIUM_36PX
diff --git a/sdk_lib_nbgl/include/nbgl_fonts.h b/sdk_lib_nbgl/include/nbgl_fonts.h
new file mode 100644
index 00000000..689fd11d
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_fonts.h
@@ -0,0 +1,210 @@
+/**
+ * @file nbgl_fonts.h
+ * Fonts types of the new BOLOS Graphical Library
+ *
+ */
+
+#ifndef NBGL_FONTS_H
+#define NBGL_FONTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define PIC_CHAR(x) ((const nbgl_font_character_t *) PIC(x))
+#define PIC_BMP(x) ((uint8_t const *) PIC(x))
+
+/**
+ * @brief fonts nicknames to be used for various wallet size targets (non-Nano)
+ *
+ */
+#define SMALL_REGULAR_FONT BAGL_FONT_INTER_REGULAR_24px
+#define SMALL_BOLD_FONT BAGL_FONT_INTER_SEMIBOLD_24px
+#define LARGE_MEDIUM_FONT BAGL_FONT_INTER_MEDIUM_32px
+#define SMALL_REGULAR_1BPP_FONT BAGL_FONT_INTER_REGULAR_24px_1bpp
+#define SMALL_BOLD_1BPP_FONT BAGL_FONT_INTER_SEMIBOLD_24px_1bpp
+#define LARGE_MEDIUM_1BPP_FONT BAGL_FONT_INTER_MEDIUM_32px_1bpp
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief structure defining an ASCII character (except the bitmap)
+ *
+ */
+// WARNING: please DON'T CHANGE the order/values of the fields below!
+// (otherwise python tools that generate data will need to be modified too)
+typedef struct {
+ uint32_t bitmap_offset; ///< offset of this character in chars buffer
+ uint32_t encoding : 1; ///< method used to encode bitmap data
+ uint32_t width : 6; ///< width of character in pixels
+ uint32_t x_min_offset : 4; ///< x_min = x_min_offset
+ uint32_t y_min_offset : 6; ///< y_min = (y_min + y_min_offset)
+ uint32_t x_max_offset : 4; ///< x_max = width - x_max_offset
+ uint32_t y_max_offset : 6; ///< y_max = (height - y_max_offset)
+} nbgl_font_character_t;
+
+/**
+ * @brief structure defining an ASCII font
+ *
+ */
+typedef struct {
+ uint32_t bitmap_len; ///< Size in bytes of the associated bitmap
+ uint8_t font_id; ///< ID of the font, from @ref nbgl_font_id_e
+ uint8_t bpp; ///< number of bits per pixels
+ uint8_t height; ///< height of all characters in pixels
+ uint8_t line_height; ///< height of a line for all characters in pixels
+ uint8_t char_kerning; ///< kerning for the font
+ uint8_t crop; ///< If false, x_min_offset+y_min_offset=bytes to skip
+ uint8_t y_min; ///< Most top Y coordinate of any char in the font
+ uint8_t
+ first_char; ///< ASCII code of the first character in \b bitmap and in \b characters fields
+ uint8_t
+ last_char; ///< ASCII code of the last character in \b bitmap and in \b characters fields
+ const nbgl_font_character_t
+ *const characters; ///< array containing definitions of all characters
+ uint8_t const *bitmap; ///< array containing bitmaps of all characters
+} nbgl_font_t;
+
+#define BAGL_ENCODING_LATIN1 0
+#define BAGL_ENCODING_UTF8 1
+#define BAGL_ENCODING_DEFAULT BAGL_ENCODING_UTF8
+
+/**
+ * @brief structure defining a unicode character (except the bitmap)
+ *
+ */
+// WARNING: please DON'T CHANGE the order of the fields below!
+// (otherwise python tools that generate data will need to be modified too)
+typedef struct {
+ uint32_t char_unicode : 21; ///< plane value from 0 to 16 then 16-bit code.
+ uint32_t encoding : 1; ///< method used to encode bitmap data
+ uint32_t width : 6; ///< width of character in pixels
+ uint32_t x_min_offset : 4; ///< x_min = x_min_offset
+ uint32_t y_min_offset : 6; ///< y_min = (y_min + y_min_offset)
+ uint32_t x_max_offset : 4; ///< x_max = width - x_max_offset
+ uint32_t y_max_offset : 6; ///< y_max = (height - y_max_offset)
+ uint32_t bitmap_offset : 16; ///< offset of this character in chars buffer
+} nbgl_font_unicode_character_t;
+/**
+ * @brief structure defining a unicode font
+ *
+ */
+typedef struct {
+ uint16_t bitmap_len; ///< Size in bytes of all characters bitmaps
+ uint8_t font_id; ///< ID of the font, from @ref nbgl_font_id_e
+ uint8_t bpp; ///< Number of bits per pixels, (interpreted as nbgl_bpp_t)
+ uint8_t height; ///< height of all characters in pixels
+ uint8_t line_height; ///< height of a line for all characters in pixels
+ uint8_t char_kerning; ///< kerning for the font
+ uint8_t crop; ///< If false, x_min_offset+y_min_offset=bytes to skip
+ uint8_t y_min; ///< Most top Y coordinate of any char in the font
+ uint8_t unused[3]; ///< for alignment
+#if !defined(HAVE_LANGUAGE_PACK)
+ // When using language packs, those 2 pointers does not exists
+ const nbgl_font_unicode_character_t
+ *const characters; ///< array containing definitions of all characters
+ uint8_t const *bitmap; ///< array containing bitmaps of all characters
+#endif //! defined(HAVE_LANGUAGE_PACK)
+} nbgl_font_unicode_t;
+
+typedef enum {
+ BAGL_FONT_INTER_REGULAR_24px,
+ BAGL_FONT_INTER_SEMIBOLD_24px,
+ BAGL_FONT_INTER_MEDIUM_32px,
+ BAGL_FONT_INTER_REGULAR_24px_1bpp,
+ BAGL_FONT_INTER_SEMIBOLD_24px_1bpp,
+ BAGL_FONT_INTER_MEDIUM_32px_1bpp,
+ BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp = 8u, // on Nano
+ BAGL_FONT_OPEN_SANS_LIGHT_16px_1bpp = 9u, // on Nano
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp = 10u, // on Nano
+ BAGL_FONT_INTER_REGULAR_28px = 11u,
+ BAGL_FONT_INTER_SEMIBOLD_28px = 12u,
+ BAGL_FONT_INTER_MEDIUM_36px = 13u,
+ BAGL_FONT_INTER_REGULAR_28px_1bpp = 14u,
+ BAGL_FONT_INTER_SEMIBOLD_28px_1bpp = 15u,
+ BAGL_FONT_INTER_MEDIUM_36px_1bpp = 16u,
+ BAGL_FONT_LAST // MUST ALWAYS BE THE LAST, FOR AUTOMATED INVALID VALUE CHECKS
+} nbgl_font_id_e;
+
+typedef struct nbgl_unicode_ctx_s {
+ const nbgl_font_unicode_t *font;
+ const nbgl_font_unicode_character_t *characters;
+ const uint8_t *bitmap;
+ uint32_t unicode_character_byte_count;
+} nbgl_unicode_ctx_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+const nbgl_font_t *nbgl_font_getFont(unsigned int fontId);
+const nbgl_font_t *nbgl_getFont(nbgl_font_id_e fontId);
+uint16_t nbgl_getSingleLineTextWidth(nbgl_font_id_e fontId, const char *text);
+uint16_t nbgl_getSingleLineTextWidthInLen(nbgl_font_id_e fontId, const char *text, uint16_t maxLen);
+uint16_t nbgl_getTextWidth(nbgl_font_id_e fontId, const char *text);
+uint8_t nbgl_getCharWidth(nbgl_font_id_e fontId, const char *text);
+uint8_t nbgl_getFontHeight(nbgl_font_id_e fontId);
+uint8_t nbgl_getFontLineHeight(nbgl_font_id_e fontId);
+uint16_t nbgl_getTextNbLines(const char *text);
+uint16_t nbgl_getTextHeight(nbgl_font_id_e fontId, const char *text);
+uint16_t nbgl_getTextLength(const char *text);
+void nbgl_getTextMaxLenAndWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t *len,
+ uint16_t *width,
+ bool wrapping);
+uint16_t nbgl_getTextNbLinesInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ bool wrapping);
+uint16_t nbgl_getTextHeightInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ bool wrapping);
+bool nbgl_getTextMaxLenAndWidthFromEnd(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t *len,
+ uint16_t *width);
+bool nbgl_getTextMaxLenInNbLines(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t maxNbLines,
+ uint16_t *len,
+ bool wrapping);
+void nbgl_textWrapOnNbLines(nbgl_font_id_e fontId, char *text, uint16_t maxWidth, uint8_t nbLines);
+uint8_t nbgl_getTextNbPagesInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint8_t nbLinesPerPage,
+ uint16_t maxWidth);
+
+uint32_t nbgl_popUnicodeChar(const uint8_t **text, uint16_t *text_length, bool *is_unicode);
+#ifdef HAVE_UNICODE_SUPPORT
+nbgl_unicode_ctx_t *nbgl_getUnicodeFont(nbgl_font_id_e font_id);
+const nbgl_font_unicode_character_t *nbgl_getUnicodeFontCharacter(uint32_t unicode);
+uint32_t nbgl_getUnicodeFontCharacterByteCount(void);
+#ifdef HAVE_LANGUAGE_PACK
+void nbgl_refreshUnicodeFont(void);
+#endif
+#endif // HAVE_UNICODE_SUPPORT
+
+/**********************
+ * MACROS
+ **********************/
+#define IS_UNICODE(__value) ((__value) > 0xF0)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_FONTS_H */
diff --git a/sdk_lib_nbgl/include/nbgl_front.h b/sdk_lib_nbgl/include/nbgl_front.h
new file mode 100644
index 00000000..08ed3934
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_front.h
@@ -0,0 +1,57 @@
+/**
+ * @file nbgl_front.h
+ * @brief Font screen low-Level driver API, to draw elementary forms
+ *
+ */
+
+#ifndef NBGL_FRONT_H
+#define NBGL_FRONT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_frontDrawRect(const nbgl_area_t *area);
+void nbgl_frontDrawHorizontalLine(const nbgl_area_t *area, uint8_t mask, color_t lineColor);
+void nbgl_frontDrawImage(const nbgl_area_t *area,
+ const uint8_t *buffer,
+ nbgl_transformation_t transformation,
+ nbgl_color_map_t colorMap);
+void nbgl_frontDrawImageFile(const nbgl_area_t *area,
+ const uint8_t *buffer,
+ nbgl_color_map_t colorMap,
+ const uint8_t *uzlib_chunk_buffer);
+void nbgl_frontDrawImageRle(const nbgl_area_t *area,
+ const uint8_t *buffer,
+ uint32_t buffer_len,
+ color_t fore_color,
+ uint8_t nb_skipped_bytes);
+void nbgl_frontRefreshArea(const nbgl_area_t *area,
+ nbgl_refresh_mode_t mode,
+ nbgl_post_refresh_t post_refresh);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_FRONT_H */
diff --git a/sdk_lib_nbgl/include/nbgl_image_utils.h b/sdk_lib_nbgl/include/nbgl_image_utils.h
new file mode 100644
index 00000000..0c951b05
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_image_utils.h
@@ -0,0 +1,102 @@
+/**
+ * @file nbgl_image_utils.h
+ * @brief Utilities for Ledger image files processing
+ *
+ */
+
+#ifndef NBGL_IMAGE_UTILS_H
+#define NBGL_IMAGE_UTILS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * Width offset in image file
+ */
+#define WIDTH_OFFSET 0
+
+/**
+ * Height offset in image file
+ */
+#define HEIGHT_OFFSET 2
+
+/**
+ * BPP & Compression offset in image file
+ */
+#define BPP_COMPRESS_OFFSET 4
+
+/**
+ * Buffer length offset in image file
+ *
+ */
+#define BUFFER_LEN_OFFSET 5
+
+/**
+ * Buffer offset in image file
+ *
+ */
+#define BUFFER_OFFSET 8
+
+/**
+ * Size in bytes of an image file header
+ */
+#define IMAGE_FILE_HEADER_SIZE 8
+
+/**********************
+ * MACROS
+ **********************/
+
+/**
+ * @brief macro to get the width of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_WIDTH(image_file) \
+ (image_file[WIDTH_OFFSET] | (image_file[WIDTH_OFFSET + 1] << 8))
+
+/**
+ * @brief macro to get the height of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_HEIGHT(image_file) \
+ (image_file[HEIGHT_OFFSET] | (image_file[HEIGHT_OFFSET + 1] << 8))
+
+/**
+ * @brief macro to get the bpp of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_BPP(image_file) (image_file[BPP_COMPRESS_OFFSET] >> 4)
+
+/**
+ * @brief macro to get the compression of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_COMPRESSION(image_file) (image_file[BPP_COMPRESS_OFFSET] & 0xF)
+
+/**
+ * @brief macro to get the buffer len of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_BUFFER_LEN(image_file) \
+ (image_file[BUFFER_LEN_OFFSET] | (image_file[BUFFER_LEN_OFFSET + 1] << 8) \
+ | (image_file[BUFFER_LEN_OFFSET + 2] << 16))
+
+/**
+ * @brief macro to get the buffer of the image file
+ * @param image_file uint8_t* buffer representing the image file
+ */
+#define GET_IMAGE_FILE_BUFFER(image_file) (&image_file[BUFFER_OFFSET])
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_IMAGE_UTILS_H */
diff --git a/sdk_lib_nbgl/include/nbgl_layout.h b/sdk_lib_nbgl/include/nbgl_layout.h
new file mode 100644
index 00000000..29020d14
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_layout.h
@@ -0,0 +1,537 @@
+/**
+ * @file nbgl_layout.h
+ * @brief API of the Advanced BOLOS Graphical Library, for predefined layouts
+ *
+ */
+
+#ifndef NBGL_LAYOUT_H
+#define NBGL_LAYOUT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "nbgl_obj.h"
+#include "nbgl_screen.h"
+#include "nbgl_types.h"
+#include "os_io_seproxyhal.h"
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+#define NO_MORE_OBJ_ERROR -3
+#define NBGL_NO_TUNE NB_TUNES
+
+#define NB_MAX_SUGGESTION_BUTTONS 4
+
+#ifdef HAVE_SE_TOUCH
+#define AVAILABLE_WIDTH (SCREEN_WIDTH - 2 * BORDER_MARGIN)
+#else // HAVE_SE_TOUCH
+// 7 pixels on each side
+#define AVAILABLE_WIDTH (SCREEN_WIDTH - 2 * 7)
+// maximum number of lines in screen
+#define NB_MAX_LINES 4
+
+#endif // HAVE_SE_TOUCH
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief type shared externally
+ *
+ */
+typedef void *nbgl_layout_t;
+
+/**
+ * @brief prototype of function to be called when an object is touched
+ * @param token integer passed when registering callback
+ * @param index when the object touched is a list of radio buttons, gives the index of the activated
+ * button
+ */
+typedef void (*nbgl_layoutTouchCallback_t)(int token, uint8_t index);
+
+/**
+ * @brief prototype of function to be called when buttons are touched on a screen
+ * @param layout layout concerned by the event
+ * @param event type of button event
+ */
+typedef void (*nbgl_layoutButtonCallback_t)(nbgl_layout_t *layout, nbgl_buttonEvent_t event);
+
+/**
+ * @brief This structure contains info to build a navigation bar at the bottom of the screen
+ * @note this widget is incompatible with a footer.
+ *
+ */
+typedef struct {
+ uint8_t token; ///< the token that will be used as argument of the callback
+ uint8_t nbPages; ///< number of pages. (if 0, no navigation)
+ uint8_t activePage; ///< index of active page (from 0 to nbPages-1).
+ bool withExitKey; ///< if set to true, an exit button is drawn, either on the left of
+ ///< navigation keys or in the center if no navigation
+ bool withSeparationLine; ///< if set to true, an horizontal line is drawn on top of bar in
+ ///< light gray
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when pressing keys)
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutNavigationBar_t;
+
+/**
+ * @brief possible directions for Navigation arrows
+ *
+ */
+typedef enum {
+ HORIZONTAL_NAV, ///< '<' and '>' are displayed, to navigate between pages and steps
+ VERTICAL_NAV ///< '\/' and '/\' are displayed, to navigate in a list (vertical scrolling)
+} nbgl_layoutNavDirection_t;
+
+/**
+ * @brief possible styles for Navigation arrows (it's a bit field)
+ *
+ */
+typedef enum {
+ NO_ARROWS = 0,
+ LEFT_ARROW, ///< left arrow is used
+ RIGHT_ARROW, ///< right arrow is used
+} nbgl_layoutNavIndication_t;
+
+/**
+ * @brief This structure contains info to build a navigation bar at the bottom of the screen
+ * @note this widget is incompatible with a footer.
+ *
+ */
+typedef struct {
+ nbgl_layoutNavDirection_t direction; ///< vertical or horizontal navigation
+ nbgl_layoutNavIndication_t indication; ///< specifies which arrows to use (left or right)
+} nbgl_layoutNavigation_t;
+
+/**
+ * @brief Structure containing all information when creating a layout. This structure must be passed
+ * as argument to @ref nbgl_layoutGet
+ * @note It shall not be used
+ *
+ */
+typedef struct nbgl_layoutDescription_s {
+ bool modal; ///< if true, puts the layout on top of screen stack (modal). Otherwise puts on
+ ///< background (for apps)
+#ifdef HAVE_SE_TOUCH
+ bool withLeftBorder; ///< if true, draws a light gray left border on the whole height of the
+ ///< screen
+ const char *tapActionText; ///< Light gray text used when main container is "tapable"
+ uint8_t tapActionToken; ///< the token that will be used as argument of the onActionCallback
+ ///< when main container is "tapped"
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tapTuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when tapping on
+ ///< main container
+#endif // HAVE_PIEZO_SOUND
+ nbgl_layoutTouchCallback_t
+ onActionCallback; ///< the callback to be called on any action on the layout
+#else // HAVE_SE_TOUCH
+ nbgl_layoutButtonCallback_t
+ onActionCallback; ///< the callback to be called on any action on the layout
+#endif // HAVE_SE_TOUCH
+ nbgl_screenTickerConfiguration_t ticker; // configuration of ticker (timeout)
+} nbgl_layoutDescription_t;
+
+/**
+ * @brief This structure contains info to build a clickable "bar" with a text and an icon
+ *
+ */
+typedef struct {
+ const nbgl_icon_details_t
+ *iconLeft; ///< a buffer containing the 1BPP icon for icon on left (can be NULL)
+ const char *text; ///< text (can be NULL)
+ const nbgl_icon_details_t *iconRight; ///< a buffer containing the 1BPP icon for icon 2 (can be
+ ///< NULL). Dimensions must be the same as iconLeft
+ const char *subText; ///< sub text (can be NULL)
+ uint8_t token; ///< the token that will be used as argument of the callback
+ bool inactive; ///< if set to true, the bar is grayed-out and cannot be touched
+ bool centered; ///< if set to true, the text is centered horizontaly in the bar
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutBar_t;
+
+/**
+ * @brief This structure contains info to build a switch (on the right) with a description (on the
+ * left), with a potential sub-description (in gray)
+ *
+ */
+typedef struct {
+ const char *text; ///< main text for the switch
+ const char
+ *subText; ///< description under main text (NULL terminated, single line, may be null)
+ nbgl_state_t initState; ///< initial state of the switch
+ uint8_t token; ///< the token that will be used as argument of the callback
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutSwitch_t;
+
+/**
+ * @brief This structure contains a list of names to build a list of radio
+ * buttons (on the right part of screen), with for each a description (names array)
+ * The chosen item index is provided is the "index" argument of the callback
+ */
+typedef struct {
+ union {
+ const char *const *names; ///< array of strings giving the choices (nbChoices)
+#if defined(HAVE_LANGUAGE_PACK)
+ UX_LOC_STRINGS_INDEX *nameIds; ///< array of string Ids giving the choices (nbChoices)
+#endif // HAVE_LANGUAGE_PACK
+ };
+ bool localized; ///< if set to true, use nameIds and not names
+ uint8_t nbChoices; ///< number of choices
+ uint8_t initChoice; ///< index of the current choice
+ uint8_t token; ///< the token that will be used as argument of the callback
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when selecting a radio button)
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutRadioChoice_t;
+
+/**
+ * @brief prototype of menu list item retrieval callback
+ * @param choiceIndex index of the menu list item to retrieve (from 0 (to nbChoices-1))
+ * @return a pointer on a string
+ */
+typedef const char *(*nbgl_menuListCallback_t)(uint8_t choiceIndex);
+
+/**
+ * @brief This structure contains a list of names to build a menu list on Nanos, with for each item
+ * a description (names array)
+ */
+typedef struct {
+ nbgl_menuListCallback_t callback; ///< function to call to retrieve a menu list item text
+ uint8_t nbChoices; ///< total number of choices in the menu list
+ uint8_t selectedChoice; ///< index of the selected choice (centered, in bold)
+} nbgl_layoutMenuList_t;
+
+/**
+ * @brief This structure contains a [tag,value] pair
+ */
+typedef struct {
+ const char *item; ///< string giving the tag name
+ const char *value; ///< string giving the value name
+#ifdef SCREEN_SIZE_WALLET
+ const nbgl_icon_details_t *valueIcon; ///< a buffer containing the 32px 1BPP icon for icon on
+ ///< right of value (can be NULL)
+ int8_t force_page_start : 1; ///< if set to 1, the tag will be displayed at the top of a new
+ ///< review page
+#endif
+} nbgl_layoutTagValue_t;
+
+/**
+ * @brief prototype of tag/value pair retrieval callback
+ * @param pairIndex index of the tag/value pair to retrieve (from 0 (to nbPairs-1))
+ * @return a pointer on a static tag/value pair
+ */
+typedef nbgl_layoutTagValue_t *(*nbgl_tagValueCallback_t)(uint8_t pairIndex);
+
+/**
+ * @brief This structure contains a list of [tag,value] pairs
+ */
+typedef struct {
+ const nbgl_layoutTagValue_t
+ *pairs; ///< array of [tag,value] pairs (nbPairs items). If NULL, callback is used instead
+ nbgl_tagValueCallback_t callback; ///< function to call to retrieve a given pair
+ uint8_t nbPairs; ///< number of pairs in pairs array (or max number of pairs to retrieve with
+ ///< callback)
+ uint8_t startIndex; ///< index of the first pair to get with callback
+ uint8_t nbMaxLinesForValue; ///< if > 0, set the max number of lines for value field. And the
+ ///< last line is ended with "..." instead of the 3 last chars
+ uint8_t token; ///< the token that will be used as argument of the callback if icon in any
+ ///< tag/value pair is touched (index is the index of the pair in pairs[])
+ bool smallCaseForValue; ///< if set to true, a 24px font is used for value text, otherwise a
+ ///< 32px font is used
+ bool wrapping; ///< if set to true, value text will be wrapped on ' ' to avoid cutting words
+} nbgl_layoutTagValueList_t;
+
+/**
+ * @brief possible styles for Centered Info Area
+ *
+ */
+typedef enum {
+#ifdef HAVE_SE_TOUCH
+ LARGE_CASE_INFO, ///< text in BLACK and large case (INTER 32px), subText in black in Inter24px
+ LARGE_CASE_BOLD_INFO, ///< text in BLACK and large case (INTER 32px), subText in black bold
+ ///< Inter24px, text3 in black Inter24px
+ NORMAL_INFO, ///< Icon in black, a potential text in black bold 24px under it, a potential text
+ ///< in dark gray (24px) under it, a potential text in black (24px) under it
+ PLUGIN_INFO ///< A potential text in black 32px, a potential text in black (24px) under it, a
+ ///< small horizontal line under it, a potential icon under it, a potential text in
+ ///< black (24px) under it
+#else // HAVE_SE_TOUCH
+ REGULAR_INFO = 0, ///< both texts regular (but '\\b' can switch to bold)
+ BOLD_TEXT1_INFO ///< bold is used for text1 (but '\\b' can switch to regular)
+#endif // HAVE_SE_TOUCH
+} nbgl_centeredInfoStyle_t;
+
+/**
+ * @brief This structure contains info to build a centered (vertically and horizontally) area, with
+ * a possible Icon, a possible text under it, and a possible sub-text gray under it.
+ *
+ */
+typedef struct {
+ const char *text1; ///< first text (can be null)
+ const char *text2; ///< second text (can be null)
+#ifdef HAVE_SE_TOUCH
+ const char *text3; ///< third text (can be null)
+#endif // HAVE_SE_TOUCH
+ const nbgl_icon_details_t *icon; ///< a buffer containing the 1BPP icon
+ bool onTop; ///< if set to true, align only horizontaly
+ nbgl_centeredInfoStyle_t style; ///< style to apply to this info
+#ifdef HAVE_SE_TOUCH
+ int16_t offsetY; ///< vertical shift to apply to this info (if >0, shift to bottom)
+#endif // HAVE_SE_TOUCH
+} nbgl_layoutCenteredInfo_t;
+
+/**
+ * @brief This structure contains info to build a centered (vertically and horizontally) area, with
+ * a QR Code, a possible text (black, bold) under it, and a possible sub-text (black, regular) under
+ * it.
+ *
+ */
+typedef struct {
+ const char *url; ///< URL for QR code
+ const char *text1; ///< first text (can be null)
+ const char *text2; ///< second text (can be null)
+ bool largeText1; ///< if set to true, use 32px font for text1
+} nbgl_layoutQRCode_t;
+
+/**
+ * @brief The different styles for a pair of buttons
+ *
+ */
+typedef enum {
+ ROUNDED_AND_FOOTER_STYLE
+ = 0, ///< A rounded black background full width button on top of a footer
+ BOTH_ROUNDED_STYLE ///< A rounded black background full width button on top of a rounded white
+ ///< background full width button
+} nbgl_layoutChoiceButtonsStyle_t;
+
+/**
+ * @brief This structure contains info to build a pair of buttons, one on top of the other.
+ *
+ * @note the pair of button is automatically put on bottom of screen
+ */
+typedef struct {
+ const char *topText; ///< up-button text (index 0)
+ const char *bottomText; ///< bottom-button text (index 1)
+ uint8_t token; ///< the token that will be used as argument of the callback
+ nbgl_layoutChoiceButtonsStyle_t style; ///< the style of the pair
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutChoiceButtons_t;
+
+/**
+ * @brief The different styles for a button
+ *
+ */
+typedef enum {
+ BLACK_BACKGROUND
+ = 0, ///< rounded bordered button, with text/icon in white, on black background
+ WHITE_BACKGROUND, ///< rounded bordered button, with text/icon in black, on white background
+ NO_BORDER, ///< simple clickable text, in black
+ LONG_PRESS ///< long press button, with progress indicator
+} nbgl_layoutButtonStyle_t;
+
+/**
+ * @brief This structure contains info to build a single button
+ */
+typedef struct {
+ const char *text; ///< button text
+ const nbgl_icon_details_t *icon; ///< a buffer containing the 1BPP icon for button1
+ uint8_t token; ///< the token that will be used as argument of the callback
+ nbgl_layoutButtonStyle_t style;
+ bool fittingContent; ///< if set to true, fit the width of button to text, otherwise full width
+ bool onBottom; ///< if set to true, align on bottom of page, otherwise put on bottom of
+ ///< previous object
+#ifdef HAVE_PIEZO_SOUND
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played
+#endif // HAVE_PIEZO_SOUND
+} nbgl_layoutButton_t;
+
+/**
+ * @brief This structure contains info to build a progress bar with info. The progress bar itself is
+ * 120px width * 12px height
+ *
+ */
+typedef struct {
+ uint8_t percentage; ///< percentage of completion, from 0 to 100.
+ const char *text; ///< text in black, on top of progress bar
+ const char *subText; ///< text in gray, under progress bar
+} nbgl_layoutProgressBar_t;
+
+/**
+ * @brief This structure contains info to build a keyboard with @ref nbgl_layoutAddKeyboard()
+ *
+ */
+typedef struct {
+ uint32_t keyMask; ///< mask used to disable some keys in letters only mod. The 26 LSB bits of
+ ///< mask are used, for the 26 letters of a QWERTY keyboard. Bit[0] for Q,
+ ///< Bit[1] for W and so on
+ keyboardCallback_t callback; ///< function called when an active key is pressed
+ bool lettersOnly; ///< if true, only display letter keys and Backspace
+ keyboardMode_t mode; ///< keyboard mode to start with
+#ifdef HAVE_SE_TOUCH
+ keyboardCase_t casing; ///< keyboard casing mode (lower, upper once or upper locked)
+#else // HAVE_SE_TOUCH
+ bool enableBackspace; ///< if true, Backspace key is enabled
+ bool enableValidate; ///< if true, Validate key is enabled
+ uint8_t selectedCharIndex;
+#endif // HAVE_SE_TOUCH
+} nbgl_layoutKbd_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+nbgl_layout_t *nbgl_layoutGet(const nbgl_layoutDescription_t *description);
+int nbgl_layoutAddCenteredInfo(nbgl_layout_t *layout, const nbgl_layoutCenteredInfo_t *info);
+int nbgl_layoutAddProgressBar(nbgl_layout_t *layout, const nbgl_layoutProgressBar_t *barLayout);
+
+#ifdef HAVE_SE_TOUCH
+int nbgl_layoutAddTopRightButton(nbgl_layout_t *layout,
+ const nbgl_icon_details_t *icon,
+ uint8_t token,
+ tune_index_e tuneId);
+int nbgl_layoutAddTouchableBar(nbgl_layout_t *layout, const nbgl_layoutBar_t *barLayout);
+int nbgl_layoutAddSwitch(nbgl_layout_t *layout, const nbgl_layoutSwitch_t *switchLayout);
+int nbgl_layoutAddText(nbgl_layout_t *layout, const char *text, const char *subText);
+int nbgl_layoutAddRadioChoice(nbgl_layout_t *layout, const nbgl_layoutRadioChoice_t *choices);
+int nbgl_layoutAddQRCode(nbgl_layout_t *layout, const nbgl_layoutQRCode_t *info);
+int nbgl_layoutAddChoiceButtons(nbgl_layout_t *layout, const nbgl_layoutChoiceButtons_t *info);
+int nbgl_layoutAddTagValueList(nbgl_layout_t *layout, const nbgl_layoutTagValueList_t *list);
+int nbgl_layoutAddLargeCaseText(nbgl_layout_t *layout, const char *text);
+int nbgl_layoutAddSeparationLine(nbgl_layout_t *layout);
+
+int nbgl_layoutAddButton(nbgl_layout_t *layout, const nbgl_layoutButton_t *buttonInfo);
+int nbgl_layoutAddLongPressButton(nbgl_layout_t *layout,
+ const char *text,
+ uint8_t token,
+ tune_index_e tuneId);
+int nbgl_layoutAddFooter(nbgl_layout_t *layout,
+ const char *text,
+ uint8_t token,
+ tune_index_e tuneId);
+int nbgl_layoutAddSplitFooter(nbgl_layout_t *layout,
+ const char *leftText,
+ uint8_t leftToken,
+ const char *rightText,
+ uint8_t rightToken,
+ tune_index_e tuneId);
+int nbgl_layoutAddNavigationBar(nbgl_layout_t *layout, const nbgl_layoutNavigationBar_t *info);
+int nbgl_layoutAddBottomButton(nbgl_layout_t *layout,
+ const nbgl_icon_details_t *icon,
+ uint8_t token,
+ bool separationLine,
+ tune_index_e tuneId);
+int nbgl_layoutAddProgressIndicator(nbgl_layout_t *layout,
+ uint8_t activePage,
+ uint8_t nbPages,
+ bool withBack,
+ uint8_t backToken,
+ tune_index_e tuneId);
+int nbgl_layoutAddSpinner(nbgl_layout_t *layout, const char *text, bool fixed);
+#else // HAVE_SE_TOUCH
+int nbgl_layoutAddText(nbgl_layout_t *layout,
+ const char *text,
+ const char *subText,
+ nbgl_centeredInfoStyle_t style);
+int nbgl_layoutAddNavigation(nbgl_layout_t *layout, nbgl_layoutNavigation_t *info);
+int nbgl_layoutAddMenuList(nbgl_layout_t *layout, nbgl_layoutMenuList_t *list);
+#endif // HAVE_SE_TOUCH
+
+#ifdef NBGL_KEYBOARD
+/* layout objects for page with keyboard */
+int nbgl_layoutAddKeyboard(nbgl_layout_t *layout, const nbgl_layoutKbd_t *kbdInfo);
+#ifdef HAVE_SE_TOUCH
+int nbgl_layoutUpdateKeyboard(nbgl_layout_t *layout,
+ uint8_t index,
+ uint32_t keyMask,
+ bool updateCasing,
+ keyboardCase_t casing);
+bool nbgl_layoutKeyboardNeedsRefresh(nbgl_layout_t *layout, uint8_t index);
+int nbgl_layoutAddSuggestionButtons(nbgl_layout_t *layout,
+ uint8_t nbUsedButtons,
+ const char *buttonTexts[NB_MAX_SUGGESTION_BUTTONS],
+ int firstButtonToken,
+ tune_index_e tuneId);
+int nbgl_layoutUpdateSuggestionButtons(nbgl_layout_t *layout,
+ uint8_t index,
+ uint8_t nbUsedButtons,
+ const char *buttonTexts[NB_MAX_SUGGESTION_BUTTONS]);
+int nbgl_layoutAddEnteredText(nbgl_layout_t *layout,
+ bool numbered,
+ uint8_t number,
+ const char *text,
+ bool grayedOut,
+ int offsetY,
+ int token);
+int nbgl_layoutUpdateEnteredText(nbgl_layout_t *layout,
+ uint8_t index,
+ bool numbered,
+ uint8_t number,
+ const char *text,
+ bool grayedOut);
+int nbgl_layoutAddConfirmationButton(nbgl_layout_t *layout,
+ bool active,
+ const char *text,
+ int token,
+ tune_index_e tuneId);
+int nbgl_layoutUpdateConfirmationButton(nbgl_layout_t *layout,
+ uint8_t index,
+ bool active,
+ const char *text);
+#else // HAVE_SE_TOUCH
+int nbgl_layoutUpdateKeyboard(nbgl_layout_t *layout, uint8_t index, uint32_t keyMask);
+int nbgl_layoutAddEnteredText(nbgl_layout_t *layout, const char *text, bool lettersOnly);
+int nbgl_layoutUpdateEnteredText(nbgl_layout_t *layout, uint8_t index, const char *text);
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYBOARD
+
+#ifdef NBGL_KEYPAD
+#ifdef HAVE_SE_TOUCH
+/* layout objects for page with keypad (Stax) */
+int nbgl_layoutAddKeypad(nbgl_layout_t *layout, keyboardCallback_t callback, bool shuffled);
+int nbgl_layoutUpdateKeypad(nbgl_layout_t *layout,
+ uint8_t index,
+ bool enableValidate,
+ bool enableBackspace,
+ bool enableDigits);
+int nbgl_layoutAddHiddenDigits(nbgl_layout_t *layout, uint8_t nbDigits);
+int nbgl_layoutUpdateHiddenDigits(nbgl_layout_t *layout, uint8_t index, uint8_t nbActive);
+#else // HAVE_SE_TOUCH
+/* layout objects for pages with keypad (nanos) */
+int nbgl_layoutAddKeypad(nbgl_layout_t *layout,
+ keyboardCallback_t callback,
+ const char *text,
+ bool shuffled);
+int nbgl_layoutUpdateKeypad(nbgl_layout_t *layout,
+ uint8_t index,
+ bool enableValidate,
+ bool enableBackspace);
+int nbgl_layoutAddHiddenDigits(nbgl_layout_t *layout, uint8_t nbDigits);
+int nbgl_layoutUpdateHiddenDigits(nbgl_layout_t *layout, uint8_t index, uint8_t nbActive);
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYPAD
+
+/* generic functions */
+int nbgl_layoutDraw(nbgl_layout_t *layout);
+int nbgl_layoutRelease(nbgl_layout_t *layout);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_LAYOUT_H */
diff --git a/sdk_lib_nbgl/include/nbgl_obj.h b/sdk_lib_nbgl/include/nbgl_obj.h
new file mode 100644
index 00000000..02ce9606
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_obj.h
@@ -0,0 +1,610 @@
+/**
+ * @file nbgl_obj.h
+ * @brief API to draw all basic graphic objects
+ *
+ */
+
+#ifndef NBGL_OBJ_H
+#define NBGL_OBJ_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "nbgl_types.h"
+#include "nbgl_fonts.h"
+#include "ux_loc.h"
+
+/*********************
+ * INCLUDES
+ *********************/
+
+/*********************
+ * DEFINES
+ *********************/
+// Keypad special key values
+#define BACKSPACE_KEY 8
+#define VALIDATE_KEY '\r'
+
+// for Keyboard
+#ifdef HAVE_SE_TOUCH
+#define KEYBOARD_KEY_HEIGHT 60
+#else // HAVE_SE_TOUCH
+#define KEYBOARD_KEY_WIDTH 14
+#define KEYBOARD_KEY_HEIGHT 14
+#define KEYBOARD_WIDTH (5 * KEYBOARD_KEY_WIDTH)
+#endif // HAVE_SE_TOUCH
+
+// for Keypad
+#ifdef HAVE_SE_TOUCH
+#define KEYPAD_KEY_HEIGHT 104
+#else // HAVE_SE_TOUCH
+#define KEYPAD_WIDTH 114
+#define KEYPAD_HEIGHT 18
+#endif // HAVE_SE_TOUCH
+
+#ifdef HAVE_SE_TOUCH
+///< special code used by given callback of @ref nbgl_navigationPopulate to inform when Exit key is
+///< pressed
+#define EXIT_PAGE 0xFF
+
+// external margin in pixels
+#define BORDER_MARGIN 24
+
+// Back button header height
+#define BACK_BUTTON_HEADER_HEIGHT 88
+
+// common dimensions for buttons
+#define BUTTON_RADIUS RADIUS_40_PIXELS
+#define BUTTON_DIAMETER 80
+#endif // HAVE_SE_TOUCH
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief All types of graphical objects.
+ *
+ */
+typedef enum {
+ SCREEN, ///< Main screen
+ CONTAINER, ///< Empty container
+ IMAGE, ///< Bitmap (y and height must be multiple of 4 on Stax)
+ LINE, ///< Vertical or Horizontal line
+ TEXT_AREA, ///< Area to contain text line(s)
+ BUTTON, ///< Rounded rectangle button with icon and/or text
+ SWITCH, ///< Switch to turn on/off something
+ PAGE_INDICATOR, ///< horizontal bar to indicate position within pages
+ PROGRESS_BAR, ///< horizontal bar to indicate progression of something (between 0% and 100%)
+ RADIO_BUTTON, ///< Indicator to inform whether something is on or off
+ QR_CODE, ///< QR Code
+ KEYBOARD, ///< Keyboard
+ KEYPAD, ///< Keypad
+ SPINNER, ///< Spinner
+ IMAGE_FILE, ///< Image file (with Ledger compression)
+ TEXT_ENTRY ///< area for entered text, only for Nanos
+} nbgl_obj_type_t;
+
+/**
+ * @brief All types of alignments.
+ *
+ */
+typedef enum {
+ NO_ALIGNMENT, ///< used when parent container layout is used
+ TOP_LEFT,
+ TOP_MIDDLE,
+ TOP_RIGHT,
+ MID_LEFT,
+ CENTER,
+ MID_RIGHT,
+ BOTTOM_LEFT,
+ BOTTOM_MIDDLE,
+ BOTTOM_RIGHT,
+ LEFT_TOP, ///< on outside left
+ LEFT_BOTTOM, ///< on outside left
+ RIGHT_TOP, ///< on outside right
+ RIGHT_BOTTOM, ///< on outside right
+} nbgl_aligment_t;
+
+/**
+ * @brief to represent a boolean state.
+ */
+typedef enum {
+ OFF_STATE,
+ ON_STATE
+} nbgl_state_t;
+
+/**
+ * @brief Directions for layout or lines
+ *
+ */
+typedef enum {
+ VERTICAL, ///< from top to bottom
+ HORIZONTAL ///< from left to right
+} nbgl_direction_t;
+
+/**
+ * @brief possible styles for text area border
+ *
+ */
+typedef enum {
+ NO_STYLE, ///< no border
+ INVERTED_COLORS ///< Inverted background and rounded corners, only for @ref TEXT_AREA
+} nbgl_style_t;
+
+/**
+ * @brief possible modes for QR Code
+ * @note if text len <= 114 chars, V4 can be used, otherwise use V10
+ *
+ */
+typedef enum {
+ QRCODE_V4 = 0, ///< QRCode V4, can encode text len up to 114 chars
+ QRCODE_V10 ///< QRCode V10, can encode text len up to 1500 chars
+} nbgl_qrcode_version_t;
+
+/**
+ * @brief the 2 possible states of a finger on the Touchscreen
+ *
+ */
+typedef enum {
+ RELEASED, ///< the finger has been released from the screen
+ PRESSED, ///< the finger is currently pressing the screen
+} nbgl_touchState_t;
+
+/**
+ * @brief The different types of Touchscreen events
+ *
+ */
+typedef enum {
+ TOUCHED, ///< corresponding to an object touched and released at least SHORT_TOUCH_DURATION ms
+ ///< later but less than LONG_TOUCH_DURATION ms
+ LONG_TOUCHED, ///< corresponding to an object touched and released at least LONG_TOUCH_DURATION
+ ///< ms later.
+ TOUCHING, ///< corresponding to an object that is currently touched
+ OUT_OF_TOUCH, ///< corresponding to an object that was touched but that has lost the focus (the
+ ///< finger has moved)
+ TOUCH_PRESSED, ///< corresponding to an object that was not touched and where the finger has
+ ///< been pressed.
+ TOUCH_RELEASED, ///< corresponding to an object that was touched and where the finger has been
+ ///< released.
+ VALUE_CHANGED ///< corresponding to a change of state of the object (indirect event)
+} nbgl_touchType_t;
+
+/**
+ * @brief The different pressed buttons
+ *
+ */
+#define LEFT_BUTTON 0x01 ///< Left button event
+#define RIGHT_BUTTON 0x02 ///< Right button event
+#define BOTH_BUTTONS 0x03 ///< Both buttons event
+#define RELEASED_MASK 0x80 ///< released (see LSB bits to know what buttons are released)
+#define CONTINUOUS_MASK \
+ 0x40 ///< if set, means that the button(s) is continuously pressed (this event is sent every
+ ///< 300ms after the first 800ms)
+
+typedef enum {
+ BUTTON_LEFT_PRESSED = 0, ///< Sent when Left button is released
+ BUTTON_RIGHT_PRESSED, ///< Send when Right button is released
+ BUTTON_LEFT_CONTINUOUS_PRESSED, ///< Send when Left button is continuouly pressed (sent every
+ ///< 300ms after the first 800ms)
+ BUTTON_RIGHT_CONTINUOUS_PRESSED, ///< Send when Left button is continuouly pressed (sent every
+ ///< 300ms after the first 800ms)
+ BUTTON_BOTH_PRESSED, ///< Sent when both buttons are released
+ BUTTON_BOTH_TOUCHED, ///< Sent when both buttons are touched
+ INVALID_BUTTON_EVENT
+} nbgl_buttonEvent_t;
+
+/**
+ * @brief prototype of function to be called when a button event is received by an object (TODO:
+ * change to screen?)
+ * @param obj the concerned object
+ * @param buttonState event on buttons
+ */
+typedef void (*nbgl_buttonCallback_t)(void *obj, nbgl_buttonEvent_t buttonEvent);
+
+/**
+ * @brief The low level Touchscreen event, coming from driver
+ *
+ */
+typedef struct {
+ nbgl_touchState_t state; ///< state of the touch event, e.g @ref PRESSED or @ref RELEASED
+ int16_t
+ x; ///< horizontal position of the touch (or for a @ref RELEASED the last touched point)
+ int16_t y; ///< vertical position of the touch (or for a @ref RELEASED the last touched point)
+} nbgl_touchStatePosition_t;
+
+/**
+ * @brief prototype of function to be called when a touch event is received by an object
+ * @param obj the concerned object
+ * @param eventType type of touch event
+ */
+typedef void (*nbgl_touchCallback_t)(void *obj, nbgl_touchType_t eventType);
+
+/**
+ * @brief Common structure for all graphical objects
+ *
+ * @note this type must never be instantiated
+ */
+typedef struct PACKED__ nbgl_obj_s {
+ nbgl_area_t area; ///< absolute position, backGround color and size of the object. DO NOT MOVE
+ ///< THIS FIELD
+ int16_t
+ rel_x0; ///< horizontal position of top-left corner relative to parent's top-left corner
+ int16_t rel_y0; ///< vertical position of top-left corner relative to parent's top-left corner,
+ ///< must be multiple of 4
+ struct nbgl_obj_s *parent; ///< parent of this object
+ struct nbgl_obj_s *alignTo; ///< object to align to (parent by default)
+ nbgl_aligment_t alignment; ///< type of alignment
+ int16_t alignmentMarginX; ///< horizontal margin when aligning
+ int16_t alignmentMarginY; ///< vertical margin when aligning
+ nbgl_obj_type_t type; ///< type of the graphical object, must be explicitly set
+ uint8_t touchMask; ///< bit mask to tell engine which touch events are handled by this object
+ uint8_t touchId; ///< a unique identifier (by screen) to be used by external test environment
+ ///< (TTYT or Screenshots)
+} nbgl_obj_t;
+
+/**
+ * @brief struct to represent a container (@ref CONTAINER type)
+ *
+ * @note the main screen is a kind of container
+ *
+ */
+typedef struct PACKED__ nbgl_container_s {
+ nbgl_obj_t obj; ///< common part
+ nbgl_direction_t layout; ///< layout of children inside this object
+ uint8_t nbChildren;
+ bool forceClean; ///< if set to true, a paint will be done with background color
+ struct nbgl_obj_s **children; ///< children of this object (nbChildren size)
+} nbgl_container_t;
+
+/**
+ * @brief struct to represent a vertical or horizontal line
+ *
+ */
+typedef struct PACKED__ nbgl_line_s {
+ nbgl_obj_t obj; ///< common part
+ nbgl_direction_t direction; ///< direction of the line, e.g @ref VERTICAL or @ref HORIZONTAL
+ color_t lineColor; ///< color of the line
+ uint8_t thickness; ///< thickness of the line in pixel, maybe different from height for
+ ///< horizontal line
+ uint8_t offset; ///< the object height being always 4, with a y0 multiple of 4, this offset is
+ ///< use to move the line within these 4 pixels
+} nbgl_line_t;
+
+/**
+ * @brief prototype of function to be called when a @ref IMAGE object is drawned, and no buffer was
+ * provided
+ * @param token provided token in @ref IMAGE object
+ * @return the icn details to be drawned in image object
+ */
+typedef nbgl_icon_details_t *(*onImageDrawCallback_t)(uint8_t token);
+
+/**
+ * @brief struct to represent an image (@ref IMAGE type)
+ *
+ */
+typedef struct PACKED__ nbgl_image_s {
+ nbgl_obj_t obj; // common part
+ color_t foregroundColor; ///< color set to '1' bits, for 1PBB images. '0' are set to background
+ ///< color.
+ const nbgl_icon_details_t *buffer; ///< buffer containing bitmap, with exact same size as
+ ///< object (width*height*bpp/8 bytes)
+ onImageDrawCallback_t onDrawCallback; ///< function called if buffer is NULL, with above token
+ ///< as parameter. Can be NULL
+ uint8_t token; ///< token to use as param of onDrawCallback
+} nbgl_image_t;
+
+/**
+ * @brief struct to represent an image file object (@ref IMAGE_FILE type)
+ * The source of the data is an image file with header. width and height are given in this header
+ *
+ */
+typedef struct PACKED__ nbgl_image_file_s {
+ nbgl_obj_t obj; // common part
+ const uint8_t *buffer; ///< buffer containing image file
+} nbgl_image_file_t;
+
+/**
+ * @brief struct to represent a QR code (@ref QR_CODE type), whose size is fixed
+ *
+ */
+typedef struct PACKED__ nbgl_qrcode_s {
+ nbgl_obj_t obj; // common part
+ color_t foregroundColor; ///< color set to '1' bits, for 1PBB images. '0' are set to background
+ ///< color.
+ nbgl_qrcode_version_t version; ///< requested version, if V10, size will be fixed to 228*228,
+ ///< if V4, size will be fixed to 132*132
+ const char *text; ///< text single line (NULL terminated)
+} nbgl_qrcode_t;
+
+/**
+ * @brief struct to represent a radio button (@ref RADIO_BUTTON type)
+ *
+ * @note size is fixed
+ *
+ */
+typedef struct PACKED__ nbgl_radio_s {
+ nbgl_obj_t obj; // common part
+ color_t activeColor; ///< color set to to inner circle, when active.
+ color_t borderColor; ///< color set to border.
+ nbgl_state_t state; ///< state of the radio button. Active is when state == @ref ON_STATE
+} nbgl_radio_t;
+
+/**
+ * @brief struct to represent a switch (size is fixed) (@ref SWITCH type)
+ *
+ */
+typedef struct PACKED__ nbgl_switch_s {
+ nbgl_obj_t obj; // common part
+ color_t onColor; ///< color set to border and knob, when ON (knob on the right).
+ color_t offColor; ///< color set to border and knob, when OFF (knob on the left).
+ nbgl_state_t state; ///< state of the switch.
+} nbgl_switch_t;
+
+/**
+ * @brief struct to represent a progress bar (@ref PROGRESS_BAR type)
+ * @note if withBorder, the stroke of the border is fixed (3 pixels)
+ */
+typedef struct PACKED__ nbgl_progress_bar_s {
+ nbgl_obj_t obj; // common part
+ bool withBorder; ///< if set to true, a border in black surround the whole object
+ uint8_t state; ///< state of the progress, in % (from 0 to 100).
+ color_t foregroundColor; ///< color of the inner progress bar and border (if applicable)
+} nbgl_progress_bar_t;
+
+/**
+ * @brief struct to represent a navigation bar (@ref PAGE_INDICATOR type)
+ * There can be up to 5 page indicators, whose shape is fixed.
+ * If there are more than 5 pages, the middle indicator will be "..."
+ *
+ * @note height is fixed
+ */
+typedef struct PACKED__ nbgl_navigation_bar_s {
+ nbgl_obj_t obj; ///< common part
+ uint8_t nbPages; ///< number of pages.
+ uint8_t activePage; ///< index of active page (from 0 to nbPages-1).
+} nbgl_page_indicator_t;
+
+/**
+ * @brief prototype of function to be called when a @ref TEXT_AREA object is drawned, and no text
+ * was provided
+ * @param token provided token in @ref TEXT_AREA object
+ * @return an ASCII string (null terminated) to be drawned in text area
+ */
+typedef char *(*onTextDrawCallback_t)(uint8_t token);
+
+/**
+ * @brief struct to represent a button (@ref BUTTON type)
+ * that can contain a text and/or an icon
+ * @note border width is fixed (2 pixels)
+ *
+ */
+typedef struct PACKED__ nbgl_button_s {
+ nbgl_obj_t obj; ///< common part
+ color_t innerColor; ///< color set inside of the button
+ color_t borderColor; ///< color set to button's border
+ color_t foregroundColor; ///< color set to '1' bits in icon, and text. '0' are set to
+ ///< innerColor color.
+ nbgl_radius_t radius; ///< radius of the corners, must be a multiple of 4.
+ nbgl_font_id_e fontId; ///< id of the font to use, if any
+ bool localized; ///< if set to true, means the following 'text' field is considered as a
+ const char *text; ///< single line UTF-8 text (NULL terminated)
+#if defined(HAVE_LANGUAGE_PACK)
+ UX_LOC_STRINGS_INDEX textId; ///< id of the text single line UTF-8 text
+#endif // HAVE_LANGUAGE_PACK
+ onTextDrawCallback_t onDrawCallback; ///< function called if not NULL, with above token as
+ ///< parameter to get the text of the button
+ uint8_t token; ///< token to use as param of onDrawCallback
+ const nbgl_icon_details_t *icon; ///< buffer containing icons bitmap. Set to NULL when no icon
+} nbgl_button_t;
+
+/**
+ * @brief struct to represent a text area (@ref TEXT_AREA type)
+ *
+ */
+typedef struct PACKED__ nbgl_text_area_s {
+ nbgl_obj_t obj; ///< common part
+ color_t textColor; ///< color set to '1' bits in text. '0' are set to backgroundColor color.
+ nbgl_aligment_t textAlignment; ///< alignment of text within the area
+ nbgl_style_t style; ///< to define the style of border
+ nbgl_font_id_e fontId; ///< id of the font to use
+ bool localized; ///< if set to true, use textId instead of text
+ bool autoHideLongLine; ///< if set to true, replace beginning of line by ... to keep it single
+ ///< line
+ bool wrapping; ///< if set to true, break lines on ' ' when possible
+ uint8_t nbMaxLines; ///< if >0, replace end (3 last chars) of line (nbMaxLines-1) by "..." and
+ ///< stop display here
+ const char *text; ///< ASCII text to draw (NULL terminated). Can be NULL.
+ uint16_t len; ///< number of bytes to write (if 0, max number of chars or strlen is used)
+#if defined(HAVE_LANGUAGE_PACK)
+ UX_LOC_STRINGS_INDEX textId; ///< id of the UTF-8 text
+#endif // HAVE_LANGUAGE_PACK
+ onTextDrawCallback_t
+ onDrawCallback; ///< function called if not NULL to get the text of the text area
+ uint8_t token; ///< token to use as param of onDrawCallback
+} nbgl_text_area_t;
+
+/**
+ * @brief struct to represent a text entry area (@ref TEXT_ENTRY type)
+ *
+ */
+typedef struct PACKED__ nbgl_text_entry_s {
+ nbgl_obj_t obj; ///< common part
+ nbgl_font_id_e fontId; ///< id of the font to use
+ uint8_t nbChars; ///< number of char placeholders to display (8 or 9 chars).
+ const char *text; ///< text to display (up to nbChars chars).
+} nbgl_text_entry_t;
+
+/**
+ * @brief struct to represent a "spinner", represented by the Ledger corners, in gray, with one of
+ * the corners in black (@ref SPINNER type)
+ *
+ */
+typedef struct PACKED__ nbgl_spinner_s {
+ nbgl_obj_t obj; ///< common part
+ uint8_t position; ///< position of the spinner (from 0 to 3). If set to 0xFF, the spinner is
+ ///< entirely black
+} nbgl_spinner_t;
+
+/**
+ * @brief prototype of function to be called when a valid key is pressed on keyboard
+ * Backspace is equal to 0x8 (ASCII code), Validate (for Keypad) is equal to 15 ('\\r')
+ * @param touchedKey char typed on keyboard
+ */
+typedef void (*keyboardCallback_t)(char touchedKey);
+
+/**
+ * @brief Mode in which to open/set the keyboard
+ *
+ */
+typedef enum {
+#ifdef HAVE_SE_TOUCH
+ MODE_LETTERS = 0, ///< letters mode
+ MODE_DIGITS, ///< digits and some special characters mode
+ MODE_SPECIAL ///< extended special characters mode
+#else // HAVE_SE_TOUCH
+ MODE_LOWER_LETTERS, ///< lower case letters mode
+ MODE_UPPER_LETTERS, ///< upper case letters mode
+ MODE_DIGITS_AND_SPECIALS, ///< digits and some special characters mode
+ MODE_NONE ///< no mode defined (only for Nanos)
+#endif // HAVE_SE_TOUCH
+} keyboardMode_t;
+
+/**
+ * @brief Letters casing in which to open/set the keyboard
+ *
+ */
+typedef enum {
+ LOWER_CASE = 0, ///< lower case mode
+ UPPER_CASE, ///< upper case mode for one character
+ LOCKED_UPPER_CASE ///< locked upper case mode
+} keyboardCase_t;
+
+/**
+ * @brief struct to represent a keyboard (@ref KEYBOARD type)
+ *
+ */
+typedef struct PACKED__ nbgl_keyboard_s {
+ nbgl_obj_t obj; ///< common part
+ color_t textColor; ///< color set to letters.
+ color_t borderColor; ///< color set to key borders
+ bool lettersOnly; ///< if true, only display letter keys and Backspace
+#ifdef HAVE_SE_TOUCH
+ bool needsRefresh; ///< if true, means that the keyboard has been redrawn and needs a refresh
+ keyboardCase_t casing; ///< keyboard casing mode (lower, upper once or upper locked)
+#else // HAVE_SE_TOUCH
+ bool enableBackspace; ///< if true, Backspace key is enabled
+ bool enableValidate; ///< if true, Validate key is enabled
+ uint8_t selectedCharIndex;
+#endif // HAVE_SE_TOUCH
+ keyboardMode_t mode; ///< keyboard mode to start with
+ uint32_t keyMask; ///< mask used to disable some keys in letters only mod. The 26 LSB bits of
+ ///< mask are used, for the 26 letters of a QWERTY keyboard. Bit[0] for Q,
+ ///< Bit[1] for W and so on
+ keyboardCallback_t callback; ///< function called when an active key is pressed
+} nbgl_keyboard_t;
+
+/**
+ * @brief struct to represent a keypad (@ref KEYPAD type)
+ *
+ */
+typedef struct PACKED__ nbgl_keypad_s {
+ nbgl_obj_t obj; ///< common part
+#ifdef HAVE_SE_TOUCH
+ color_t textColor; ///< color set to digits.
+ color_t borderColor; ///< color set to key borders
+ bool enableDigits; ///< if true, Digit keys are enabled
+ uint8_t digitIndexes[5]; ///< array of digits indexes, 4 bits per digit
+#else // HAVE_SE_TOUCH
+ uint8_t selectedKey; ///< selected key position
+#endif // HAVE_SE_TOUCH
+ bool enableBackspace; ///< if true, Backspace key is enabled
+ bool enableValidate; ///< if true, Validate key is enabled
+ bool shuffled; ///< if true, Digit keys are shuffled
+ keyboardCallback_t callback; ///< function called when an active key is pressed
+} nbgl_keypad_t;
+
+/**
+ * @brief ids of touchable objects, for external stimulus (by Testing environment)
+ *
+ */
+enum {
+ BOTTOM_BUTTON_ID = 1,
+ LEFT_BUTTON_ID,
+ RIGHT_BUTTON_ID,
+ WHOLE_SCREEN_ID,
+ TOP_RIGHT_BUTTON_ID,
+ BACK_BUTTON_ID,
+ SINGLE_BUTTON_ID,
+ CHOICE_1_ID,
+ CHOICE_2_ID,
+ KEYPAD_ID,
+ KEYBOARD_ID,
+ ENTERED_TEXT_ID,
+ LONG_PRESS_BUTTON_ID,
+ CONTROLS_ID, // when multiple controls in the same pages (buttons, switches, radios)
+ NB_CONTROL_IDS
+};
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_redrawObject(nbgl_obj_t *obj, nbgl_obj_t *prevObj, bool computePosition);
+
+void nbgl_refresh(void);
+void nbgl_refreshSpecial(nbgl_refresh_mode_t mode);
+void nbgl_refreshSpecialWithPostRefresh(nbgl_refresh_mode_t mode, nbgl_post_refresh_t post_refresh);
+bool nbgl_refreshIsNeeded(void);
+void nbgl_refreshReset(void);
+
+void nbgl_objInit(void);
+void nbgl_objAllowDrawing(bool enable);
+
+void nbgl_objPoolRelease(uint8_t layer);
+nbgl_obj_t *nbgl_objPoolGet(nbgl_obj_type_t type, uint8_t layer);
+nbgl_obj_t *nbgl_objPoolGetPrevious(nbgl_obj_t *obj, uint8_t layer);
+uint8_t nbgl_objPoolGetId(nbgl_obj_t *obj);
+int nbgl_objPoolGetArray(nbgl_obj_type_t type,
+ uint8_t nbObjs,
+ uint8_t layer,
+ nbgl_obj_t **objArray);
+uint8_t nbgl_objPoolGetNbUsed(uint8_t layer);
+void nbgl_containerPoolRelease(uint8_t layer);
+nbgl_obj_t **nbgl_containerPoolGet(uint8_t nbObjs, uint8_t layer);
+uint8_t nbgl_containerPoolGetNbUsed(uint8_t layer);
+
+#ifdef HAVE_SE_TOUCH
+nbgl_container_t *nbgl_navigationPopulate(uint8_t nbPages,
+ uint8_t activePage,
+ bool withExitKey,
+ uint8_t layer);
+bool nbgl_navigationCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ uint8_t nbPages,
+ uint8_t *activePage);
+#endif // HAVE_SE_TOUCH
+
+// for internal use
+void nbgl_objDrawKeyboard(nbgl_keyboard_t *kbd);
+void nbgl_objDrawKeypad(nbgl_keypad_t *kbd);
+#ifdef HAVE_SE_TOUCH
+void nbgl_keyboardTouchCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType);
+void nbgl_keypadTouchCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType);
+
+bool nbgl_keyboardGetPosition(nbgl_keyboard_t *kbd, char index, uint16_t *x, uint16_t *y);
+bool nbgl_keypadGetPosition(nbgl_keypad_t *kbd, char index, uint16_t *x, uint16_t *y);
+#else // HAVE_SE_TOUCH
+void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent);
+void nbgl_keypadCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent);
+#endif // HAVE_SE_TOUCH
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_OBJ_H */
diff --git a/sdk_lib_nbgl/include/nbgl_page.h b/sdk_lib_nbgl/include/nbgl_page.h
new file mode 100644
index 00000000..b14a8bbe
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_page.h
@@ -0,0 +1,323 @@
+/**
+ * @file nbgl_page.h
+ * @brief API of the Advanced BOLOS Graphical Library, for predefined pages
+ *
+ */
+
+#ifndef NBGL_PAGE_H
+#define NBGL_PAGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "nbgl_layout.h"
+#include "nbgl_obj.h"
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief The different types of top-right / bottom button
+ *
+ */
+typedef enum {
+ NO_BUTTON_STYLE = 0, ///< no button.
+ SETTINGS_ICON, ///< settings (wheel) icon in the button.
+ QUIT_ICON, ///< quit (X) icon in the button.
+ INFO_ICON, ///< info (i) icon in the button.
+ QUIT_APP_TEXT ///< A full width button with "Quit app" text (only for bottom button)
+} nbgl_pageButtonStyle_t;
+
+/**
+ * @brief The different types of predefined page contents
+ *
+ */
+typedef enum {
+ CENTERED_INFO = 0, ///< a centered info
+ INFO_LONG_PRESS, ///< a centered info and a long press button
+ INFO_BUTTON, ///< a centered info and a simple black button
+ TAG_VALUE_LIST, ///< list of tag/value pairs
+ TAG_VALUE_DETAILS, ///< a tag/value pair and a small button to get details.
+ TAG_VALUE_CONFIRM, ///< tag/value pairs and a black button/footer to confirm/cancel.
+ SWITCHES_LIST, ///< list of switches with descriptions
+ INFOS_LIST, ///< list of infos with titles
+ CHOICES_LIST, ///< list of choices through radio buttons
+ BARS_LIST ///< list of touchable bars (with > on the right to go to sub-pages)
+} nbgl_pageContentType_t;
+
+/**
+ * @brief This structure contains a [item,value] pair and info about "details" button
+ */
+typedef struct nbgl_pageTagValueDetails_s {
+ nbgl_layoutTagValueList_t tagValueList; ///< list of tag/value pairs
+ const nbgl_icon_details_t *detailsButtonIcon; ///< icon to use in details button
+ const char *detailsButtonText; ///< this text is used for "details" button
+ uint8_t detailsButtonToken; ///< the token used as argument of the actionCallback when the
+ ///< "details" button is touched
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when details button is touched
+} nbgl_pageTagValueDetails_t;
+
+/**
+ * @brief This structure contains [item,value] pair(s) and info about a potential "details" button,
+ * but also a black button + footer to confirm/cancel
+ */
+typedef struct nbgl_pageTagValueConfirm_s {
+ nbgl_layoutTagValueList_t tagValueList; ///< list of tag/value pairs
+ const nbgl_icon_details_t *detailsButtonIcon; ///< icon to use in details button
+ const char *detailsButtonText; ///< this text is used for "details" button (if NULL, no button)
+ uint8_t detailsButtonToken; ///< the token used as argument of the actionCallback when the
+ ///< "details" button is touched
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when details button is touched
+ const char
+ *confirmationText; ///< text of the confirmation button, if NULL "It matches" is used
+ const char
+ *cancelText; ///< the text used for cancel action, if NULL "It doesn't matches" is used
+ uint8_t confirmationToken; ///< the token used as argument of the onActionCallback
+ uint8_t cancelToken; ///< the token used as argument of the onActionCallback when the cancel
+ ///< button is pressed
+} nbgl_pageTagValueConfirm_t;
+
+/**
+ * @brief This structure contains data to build a centered info + long press button page content
+ */
+typedef struct nbgl_pageInfoLongPress_s {
+ const char *text; ///< centered text in large case
+ const nbgl_icon_details_t *icon; ///< a buffer containing the 1BPP icon
+ const char *longPressText; ///< text of the long press button
+ uint8_t longPressToken; ///< the token used as argument of the onActionCallback when button is
+ ///< long pressed
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when button is touched
+} nbgl_pageInfoLongPress_t;
+
+/**
+ * @brief This structure contains data to build a centered info + simple black button page content
+ */
+typedef struct nbgl_pageInfoButton_s {
+ const char *text; ///< centered text in large case
+ const nbgl_icon_details_t *icon; ///< a buffer containing the 1BPP icon
+ const char *buttonText; ///< text of the long press button
+ uint8_t buttonToken; ///< the token used as argument of the onActionCallback when button is
+ ///< long pressed
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when button is touched
+} nbgl_pageInfoButton_t;
+
+/**
+ * @brief This structure contains data to build a @ref SWITCHES_LIST page content
+ */
+typedef struct nbgl_pageSwitchesList_s {
+ const nbgl_layoutSwitch_t *switches; ///< array of switches (nbSwitches items)
+ uint8_t nbSwitches; ///< number of elements in switches and tokens array
+} nbgl_pageSwitchesList_t;
+
+/**
+ * @brief This structure contains data to build a @ref INFOS_LIST page content
+ */
+typedef struct nbgl_pageInfoList_s {
+ const char *const *infoTypes; ///< array of types of infos (in black/bold)
+ const char *const *infoContents; ///< array of contents of infos (in black)
+ uint8_t nbInfos; ///< number of elements in infoTypes and infoContents array
+} nbgl_pageInfoList_t;
+
+/**
+ * @brief This structure contains data to build a @ref BARS_LIST page content
+ */
+typedef struct nbgl_pageBarsList_s {
+ const char *const *barTexts; ///< array of texts for each bar (nbBars items, in black/bold)
+ const uint8_t *tokens; ///< array of tokens, one for each bar (nbBars items)
+ uint8_t nbBars; ///< number of elements in barTexts and tokens array
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when a bar is touched
+} nbgl_pageBarsList_t;
+
+/**
+ * @brief This structure contains data to build a page in multi-pages mode (@ref
+ * nbgl_pageDrawGenericContent)
+ */
+typedef struct nbgl_pageContent_s {
+ const char *title; ///< text for the title of the page (if NULL, no title)
+ bool isTouchableTitle; ///< if set to true, the title is preceded by <- arrow to go back
+ uint8_t titleToken; ///< if isTouchableTitle set to true, this is the token used when touching
+ ///< title
+ tune_index_e tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when title is touched
+ nbgl_pageContentType_t type; ///< type of page content in the following union
+ union {
+ nbgl_layoutTagValueList_t tagValueList; ///< @ref TAG_VALUE_LIST type
+ nbgl_layoutCenteredInfo_t centeredInfo; ///< @ref CENTERED_INFO type
+ nbgl_pageInfoLongPress_t infoLongPress; ///< @ref INFO_LONG_PRESS type
+ nbgl_pageInfoButton_t infoButton; ///< @ref INFO_BUTTON type
+ nbgl_pageTagValueDetails_t tagValueDetails; ///< @ref TAG_VALUE_DETAILS type
+ nbgl_pageTagValueConfirm_t tagValueConfirm; ///< @ref TAG_VALUE_CONFIRM type
+ nbgl_pageSwitchesList_t switchesList; ///< @ref SWITCHES_LIST type
+ nbgl_pageInfoList_t infosList; ///< @ref INFOS_LIST type
+ nbgl_layoutRadioChoice_t choicesList; ///< @ref CHOICES_LIST type
+ nbgl_pageBarsList_t barsList; ///< @ref BARS_LIST type
+ };
+} nbgl_pageContent_t;
+
+/**
+ * @brief type shared externally
+ *
+ */
+typedef void *nbgl_page_t;
+
+/**
+ * @brief The different types of navigation in a multi-screens page
+ *
+ */
+typedef enum {
+ NAV_WITH_TAP, ///< move forward with "tap" and possibly backward with top left arrow
+ NAV_WITH_BUTTONS, ///< move forward and backward with buttons in bottom nav bar
+} nbgl_pageNavigationType_t;
+
+/**
+ * @brief Structure containing all information to create a navigation with "tap"
+ *
+ */
+typedef struct nbgl_pageNavWithTap_s {
+ bool backButton; ///< if set to true, a back button (left arrow) is displayed in the top left
+ ///< corner (if page >=1)
+ uint8_t backToken; ///< the token used as argument of the actionCallback when the back button
+ ///< is touched
+ uint8_t nextPageToken; ///< the token used as argument of the actionCallback when the main
+ ///< panel is "tapped"
+ const char *nextPageText; ///< this text is used as indication for "Tap to continue", to
+ ///< navigate forward
+ const char *quitText; ///< the text displayed in footer, used to quit
+ const char *skipText; ///< if not NULL the text displayed in right part of footer, used for
+ ///< example to skip pages
+ uint8_t skipToken; ///< if skipText is NULL the token used when right part of footer is touched
+} nbgl_pageNavWithTap_t;
+
+/**
+ * @brief Structure containing all information to create a navigation with buttons in bottom nav bar
+ *
+ */
+typedef struct nbgl_pageNavWithButtons_s {
+ bool quitButton; ///< if set to true, a quit button (X) is displayed in the nav bar
+ uint8_t navToken; ///< the token used as argument of the actionCallback when the nav buttons
+ ///< are pressed (index param gives the page)
+} nbgl_pageNavWithButtons_t;
+
+/**
+ * @brief Structure containing all specific information when creating a multi-screens page.
+ *
+ */
+typedef struct nbgl_pageMultiScreensDescription_s {
+ uint8_t activePage; ///< the index of the page to display at start-up
+ uint8_t nbPages; ///< the number of pages to display (if <2, no navigation bar)
+ uint8_t
+ quitToken; ///< the token used as argument of the actionCallback when the footer is touched
+ nbgl_pageNavigationType_t navType; ///< type of navigation, it will tell which structure in the
+ ///< following union will be used
+ bool progressIndicator; ///< if set to true, display a progress indicator on top of the page
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when next or back is pressed
+ union {
+ nbgl_pageNavWithTap_t navWithTap; ///< structure used when navigation with "tap"
+ nbgl_pageNavWithButtons_t navWithButtons; ///< structure used when navigation with buttons
+ };
+} nbgl_pageNavigationInfo_t;
+
+/**
+ * @brief Structure containing all specific information when creating a confirmation page.
+ */
+typedef struct nbgl_pageConfirmationDescription_s {
+ nbgl_layoutCenteredInfo_t centeredInfo; ///< description of the centered info to be used
+ const char *confirmationText; ///< text of the confirmation button
+ const char *cancelText; ///< the text used for cancel action, if NULL a simple X button is used
+ uint8_t confirmationToken; ///< the token used as argument of the onActionCallback
+ uint8_t cancelToken; ///< the token used as argument of the onActionCallback when the cancel
+ ///< button is pressed
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when button is pressed
+ bool modal; ///< if true, page is open as a modal
+} nbgl_pageConfirmationDescription_t;
+
+/**
+ * @brief Structure containing all specific information when creating a address confirmation page.
+ * This page contains the address in a tag/value format, and a white button to dipsplay the same
+ * address as a QRCode in a modal window. At the bottom 2 buttons allow to confirm or invalidate the
+ * address
+ */
+typedef struct nbgl_pageAddressConfirmationDescription_s {
+ const char *address; ///< address to confirm
+ const char
+ *qrCodeButtonText; ///< text to display in "QR code button", if NULL "Show as QR is used"
+ const char
+ *confirmationText; ///< text of the confirmation button, if NULL "It matches" is used
+ const char
+ *cancelText; ///< the text used for cancel action, if NULL "It doesn't matches" is used
+ uint8_t confirmationToken; ///< the token used as argument of the onActionCallback
+ uint8_t cancelToken; ///< the token used as argument of the onActionCallback when the cancel
+ ///< button is pressed
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when button is pressed
+} nbgl_pageAddressConfirmationDescription_t;
+
+/**
+ * @brief Structure containing all specific information when creating an information page.
+ */
+typedef struct nbgl_pageInfoDescription_s {
+ nbgl_layoutCenteredInfo_t centeredInfo; ///< description of the centered info to be used
+ nbgl_pageButtonStyle_t topRightStyle; ///< style to apply to the Top-Right button
+ nbgl_pageButtonStyle_t bottomButtonStyle; ///< style to apply to the Bottom button
+ uint8_t topRightToken; ///< the token that will be used as argument of the onActionCallback
+ uint8_t bottomButtonsToken; ///< the token that will be used as argument of the
+ ///< onActionCallback if action/bottom button is touched
+ const char *footerText; ///< if not NULL, add a touchable footer
+ uint8_t footerToken; ///< the token that will be used as argument of the onActionCallback
+ const char
+ *tapActionText; ///< if set to true, main area is "tapable", with this text as indication
+ uint8_t tapActionToken; ///< the token that will be used as argument of the onActionCallback
+ const char
+ *actionButtonText; ///< if not NULL a black "action" button is set under the centered info
+ tune_index_e
+ tuneId; ///< if not @ref NBGL_NO_TUNE, a tune will be played when button/footer is pressed
+} nbgl_pageInfoDescription_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+nbgl_page_t *nbgl_pageDrawLedgerInfo(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ const char *text,
+ int tapActionToken);
+nbgl_page_t *nbgl_pageDrawSpinner(nbgl_layoutTouchCallback_t onActionCallback, const char *text);
+nbgl_page_t *nbgl_pageDrawInfo(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ const nbgl_pageInfoDescription_t *info);
+nbgl_page_t *nbgl_pageDrawConfirmation(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageConfirmationDescription_t *info);
+nbgl_page_t *nbgl_pageDrawGenericContentExt(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageNavigationInfo_t *nav,
+ nbgl_pageContent_t *content,
+ bool modal);
+nbgl_page_t *nbgl_pageDrawGenericContent(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageNavigationInfo_t *nav,
+ nbgl_pageContent_t *content);
+int nbgl_pageRelease(nbgl_page_t *);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_PAGE_H */
diff --git a/sdk_lib_nbgl/include/nbgl_screen.h b/sdk_lib_nbgl/include/nbgl_screen.h
new file mode 100644
index 00000000..df76fe83
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_screen.h
@@ -0,0 +1,127 @@
+/**
+ * @file nbgl_screen.h
+ * @brief API to manage screens
+ *
+ */
+
+#ifndef NBGL_SCREEN_H
+#define NBGL_SCREEN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "nbgl_types.h"
+#include "nbgl_obj.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief prototype of function to be called when a timer on screen is fired
+ */
+typedef void (*nbgl_tickerCallback_t)(void);
+
+/**
+ * @brief struct to configure a screen layer
+ *
+ */
+typedef struct PACKED__ nbgl_screenTickerConfiguration_s {
+ nbgl_tickerCallback_t
+ tickerCallback; ///< callback called when ticker timer is fired. Set to NULL for no ticker
+ uint32_t tickerValue; ///< timer initial value, in ms (should be multiple of 100 ms). Set to 0
+ ///< for no ticker
+ uint32_t tickerIntervale; ///< for periodic timers, the intervale in ms to rearm the timer
+ ///< (should be multiple of 100 ms). Set to 0 for one-shot timers
+} nbgl_screenTickerConfiguration_t;
+
+/**
+ * @brief struct to represent a screen (@ref SCREEN type)
+ * @note Only for internal usage
+ * @note inherits from container
+ *
+ */
+typedef struct PACKED__ nbgl_screen_s {
+ nbgl_container_t container; ///< common part
+ nbgl_screenTickerConfiguration_t ticker; ///< ticker configuration
+#ifdef HAVE_SE_TOUCH
+ nbgl_touchCallback_t
+ touchCallback; ///< function to be called on events defined in touchMask of each objects
+#else // HAVE_SE_TOUCH
+ nbgl_buttonCallback_t buttonCallback;
+#endif // HAVE_SE_TOUCH
+ struct nbgl_screen_s
+ *next; ///< pointer to screen on top of this one (or NULL is this screen is top of stack)
+ struct nbgl_screen_s *previous; ///< pointer to screen on bottom of this one (or NULL is this
+ ///< screen is bottom of stack)
+ uint8_t index; ///< index in screenStack array
+} nbgl_screen_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_screen_reinit(void);
+
+#ifdef HAVE_DISPLAY_FAST_MODE
+void nbgl_screen_update_temperature(uint8_t temp_degrees);
+#endif // HAVE_DISPLAY_FAST_MODE
+
+#ifdef HAVE_CONFIGURABLE_DISPLAY_FAST_MODE
+void nbgl_screen_config_fast_mode(uint8_t fast_mode_setting);
+#endif // HAVE_CONFIGURABLE_DISPLAY_FAST_MODE
+
+void nbgl_screenRedraw(void);
+nbgl_obj_t *nbgl_screenGetTop(void);
+uint8_t nbgl_screenGetCurrentStackSize(void);
+bool nbgl_screenContainsObj(nbgl_obj_t *obj);
+nbgl_obj_t *nbgl_screenContainsObjType(nbgl_screen_t *screen, nbgl_obj_type_t type);
+
+#ifdef HAVE_SE_TOUCH
+int nbgl_screenSet(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_touchCallback_t touchCallback);
+#else // HAVE_SE_TOUCH
+int nbgl_screenSet(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_buttonCallback_t buttonCallback);
+#endif // HAVE_SE_TOUCH
+int nbgl_screenUpdateNbElements(uint8_t screenIndex, uint8_t nbElements);
+int nbgl_screenUpdateBackgroundColor(uint8_t screenIndex, color_t color);
+int nbgl_screenUpdateTicker(uint8_t screenIndex, const nbgl_screenTickerConfiguration_t *ticker);
+nbgl_obj_t **nbgl_screenGetElements(uint8_t screenIndex);
+int nbgl_screenRelease(void);
+#ifdef HAVE_SE_TOUCH
+int nbgl_screenPush(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_touchCallback_t touchCallback);
+#else // HAVE_SE_TOUCH
+int nbgl_screenPush(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_buttonCallback_t buttonCallback);
+#endif // HAVE_SE_TOUCH
+int nbgl_screenPop(uint8_t screenIndex);
+int nbgl_screenReset(void);
+void nbgl_screenHandler(uint32_t intervaleMs);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_SCREEN_H */
diff --git a/sdk_lib_nbgl/include/nbgl_serialize.h b/sdk_lib_nbgl/include/nbgl_serialize.h
new file mode 100644
index 00000000..537b9f88
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_serialize.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "nbgl_obj.h"
+
+#define NBGL_SERIALIZE_OK 0
+#define NBGL_SERIALIZE_ERROR 1
+
+typedef enum nbgl_serialized_event_type_e {
+ NBGL_DRAW_OBJ = 0,
+ NBGL_REFRESH_AREA
+} nbgl_serialized_event_type_e;
+
+uint8_t nbgl_serializeNbglEvent(nbgl_serialized_event_type_e type,
+ nbgl_obj_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len);
diff --git a/sdk_lib_nbgl/include/nbgl_side.h b/sdk_lib_nbgl/include/nbgl_side.h
new file mode 100644
index 00000000..c2007110
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_side.h
@@ -0,0 +1,53 @@
+
+/**
+ * @file nbgl_side.h
+ * @brief Side screen low-Level driver API, to draw elementary forms
+ *
+ */
+
+#ifndef NBGL_SIDE_H
+#define NBGL_SIDE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * Width of the side screen in pixels
+ */
+#define SIDE_SCREEN_WIDTH 96
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_sideDrawRect(nbgl_area_t *area);
+void nbgl_sideDrawHorizontalLine(nbgl_area_t *area, uint8_t mask, color_t lineColor);
+void nbgl_sideDrawImage(nbgl_area_t *area,
+ uint8_t *buffer,
+ nbgl_transformation_t transformation,
+ nbgl_color_map_t colorMap);
+void nbgl_sideRefreshArea(nbgl_area_t *area, nbgl_post_refresh_t post_refresh);
+
+/**********************
+ * VARIABLES
+ **********************/
+
+extern uint8_t ramBuffer[];
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_SIDE_H */
diff --git a/sdk_lib_nbgl/include/nbgl_step.h b/sdk_lib_nbgl/include/nbgl_step.h
new file mode 100644
index 00000000..a4ed419e
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_step.h
@@ -0,0 +1,115 @@
+/**
+ * @file nbgl_step.h
+ * @brief Step construction API of NBGL
+ *
+ */
+
+#ifndef NBGL_STEP_H
+#define NBGL_STEP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "nbgl_layout.h"
+#include "nbgl_obj.h"
+#include "nbgl_types.h"
+#ifdef HAVE_LANGUAGE_PACK
+#include "bolos_ux_loc_strings.h"
+#endif // HAVE_LANGUAGE_PACK
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * get the "position" of a step within a flow of several steps
+ * @param _step step index from which to get the position
+ * @param _nb_steps number of steps in the flow
+ */
+#define GET_POS_OF_STEP(_step, _nb_steps) \
+ (_nb_steps < 2) \
+ ? SINGLE_STEP \
+ : ((_step == 0) ? FIRST_STEP \
+ : ((_step == (_nb_steps - 1)) ? LAST_STEP : NEITHER_FIRST_NOR_LAST_STEP))
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**
+ * @brief type shared externally
+ *
+ */
+typedef void *nbgl_step_t;
+
+/**
+ * @brief prototype of chosen menu list item callback
+ * @param choiceIndex index of the menu list item
+ */
+typedef void (*nbgl_stepMenuListCallback_t)(uint8_t choiceIndex);
+
+/**
+ * @brief prototype of function to be called when buttons are touched on a screen
+ * @param event type of button event
+ */
+typedef void (*nbgl_stepButtonCallback_t)(nbgl_step_t stepCtx, nbgl_buttonEvent_t event);
+
+/**
+ * @brief possible position for a step in a flow
+ *
+ */
+enum {
+ SINGLE_STEP, ///< single step flow
+ FIRST_STEP, ///< first in a multiple steps flow
+ LAST_STEP, ///< last in a multiple steps flow
+ NEITHER_FIRST_NOR_LAST_STEP, ///< neither first nor last in a multiple steps flow
+};
+
+///< When the flow is navigated from first to last step
+#define FORWARD_DIRECTION 0x00
+///< When the flow is navigated from last to first step
+#define BACKWARD_DIRECTION 0x08
+
+/**
+ * @brief this type contains nbgl_layoutNavIndication_t in its LSBs
+ * and direction in its MSB (using @ref FORWARD_DIRECTION and @ref BACKWARD_DIRECTION)
+ *
+ */
+typedef uint8_t nbgl_stepPosition_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+nbgl_step_t nbgl_stepDrawText(nbgl_stepPosition_t pos,
+ nbgl_stepButtonCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ const char *text,
+ const char *subText,
+ nbgl_centeredInfoStyle_t style,
+ bool modal);
+nbgl_step_t nbgl_stepDrawCenteredInfo(nbgl_stepPosition_t pos,
+ nbgl_stepButtonCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_layoutCenteredInfo_t *info,
+ bool modal);
+nbgl_step_t nbgl_stepDrawMenuList(nbgl_stepMenuListCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_layoutMenuList_t *list,
+ bool modal);
+uint8_t nbgl_stepGetMenuListCurrent(nbgl_step_t step);
+int nbgl_stepRelease(nbgl_step_t step);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_STEP_H */
diff --git a/sdk_lib_nbgl/include/nbgl_touch.h b/sdk_lib_nbgl/include/nbgl_touch.h
new file mode 100644
index 00000000..03e95df8
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_touch.h
@@ -0,0 +1,49 @@
+/**
+ * @file nbgl_touch.h
+ * TouchScreen management of the new BOLOS Graphical Library
+ *
+ */
+
+#ifndef NBGL_TOUCH_H
+#define NBGL_TOUCH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_types.h"
+#include "nbgl_obj.h"
+
+/*********************
+ * DEFINES
+ *********************/
+// duration of a short touch on touch panel (in ms)
+#define SHORT_TOUCH_DURATION 0
+// duration of a long touch on touch panel (in ms)
+#define LONG_TOUCH_DURATION 1500
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+void nbgl_touchHandler(nbgl_touchStatePosition_t *touchEvent, uint32_t currentTimeMs);
+bool nbgl_touchGetTouchedPosition(nbgl_obj_t *obj,
+ nbgl_touchStatePosition_t **firstPos,
+ nbgl_touchStatePosition_t **lastPos);
+uint32_t nbgl_touchGetTouchDuration(nbgl_obj_t *obj);
+nbgl_obj_t *nbgl_touchGetObjectFromId(nbgl_obj_t *obj, uint8_t id);
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_TOUCH_H */
diff --git a/sdk_lib_nbgl/include/nbgl_types.h b/sdk_lib_nbgl/include/nbgl_types.h
new file mode 100644
index 00000000..2f4777bd
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_types.h
@@ -0,0 +1,233 @@
+/**
+ * @file nbgl_types.h
+ * @brief common types for Graphical Library
+ *
+ */
+
+#ifndef NBGL_TYPES_H
+#define NBGL_TYPES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include
+#include
+#include "bolos_target.h"
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * Width of the front screen in pixels
+ */
+#ifdef SCREEN_SIZE_WALLET
+#ifdef TARGET_STAX
+#define SCREEN_WIDTH 400
+#endif // TARGET_STAX
+#else // SCREEN_SIZE_WALLET
+#define SCREEN_WIDTH 128
+#endif // SCREEN_SIZE_WALLET
+
+/**
+ * Height of the front screen in pixels
+ */
+#ifdef SCREEN_SIZE_WALLET
+#ifdef TARGET_STAX
+#define SCREEN_HEIGHT 672
+#endif // TARGET_STAX
+#else // SCREEN_SIZE_WALLET
+#define SCREEN_HEIGHT 64
+#endif // SCREEN_SIZE_WALLET
+
+/**
+ * No transformation
+ *
+ */
+#define NO_TRANSFORMATION 0
+/**
+ * Horizontal mirroring when rendering bitmap
+ *
+ */
+#define HORIZONTAL_MIRROR 0x1
+/**
+ * Vertical mirroring when rendering bitmap
+ *
+ */
+#define VERTICAL_MIRROR 0x2
+
+/**
+ * Both directions mirroring when rendering bitmap
+ *
+ */
+#define BOTH_MIRRORS (HORIZONTAL_MIRROR | VERTICAL_MIRROR)
+
+/**
+ * Rotation 90 degrees clockwise when rendering bitmap
+ *
+ */
+#define ROTATE_90_CLOCKWISE 0x4
+
+/**
+ * Code to be used for color map when not used
+ *
+ */
+#define INVALID_COLOR_MAP 0x0
+
+/**********************
+ * TYPEDEFS
+ **********************/
+#ifndef MIN
+#define MIN(x, y) ((x) < (y) ? (x) : (y))
+#endif
+#ifndef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+#endif
+
+#ifdef LINUX_SIMU
+#define PACKED__
+#else // LINUX_SIMU
+#define PACKED__ __attribute__((packed))
+#endif // LINUX_SIMU
+#ifdef BICOLOR_MODE
+
+typedef enum {
+ BLACK = 0,
+ DARK_GRAY = 0,
+ LIGHT_GRAY = 0,
+ WHITE = 3
+} color_t;
+
+#else
+
+typedef enum {
+ BLACK = 0,
+ DARK_GRAY,
+ LIGHT_GRAY,
+ WHITE,
+ NB_NBGL_COLOR
+} color_t;
+
+#endif
+
+/**
+ * @brief Enum to represent the number of bits per pixel (BPP)
+ *
+ */
+typedef enum {
+ NBGL_BPP_1 = 0, ///< 1 bit per pixel
+ NBGL_BPP_2, ///< 2 bits per pixel
+ NBGL_BPP_4, ///< 4 bits per pixel
+ NB_NBGL_BPP, ///< Number of NBGL_BPP enums
+} nbgl_bpp_t;
+
+/**
+ * @brief Enum to represent the compression
+ *
+ */
+typedef enum {
+ NBGL_NO_COMPRESSION = 0, ///< no compression, raw data
+ NBGL_GZLIB_COMPRESSION, ///< gzlib compression
+ NBGL_RLE_COMPRESSION, ///< RLE compression
+ NB_NBGL_COMPRESSION ///< Number of NBGL_COMPRESSION enums
+} nbgl_compression_t;
+
+/**
+ * @brief size of gzlib uncompression buffer in bytes
+ *
+ */
+#define GZLIB_UNCOMPRESSED_CHUNK 2049
+
+/**
+ * @brief Represents a rectangle area of the screen
+ *
+ */
+typedef struct PACKED__ nbgl_area_s {
+ int16_t x0; ///< horizontal position of the upper left point of the area (signed int allow for
+ ///< out of screen rendering)
+ int16_t y0; ///< vertical position of the upper left point of the area (signed int allow for
+ ///< out of screen rendering)
+ uint16_t width; ///< width of the area, in pixels
+ uint16_t height; ///< height of the area, in pixels
+ color_t backgroundColor; ///< color (usually background) to be applied
+ nbgl_bpp_t bpp; ///< bits per pixel for this area
+} nbgl_area_t;
+
+/**
+ * @brief different modes of refresh for @ref nbgl_refreshSpecial()
+ *
+ */
+typedef enum {
+ FULL_COLOR_REFRESH, ///< to be used for normal refresh
+ FULL_COLOR_PARTIAL_REFRESH, ///< to be used for small partial refresh (radio buttons, switches)
+ FULL_COLOR_CLEAN_REFRESH, ///< to be used for lock screen display (cleaner but longer refresh)
+ BLACK_AND_WHITE_REFRESH, ///< to be used for pure B&W area, when contrast is important
+ BLACK_AND_WHITE_FAST_REFRESH, ///< to be used for pure B&W area, when contrast is not priority
+ NB_REFRESH_MODES
+} nbgl_refresh_mode_t;
+
+/**
+ * @brief Available post-refresh power modes
+ *
+ * - Power off after a refresh allows to save power
+ * - Keep the screen powered on after a refresh allows to
+ * achieve a faster following refresh.
+ */
+typedef enum nbgl_post_refresh_t {
+ POST_REFRESH_FORCE_POWER_OFF, ///< Force screen power off after refresh
+ POST_REFRESH_FORCE_POWER_ON, ///< Force screen power on after refresh
+ POST_REFRESH_KEEP_POWER_STATE, ///< Keep screen power state after refresh
+} nbgl_post_refresh_t;
+
+/**
+ * @brief possible radius for objects
+ *
+ */
+typedef enum {
+ RADIUS_3_PIXELS = 0, ///< 3 pixels (not on Stax)
+ RADIUS_4_PIXELS, ///< 4 pixels
+ RADIUS_8_PIXELS, ///< 8 pixels
+ RADIUS_16_PIXELS, ///< 16 pixels
+ RADIUS_20_PIXELS, ///< 20 pixels
+ RADIUS_24_PIXELS, ///< 24 pixels
+ RADIUS_32_PIXELS, ///< 32 pixels
+ RADIUS_40_PIXELS, ///< 40 pixels
+ RADIUS_48_PIXELS, ///< 48 pixels
+ RADIUS_1_PIXEL, ///< 1 pixel (not on Stax)
+ RADIUS_0_PIXELS = 0xFF, ///< no radius (square angle)
+} nbgl_radius_t;
+
+/**
+ * @brief Represents the transformation to be applied on the bitmap before rendering
+ * This is a bitfield using masks as @ref HORIZONTAL_MIRROR
+ */
+typedef uint8_t nbgl_transformation_t;
+
+/**
+ * @brief Represents the color_map to be used for 2BPP image, or the foreground color for 1BPP image
+ * @note colors are encoded on 2 bits, so a 8 bits stores the 4 colors for a 2BPP image
+ * @note not used for 4BPP image
+ */
+typedef uint8_t nbgl_color_map_t;
+
+/**
+ * @brief Represents all information about an icon
+ *
+ */
+typedef struct PACKED__ nbgl_icon_details_s {
+ uint16_t width; ///< width of the icon, in pixels
+ uint16_t height; ///< height of the icon, in pixels
+ nbgl_bpp_t bpp; ///< bits per pixel for this area
+ bool isFile; ///< if true, the bitmap buffer contains an image file
+ const uint8_t *bitmap; ///< buffer containing pixel values
+} nbgl_icon_details_t;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_TYPES_H */
diff --git a/sdk_lib_nbgl/include/nbgl_use_case.h b/sdk_lib_nbgl/include/nbgl_use_case.h
new file mode 100644
index 00000000..57ba20bf
--- /dev/null
+++ b/sdk_lib_nbgl/include/nbgl_use_case.h
@@ -0,0 +1,232 @@
+/**
+ * @file nbgl_use_case.h
+ * @brief API of the Advanced BOLOS Graphical Library, for typical application use-cases
+ *
+ */
+
+#ifndef NBGL_USE_CASE_H
+#define NBGL_USE_CASE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#ifdef NBGL_PAGE
+#include "nbgl_page.h"
+#else // NBGL_PAGE
+#include "nbgl_flow.h"
+#endif // NBGL_PAGE
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * @brief when using controls in page content (@ref nbgl_pageContent_t), this is the first token
+ * value usable for these controls
+ */
+#define FIRST_USER_TOKEN 20
+
+/**
+ * @brief value of page parameter used with navigation callback when "skip" button is touched, to
+ * display the long press button to confirm review.
+ */
+#define LAST_PAGE_FOR_REVIEW 0xFF
+
+/**
+ * @brief maximum number of lines for value field in details pages
+ */
+#define NB_MAX_LINES_IN_DETAILS 12
+
+/**
+ * @brief maximum number of lines for value field in review pages
+ */
+#define NB_MAX_LINES_IN_REVIEW 9
+
+/**
+ * @brief maximum number of simultaneously displayed pairs in review pages.
+ * Can be useful when using nbgl_useCaseStaticReview() with the
+ * callback mechanism to retrieve the item/value pairs.
+ */
+#define NB_MAX_DISPLAYED_PAIRS_IN_REVIEW 4
+
+/**
+ * @brief height available for tag/value pairs display
+ */
+#define TAG_VALUE_AREA_HEIGHT 400
+
+/**
+ * @brief Default strings used in the Home tagline
+ */
+#define TAGLINE_PART1 "This app enables signing\ntransactions on the"
+#define TAGLINE_PART2 "network."
+
+/**
+ * @brief Length of buffer used for the default Home tagline
+ */
+#define APP_DESCRIPTION_MAX_LEN 74
+
+/**
+ * @brief Max supported length of appName used for the default Home tagline
+ */
+#define MAX_APP_NAME_FOR_SDK_TAGLINE \
+ (APP_DESCRIPTION_MAX_LEN - 1 - (sizeof(TAGLINE_PART1) + sizeof(TAGLINE_PART2)))
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+/**
+ * @brief prototype of generic callback function
+ */
+typedef void (*nbgl_callback_t)(void);
+
+/**
+ * @brief prototype of navigation callback function
+ * @param page page index (0->(nb_pages-1)) on which we go
+ * @param content content to fill (only type and union)
+ * @return true if the page content is valid, false if no more page
+ */
+typedef bool (*nbgl_navCallback_t)(uint8_t page, nbgl_pageContent_t *content);
+
+/**
+ * @brief prototype of choice callback function
+ * @param confirm if true, means that the confirmation button has been pressed
+ */
+typedef void (*nbgl_choiceCallback_t)(bool confirm);
+
+/**
+ * @brief prototype of function to be called when an page of settings is double-pressed
+ * @param page page index (0->(nb_pages-1))
+ */
+typedef void (*nbgl_actionCallback_t)(uint8_t page);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+#ifdef HAVE_SE_TOUCH
+// utils
+uint8_t nbgl_useCaseGetNbTagValuesInPage(uint8_t nbPairs,
+ const nbgl_layoutTagValueList_t *tagValueList,
+ uint8_t startIndex,
+ bool *tooLongToFit);
+uint8_t nbgl_useCaseGetNbPagesForTagValueList(const nbgl_layoutTagValueList_t *tagValueList);
+
+// use case drawing
+void nbgl_useCaseHome(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ bool withSettings,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback);
+void nbgl_useCaseHomeExt(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ bool withSettings,
+ const char *actionButtonText,
+ nbgl_callback_t actionCallback,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback);
+void nbgl_useCasePlugInHome(const char *plugInName,
+ const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ const char *subTagline,
+ bool withSettings,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback);
+void nbgl_useCaseSettings(const char *settingsTitle,
+ uint8_t initPage,
+ uint8_t nbPages,
+ bool touchableTitle,
+ nbgl_callback_t quitCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_layoutTouchCallback_t controlsCallback);
+void nbgl_useCaseChoice(const nbgl_icon_details_t *icon,
+ const char *message,
+ const char *subMessage,
+ const char *confirmText,
+ const char *rejectString,
+ nbgl_choiceCallback_t callback);
+void nbgl_useCaseConfirm(const char *message,
+ const char *subMessage,
+ const char *confirmText,
+ const char *rejectText,
+ nbgl_callback_t callback);
+void nbgl_useCaseStatus(const char *message, bool isSuccess, nbgl_callback_t quitCallback);
+void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
+ const char *reviewTitle,
+ const char *reviewSubTitle,
+ const char *rejectText,
+ nbgl_callback_t continueCallback,
+ nbgl_callback_t rejectCallback);
+void nbgl_useCaseRegularReview(uint8_t initPage,
+ uint8_t nbPages,
+ const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback);
+void nbgl_useCaseForwardOnlyReview(const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback);
+void nbgl_useCaseForwardOnlyReviewNoSkip(const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback);
+void nbgl_useCaseStaticReview(const nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_pageInfoLongPress_t *infoLongPress,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback);
+void nbgl_useCaseStaticReviewLight(const nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_pageInfoLongPress_t *infoLongPress,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback);
+void nbgl_useCaseViewDetails(const char *tag, const char *value, bool wrapping);
+void nbgl_useCaseAddressConfirmation(const char *address, nbgl_choiceCallback_t callback);
+void nbgl_useCaseAddressConfirmationExt(const char *address,
+ nbgl_choiceCallback_t callback,
+ const nbgl_layoutTagValueList_t *tagValueList);
+#else // HAVE_SE_TOUCH
+void nbgl_useCaseHome(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *appVersion,
+ const char *tagline,
+ nbgl_callback_t aboutCallback,
+ nbgl_callback_t quitCallback);
+void nbgl_useCaseSettings(uint8_t initPage,
+ uint8_t nbPages,
+ nbgl_callback_t quitCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_actionCallback_t actionCallback);
+void nbgl_useCaseRegularReview(uint8_t initPage, uint8_t nbPages, nbgl_navCallback_t navCallback);
+void nbgl_useCaseForwardOnlyReview(nbgl_navCallback_t navCallback);
+void nbgl_useCaseStaticReview(nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_icon_details_t *icon,
+ const char *reviewTitle,
+ const char *acceptText,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback);
+void nbgl_useCaseAddressConfirmation(const nbgl_icon_details_t *icon,
+ const char *title,
+ const char *address,
+ nbgl_choiceCallback_t callback);
+void nbgl_useCaseAddressConfirmationExt(const nbgl_icon_details_t *icon,
+ const char *title,
+ const char *address,
+ nbgl_choiceCallback_t callback,
+ const nbgl_layoutTagValueList_t *tagValueList);
+#endif // HAVE_SE_TOUCH
+void nbgl_useCaseSpinner(const char *text);
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* NBGL_USE_CASE_H */
diff --git a/sdk_lib_nbgl/serialization/Makefile b/sdk_lib_nbgl/serialization/Makefile
new file mode 100644
index 00000000..6ce375b3
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/Makefile
@@ -0,0 +1,19 @@
+
+INC := -I . -I ../include
+DEFINES := -DLINUX_SIMU -DHAVE_LANGUAGE_PACK -DNBGL_GENERATE_DATA_TEST
+
+ifdef TARGET_STAX
+DEFINES += -DHAVE_SE_TOUCH
+DEFINES += -DSCREEN_SIZE_WALLET
+endif
+
+default: generate_data_test.c
+ gcc $(INC) generate_data_test.c $(DEFINES) ../src/nbgl_serialize.c -o generate_data_test
+
+run_test: default
+ ./generate_data_test > data_test.txt
+ pytest -s -vv
+ rm data_test.txt
+
+clean:
+ rm generate_data_test
diff --git a/sdk_lib_nbgl/serialization/README.md b/sdk_lib_nbgl/serialization/README.md
new file mode 100644
index 00000000..01df40dd
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/README.md
@@ -0,0 +1,38 @@
+## NBGL serialization/deserialization library
+
+### Usage
+
+Deserialize raw bytes into an Nbgl event:
+```python
+>>> from nbgl_lib import deserialize_nbgl_bytes
+>>> data = bytes.fromhex("00010501f403e800ff003201000301020403015465737420627574746f6e00")
+>>> nbgl_event = deserialize_nbgl_bytes(data)
+>>> nbgl_event
+NbglDrawObjectEvent(obj=NbglButton(area=NbglArea(width=255, height=50, x0=500, y0=1000, background_color=, bpp=), inner_color=, border_color=, foreground_color=, radius=, font_id=, localized=True, text='Test button'))
+```
+
+Serialize a Nbgl event into a json-like dict:
+```python
+>>> from nbgl_lib import serialize_nbgl_json
+>>> serialize_nbgl_json(nbgl_event)
+{'event': 'NBGL_DRAW_OBJ', 'obj': {'type': 'BUTTON', 'content': {'area': {'width': 255, 'height': 50, 'x0': 500, 'y0': 1000, 'background_color': 'DARK_GRAY', 'bpp': 'BPP_1'}, 'inner_color': 'WHITE', 'border_color': 'DARK_GRAY', 'foreground_color': 'LIGHT_GRAY', 'radius': 'RADIUS_24_PIXELS', 'font_id': 'BAGL_FONT_HM_ALPHA_MONO_MEDIUM_32px', 'localized': True, 'text': 'Test button'}}}
+```
+
+Deserialize json-like dict into an Nbgl event:
+
+```python
+>>> from nbgl_lib import deserialize_nbgl_json
+>>> deserialize_nbgl_json({'event': 'NBGL_DRAW_OBJ', 'obj': {'type': 'BUTTON', 'content': {'area': {'width': 255, 'height': 50, 'x0': 500, 'y0': 1000, 'background_color': 'DARK_GRAY', 'bpp': 'BPP_1'}, 'inner_color': 'WHITE', 'border_color': 'DARK_GRAY', 'foreground_color': 'LIGHT_GRAY', 'radius': 'RADIUS_24_PIXELS', 'font_id': 'BAGL_FONT_HM_ALPHA_MONO_MEDIUM_32px', 'localized': True, 'text': 'Test button'}}})
+NbglDrawObjectEvent(obj=NbglButton(area=NbglArea(width=255, height=50, x0=500, y0=1000, background_color=, bpp=), inner_color=, border_color=, foreground_color=, radius=, font_id=, localized=True, text='Test button'))
+```
+### Tests
+
+- ```generate_data_test.c``` generates reference data for deserialization testing.
+- ```test_bytes_deserialize.py``` deserializes the reference data and inspect the result.
+- ```test_json_ser_deser.py``` tests json serialization and deserialization.
+
+To generate reference data and run tests:
+
+```
+make run_test
+```
diff --git a/sdk_lib_nbgl/serialization/generate_data_test.c b/sdk_lib_nbgl/serialization/generate_data_test.c
new file mode 100644
index 00000000..ae6a9b7a
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/generate_data_test.c
@@ -0,0 +1,377 @@
+#ifdef NBGL_GENERATE_DATA_TEST
+
+#include
+#include "nbgl_types.h"
+#include "nbgl_serialize.h"
+#include "nbgl_obj.h"
+#include "nbgl_screen.h"
+
+static uint8_t const C_leftArrow32px_bitmap[] = {
+ 0x20, 0x00, 0x20, 0x00, 0x02, 0x4d, 0x00, 0x00, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3,
+ 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0,
+ 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0xe3, 0xf0, 0x32, 0x93, 0x92,
+ 0x64, 0x83, 0x84, 0x64, 0x73, 0x74, 0x84, 0x63, 0x64, 0xa4, 0x53, 0x54, 0xc4, 0x43, 0x44,
+ 0xe4, 0x33, 0x34, 0xf0, 0x14, 0x23, 0x24, 0xf0, 0x34, 0x13, 0x14, 0xf0, 0x5b, 0xf0, 0x79,
+ 0xf0, 0x97, 0xf0, 0xb5, 0xf0, 0xd3, 0xf0, 0xf1, 0xf0, 0x10,
+};
+const nbgl_icon_details_t C_leftArrow32px = {32, 32, NBGL_BPP_1, true, C_leftArrow32px_bitmap};
+
+uint8_t nbgl_objPoolGetId(nbgl_obj_t *obj)
+{
+ return 0;
+}
+
+void print_hex(const char *name, uint8_t *buffer, size_t len)
+{
+ printf("%s,", name);
+ for (size_t i = 0; i < len; i++) {
+ printf("%02x", buffer[i]);
+ }
+ printf("\n");
+}
+
+void run_serialize_and_print(const char *name, nbgl_serialized_event_type_e event, nbgl_obj_t *obj)
+{
+ uint8_t buf[192];
+ size_t len = 0;
+ nbgl_serializeNbglEvent(event, obj, buf, &len, sizeof(buf));
+ print_hex(name, buf, len);
+}
+
+#define SERIALIZE_AND_PRINT(obj, event) \
+ run_serialize_and_print(__FUNCTION__, event, (nbgl_obj_t *) obj)
+
+void test_draw_nbgl_screen()
+{
+ nbgl_screen_t screen = {
+ .container.obj.type = SCREEN,
+
+ .container.obj.area.backgroundColor = WHITE,
+ .container.obj.area.bpp = NBGL_BPP_4,
+ .container.obj.area.height = 670,
+ .container.obj.area.width = 400,
+ .container.obj.area.x0 = 0,
+ .container.obj.area.y0 = 0,
+ };
+
+ SERIALIZE_AND_PRINT(&screen, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_container()
+{
+ nbgl_container_t container = {.obj.type = CONTAINER,
+
+ .obj.area.backgroundColor = DARK_GRAY,
+ .obj.area.bpp = NBGL_BPP_4,
+ .obj.area.height = 450,
+ .obj.area.width = 460,
+ .obj.area.x0 = 56,
+ .obj.area.y0 = 12,
+
+ .layout = VERTICAL,
+ .nbChildren = 4,
+ .forceClean = true};
+
+ SERIALIZE_AND_PRINT(&container, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_text_area()
+{
+ nbgl_text_area_t text = {.obj.type = TEXT_AREA,
+
+ .obj.area.backgroundColor = DARK_GRAY,
+ .obj.area.bpp = NBGL_BPP_4,
+ .obj.area.height = 400,
+ .obj.area.width = 360,
+ .obj.area.x0 = 12,
+ .obj.area.y0 = 256,
+
+ .textColor = BLACK,
+ .textAlignment = BOTTOM_RIGHT,
+ .style = NO_STYLE,
+ .fontId = BAGL_FONT_INTER_MEDIUM_32px,
+ .localized = false,
+ .autoHideLongLine = true,
+ .text = "arthur"};
+
+ SERIALIZE_AND_PRINT(&text, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_line()
+{
+ nbgl_line_t line = {.obj.type = LINE,
+ .obj.area.backgroundColor = WHITE,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 267,
+ .obj.area.width = 36,
+ .obj.area.x0 = 0,
+ .obj.area.y0 = 42,
+ .direction = HORIZONTAL,
+ .lineColor = DARK_GRAY,
+ .thickness = 4,
+ .offset = 2};
+
+ SERIALIZE_AND_PRINT(&line, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_qr_code()
+{
+ nbgl_qrcode_t qr_code = {.obj.type = QR_CODE,
+
+ .obj.area.backgroundColor = DARK_GRAY,
+ .obj.area.bpp = NBGL_BPP_2,
+ .obj.area.height = 55,
+ .obj.area.width = 66,
+ .obj.area.x0 = 400,
+ .obj.area.y0 = 300,
+
+ .foregroundColor = DARK_GRAY,
+ .text = "fatstacks",
+ .version = QRCODE_V10};
+
+ SERIALIZE_AND_PRINT(&qr_code, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_radio()
+{
+ nbgl_radio_t radio = {.obj.type = RADIO_BUTTON,
+
+ .obj.area.backgroundColor = BLACK,
+ .obj.area.bpp = NBGL_BPP_4,
+ .obj.area.height = 100,
+ .obj.area.width = 200,
+ .obj.area.x0 = 123,
+ .obj.area.y0 = 234,
+
+ .activeColor = BLACK,
+ .borderColor = DARK_GRAY,
+ .state = ON_STATE};
+
+ SERIALIZE_AND_PRINT(&radio, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_switch()
+{
+ nbgl_switch_t switch_obj = {.obj.type = SWITCH,
+
+ .obj.area.backgroundColor = LIGHT_GRAY,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 333,
+ .obj.area.width = 89,
+ .obj.area.x0 = 1,
+ .obj.area.y0 = 10000,
+
+ .offColor = WHITE,
+ .onColor = BLACK,
+ .state = OFF_STATE};
+
+ SERIALIZE_AND_PRINT(&switch_obj, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_progress_bar()
+{
+ nbgl_progress_bar_t progress_bar = {.obj.type = PROGRESS_BAR,
+
+ .obj.area.backgroundColor = BLACK,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 10000,
+ .obj.area.width = 11000,
+ .obj.area.x0 = 12000,
+ .obj.area.y0 = 13000,
+
+ .withBorder = true,
+ .state = 91};
+
+ SERIALIZE_AND_PRINT(&progress_bar, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_page_indicator()
+{
+ nbgl_page_indicator_t page_indicator = {.obj.type = PAGE_INDICATOR,
+
+ .obj.area.backgroundColor = BLACK,
+ .obj.area.bpp = NBGL_BPP_2,
+ .obj.area.height = 11,
+ .obj.area.width = 22,
+ .obj.area.x0 = 33,
+ .obj.area.y0 = 44,
+
+ .activePage = 2,
+ .nbPages = 10};
+
+ SERIALIZE_AND_PRINT(&page_indicator, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_button()
+{
+ nbgl_button_t button = {
+ .obj.type = BUTTON,
+
+ .obj.area.backgroundColor = DARK_GRAY,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 50,
+ .obj.area.width = 255,
+ .obj.area.x0 = 500,
+ .obj.area.y0 = 1000,
+
+ .innerColor = WHITE,
+ .borderColor = DARK_GRAY,
+ .foregroundColor = LIGHT_GRAY,
+ .radius = RADIUS_24_PIXELS,
+ .fontId = BAGL_FONT_INTER_MEDIUM_32px,
+ .localized = true,
+ .text = "Test button",
+ };
+
+ SERIALIZE_AND_PRINT(&button, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_image()
+{
+ nbgl_image_t image = {.obj.type = IMAGE,
+
+ .obj.area.backgroundColor = WHITE,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 32,
+ .obj.area.width = 32,
+ .obj.area.x0 = 124,
+ .obj.area.y0 = 235,
+
+ .foregroundColor = DARK_GRAY,
+ .buffer = &C_leftArrow32px};
+
+ SERIALIZE_AND_PRINT(&image, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_keyboard()
+{
+ nbgl_keyboard_t keyboard = {
+ .obj.type = KEYBOARD,
+
+ .obj.area.backgroundColor = LIGHT_GRAY,
+ .obj.area.bpp = NBGL_BPP_2,
+ .obj.area.height = 210,
+ .obj.area.width = 225,
+ .obj.area.x0 = 332,
+ .obj.area.y0 = 431,
+
+ .textColor = WHITE,
+ .borderColor = BLACK,
+ .lettersOnly = true,
+#ifdef HAVE_SE_TOUCH
+ .casing = 0,
+ .mode = MODE_DIGITS,
+#else // HAVE_SE_TOUCH
+ .mode = MODE_UPPER_LETTERS,
+#endif // HAVE_SE_TOUCH
+ .keyMask = 0x12345678,
+ };
+
+ SERIALIZE_AND_PRINT(&keyboard, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_keypad()
+{
+ nbgl_keypad_t keypad = {.obj.type = KEYPAD,
+
+ .obj.area.backgroundColor = WHITE,
+ .obj.area.bpp = NBGL_BPP_4,
+ .obj.area.height = 4,
+ .obj.area.width = 4,
+ .obj.area.x0 = 3,
+ .obj.area.y0 = 4,
+
+#ifdef HAVE_SE_TOUCH
+ .textColor = WHITE,
+ .borderColor = BLACK,
+#endif // HAVE_SE_TOUCH
+ .enableBackspace = true,
+ .enableValidate = false,
+#ifdef HAVE_SE_TOUCH
+ .enableDigits = true,
+#endif // HAVE_SE_TOUCH
+ .shuffled = false};
+
+ SERIALIZE_AND_PRINT(&keypad, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_spinner()
+{
+ nbgl_spinner_t spinner = {.obj.type = SPINNER,
+
+ .obj.area.backgroundColor = LIGHT_GRAY,
+ .obj.area.bpp = NBGL_BPP_1,
+ .obj.area.height = 14,
+ .obj.area.width = 25,
+ .obj.area.x0 = 12,
+ .obj.area.y0 = 10,
+
+ .position = 2};
+
+ SERIALIZE_AND_PRINT(&spinner, NBGL_DRAW_OBJ);
+}
+
+void test_draw_nbgl_image_file()
+{
+ nbgl_image_file_t image_file = {
+ .obj.type = IMAGE_FILE,
+
+ .obj.area.backgroundColor = DARK_GRAY,
+ .obj.area.bpp = NBGL_BPP_4,
+ .obj.area.height = 24,
+ .obj.area.width = 35,
+ .obj.area.x0 = 22,
+ .obj.area.y0 = 20,
+ };
+
+ SERIALIZE_AND_PRINT(&image_file, NBGL_DRAW_OBJ);
+}
+
+void test_refresh_area()
+{
+ nbgl_area_t area = {
+ .backgroundColor = WHITE,
+ .bpp = NBGL_BPP_4,
+ .height = 4,
+ .width = 4,
+ .x0 = 3,
+ .y0 = 4,
+ };
+
+ SERIALIZE_AND_PRINT(&area, NBGL_REFRESH_AREA);
+}
+
+int main()
+{
+#ifdef HAVE_SE_TOUCH
+ printf("stax\n");
+#else // HAVE_SE_TOUCH
+ printf("nano\n");
+#endif // HAVE_SE_TOUCH
+ test_draw_nbgl_screen();
+ test_draw_nbgl_container();
+#ifdef HAVE_SE_TOUCH
+ test_draw_nbgl_line();
+#endif // HAVE_SE_TOUCH
+ test_draw_nbgl_text_area();
+#ifdef HAVE_SE_TOUCH
+ test_draw_nbgl_qr_code();
+ test_draw_nbgl_radio();
+ test_draw_nbgl_switch();
+#endif // HAVE_SE_TOUCH
+ test_draw_nbgl_progress_bar();
+#ifdef HAVE_SE_TOUCH
+ test_draw_nbgl_page_indicator();
+ test_draw_nbgl_button();
+#endif // HAVE_SE_TOUCH
+ test_draw_nbgl_image();
+ test_draw_nbgl_keyboard();
+ test_draw_nbgl_keypad();
+#ifdef HAVE_SE_TOUCH
+ test_draw_nbgl_spinner();
+#endif // HAVE_SE_TOUCH
+ test_draw_nbgl_image_file();
+ test_refresh_area();
+}
+
+#endif
diff --git a/sdk_lib_nbgl/serialization/nbgl_lib.py b/sdk_lib_nbgl/serialization/nbgl_lib.py
new file mode 100644
index 00000000..ab10d941
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/nbgl_lib.py
@@ -0,0 +1,695 @@
+from dataclasses import dataclass
+from enum import IntEnum, Enum
+from typing import Tuple, Dict, Union
+from abc import ABC, abstractclassmethod
+import struct
+
+# Common types
+
+
+class NbglColor(IntEnum):
+ BLACK = 0,
+ DARK_GRAY = 1,
+ LIGHT_GRAY = 2,
+ WHITE = 3
+
+
+class NbglBpp(IntEnum):
+ BPP_1 = 0,
+ BPP_2 = 1
+ BPP_4 = 2
+
+
+class NbglDirection(IntEnum):
+ VERTICAL = 0,
+ HORIZONTAL = 1
+
+
+class NbglState(IntEnum):
+ OFF_STATE = 0,
+ ON_STATE = 1
+
+
+class NbglQrCodeVersion(IntEnum):
+ QRCODE_V4 = 0,
+ QRCODE_V10 = 1
+
+
+class NbglRadius(IntEnum):
+ RADIUS_4_PIXELS = 0,
+ RADIUS_8_PIXELS = 1,
+ RADIUS_16_PIXELS = 2,
+ RADIUS_20_PIXELS = 3,
+ RADIUS_24_PIXELS = 4,
+ RADIUS_32_PIXELS = 5,
+ RADIUS_40_PIXELS = 6,
+ RADIUS_48_PIXELS = 7,
+ RADIUS_0_PIXELS = 0xFF,
+
+
+class NbglKeyboardMode(IntEnum):
+ MODE_LETTERS = 0,
+ MODE_DIGITS = 1,
+ MODE_SPECIAL = 2,
+ MODE_NONE = 3
+
+
+class NbglObjType(IntEnum):
+ SCREEN, = 0, # Main screen
+ CONTAINER, = 1, # Empty container
+ IMAGE, = 2, # Bitmap (x and width must be multiple of 4)
+ LINE, = 3, # Vertical or Horizontal line
+ TEXT_AREA, = 4, # Area to contain text line(s)
+ BUTTON, = 5, # Rounded rectangle button with icon and/or text
+ SWITCH, = 6, # Switch to turn on/off something
+ PAGE_INDICATOR, = 7, # horizontal bar to indicate navigation across pages
+
+ PROGRESS_BAR, = 8, # horizontal bar to indicate progression of something (between 0% and 100%)
+ RADIO_BUTTON, = 9, # Indicator to inform whether something is on or off
+ QR_CODE, = 10, # QR Code
+ KEYBOARD, = 11, # Keyboard
+ KEYPAD, = 12, # Keypad
+ SPINNER, = 13, # Spinner
+ IMAGE_FILE = 14, # Image file (with Ledger compression)
+
+
+class NbglAlignment(IntEnum):
+ NO_ALIGNMENT = 0,
+ TOP_LEFT = 1,
+ TOP_MIDDLE = 2,
+ TOP_RIGHT = 3,
+ MID_LEFT = 4,
+ CENTER = 5,
+ MID_RIGHT = 6,
+ BOTTOM_LEFT = 7,
+ BOTTOM_MIDDLE = 8,
+ BOTTOM_RIGHT = 9,
+ LEFT_TOP = 10,
+ LEFT_BOTTOM = 11,
+ RIGHT_TOP = 12,
+ RIGHT_BOTTOM = 13,
+
+
+class NbglFontId(IntEnum):
+ BAGL_FONT_INTER_REGULAR_24px = 0
+ BAGL_FONT_INTER_SEMIBOLD_24px = 1
+ BAGL_FONT_INTER_MEDIUM_32px = 2
+ BAGL_FONT_INTER_REGULAR_24px_1bpp = 3
+ BAGL_FONT_INTER_SEMIBOLD_24px_1bpp = 4
+ BAGL_FONT_INTER_MEDIUM_32px_1bpp = 5
+ BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp = 8
+ BAGL_FONT_OPEN_SANS_LIGHT_16px_1bpp = 9
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp = 10
+ BAGL_FONT_INTER_REGULAR_28px = 11
+ BAGL_FONT_INTER_SEMIBOLD_28px = 12
+ BAGL_FONT_INTER_MEDIUM_36px = 13
+ BAGL_FONT_INTER_REGULAR_28px_1bpp = 14
+ BAGL_FONT_INTER_SEMIBOLD_28px_1bpp = 15
+ BAGL_FONT_INTER_MEDIUM_36px_1bpp = 16
+
+
+class NbglStyle(IntEnum):
+ NO_STYLE = 0,
+ INVERTED_COLORS = 1
+
+
+def parse_str(data: bytes) -> str:
+ """
+ Utility function to parse a NULL terminated string
+ from input bytes. If the string is not terminated by NULL,
+ take the truncated string instead.
+
+ Returns the string
+ """
+ size = 0
+ for b in data:
+ size += 1
+ if b == 0:
+ break
+
+ if size > 0:
+ return data[:size-1].decode()
+
+ return ""
+
+
+class NbglGenericJsonSerializable(ABC):
+ """
+ Base type for all NBGL objects.
+ Implements generic json dict serialization / deserialization functions.
+ """
+
+ def to_json_dict(self) -> Dict:
+ """
+ Returns the json dict version of the object.
+ """
+ result = {}
+ for name, val in self.__dict__.items():
+ if issubclass(type(val), NbglObj):
+ result[name] = val.to_json_dict()
+ elif issubclass(type(val), Enum):
+ result[name] = val.name
+ else:
+ result[name] = val
+ return result
+
+ @classmethod
+ def from_json_dict(cls, data: Dict):
+ """
+ Get an instance of the class, from its json dict version.
+ """
+ fields = {}
+ for field_name, field_obj in cls.__dataclass_fields__.items():
+ field_type = field_obj.type
+ if issubclass(field_type, Enum):
+ fields[field_name] = field_type[data[field_name]]
+ elif issubclass(field_type, NbglObj):
+ fields[field_name] = NbglArea.from_json_dict(data[field_name])
+ else:
+ fields[field_name] = data[field_name]
+ return cls(**fields)
+
+ @abstractclassmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ """
+ Get an instance of the class, from raw bytes.
+ """
+ pass
+
+
+class NbglObj(NbglGenericJsonSerializable):
+ pass
+
+# Nbgl objects
+
+
+@dataclass
+class NbglArea(NbglObj):
+ width: int
+ height: int
+ x0: int
+ y0: int
+ background_color: NbglColor
+ bpp: NbglBpp
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ x0, y0, width, height, color_n, bpp_n = struct.unpack('>HHHHBB', data[:10])
+ color = NbglColor(color_n)
+ bpp = NbglBpp(bpp_n)
+ return cls(width, height, x0, y0, color, bpp)
+
+ @staticmethod
+ def size():
+ return struct.calcsize('>HHHHBB')
+
+
+@dataclass
+class NbglScreen(NbglObj):
+ area: NbglArea
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ return cls(
+ area=area
+ )
+
+
+@dataclass
+class NbglContainer(NbglObj):
+ area: NbglArea
+ layout: NbglDirection
+ nb_children: int
+ force_clean: bool
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ layout, nb_children, force_clean = struct.unpack(
+ '>BB?', data[NbglArea.size():])
+ return cls(
+ area=area,
+ layout=NbglDirection(layout),
+ nb_children=nb_children,
+ force_clean=force_clean
+ )
+
+
+@dataclass
+class NbglLine(NbglObj):
+ area: NbglArea
+ direction: NbglDirection
+ line_color: NbglColor
+ thickness: int
+ offset: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ direction, line_color, thickness, offset = struct.unpack(
+ '>BBBB', data[NbglArea.size():])
+ return cls(
+ area=area,
+ direction=NbglDirection(direction),
+ line_color=NbglColor(line_color),
+ thickness=thickness,
+ offset=offset)
+
+
+@dataclass
+class NbglRadioButton(NbglObj):
+ area: NbglArea
+ active_color: NbglColor
+ border_color: NbglColor
+ state: NbglState
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ active_color, border_color, state = struct.unpack(
+ '>BBB', data[NbglArea.size():])
+ return cls(
+ area=area,
+ active_color=NbglColor(active_color),
+ border_color=NbglColor(border_color),
+ state=NbglState(state)
+ )
+
+
+@dataclass
+class NbglSwitch(NbglObj):
+ area: NbglArea
+ on_color: NbglColor
+ off_color: NbglColor
+ state: NbglState
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ on_color, off_color, state = struct.unpack(
+ '>BBB', data[NbglArea.size():])
+ return cls(
+ area=area,
+ on_color=NbglColor(on_color),
+ off_color=NbglColor(off_color),
+ state=NbglState(state)
+ )
+
+
+@dataclass
+class NbglProgressBar(NbglObj):
+ area: NbglArea
+ with_border: bool
+ state: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ with_border, state = struct.unpack(
+ '>?B', data[NbglArea.size():])
+ return cls(
+ area=area,
+ with_border=with_border,
+ state=state
+ )
+
+
+@dataclass
+class NbglPageIndicator(NbglObj):
+ area: NbglArea
+ active_page: int
+ nb_pages: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ active_page, nb_pages = \
+ struct.unpack('>BB', data[NbglArea.size():])
+ return cls(
+ area=area,
+ active_page=active_page,
+ nb_pages=nb_pages
+ )
+
+
+@dataclass
+class NbglButton(NbglObj):
+ area: NbglArea
+ inner_color: NbglColor
+ border_color: NbglColor
+ foreground_color: NbglColor
+ radius: NbglRadius
+ font_id: NbglFontId
+ localized: bool
+ text: str
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+ cnt = NbglArea.size()
+ area = NbglArea.from_bytes(is_stax, data[0:cnt])
+ params_template = '>BBBBB?'
+ params_size = struct.calcsize(params_template)
+ inner_color, border_color, \
+ foreground_color, \
+ radius, font_id, localized = struct.unpack(
+ params_template, data[cnt:cnt+params_size])
+
+ cnt += params_size
+ text = parse_str(data[cnt:])
+
+ return cls(
+ area=area,
+ inner_color=NbglColor(inner_color),
+ border_color=NbglColor(border_color),
+ foreground_color=NbglColor(foreground_color),
+ radius=NbglRadius(radius),
+ font_id=NbglFontId(font_id),
+ localized=localized,
+ text=text)
+
+
+@dataclass
+class NbglTextArea(NbglObj):
+ area: NbglArea
+ text_color: NbglColor
+ text_alignment: NbglAlignment
+ style: NbglStyle
+ font_id: NbglFontId
+ localized: bool
+ auto_hide_long_line: bool
+ len: int
+ text: str
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ # Parse area
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ cnt = NbglArea.size()
+
+ # Parse pattern
+ params_pattern = '>BBBB??H'
+ params_size = struct.calcsize(params_pattern)
+ text_color, alignment, style, font_id, localized, auto_hide_long_line, len = struct.unpack(
+ params_pattern, data[cnt:cnt+params_size]
+ )
+ cnt += params_size
+
+ # Parse text
+ text = parse_str(data[cnt:])
+ return cls(
+ area=area,
+ text_color=NbglColor(text_color),
+ text_alignment=NbglAlignment(alignment),
+ style=NbglStyle(style),
+ font_id=NbglFontId(font_id),
+ localized=localized,
+ auto_hide_long_line=auto_hide_long_line,
+ len=len,
+ text=text
+ )
+
+
+@dataclass
+class NbglSpinner(NbglObj):
+ area: NbglArea
+ position: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ position, = struct.unpack(
+ '>B', data[NbglArea.size():]
+ )
+ return cls(
+ area=area,
+ position=position
+ )
+
+
+@dataclass
+class NbglImage(NbglObj):
+ area: NbglArea
+ width: int
+ height: int
+ bpp: int
+ isFile: int
+ foreground_color: NbglColor
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data):
+
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+
+ width,height,bpp,isFile,size, = struct.unpack('>HHBBI', data[NbglArea.size():NbglArea.size()+10])
+ foreground_color, = struct.unpack('>B', data[NbglArea.size()+10:])
+ return cls(
+ area=area,
+ width=width,
+ height=height,
+ bpp=bpp,
+ isFile=isFile,
+ foreground_color=NbglColor(foreground_color)
+ )
+
+
+@dataclass
+class NbglImageFile(NbglObj):
+ area: NbglArea
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:])
+ return cls(area)
+
+
+@dataclass
+class NbglQrCode(NbglObj):
+ area: NbglArea
+ foreground_color: NbglColor
+ version: NbglQrCodeVersion
+ text: str
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ # Parse area
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ cnt = NbglArea.size()
+
+ # Parse QR code color and version
+ foreground_color, version = struct.unpack('>BB', data[cnt: cnt + 2])
+ cnt += 2
+
+ # Parse text
+ text = parse_str(data[cnt:])
+
+ # Return
+ return cls(
+ area=area,
+ foreground_color=NbglColor(foreground_color),
+ version=NbglQrCodeVersion(version),
+ text=text)
+
+
+@dataclass
+class NbglKeyboard(NbglObj):
+ area: NbglArea
+ text_color: NbglColor
+ border_color: NbglColor
+ letters_only: bool
+ upper_case: bool
+ mode: NbglKeyboardMode
+ key_mask: int
+ selected_char_index: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ if is_stax:
+ selected_char_index = 0
+ text_color, border_color, letters_only, upper_case, mode, key_mask = struct.unpack(
+ '>BBBBBI', data[NbglArea.size():])
+ else:
+ upper_case = False
+ text_color, border_color, letters_only, selected_char_index, mode, key_mask = struct.unpack(
+ '>BBBBBI', data[NbglArea.size():])
+
+ return cls(
+ area=area,
+ text_color=NbglColor(text_color),
+ border_color=NbglColor(border_color),
+ letters_only=letters_only,
+ upper_case=upper_case,
+ mode=NbglKeyboardMode(mode),
+ key_mask=key_mask,
+ selected_char_index=selected_char_index
+ )
+
+
+@dataclass
+class NbglKeypad(NbglObj):
+ area: NbglArea
+ text_color: NbglColor
+ border_color: NbglColor
+ enable_backspace: bool
+ enable_validate: bool
+ enable_digits: bool
+ shuffled:bool
+ selectedKey: int
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ area = NbglArea.from_bytes(is_stax, data[0:NbglArea.size()])
+ if is_stax:
+ text_color, border_color, enable_backspace, enable_validate, enable_digits, shuffled = \
+ struct.unpack('>BBBBBB', data[NbglArea.size():NbglArea.size()+6])
+ selectedKey = 0 # unused on Stax
+ else:
+ text_color = NbglColor.WHITE
+ border_color = NbglColor.BLACK
+ enable_digits = True
+ enable_backspace, enable_validate, shuffled, selectedKey = \
+ struct.unpack('>BBBB', data[NbglArea.size():NbglArea.size()+4])
+ return cls(
+ area=area,
+ text_color=NbglColor(text_color),
+ border_color=NbglColor(border_color),
+ enable_backspace=enable_backspace,
+ enable_validate=enable_validate,
+ enable_digits=enable_digits,
+ shuffled=shuffled,
+ selectedKey=selectedKey
+ )
+
+
+# Mapping of NbglObjType and their associated class.
+NBGL_OBJ_TYPES = {
+ NbglObjType.SCREEN: NbglScreen,
+ NbglObjType.CONTAINER: NbglContainer,
+ NbglObjType.LINE: NbglLine,
+ NbglObjType.IMAGE: NbglImage,
+ NbglObjType.IMAGE_FILE: NbglImageFile,
+ NbglObjType.QR_CODE: NbglQrCode,
+ NbglObjType.RADIO_BUTTON: NbglRadioButton,
+ NbglObjType.TEXT_AREA: NbglTextArea,
+ NbglObjType.BUTTON: NbglButton,
+ NbglObjType.SWITCH: NbglSwitch,
+ NbglObjType.PAGE_INDICATOR: NbglPageIndicator,
+ NbglObjType.PROGRESS_BAR: NbglProgressBar,
+ NbglObjType.KEYBOARD: NbglKeyboard,
+ NbglObjType.KEYPAD: NbglKeypad,
+ NbglObjType.SPINNER: NbglSpinner,
+}
+
+# Nbgl events
+
+
+class NbglEventType(IntEnum):
+ """
+ Available serialized Nbgl events
+ """
+ NBGL_DRAW_OBJ = 0,
+ NBGL_REFRESH_AREA = 1
+
+
+@dataclass
+class NbglRefreshAreaEvent(NbglGenericJsonSerializable):
+ area: NbglArea
+
+ @classmethod
+ def from_bytes(cls, is_stax : bool, data: bytes):
+ return cls(
+ area=NbglArea.from_bytes(is_stax, data)
+ )
+
+
+@dataclass
+class NbglDrawObjectEvent(NbglGenericJsonSerializable):
+ obj: NbglObj
+ id: int
+
+ @classmethod
+ def from_bytes(cls, is_stax: bool, data: bytes):
+ # the first byte is the object id
+ # the second one is the object type
+ id = int(data[0])
+ obj_type = NbglObjType(data[1])
+ class_type = NBGL_OBJ_TYPES[obj_type]
+
+ return cls(
+ obj=class_type.from_bytes(is_stax, data[2:]),
+ id=id
+ )
+
+ def to_json_dict(self) -> Dict:
+ for obj_type, obj_class in NBGL_OBJ_TYPES.items():
+ if obj_class == type(self.obj):
+ return {
+ 'obj': {
+ 'type': obj_type.name,
+ 'content': self.obj.to_json_dict()
+ },
+ 'id': self.id
+ }
+ # Object not serializable
+ return None
+
+ @classmethod
+ def from_json_dict(cls, data: Dict):
+ obj_id = data['id']
+ obj_data = data['obj']
+ obj_type = NBGL_OBJ_TYPES[NbglObjType[obj_data['type']]]
+
+ return cls(
+ obj=obj_type.from_json_dict(obj_data['content']),
+ id=obj_id
+ )
+
+# Public functions
+
+
+NbglEvent = Union[
+ NbglRefreshAreaEvent,
+ NbglDrawObjectEvent
+]
+
+
+def deserialize_nbgl_bytes(is_stax: bool, data: bytes) -> NbglEvent:
+ """
+ Return a NbglRefreshAreaEvent or a NbglDrawObjectEvent,
+ from input bytes.
+ """
+ event_type = NbglEventType(int(data[0]))
+
+ if event_type == NbglEventType.NBGL_DRAW_OBJ:
+ return NbglDrawObjectEvent.from_bytes(is_stax, data[1:])
+ elif event_type == NbglEventType.NBGL_REFRESH_AREA:
+ return NbglRefreshAreaEvent.from_bytes(is_stax, data[1:])
+
+
+def deserialize_nbgl_json(data: Dict) -> NbglEvent:
+ """
+ Return a NbglRefreshAreaEvent or a NbglDrawObjectEvent,
+ from input json-like dictionary.
+ """
+ event_type = NbglEventType[data['event']]
+
+ if event_type == NbglEventType.NBGL_DRAW_OBJ:
+ return NbglDrawObjectEvent.from_json_dict(data)
+ elif event_type == NbglEventType.NBGL_REFRESH_AREA:
+ return NbglRefreshAreaEvent.from_json_dict(data)
+
+
+def serialize_nbgl_json(data: NbglEvent) -> Dict:
+ """
+ Return a json-like dictionary from
+ input NbglRefreshAreaEvent / NbglDrawObjectEvent
+ """
+ EVENT_TYPES = {
+ NbglRefreshAreaEvent: NbglEventType.NBGL_REFRESH_AREA,
+ NbglDrawObjectEvent: NbglEventType.NBGL_DRAW_OBJ
+ }
+
+ result = {'event': EVENT_TYPES[type(data)].name}
+ result.update(data.to_json_dict())
+ return result
diff --git a/sdk_lib_nbgl/serialization/test_bytes_deserialize.py b/sdk_lib_nbgl/serialization/test_bytes_deserialize.py
new file mode 100644
index 00000000..ec906570
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/test_bytes_deserialize.py
@@ -0,0 +1,426 @@
+from nbgl_lib import *
+import pytest
+
+
+@pytest.fixture
+def data_test():
+ with open("data_test.txt", "r") as data_test_file:
+ data_test = data_test_file.readlines()
+ # first line is giving the HW: stax or nano
+ if data_test[0] == 'stax\n':
+ is_stax = True
+ else:
+ is_stax = False
+ data_test = list(map(lambda s: s.rstrip().split(','), data_test[1:]))
+ data_test = {el[0]: el[1] for el in data_test}
+ return (is_stax,data_test)
+
+
+def run_deserialize_nbgl(is_stax: bool, hex_str: str):
+ bytes_in = bytes.fromhex(hex_str)
+ return deserialize_nbgl_bytes(is_stax, bytes_in)
+
+
+def test_draw_nbgl_screen(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_screen"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglScreen(
+ area=NbglArea(
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_4,
+ height=670,
+ width=400,
+ x0=0,
+ y0=0
+ )
+ ),
+ id=0
+ )
+
+ assert deserialized == expected
+
+
+def test_draw_nbgl_container(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_container"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglContainer(
+ area=NbglArea(
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_4,
+ height=450,
+ width=460,
+ x0=56,
+ y0=12
+ ),
+ layout=NbglDirection.VERTICAL,
+ nb_children=4,
+ force_clean=True
+ ),
+ id=1
+ )
+
+ assert deserialized == expected
+
+
+def test_draw_nbgl_text_area(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_text_area"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ excepted = \
+ NbglDrawObjectEvent(
+ obj=NbglTextArea(
+ area=NbglArea(
+ bpp=NbglBpp.BPP_4,
+ width=360,
+ height=400,
+ x0=12,
+ y0=256,
+ background_color=NbglColor.DARK_GRAY,
+ ),
+
+ text_color=NbglColor.BLACK,
+ text_alignment=NbglAlignment.BOTTOM_RIGHT,
+ style=NbglStyle.NO_STYLE,
+ font_id=NbglFontId.BAGL_FONT_INTER_MEDIUM_32px,
+ localized=False,
+ auto_hide_long_line=True,
+ len=0,
+ text="arthur"
+ ),
+ id=1
+ )
+ assert deserialized == excepted
+
+
+def test_draw_nbgl_line(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_line"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglLine(
+ area=NbglArea(
+ bpp=NbglBpp.BPP_1,
+ width=36,
+ height=267,
+ x0=0,
+ y0=42,
+ background_color=NbglColor.WHITE,
+ ),
+ direction=NbglDirection.HORIZONTAL,
+ line_color=NbglColor.DARK_GRAY,
+ thickness=4,
+ offset=2
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_qr_code(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_qr_code"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglQrCode(
+ area=NbglArea(
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_2,
+ height=55,
+ width=66,
+ x0=400,
+ y0=300
+ ),
+ foreground_color=NbglColor.DARK_GRAY,
+ text="fatstacks",
+ version=NbglQrCodeVersion.QRCODE_V10
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_radio(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_radio"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglRadioButton(
+ area=NbglArea(
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_4,
+ height=100,
+ width=200,
+ x0=123,
+ y0=234
+ ),
+ active_color=NbglColor.BLACK,
+ border_color=NbglColor.DARK_GRAY,
+ state=NbglState.ON_STATE
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_switch(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_switch"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglSwitch(
+ area=NbglArea(
+ background_color=NbglColor.LIGHT_GRAY,
+ bpp=NbglBpp.BPP_1,
+ height=333,
+ width=89,
+ x0=1,
+ y0=10000
+ ),
+ off_color=NbglColor.WHITE,
+ on_color=NbglColor.BLACK,
+ state=NbglState.OFF_STATE
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_progress_bar(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_progress_bar"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglProgressBar(
+ area=NbglArea(
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_1,
+ height=10000,
+ width=11000,
+ x0=12000,
+ y0=13000,
+ ),
+ with_border=True,
+ state=91
+ ),
+ id=1
+ )
+ assert deserialized == expected
+
+
+def test_draw_nbgl_page_indicator(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_page_indicator"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglPageIndicator(
+ area=NbglArea(
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2,
+ height=11,
+ width=22,
+ x0=33,
+ y0=44
+ ),
+ active_page=2,
+ nb_pages=10
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_button(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_button"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglButton(
+ area=NbglArea(
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_1,
+ height=50,
+ width=255,
+ x0=500,
+ y0=1000
+ ),
+ inner_color=NbglColor.WHITE,
+ border_color=NbglColor.DARK_GRAY,
+ foreground_color=NbglColor.LIGHT_GRAY,
+ radius=NbglRadius.RADIUS_24_PIXELS,
+ font_id=NbglFontId.BAGL_FONT_INTER_MEDIUM_32px,
+ text="Test button",
+ localized=True
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_image(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_image"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglImage(
+ area=NbglArea(
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_1,
+ height=32,
+ width=32,
+ x0=124,
+ y0=235
+ ),
+ height=32,
+ width=32,
+ bpp=0,
+ isFile=1,
+ foreground_color=NbglColor.DARK_GRAY
+ ),
+ id=1
+ )
+ assert deserialized == expected
+
+
+def test_draw_nbgl_keyboard(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_keyboard"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglKeyboard(
+ area=NbglArea(
+ width=225,
+ height=210,
+ x0=332,
+ y0=431,
+ background_color=NbglColor.LIGHT_GRAY,
+ bpp=NbglBpp.BPP_2
+ ),
+ text_color=NbglColor.WHITE,
+ border_color=NbglColor.BLACK,
+ letters_only=True,
+ upper_case=False,
+ mode=NbglKeyboardMode.MODE_DIGITS,
+ key_mask=0x12345678,
+ selected_char_index=0
+ ),
+ id=1
+ )
+ assert deserialized == expected
+
+
+def test_draw_nbgl_keypad(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_keypad"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglKeypad(
+ area=NbglArea(
+ width=4,
+ height=4,
+ x0=3,
+ y0=4,
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_4
+ ),
+ text_color=NbglColor.WHITE,
+ border_color=NbglColor.BLACK,
+ enable_backspace=True,
+ enable_validate=False,
+ enable_digits=True,
+ shuffled=False,
+ selectedKey=0
+ ),
+ id=1
+ )
+ assert deserialized == expected
+
+
+def test_draw_nbgl_spinner(data_test):
+ is_stax = data_test[0]
+ if is_stax:
+ serialized = data_test[1]["test_draw_nbgl_spinner"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglSpinner(
+ area=NbglArea(
+ background_color=NbglColor.LIGHT_GRAY,
+ bpp=NbglBpp.BPP_1,
+ height=14,
+ width=25,
+ x0=12,
+ y0=10,
+ ),
+ position=2
+ ),
+ id=1
+ )
+ assert deserialized == expected
+ assert True
+
+
+def test_draw_nbgl_image_file(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_draw_nbgl_image_file"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglDrawObjectEvent(
+ obj=NbglImageFile(
+ area=NbglArea(
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_4,
+ height=24,
+ width=35,
+ x0=22,
+ y0=20,
+ ),
+ ),
+ id=1
+ )
+ assert deserialized == expected
+
+
+def test_refresh_area(data_test):
+ is_stax = data_test[0]
+ serialized = data_test[1]["test_refresh_area"]
+ deserialized = run_deserialize_nbgl(is_stax, serialized)
+ expected = \
+ NbglRefreshAreaEvent(
+ area=NbglArea(
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_4,
+ height=4,
+ width=4,
+ x0=3,
+ y0=4,
+ ),
+ )
+ assert deserialized == expected
diff --git a/sdk_lib_nbgl/serialization/test_json_ser_deser.py b/sdk_lib_nbgl/serialization/test_json_ser_deser.py
new file mode 100644
index 00000000..fbfafdf8
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/test_json_ser_deser.py
@@ -0,0 +1,694 @@
+from threading import local
+from nbgl_lib import *
+import pytest
+
+
+def test_json_deserialize_screen():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'SCREEN',
+ 'content': {
+ 'area': {
+ 'width': 400,
+ 'height': 670,
+ 'x0': 0,
+ 'y0': 0,
+ 'background_color': 'WHITE',
+ 'bpp': 'BPP_4'
+ }
+ }
+ },
+ 'id':0
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglScreen(
+ area=NbglArea(
+ width=400,
+ height=670,
+ x0=0,
+ y0=0,
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_4
+ )
+ ),
+ id=0
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+def test_json_deserialize_container():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'CONTAINER',
+ 'content': {
+ 'area': {
+ 'width': 1,
+ 'height': 2,
+ 'x0': 3,
+ 'y0': 4,
+ 'background_color': 'DARK_GRAY',
+ 'bpp': 'BPP_4'
+ },
+ 'layout': 'VERTICAL',
+ 'nb_children': 4,
+ 'force_clean': True
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglContainer(
+ area=NbglArea(
+ width=1,
+ height=2,
+ x0=3,
+ y0=4,
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_4
+ ),
+ layout=NbglDirection.VERTICAL,
+ nb_children=4,
+ force_clean=True
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_line():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'LINE',
+ 'content': {
+ 'area': {
+ 'width': 10,
+ 'height': 20,
+ 'x0': 30,
+ 'y0': 40,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'direction': 'VERTICAL',
+ 'line_color': 'WHITE',
+ 'thickness': 4,
+ 'offset': 1
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglLine(
+ area=NbglArea(
+ width=10,
+ height=20,
+ x0=30,
+ y0=40,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ direction=NbglDirection.VERTICAL,
+ line_color=NbglColor.WHITE,
+ thickness=4,
+ offset=1
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_radio_button():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'RADIO_BUTTON',
+ 'content': {
+ 'area': {
+ 'width': 100,
+ 'height': 200,
+ 'x0': 300,
+ 'y0': 400,
+ 'background_color': 'LIGHT_GRAY',
+ 'bpp': 'BPP_1'
+ },
+ 'active_color': 'WHITE',
+ 'border_color': 'BLACK',
+ 'state': 'OFF_STATE'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglRadioButton(
+ area=NbglArea(
+ width=100,
+ height=200,
+ x0=300,
+ y0=400,
+ background_color=NbglColor.LIGHT_GRAY,
+ bpp=NbglBpp.BPP_1
+ ),
+ active_color=NbglColor.WHITE,
+ border_color=NbglColor.BLACK,
+ state=NbglState.OFF_STATE
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_switch():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'SWITCH',
+ 'content': {
+ 'area': {
+ 'width': 50,
+ 'height': 60,
+ 'x0': 150,
+ 'y0': 300,
+ 'background_color': 'DARK_GRAY',
+ 'bpp': 'BPP_2'
+ },
+ 'on_color': 'BLACK',
+ 'off_color': 'DARK_GRAY',
+ 'state': 'ON_STATE'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglSwitch(
+ area=NbglArea(
+ width=50,
+ height=60,
+ x0=150,
+ y0=300,
+ background_color=NbglColor.DARK_GRAY,
+ bpp=NbglBpp.BPP_2
+ ),
+ on_color=NbglColor.BLACK,
+ off_color=NbglColor.DARK_GRAY,
+ state=NbglState.ON_STATE
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_progress_bar():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'PROGRESS_BAR',
+ 'content': {
+ 'area': {
+ 'width': 20,
+ 'height': 30,
+ 'x0': 70,
+ 'y0': 80,
+ 'background_color': 'WHITE',
+ 'bpp': 'BPP_1'
+ },
+ 'with_border': True,
+ 'state': 42
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglProgressBar(
+ area=NbglArea(
+ width=20,
+ height=30,
+ x0=70,
+ y0=80,
+ background_color=NbglColor.WHITE,
+ bpp=NbglBpp.BPP_1
+ ),
+ with_border=True,
+ state=42
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_page_indicator():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'PAGE_INDICATOR',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'active_page': 2,
+ 'nb_pages': 10
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglPageIndicator(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ active_page=2,
+ nb_pages=10
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_button():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'BUTTON',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'inner_color': 'BLACK',
+ 'border_color': 'WHITE',
+ 'foreground_color': 'DARK_GRAY',
+ 'radius': 'RADIUS_40_PIXELS',
+ 'font_id': 'BAGL_FONT_INTER_REGULAR_24px',
+ 'localized': True,
+ 'text': 'Hello world'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglButton(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ inner_color=NbglColor.BLACK,
+ border_color=NbglColor.WHITE,
+ foreground_color=NbglColor.DARK_GRAY,
+ radius=NbglRadius.RADIUS_40_PIXELS,
+ font_id=NbglFontId.BAGL_FONT_INTER_REGULAR_24px,
+ localized=True,
+ text="Hello world"
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_text_area():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'TEXT_AREA',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'text_color': 'BLACK',
+ 'text_alignment': 'RIGHT_BOTTOM',
+ 'style': 'NO_STYLE',
+ 'font_id': 'BAGL_FONT_INTER_SEMIBOLD_24px',
+ 'localized': True,
+ 'auto_hide_long_line': True,
+ 'len': 0,
+ 'text': 'Hello fatstacks'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglTextArea(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ text_color=NbglColor.BLACK,
+ text_alignment=NbglAlignment.RIGHT_BOTTOM,
+ style=NbglStyle.NO_STYLE,
+ font_id=NbglFontId.BAGL_FONT_INTER_SEMIBOLD_24px,
+ localized=True,
+ auto_hide_long_line=True,
+ len=0,
+ text='Hello fatstacks'
+ ),
+ id=1
+ )
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_spinner():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'SPINNER',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'position': 3
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglSpinner(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ position=3
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_image():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'IMAGE',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'height':35,
+ 'width':36,
+ 'bpp':2,
+ 'isFile':1,
+ 'foreground_color': 'WHITE'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ NbglImage(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ height=35,
+ width=36,
+ bpp=2,
+ isFile=1,
+ foreground_color=NbglColor.WHITE
+ ),
+ id=1
+ )
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_image_file():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'IMAGE_FILE',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglImageFile(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_qr_code():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'QR_CODE',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'foreground_color': 'LIGHT_GRAY',
+ 'version': 'QRCODE_V10',
+ 'text': 'Qr code text qr code'
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ NbglQrCode(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ foreground_color=NbglColor.LIGHT_GRAY,
+ version=NbglQrCodeVersion.QRCODE_V10,
+ text='Qr code text qr code'
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_keyboard():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'KEYBOARD',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'text_color': 'WHITE',
+ 'border_color': 'LIGHT_GRAY',
+ 'letters_only': False,
+ 'upper_case': True,
+ 'mode': 'MODE_SPECIAL',
+ 'key_mask': 255,
+ 'selected_char_index':2
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglKeyboard(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ text_color=NbglColor.WHITE,
+ border_color=NbglColor.LIGHT_GRAY,
+ letters_only=False,
+ upper_case=True,
+ mode=NbglKeyboardMode.MODE_SPECIAL,
+ key_mask=255,
+ selected_char_index=2
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_keypad():
+ serialized = {
+ 'event': 'NBGL_DRAW_OBJ',
+ 'obj': {
+ 'type': 'KEYPAD',
+ 'content': {
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ 'text_color': 'WHITE',
+ 'border_color': 'LIGHT_GRAY',
+ 'enable_backspace': True,
+ 'enable_validate': False,
+ 'enable_digits': True,
+ 'shuffled': False,
+ 'selectedKey': 0
+ }
+ },
+ 'id':1
+ }
+ deserialized = \
+ NbglDrawObjectEvent(
+ obj=NbglKeypad(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ text_color=NbglColor.WHITE,
+ border_color=NbglColor.LIGHT_GRAY,
+ enable_backspace=True,
+ enable_validate=False,
+ enable_digits=True,
+ shuffled=False,
+ selectedKey=0
+ ),
+ id=1
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
+
+
+def test_json_deserialize_refresh():
+ serialized = {
+ 'event': 'NBGL_REFRESH_AREA',
+ 'area': {
+ 'width': 35,
+ 'height': 36,
+ 'x0': 37,
+ 'y0': 38,
+ 'background_color': 'BLACK',
+ 'bpp': 'BPP_2'
+ },
+ }
+
+ deserialized = \
+ NbglRefreshAreaEvent(
+ area=NbglArea(
+ width=35,
+ height=36,
+ x0=37,
+ y0=38,
+ background_color=NbglColor.BLACK,
+ bpp=NbglBpp.BPP_2
+ ),
+ )
+
+ assert serialize_nbgl_json(deserialized) == serialized
+ assert deserialized == deserialize_nbgl_json(serialized)
diff --git a/sdk_lib_nbgl/serialization/ux_loc.h b/sdk_lib_nbgl/serialization/ux_loc.h
new file mode 100644
index 00000000..010970af
--- /dev/null
+++ b/sdk_lib_nbgl/serialization/ux_loc.h
@@ -0,0 +1,3 @@
+#pragma once
+
+typedef unsigned short UX_LOC_STRINGS_INDEX;
diff --git a/sdk_lib_nbgl/src/nbgl_buttons.c b/sdk_lib_nbgl/src/nbgl_buttons.c
new file mode 100644
index 00000000..b10e9207
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_buttons.c
@@ -0,0 +1,150 @@
+/**
+ * @file nbgl_buttons.c
+ * Implementation of buttons management in NBGL
+ */
+
+#ifndef HAVE_SE_TOUCH
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_obj.h"
+#include "nbgl_debug.h"
+#include "nbgl_buttons.h"
+#include "nbgl_screen.h"
+#include "os_pic.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static uint8_t gButtonMask = 0;
+static uint32_t gButtonSameMaskCounter = 0;
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static nbgl_buttonEvent_t maskToEvent(uint8_t mask)
+{
+ nbgl_buttonEvent_t event = INVALID_BUTTON_EVENT;
+ switch (mask) {
+ case RELEASED_MASK | LEFT_BUTTON | RIGHT_BUTTON:
+ event = BUTTON_BOTH_PRESSED;
+ break;
+
+ case LEFT_BUTTON | RIGHT_BUTTON:
+ event = BUTTON_BOTH_TOUCHED;
+ break;
+
+ case CONTINUOUS_MASK | LEFT_BUTTON:
+ event = BUTTON_LEFT_CONTINUOUS_PRESSED;
+ break;
+
+ case RELEASED_MASK | LEFT_BUTTON:
+ event = BUTTON_LEFT_PRESSED;
+ break;
+
+ case CONTINUOUS_MASK | RIGHT_BUTTON:
+ event = BUTTON_RIGHT_CONTINUOUS_PRESSED;
+ break;
+
+ case RELEASED_MASK | RIGHT_BUTTON:
+ event = BUTTON_RIGHT_PRESSED;
+ break;
+ }
+
+ return event;
+}
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief Function to be called periodically to check touchscreen state
+ * and coordinates
+ * @param buttonState state of both buttons (only 2 LSB are used)
+ * @param currentTimeMs current time in ms
+ */
+void nbgl_buttonsHandler(uint8_t buttonState, uint32_t currentTimeMs)
+{
+ uint8_t button_mask;
+ uint32_t button_same_mask_counter;
+
+ (void) currentTimeMs;
+ // enable speeded up long push (continuous)
+ if (buttonState == gButtonMask) {
+ if (buttonState == 0) {
+ // nothing to be done when both buttons released twice in a row
+ return;
+ }
+ // each 100ms ~
+ gButtonSameMaskCounter++;
+ }
+
+ // append the button mask
+ button_mask = gButtonMask | buttonState;
+
+ // pre reset variable due to os_sched_exit
+ button_same_mask_counter = gButtonSameMaskCounter;
+
+ if (buttonState == 0) {
+ // reset next state when both buttons are released
+ gButtonMask = 0;
+ gButtonSameMaskCounter = 0;
+
+ // notify button released event
+ button_mask |= RELEASED_MASK;
+ }
+ else {
+ gButtonMask = button_mask;
+ }
+
+ // reset counter when button mask changes
+ if (buttonState != gButtonMask) {
+ gButtonSameMaskCounter = 0;
+ }
+
+ // if the same button(s) is pressed more than 800 ms
+ if (button_same_mask_counter >= CONTINOUS_PRESS_THRESHOLD) {
+ // fast bit when pressing and timing is right (tag the event every 300ms)
+ if ((button_same_mask_counter % CONTINUOUS_PRESS_PERIOD) == 0) {
+ button_mask |= CONTINUOUS_MASK;
+ }
+
+ // discard the release event after a fastskip has been detected, to avoid strange at release
+ // behavior and also to enable user to cancel an operation by starting triggering the fast
+ // skip
+ button_mask &= ~RELEASED_MASK;
+ }
+
+ nbgl_screen_t *topScreen = (nbgl_screen_t *) nbgl_screenGetTop();
+ if ((topScreen != NULL) && (topScreen->buttonCallback != NULL)) {
+ nbgl_buttonEvent_t event = maskToEvent(button_mask);
+ if (event != INVALID_BUTTON_EVENT) {
+ topScreen->buttonCallback(topScreen, event);
+ }
+ }
+}
+
+void nbgl_buttonsReset(void)
+{
+ // no button push so far
+ gButtonMask = 0;
+ gButtonSameMaskCounter = 0;
+}
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/src/nbgl_draw.c b/sdk_lib_nbgl/src/nbgl_draw.c
new file mode 100644
index 00000000..b03cbdfb
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_draw.c
@@ -0,0 +1,769 @@
+
+/**
+ * @file nbgl_draw.c
+ * @brief Implementation of middle-level API to draw rich forms like
+ * rounded rectangle
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_front.h"
+#include "nbgl_draw.h"
+#include "nbgl_fonts.h"
+#include "nbgl_debug.h"
+#include "nbgl_side.h"
+#ifdef NBGL_QRCODE
+#include "qrcodegen.h"
+#endif // NBGL_QRCODE
+#include "glyphs.h"
+#include "os_pic.h"
+#include "os_utils.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define BAGL_FILL_CIRCLE_3PI2_2PI 1
+#define BAGL_FILL_CIRCLE_PI_3PI2 2
+#define BAGL_FILL_CIRCLE_0_PI2 4
+#define BAGL_FILL_CIRCLE_PI2_PI 8
+
+#define QR_PIXEL_WIDTH_HEIGHT 4
+
+/**********************
+ * TYPEDEFS
+ **********************/
+#ifdef NBGL_QRCODE
+typedef struct {
+ uint8_t qrcode[qrcodegen_BUFFER_LEN_MAX];
+ uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
+ uint8_t QrDrawBuffer[QR_PIXEL_WIDTH_HEIGHT * QR_PIXEL_WIDTH_HEIGHT * QR_MAX_PIX_SIZE / 8];
+} QrCodeBuffer_t;
+
+#define qrcode ((QrCodeBuffer_t *) ramBuffer)->qrcode
+#define tempBuffer ((QrCodeBuffer_t *) ramBuffer)->tempBuffer
+#define QrDrawBuffer ((QrCodeBuffer_t *) ramBuffer)->QrDrawBuffer
+#endif // NBGL_QRCODE
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static const uint8_t quarter_disc_3px_1bpp[] = {0xEC, 0xFF};
+#ifndef HAVE_SE_TOUCH
+static const uint8_t quarter_disc_3px_90_1bpp[] = {0x2F, 0xFF};
+static const uint8_t quarter_disc_3px_180_1bpp[] = {0x9B, 0xFF};
+static const uint8_t quarter_disc_3px_270_1bpp[] = {0xFA, 0x00};
+#endif // HAVE_SE_TOUCH
+
+static const uint8_t quarter_circle_3px_1bpp[] = {0x4C, 0x00};
+#ifndef HAVE_SE_TOUCH
+static const uint8_t quarter_circle_3px_90_1bpp[] = {0x0D, 0x00};
+static const uint8_t quarter_circle_3px_180_1bpp[] = {0x19, 0x00};
+static const uint8_t quarter_circle_3px_270_1bpp[] = {0x58, 0x00};
+#else // HAVE_SE_TOUCH
+static const nbgl_icon_details_t C_quarter_disc_3px_1bpp
+ = {2, 2, NBGL_BPP_1, false, quarter_disc_3px_1bpp};
+static const nbgl_icon_details_t C_quarter_circle_3px_1bpp
+ = {2, 2, NBGL_BPP_1, false, quarter_circle_3px_1bpp};
+
+static const uint8_t quarter_disc_4px_1bpp[] = {0x13, 0xFF};
+static const nbgl_icon_details_t C_quarter_disc_4px_1bpp
+ = {4, 4, NBGL_BPP_1, false, quarter_disc_4px_1bpp};
+
+static const uint8_t quarter_circle_4px_1bpp[] = {0x13, 0xFF};
+static const nbgl_icon_details_t C_quarter_circle_4px_1bpp
+ = {4, 4, NBGL_BPP_1, false, quarter_circle_4px_1bpp};
+#endif // HAVE_SE_TOUCH
+
+// indexed by nbgl_radius_t (except RADIUS_0_PIXELS)
+static const uint8_t radiusValues[] = {3,
+#ifdef HAVE_SE_TOUCH
+ 4,
+ 8,
+ 16,
+ 20,
+ 24,
+ 32,
+ 40,
+ 48
+#endif // HAVE_SE_TOUCH
+};
+
+#ifdef HAVE_SE_TOUCH
+// indexed by nbgl_radius_t (except RADIUS_0_PIXELS)
+static const nbgl_icon_details_t *quarterDiscs[] = {&C_quarter_disc_3px_1bpp,
+ &C_quarter_disc_4px_1bpp,
+ &C_quarter_round_8px_1bpp,
+ &C_quarter_round_16px_1bpp,
+ &C_quarter_round_20px_1bpp,
+ &C_quarter_round_24px_1bpp,
+ &C_quarter_round_32px_1bpp,
+ &C_quarter_round_40px_1bpp,
+ &C_quarter_round_48px_1bpp};
+
+// indexed by nbgl_radius_t (except RADIUS_0_PIXELS)
+static const nbgl_icon_details_t *quarterCircles[] = {&C_quarter_circle_3px_1bpp,
+ &C_quarter_circle_4px_1bpp,
+ &C_quarter_circle_8px_1bpp,
+ &C_quarter_circle_16px_1bpp,
+ &C_quarter_circle_20px_1bpp,
+ &C_quarter_circle_24px_1bpp,
+ &C_quarter_circle_32px_1bpp,
+ &C_quarter_circle_40px_1bpp,
+ &C_quarter_circle_48px_1bpp};
+#endif // HAVE_SE_TOUCH
+
+#ifdef NBGL_QRCODE
+// ensure that the ramBuffer also used for image file decompression is big enough for QR code
+CCASSERT(qr_code_buffer, sizeof(QrCodeBuffer_t) <= GZLIB_UNCOMPRESSED_CHUNK);
+#endif // NBGL_QRCODE
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void draw_circle_helper(int x_center,
+ int y_center,
+ nbgl_radius_t radiusIndex,
+ uint8_t quarter,
+ color_t borderColor,
+ color_t innerColor,
+ color_t backgroundColor)
+{
+ const uint8_t *quarter_buffer = NULL;
+ nbgl_area_t area = {.bpp = NBGL_BPP_1, .backgroundColor = backgroundColor};
+
+#ifdef HAVE_SE_TOUCH
+ // radius is not supported
+ if (radiusIndex > RADIUS_48_PIXELS) {
+ return;
+ }
+ if (borderColor == innerColor) {
+ quarter_buffer
+ = (const uint8_t *) ((const nbgl_icon_details_t *) PIC(quarterDiscs[radiusIndex]))
+ ->bitmap;
+ }
+ else {
+ quarter_buffer
+ = (const uint8_t *) ((const nbgl_icon_details_t *) PIC(quarterCircles[radiusIndex]))
+ ->bitmap;
+ }
+ area.width = area.height = radiusValues[radiusIndex];
+ area.backgroundColor = backgroundColor;
+ if (quarter & BAGL_FILL_CIRCLE_3PI2_2PI) { //
+ area.x0 = x_center;
+ area.y0 = y_center;
+ nbgl_frontDrawImage(&area, quarter_buffer, BOTH_MIRRORS, borderColor);
+ }
+ if (quarter & BAGL_FILL_CIRCLE_PI_3PI2) { //
+ area.x0 = x_center - area.width;
+ area.y0 = y_center;
+ nbgl_frontDrawImage(&area, quarter_buffer, HORIZONTAL_MIRROR, borderColor);
+ }
+ if (quarter & BAGL_FILL_CIRCLE_0_PI2) { //
+ area.x0 = x_center;
+ area.y0 = y_center - area.width;
+ nbgl_frontDrawImage(&area, quarter_buffer, VERTICAL_MIRROR, borderColor);
+ }
+ if (quarter & BAGL_FILL_CIRCLE_PI2_PI) { //
+ area.x0 = x_center - area.width;
+ area.y0 = y_center - area.width;
+ nbgl_frontDrawImage(&area, quarter_buffer, NO_TRANSFORMATION, borderColor);
+ }
+#else // HAVE_SE_TOUCH
+ // radius is not supported
+ if (radiusIndex > RADIUS_3_PIXELS) {
+ return;
+ }
+ area.width = area.height = radiusValues[radiusIndex];
+ area.backgroundColor = backgroundColor;
+ if (quarter & BAGL_FILL_CIRCLE_3PI2_2PI) { //
+ area.x0 = x_center;
+ area.y0 = y_center;
+ quarter_buffer
+ = (borderColor == innerColor) ? quarter_disc_3px_180_1bpp : quarter_circle_3px_180_1bpp;
+ }
+ if (quarter & BAGL_FILL_CIRCLE_PI_3PI2) { //
+ area.x0 = x_center - area.width;
+ area.y0 = y_center;
+ quarter_buffer
+ = (borderColor == innerColor) ? quarter_disc_3px_270_1bpp : quarter_circle_3px_270_1bpp;
+ }
+ if (quarter & BAGL_FILL_CIRCLE_0_PI2) { //
+ area.x0 = x_center;
+ area.y0 = y_center - area.width;
+ quarter_buffer
+ = (borderColor == innerColor) ? quarter_disc_3px_90_1bpp : quarter_circle_3px_90_1bpp;
+ }
+ if (quarter & BAGL_FILL_CIRCLE_PI2_PI) { //
+ area.x0 = x_center - area.width;
+ area.y0 = y_center - area.width;
+ quarter_buffer
+ = (borderColor == innerColor) ? quarter_disc_3px_1bpp : quarter_circle_3px_1bpp;
+ }
+ nbgl_frontDrawImage(&area, quarter_buffer, NO_TRANSFORMATION, borderColor);
+#endif // HAVE_SE_TOUCH
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief This functions draws a rounded corners rectangle (without border), with the given
+ * parameters.
+ *
+ * @param area position, size and background color (outside of the rectangle) to use for the
+ * rectangle
+ * @param radiusIndex radius size
+ * @param innerColor color to use for inside the rectangle
+ */
+void nbgl_drawRoundedRect(const nbgl_area_t *area, nbgl_radius_t radiusIndex, color_t innerColor)
+{
+ nbgl_area_t rectArea;
+ uint8_t radius;
+
+ LOG_DEBUG(DRAW_LOGGER,
+ "nbgl_drawRoundedRect x0 = %d, y0 = %d, width =%d, height =%d\n",
+ area->x0,
+ area->y0,
+ area->width,
+ area->height);
+
+ if (radiusIndex <= RADIUS_48_PIXELS) {
+#ifndef HAVE_SE_TOUCH
+ if (radiusIndex > RADIUS_3_PIXELS) {
+ return;
+ }
+#endif // HAVE_SE_TOUCH
+ radius = radiusValues[radiusIndex];
+ }
+ else if (radiusIndex == RADIUS_1_PIXEL) {
+ radius = 1;
+ }
+ else if (radiusIndex == RADIUS_0_PIXELS) {
+ radius = 0;
+ }
+ else {
+ // radius not supported
+ LOG_WARN(DRAW_LOGGER, "nbgl_drawRoundedRect forbidden radius index =%d\n", radiusIndex);
+ return;
+ }
+
+ // Draw main inner rectangle
+ rectArea.x0 = area->x0 + radius;
+ rectArea.y0 = area->y0;
+ rectArea.width = area->width - (2 * radius);
+ rectArea.height = area->height;
+ rectArea.backgroundColor = innerColor;
+ nbgl_frontDrawRect(&rectArea);
+ // special case when radius is null, just draw a rectangle
+ if (radiusIndex == RADIUS_0_PIXELS) {
+ return;
+ }
+ // Draw left inner rectangle
+ rectArea.x0 = area->x0;
+ rectArea.y0 = area->y0 + radius;
+ rectArea.width = radius;
+ rectArea.height = area->height - (2 * radius);
+ nbgl_frontDrawRect(&rectArea);
+ // Draw right inner rectangle
+ rectArea.x0 = area->x0 + area->width - radius;
+ rectArea.y0 = area->y0 + radius;
+ rectArea.width = radius;
+ rectArea.height = area->height - (2 * radius);
+ nbgl_frontDrawRect(&rectArea);
+
+ if (radiusIndex == RADIUS_1_PIXEL) {
+ return;
+ }
+ // Draw 4 quarters of disc
+ draw_circle_helper(area->x0 + radius,
+ area->y0 + radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_PI2_PI,
+ innerColor, // unused
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + area->width - radius,
+ area->y0 + radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_0_PI2,
+ innerColor, // unused
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + radius,
+ area->y0 + area->height - radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_PI_3PI2,
+ innerColor, // unused
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + area->width - radius,
+ area->y0 + area->height - radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_3PI2_2PI,
+ innerColor, // unused
+ innerColor,
+ area->backgroundColor);
+}
+
+/**
+ * @brief This functions draws a rounded corners rectangle with a border, with the given parameters.
+ *
+ * @param area position, size and background color (outside of the rectangle) to use for the
+ * rectangle
+ * @param radiusIndex radius size
+ * @param stroke thickness of border (fixed to 2)
+ * @param innerColor color to use for inside the rectangle
+ * @param borderColor color to use for the border
+ */
+void nbgl_drawRoundedBorderedRect(const nbgl_area_t *area,
+ nbgl_radius_t radiusIndex,
+ uint8_t stroke,
+ color_t innerColor,
+ color_t borderColor)
+{
+ uint8_t radius;
+ nbgl_area_t rectArea;
+
+ LOG_DEBUG(
+ DRAW_LOGGER,
+ "nbgl_drawRoundedBorderedRect: innerColor = %d, borderColor = %d, backgroundColor=%d\n",
+ innerColor,
+ borderColor,
+ area->backgroundColor);
+
+ if (radiusIndex <= RADIUS_48_PIXELS) {
+ radius = radiusValues[radiusIndex];
+ }
+ else if (radiusIndex == RADIUS_0_PIXELS) {
+ radius = 0;
+ }
+ else {
+ // radius not supported
+ LOG_WARN(
+ DRAW_LOGGER, "nbgl_drawRoundedBorderedRect forbidden radius index =%d\n", radiusIndex);
+ return;
+ }
+ rectArea.backgroundColor = innerColor;
+
+ // special case, when border_color == inner_color == background_color, just draw a rectangle
+ if ((innerColor == borderColor) && (borderColor == area->backgroundColor)) {
+ rectArea.x0 = area->x0;
+ rectArea.y0 = area->y0;
+ rectArea.width = area->width;
+ rectArea.height = area->height;
+ nbgl_frontDrawRect(&rectArea);
+ return;
+ }
+ // Draw 3 rectangles
+ if ((2 * radius) < area->width) {
+ rectArea.x0 = area->x0 + radius;
+ rectArea.y0 = area->y0;
+ rectArea.width = area->width - (2 * radius);
+ rectArea.height = area->height;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ // special case when radius is null, left and right rectangles are not necessary
+ if (radiusIndex <= RADIUS_48_PIXELS) {
+ if ((2 * radius) < area->height) {
+ rectArea.x0 = area->x0;
+ rectArea.y0 = area->y0 + radius;
+ rectArea.width = radius;
+ rectArea.height = area->height - (2 * radius);
+ nbgl_frontDrawRect(&rectArea);
+ rectArea.x0 = area->x0 + area->width - radius;
+ rectArea.y0 = area->y0 + radius;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ }
+ // border
+ // 4 rectangles (with last pixel of each corner not set)
+#ifdef HAVE_SE_TOUCH
+ uint8_t maskTop, maskBottom;
+ if (stroke == 1) {
+ maskTop = 0x1;
+ maskBottom = 0x8;
+ }
+ else if (stroke == 2) {
+ maskTop = 0x3;
+ maskBottom = 0xC;
+ }
+ else if (stroke == 3) {
+ maskTop = 0x7;
+ maskBottom = 0xE;
+ }
+ else if (stroke == 4) {
+ maskTop = 0xF;
+ maskBottom = 0xF;
+ }
+ else {
+ LOG_WARN(DRAW_LOGGER, "nbgl_drawRoundedBorderedRect forbidden stroke=%d\n", stroke);
+ return;
+ }
+ rectArea.x0 = area->x0 + radius;
+ rectArea.y0 = area->y0;
+ rectArea.width = area->width - 2 * radius;
+ rectArea.height = 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, maskTop, borderColor); // top
+ rectArea.x0 = area->x0 + radius;
+ rectArea.y0 = area->y0 + area->height - 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, maskBottom, borderColor); // bottom
+#else // HAVE_SE_TOUCH
+ rectArea.x0 = area->x0 + radius;
+ rectArea.y0 = area->y0;
+ rectArea.width = area->width - 2 * radius;
+ rectArea.height = stroke;
+ rectArea.backgroundColor = borderColor;
+ nbgl_frontDrawRect(&rectArea); // top
+ rectArea.y0 = area->y0 + area->height - stroke;
+ nbgl_frontDrawRect(&rectArea); // bottom
+#endif // HAVE_SE_TOUCH
+ if ((2 * radius) < area->height) {
+ rectArea.x0 = area->x0;
+ rectArea.y0 = area->y0 + radius;
+ rectArea.width = stroke;
+ rectArea.height = area->height - 2 * radius;
+ rectArea.backgroundColor = borderColor;
+ nbgl_frontDrawRect(&rectArea); // left
+ rectArea.x0 = area->x0 + area->width - stroke;
+ nbgl_frontDrawRect(&rectArea); // right
+ }
+
+ if (radiusIndex <= RADIUS_48_PIXELS) {
+ // Draw 4 quarters of circles
+ draw_circle_helper(area->x0 + radius,
+ area->y0 + radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_PI2_PI,
+ borderColor,
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + area->width - radius,
+ area->y0 + radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_0_PI2,
+ borderColor,
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + radius,
+ area->y0 + area->height - radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_PI_3PI2,
+ borderColor,
+ innerColor,
+ area->backgroundColor);
+ draw_circle_helper(area->x0 + area->width - radius,
+ area->y0 + area->height - radius,
+ radiusIndex,
+ BAGL_FILL_CIRCLE_3PI2_2PI,
+ borderColor,
+ innerColor,
+ area->backgroundColor);
+ }
+}
+
+/**
+ * @brief Helper function to render an icon directly from its `nbgl_icon_details_t` structure.
+ *
+ * The icon is rendered whether it's an image file or not.
+ * No transformation is applied to the icon.
+ *
+ * @param area Area of drawing
+ * @param color_map Color map applied to icon
+ * @param icon Icon details structure to draw
+ */
+void nbgl_drawIcon(nbgl_area_t *area, nbgl_color_map_t color_map, const nbgl_icon_details_t *icon)
+{
+ if (icon->isFile) {
+ nbgl_frontDrawImageFile(area, icon->bitmap, color_map, ramBuffer);
+ }
+ else {
+ nbgl_frontDrawImage(area, icon->bitmap, NO_TRANSFORMATION, color_map);
+ }
+}
+
+/**
+ * @brief Return the size of the bitmap associated to the input font and character
+ *
+ * @param font pointer to the font infos
+ * @param charId id of the character
+ */
+
+static uint16_t get_bitmap_byte_cnt(const nbgl_font_t *font, uint8_t charId)
+{
+ if ((charId < font->first_char) || (charId > font->last_char)) {
+ return 0;
+ }
+
+ uint16_t baseId = charId - font->first_char;
+ if (charId < font->last_char) {
+ const nbgl_font_character_t *character
+ = (const nbgl_font_character_t *) PIC(&font->characters[baseId]);
+ const nbgl_font_character_t *nextCharacter
+ = (const nbgl_font_character_t *) PIC(&font->characters[baseId + 1]);
+ return (nextCharacter->bitmap_offset - character->bitmap_offset);
+ }
+ else if (charId == font->last_char) {
+ return (font->bitmap_len - font->characters[baseId].bitmap_offset);
+ }
+ return 0;
+}
+
+/**
+ * @brief This function draws the given single-line text, with the given parameters.
+ *
+ * @param area position, size and background color to use for text
+ * @param text array of characters (UTF-8)
+ * @param textLen number of chars to draw
+ * @param fontId font to be used
+ * @param fontColor color to use for font
+ */
+nbgl_font_id_e nbgl_drawText(const nbgl_area_t *area,
+ const char *text,
+ uint16_t textLen,
+ nbgl_font_id_e fontId,
+ color_t fontColor)
+{
+ // text is a series of characters, each character being a bitmap
+ // we need to align bitmaps on width multiple of 4 limitation.
+ int16_t x = area->x0;
+ nbgl_area_t rectArea;
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+
+ LOG_DEBUG(DRAW_LOGGER,
+ "nbgl_drawText: x0 = %d, y0 = %d, w = %d, h = %d, fontColor = %d, "
+ "backgroundColor=%d, text = %s\n",
+ area->x0,
+ area->y0,
+ area->width,
+ area->height,
+ fontColor,
+ area->backgroundColor,
+ text);
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_unicode_ctx_t *unicode_ctx = nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+
+ rectArea.backgroundColor = area->backgroundColor;
+ rectArea.bpp = (nbgl_bpp_t) font->bpp;
+
+ while (textLen > 0) {
+ const nbgl_font_character_t *character;
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+ const uint8_t *char_buffer;
+ int16_t char_x_min;
+ int16_t char_y_min;
+ int16_t char_x_max;
+ int16_t char_y_max;
+ uint16_t char_byte_cnt;
+ uint8_t encoding;
+ uint8_t nb_skipped_bytes;
+
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+
+ if (is_unicode) {
+#ifdef HAVE_UNICODE_SUPPORT
+ const nbgl_font_unicode_character_t *unicodeCharacter
+ = nbgl_getUnicodeFontCharacter(unicode);
+ // if not supported char, go to next one
+ if (unicodeCharacter == NULL) {
+ continue;
+ }
+ char_width = unicodeCharacter->width;
+#if defined(HAVE_LANGUAGE_PACK)
+ char_buffer = unicode_ctx->bitmap;
+ char_buffer += unicodeCharacter->bitmap_offset;
+
+ char_x_max = char_width;
+ char_y_max = unicode_ctx->font->height;
+
+ if (!unicode_ctx->font->crop) {
+ // Take in account the skipped bytes, if any
+ nb_skipped_bytes = (unicodeCharacter->x_min_offset & 7) << 3;
+ nb_skipped_bytes |= unicodeCharacter->y_min_offset & 7;
+ char_x_min = 0;
+ char_y_min = 0;
+ }
+ else {
+ nb_skipped_bytes = 0;
+ char_x_min = (uint16_t) unicodeCharacter->x_min_offset;
+ char_y_min = unicode_ctx->font->y_min;
+ char_y_min += (uint16_t) unicodeCharacter->y_min_offset;
+ char_x_max -= (uint16_t) unicodeCharacter->x_max_offset;
+ char_y_max -= (uint16_t) unicodeCharacter->y_max_offset;
+ }
+
+ char_byte_cnt = nbgl_getUnicodeFontCharacterByteCount();
+ encoding = unicodeCharacter->encoding;
+#endif // defined(HAVE_LANGUAGE_PACK)
+#else // HAVE_UNICODE_SUPPORT
+ continue;
+#endif // HAVE_UNICODE_SUPPORT
+ }
+ else {
+ if (unicode == '\f') {
+ break;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ unicode_ctx = nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = (const nbgl_font_t *) nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ unicode_ctx = nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = (const nbgl_font_t *) nbgl_getFont(fontId);
+ }
+ continue;
+ }
+ // if not supported char, go to next one
+ if ((unicode < font->first_char) || (unicode > font->last_char)) {
+ continue;
+ }
+ character = (const nbgl_font_character_t *) PIC(
+ &font->characters[unicode - font->first_char]);
+ char_buffer = (const uint8_t *) PIC(&font->bitmap[character->bitmap_offset]);
+ char_width = character->width;
+ encoding = character->encoding;
+
+ char_x_max = char_width;
+ char_y_max = font->height;
+
+ if (!font->crop) {
+ // Take in account the skipped bytes, if any
+ nb_skipped_bytes = (character->x_min_offset & 7) << 3;
+ nb_skipped_bytes |= character->y_min_offset & 7;
+ char_x_min = 0;
+ char_y_min = 0;
+ }
+ else {
+ nb_skipped_bytes = 0;
+ char_x_min = (uint16_t) character->x_min_offset;
+ char_y_min = font->y_min;
+ char_y_min += (uint16_t) character->y_min_offset;
+ char_x_max -= (uint16_t) character->x_max_offset;
+ char_y_max -= (uint16_t) character->y_max_offset;
+ }
+
+ char_byte_cnt = get_bitmap_byte_cnt(font, unicode);
+ }
+
+ // Render character
+ rectArea.x0 = x + char_x_min;
+ rectArea.y0 = area->y0 + char_y_min;
+ rectArea.height = (char_y_max - char_y_min);
+ rectArea.width = (char_x_max - char_x_min);
+
+ // If char_byte_cnt = 0, call nbgl_frontDrawImageRle to let speculos notice
+ // a space character was 'displayed'
+ if (!char_byte_cnt || encoding == 1) {
+ nbgl_frontDrawImageRle(
+ &rectArea, char_buffer, char_byte_cnt, fontColor, nb_skipped_bytes);
+ }
+ else {
+ nbgl_frontDrawImage(&rectArea, char_buffer, NO_TRANSFORMATION, fontColor);
+ }
+ x += char_width - font->char_kerning;
+ }
+ return fontId;
+}
+
+#ifdef NBGL_QRCODE
+static void nbgl_frontDrawQrInternal(const nbgl_area_t *area, color_t foregroundColor)
+{
+ int size = qrcodegen_getSize(qrcode);
+ uint16_t idx = 0;
+
+ nbgl_area_t qrArea = {.x0 = area->x0,
+ .y0 = area->y0,
+ .backgroundColor = area->backgroundColor,
+ // QR codes are 1 BPP only
+ .bpp = NBGL_BPP_1};
+ if (size == QR_V4_NB_PIX_SIZE) {
+ // for each point of the V4 QR code, paint 64 pixels in image (8 in width, 8 in height)
+ qrArea.width = 2;
+ qrArea.height = QR_PIXEL_WIDTH_HEIGHT * 2 * size;
+ // paint a column of 2*size pixels in width by 8 pixels in height
+ for (int x = 0; x < size; x++) {
+ idx = 0;
+ for (int y = 0; y < size; y++) {
+ // draw 2 columns at once
+ QrDrawBuffer[idx] = qrcodegen_getModule(qrcode, x, y) ? 0xFF : 0x00;
+ QrDrawBuffer[idx + QR_V4_NB_PIX_SIZE] = QrDrawBuffer[idx];
+ idx += 1;
+ }
+ nbgl_frontDrawImage(&qrArea, QrDrawBuffer, NO_TRANSFORMATION, foregroundColor);
+ qrArea.x0 += 2;
+ nbgl_frontDrawImage(&qrArea, QrDrawBuffer, NO_TRANSFORMATION, foregroundColor);
+ qrArea.x0 += 2;
+ nbgl_frontDrawImage(&qrArea, QrDrawBuffer, NO_TRANSFORMATION, foregroundColor);
+ qrArea.x0 += 2;
+ nbgl_frontDrawImage(&qrArea, QrDrawBuffer, NO_TRANSFORMATION, foregroundColor);
+ qrArea.x0 += 2;
+ }
+ }
+ else {
+ // for each point of the V10 QR code, paint 16 pixels in image (4 in width, 4 in height)
+ qrArea.width = QR_PIXEL_WIDTH_HEIGHT * size;
+ qrArea.height = QR_PIXEL_WIDTH_HEIGHT;
+ // paint a line of 4*size pixels in width by 4 pixels in height
+ for (int y = 0; y < size; y++) {
+ idx = 0;
+ for (int x = 0; x < size; x++) {
+ memset(&QrDrawBuffer[idx], qrcodegen_getModule(qrcode, x, y) ? 0xFF : 0x00, 2);
+ idx += 2;
+ }
+ nbgl_frontDrawImage(&qrArea, QrDrawBuffer, NO_TRANSFORMATION, foregroundColor);
+ qrArea.y0 += QR_PIXEL_WIDTH_HEIGHT;
+ }
+ }
+}
+
+/**
+ * @brief Draws the given text into a V10 QR code (QR code version is fixed using
+ * qrcodegen_VERSION_MIN/qrcodegen_VERSION_MAX in qrcodegen.h)
+ *
+ * @note y0 and height must be multiple 4 pixels, and background color is applied to 0's in 1BPP
+ * bitmap.
+ *
+ * @param area position, size and color of the QR code to draw
+ * @param version version of QR Code (4, 10, ...)
+ * @param text text to encode
+ * @param foregroundColor color to be applied to the 1's in QR code
+ */
+void nbgl_drawQrCode(const nbgl_area_t *area,
+ uint8_t version,
+ const char *text,
+ color_t foregroundColor)
+{
+ bool ok = qrcodegen_encodeText(
+ text, tempBuffer, qrcode, qrcodegen_Ecc_LOW, version, version, qrcodegen_Mask_AUTO, true);
+
+ if (ok) {
+ nbgl_frontDrawQrInternal(area, foregroundColor);
+ }
+ else {
+ LOG_WARN(DRAW_LOGGER, "Impossible to draw QRCode text %s with version %d\n", text, version);
+ }
+}
+#endif // NBGL_QRCODE
diff --git a/sdk_lib_nbgl/src/nbgl_flow.c b/sdk_lib_nbgl/src/nbgl_flow.c
new file mode 100644
index 00000000..9f2f3bc4
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_flow.c
@@ -0,0 +1,234 @@
+/**
+ * @file nbgl_flow.c
+ * @brief Implementation of flow management
+ */
+
+#ifdef NBGL_STEP
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_debug.h"
+#include "nbgl_flow.h"
+#include "glyphs.h"
+#include "os_pic.h"
+#include "ux.h"
+
+/*********************
+ * DEFINES
+ *********************/
+///< Maximum number of layers for flow, cannot be greater than max number of step layers
+#define NB_MAX_LAYERS 3
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct FlowContext_s {
+ const nbgl_stepDesc_t *steps;
+ uint8_t curStep;
+ uint8_t nbSteps;
+ bool loop;
+ bool modal;
+ nbgl_step_t stepCtx;
+} FlowContext_t;
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static FlowContext_t contexts[NB_MAX_LAYERS];
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void actionCallback(nbgl_step_t stepCtx, nbgl_buttonEvent_t event);
+
+// returns a non-used flow context from the contexts[] array, or NULL if not found
+static FlowContext_t *getFreeContext(bool modal)
+{
+ FlowContext_t *ctx = NULL;
+
+ if (!modal) {
+ // Index 0 is reserved for background
+ ctx = &contexts[0];
+ }
+ else {
+ uint32_t i = 1;
+ while (i < NB_MAX_LAYERS) {
+ if (contexts[i].stepCtx == NULL) {
+ ctx = &contexts[i];
+ break;
+ }
+ i++;
+ }
+ }
+ if (ctx == NULL) {
+ LOG_FATAL(FLOW_LOGGER, "getFreeContext(): no available context\n");
+ }
+ else {
+ ctx->modal = modal;
+ }
+ return ctx;
+}
+
+// returns the flow context from the contexts[] array matching with the given step handler, or NULL
+// if not found
+static FlowContext_t *getContextFromStepCtx(nbgl_step_t stepCtx)
+{
+ FlowContext_t *ctx = NULL;
+ uint32_t i = 0;
+ while (i < NB_MAX_LAYERS) {
+ if (contexts[i].stepCtx == stepCtx) {
+ ctx = &contexts[i];
+ break;
+ }
+ i++;
+ }
+ if (ctx == NULL) {
+ LOG_WARN(FLOW_LOGGER, "getContextFromStepCtx(): no matching context\n");
+ }
+ return ctx;
+}
+
+// draws a step with the provided parameters, using the context provided as @ref ctx
+static void drawStep(FlowContext_t *ctx,
+ nbgl_stepPosition_t pos,
+ bool modal,
+ const nbgl_icon_details_t *icon,
+ const char *txt,
+ const char *subTxt)
+{
+ nbgl_layoutCenteredInfo_t info;
+ if ((ctx->loop) && (ctx->nbSteps > 1)) {
+ pos |= NEITHER_FIRST_NOR_LAST_STEP;
+ }
+ else {
+ pos |= GET_POS_OF_STEP(ctx->curStep, ctx->nbSteps);
+ }
+
+ if (icon == NULL) {
+ ctx->stepCtx
+ = nbgl_stepDrawText(pos, actionCallback, NULL, txt, subTxt, REGULAR_INFO, modal);
+ }
+ else {
+ info.icon = icon;
+ info.text1 = txt;
+ info.text2 = subTxt;
+ info.onTop = false;
+ info.style = REGULAR_INFO;
+ ctx->stepCtx = nbgl_stepDrawCenteredInfo(pos, actionCallback, NULL, &info, modal);
+ }
+}
+
+// function called on key action of the current step, if not an internal navigation in a multi-pages
+// text step
+static void actionCallback(nbgl_step_t stepCtx, nbgl_buttonEvent_t event)
+{
+ nbgl_stepPosition_t pos;
+ FlowContext_t *ctx = getContextFromStepCtx(stepCtx);
+
+ if (!ctx) {
+ return;
+ }
+ LOG_DEBUG(FLOW_LOGGER, "actionCallback: event = 0x%X, step = %d\n", event, ctx->curStep);
+ // if navigation to the previous step
+ if ((event == BUTTON_LEFT_PRESSED) && (ctx->curStep > 0)) {
+ ctx->curStep--;
+ pos = BACKWARD_DIRECTION;
+ }
+ // if navigation to the next step
+ else if ((event == BUTTON_RIGHT_PRESSED) && (ctx->curStep < (int) (ctx->nbSteps - 1))) {
+ ctx->curStep++;
+ pos = FORWARD_DIRECTION;
+ }
+ // if action on the current step
+ else if (event == BUTTON_BOTH_PRESSED) {
+ if (ctx->steps[ctx->curStep].callback != NULL) {
+ ctx->steps[ctx->curStep].callback();
+ }
+ return;
+ }
+ else {
+ return;
+ }
+ const nbgl_stepDesc_t *step = &ctx->steps[ctx->curStep];
+#ifdef HAVE_LANGUAGE_PACK
+ const char *txt = (step->text != NULL)
+ ? step->text
+ : ((step->textId != INVALID_ID) ? get_ux_loc_string(step->textId) : NULL);
+#else // HAVE_LANGUAGE_PACK
+ const char *txt = step->text;
+#endif // HAVE_LANGUAGE_PACK
+ // release the current step before opening new one
+ nbgl_stepRelease((nbgl_step_t) ctx->stepCtx);
+ if (step->init != NULL) {
+ step->init();
+ }
+ drawStep(ctx, pos, ctx->modal, step->icon, txt, step->subText);
+ nbgl_refresh();
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief draw the given flow, starting at the given step
+ *
+ * @param steps array of step descriptions
+ * @param nbSteps number of steps in above array
+ * @param initStep init step in above array
+ * @param loop if true, loop between last and first step, in both direction
+ * @param modal if true, screens are modal
+ * @return >= 0 if OK, < 0 otherwise
+ */
+nbgl_flow_t nbgl_flowDraw(const nbgl_stepDesc_t *steps,
+ uint8_t nbSteps,
+ uint8_t initStep,
+ bool loop,
+ bool modal)
+{
+ const nbgl_stepDesc_t *step = &steps[initStep];
+#ifdef HAVE_LANGUAGE_PACK
+ const char *txt = (step->text != NULL)
+ ? step->text
+ : ((step->textId != INVALID_ID) ? get_ux_loc_string(step->textId) : NULL);
+#else // HAVE_LANGUAGE_PACK
+ const char *txt = step->text;
+#endif // HAVE_LANGUAGE_PACK
+ nbgl_stepPosition_t pos = FORWARD_DIRECTION;
+ FlowContext_t *ctx = getFreeContext(modal);
+
+ if (!ctx) {
+ return NULL;
+ }
+
+ ctx->nbSteps = nbSteps;
+ ctx->curStep = initStep;
+ ctx->steps = steps;
+ ctx->loop = loop;
+ if (step->init != NULL) {
+ step->init();
+ }
+
+ drawStep(ctx, pos, ctx->modal, step->icon, txt, step->subText);
+ nbgl_refresh();
+ return (nbgl_flow_t) ctx;
+}
+
+/**
+ * @brief release the given flow
+ *
+ * @param flow flow to release
+ */
+void nbgl_flowRelease(nbgl_flow_t flow)
+{
+ FlowContext_t *ctx = (FlowContext_t *) flow;
+
+ if (!ctx) {
+ LOG_WARN(FLOW_LOGGER, "nbgl_flowRelease: NULL context!");
+ return;
+ }
+ nbgl_stepRelease(ctx->stepCtx);
+ ctx->stepCtx = NULL;
+}
+#endif // NBGL_STEP
diff --git a/sdk_lib_nbgl/src/nbgl_fonts.c b/sdk_lib_nbgl/src/nbgl_fonts.c
new file mode 100644
index 00000000..af53f9f3
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_fonts.c
@@ -0,0 +1,1085 @@
+
+/**
+ * @file nbgl_fonts.c
+ * Implementation of fonts array
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_debug.h"
+#include "nbgl_draw.h"
+#include "nbgl_fonts.h"
+#include "os_helpers.h"
+#include "os_pic.h"
+#if defined(HAVE_LANGUAGE_PACK)
+#include "ux_loc.h"
+#endif // defined(HAVE_LANGUAGE_PACK)
+
+/*********************
+ * DEFINES
+ *********************/
+#define PIC_FONT(x) ((nbgl_font_t const *) PIC(x))
+#define BAGL_FONT_ID_MASK 0x0FFF
+
+#define IS_WORD_DELIM(c) (c == ' ' || c == '\n' || c == '\b' || c == '\f' || c == '-' || c == '_')
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+#ifdef HAVE_UNICODE_SUPPORT
+static nbgl_unicode_ctx_t unicodeCtx = {0};
+#endif // HAVE_UNICODE_SUPPORT
+
+/**********************
+ * VARIABLES
+ **********************/
+
+#if defined(HAVE_LANGUAGE_PACK)
+extern const LANGUAGE_PACK *language_pack;
+#endif // defined(HAVE_LANGUAGE_PACK)
+
+#if defined(BOLOS_OS_UPGRADER_APP)
+#ifdef SCREEN_SIZE_WALLET
+#ifdef TARGET_STAX
+#include "nbgl_font_inter_regular_24.inc"
+#include "nbgl_font_inter_semibold_24.inc"
+#include "nbgl_font_inter_medium_32.inc"
+#include "nbgl_font_inter_regular_24_1bpp.inc"
+#include "nbgl_font_inter_semibold_24_1bpp.inc"
+#include "nbgl_font_inter_medium_32_1bpp.inc"
+#endif // TARGET_STAX
+#else // SCREEN_SIZE_WALLET
+#include "nbgl_font_open_sans_extrabold_11.inc"
+#include "nbgl_font_open_sans_regular_11.inc"
+#include "nbgl_font_open_sans_light_16.inc"
+#endif // SCREEN_SIZE_WALLET
+
+const nbgl_font_t *const C_nbgl_fonts[] = {
+
+#include "nbgl_font_rom_struct.inc"
+
+};
+const unsigned int C_nbgl_fonts_count = sizeof(C_nbgl_fonts) / sizeof(C_nbgl_fonts[0]);
+
+#endif
+
+#if (defined(HAVE_BOLOS) && !defined(BOLOS_OS_UPGRADER_APP))
+#if !defined(HAVE_LANGUAGE_PACK)
+const nbgl_font_unicode_t *const C_nbgl_fonts_unicode[] = {
+
+#include "nbgl_font_unicode_rom_struct.inc"
+
+};
+
+// All Unicode fonts MUST have the same number of characters!
+const unsigned int C_unicode_characters_count
+ = (sizeof(charactersOPEN_SANS_REGULAR_11PX_UNICODE)
+ / sizeof(charactersOPEN_SANS_REGULAR_11PX_UNICODE[0]));
+
+#endif //! defined(HAVE_LANGUAGE_PACK)
+#endif // HAVE_BOLOS
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief return the non-unicode font corresponding to the given font ID
+ *
+ * @param fontId font ID
+ * @return the found font or NULL
+ */
+#if defined(BOLOS_OS_UPGRADER_APP)
+const nbgl_font_t *nbgl_getFont(nbgl_font_id_e fontId)
+{
+ unsigned int i = C_nbgl_fonts_count;
+ fontId &= BAGL_FONT_ID_MASK;
+
+ while (i--) {
+ // font id match this entry (non indexed array)
+ if (PIC_FONT(C_nbgl_fonts[i])->font_id == fontId) {
+ return PIC_FONT(C_nbgl_fonts[i]);
+ }
+ }
+
+ // id not found
+ return NULL;
+}
+#else
+const nbgl_font_t *nbgl_getFont(nbgl_font_id_e fontId)
+{
+ return nbgl_font_getFont(fontId);
+}
+#endif // BOLOS_OS_UPGRADER_APP
+/**
+ * @brief Get the coming unicode value on the given UTF-8 string. If the value is a simple ASCII
+ * character, is_unicode is set to false.
+ *
+ * @param text (in/out) text to get character from. Updated after pop to the next UTF-8 char
+ * @param textLen (in/out) remaining length in given text (before '\n' or '\0')
+ * @param is_unicode (out) set to true if it's a real unicode (not ASCII)
+ * @return unicode (or ascii-7) value of the found character
+ */
+uint32_t nbgl_popUnicodeChar(const uint8_t **text, uint16_t *textLen, bool *is_unicode)
+{
+ const uint8_t *txt = *text;
+ uint8_t cur_char = *txt++;
+ uint32_t unicode;
+
+ *is_unicode = true;
+ // Handle UTF-8 decoding (RFC3629): (https://www.ietf.org/rfc/rfc3629.txt
+ // Char. number range | UTF-8 octet sequence
+ // (hexadecimal) | (binary)
+ // --------------------+---------------------------------------------
+ // 0000 0000-0000 007F | 0xxxxxxx
+ // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+ // 4 bytes UTF-8, Unicode 0x1000 to 0x1FFFF
+ if ((cur_char >= 0xF0) && (*textLen >= 4)) {
+ unicode = (cur_char & 0x07) << 18;
+ unicode |= (*txt++ & 0x3F) << 12;
+ unicode |= (*txt++ & 0x3F) << 6;
+ unicode |= (*txt++ & 0x3F);
+
+ // 3 bytes, from 0x800 to 0xFFFF
+ }
+ else if ((cur_char >= 0xE0) && (*textLen >= 3)) {
+ unicode = (cur_char & 0x0F) << 12;
+ unicode |= (*txt++ & 0x3F) << 6;
+ unicode |= (*txt++ & 0x3F);
+
+ // 2 bytes UTF-8, Unicode 0x80 to 0x7FF
+ // (0xC0 & 0xC1 are unused and can be used to store something else)
+ }
+ else if ((cur_char >= 0xC2) && (*textLen >= 2)) {
+ unicode = (cur_char & 0x1F) << 6;
+ unicode |= (*txt++ & 0x3F);
+ }
+ else {
+ *is_unicode = false;
+ unicode = cur_char;
+ }
+ *textLen = *textLen - (txt - *text);
+ *text = txt;
+ return unicode;
+}
+
+/**
+ * @brief return the width in pixels of the given char (unicode or not).
+ *
+ * @param fontId font ID
+ * @param unicode character
+ * @param is_unicode if true, is unicode
+ * @return the width in pixels of the char
+ */
+static uint8_t getCharWidth(const nbgl_font_t *font, uint32_t unicode, bool is_unicode)
+{
+ if (is_unicode) {
+#ifdef HAVE_UNICODE_SUPPORT
+ const nbgl_font_unicode_character_t *unicodeCharacter
+ = nbgl_getUnicodeFontCharacter(unicode);
+ if (!unicodeCharacter) {
+ return 0;
+ }
+ return unicodeCharacter->width - font->char_kerning;
+#else // HAVE_UNICODE_SUPPORT
+ return 0;
+#endif // HAVE_UNICODE_SUPPORT
+ }
+ else {
+ const nbgl_font_character_t *character; // non-unicode char
+ if ((unicode < font->first_char) || (unicode > font->last_char)) {
+ return 0;
+ }
+ character
+ = (const nbgl_font_character_t *) PIC(&font->characters[unicode - font->first_char]);
+ return character->width - font->char_kerning;
+ }
+}
+
+/**
+ * @brief return the max width in pixels of the given text until the first terminator (\n if
+ * breakOnLineEnd, or \0) is encountered, or maxLen bytes have been parsed.
+ *
+ * @param fontId font ID
+ * @param text text in UTF8
+ * @param breakOnLineEnd if true, \n is considered as an end of string
+ * @param maxLen max number of bytes to parse in text
+ * @return the width in pixels of the text
+ */
+static uint16_t getTextWidth(nbgl_font_id_e fontId,
+ const char *text,
+ bool breakOnLineEnd,
+ uint16_t maxLen)
+{
+ uint16_t line_width = 0;
+ uint16_t max_width = 0;
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t textLen = MIN(strlen(text), maxLen);
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ // end loop text len is NULL (max reached)
+ while (textLen) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+ if (unicode == '\n') {
+ if (breakOnLineEnd) {
+ break;
+ }
+ // reset line width for next line
+ line_width = 0;
+ continue;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ continue;
+ }
+ char_width = getCharWidth(font, unicode, is_unicode);
+
+ line_width += char_width;
+ // memorize max line width if greater than current
+ if (line_width > max_width) {
+ max_width = line_width;
+ }
+ }
+ return max_width;
+}
+
+/**
+ * @brief return the max width in pixels of the given text until the first \n or \0 is encountered
+ *
+ * @param fontId font ID
+ * @param text text in UTF8
+ * @return the width in pixels of the text
+ */
+uint16_t nbgl_getSingleLineTextWidth(nbgl_font_id_e fontId, const char *text)
+{
+ return getTextWidth(fontId, text, true, 0xFFFF);
+}
+
+/**
+ * @brief return the max width in pixels of the given text until the first \n or \0 is encountered,
+ * or maxLen characters have been parsed.
+ *
+ * @param fontId font ID
+ * @param text text in UTF8
+ * @param maxLen max number of bytes to parse
+ * @return the width in pixels of the text
+ */
+uint16_t nbgl_getSingleLineTextWidthInLen(nbgl_font_id_e fontId, const char *text, uint16_t maxLen)
+{
+ return getTextWidth(fontId, text, true, maxLen);
+}
+
+/**
+ * @brief return the max width in pixels of the given text (can be multiline)
+ *
+ * @param fontId font ID
+ * @param text text in UTF8
+ * @return the width in pixels of the text
+ */
+uint16_t nbgl_getTextWidth(nbgl_font_id_e fontId, const char *text)
+{
+ return getTextWidth(fontId, text, false, 0xFFFF);
+}
+
+/**
+ * @brief return the width in pixels of the given UTF-8 character
+ *
+ * @param fontId font ID
+ * @param text UTF-8 character
+ * @return the width in pixels of the character
+ */
+uint8_t nbgl_getCharWidth(nbgl_font_id_e fontId, const char *text)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint32_t unicode;
+ bool is_unicode;
+ uint16_t textLen = 4; // max len for a char
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+
+ return getCharWidth(font, unicode, is_unicode);
+}
+
+/**
+ * @brief return the height in pixels of the font with the given font ID
+ *
+ * @param fontId font ID
+ * @return the height in pixels
+ */
+uint8_t nbgl_getFontHeight(nbgl_font_id_e fontId)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ return font->height;
+}
+
+/**
+ * @brief return the height in pixels of the line of font with the given font ID
+ *
+ * @param fontId font ID
+ * @return the height in pixels
+ */
+uint8_t nbgl_getFontLineHeight(nbgl_font_id_e fontId)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ return font->line_height;
+}
+
+/**
+ * @brief return the number of lines in the given text, according to the found '\n's
+ *
+ * @param text text to get the number of lines from
+ * @return the number of lines in the given text
+ */
+uint16_t nbgl_getTextNbLines(const char *text)
+{
+ uint16_t nbLines = 1;
+ while (*text) {
+ if (*text == '\n') {
+ nbLines++;
+ }
+ text++;
+ }
+ return nbLines;
+}
+
+/**
+ * @brief return the height of the given multiline text, with the given font.
+ *
+ * @param fontId font ID
+ * @param text text to get the height from
+ * @return the height in pixels
+ */
+uint16_t nbgl_getTextHeight(nbgl_font_id_e fontId, const char *text)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ return (nbgl_getTextNbLines(text) * font->line_height);
+}
+
+/**
+ * @brief return the number of bytes of the given text, excluding final '\n' or '\0'
+ * @note '\n' and '\0' are considered as end of string
+ *
+ * @param text text to get the number of bytes from
+ * @return the number of bytes in the given text
+ */
+uint16_t nbgl_getTextLength(const char *text)
+{
+ const char *origText = text;
+ while (*text) {
+ if (*text == '\f') {
+ break;
+ }
+ else if (*text == '\n') {
+ break;
+ }
+ text++;
+ }
+ return text - origText;
+}
+
+/**
+ * @brief compute the max width of the first line of the given text fitting in maxWidth
+ *
+ * @param fontId font ID
+ * @param text input UTF-8 string, possibly multi-line (but only first line, before \n, is used)
+ * @param maxWidth maximum width in bytes, if text is greater than that the parsing is escaped
+ * @param len (output) consumed bytes in text fitting in maxWidth
+ * @param width (output) set to maximum width in pixels in text fitting in maxWidth
+ * @param wrapping if true, lines are split on separators like spaces, \n...
+ *
+ * @return true if maxWidth is reached, false otherwise
+ *
+ */
+void nbgl_getTextMaxLenAndWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t *len,
+ uint16_t *width,
+ bool wrapping)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t textLen = nbgl_getTextLength(text);
+ uint32_t lenAtLastDelimiter = 0, widthAtlastDelimiter = 0;
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+
+ *width = 0;
+ *len = 0;
+ while (textLen) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+ uint16_t curTextLen = textLen;
+
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+ // if \f, exit loop
+ if (unicode == '\f') {
+ *len += curTextLen - textLen;
+ break;
+ }
+ // if \n, exit
+ else if (unicode == '\n') {
+ *len += curTextLen - textLen;
+ return;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ *len += curTextLen - textLen;
+ continue;
+ }
+
+ char_width = getCharWidth(font, unicode, is_unicode);
+ if (char_width == 0) {
+ continue;
+ }
+
+ // memorize cursors at last found sepator, when wrapping
+ if ((wrapping == true) && IS_WORD_DELIM(unicode)) {
+ lenAtLastDelimiter = *len;
+ widthAtlastDelimiter = *width;
+ }
+ if ((*width + char_width) > maxWidth) {
+ if ((wrapping == true) && (widthAtlastDelimiter > 0)) {
+ *len = lenAtLastDelimiter + 1;
+ *width = widthAtlastDelimiter;
+ }
+ return;
+ }
+ *len += curTextLen - textLen;
+ *width = *width + char_width;
+ }
+}
+
+/**
+ * @brief compute the len of the given text (in bytes) fitting in the given maximum nb lines, with
+ * the given maximum width
+ *
+ * @param fontId font ID
+ * @param text input UTF-8 string, possibly multi-line
+ * @param maxWidth maximum width in bytes, if text is greater than that the parsing is escaped
+ * @param maxNbLines maximum number of lines, if text is greater than that the parsing is escaped
+ * @param len (output) consumed bytes in text fitting in maxWidth
+ * @param wrapping if true, lines are split on separators like spaces, \n...
+ *
+ * @return true if maxNbLines is reached, false otherwise
+ *
+ */
+bool nbgl_getTextMaxLenInNbLines(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t maxNbLines,
+ uint16_t *len,
+ bool wrapping)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t textLen = strlen(text);
+ uint16_t width = 0;
+ const char *lastDelimiter = NULL;
+ uint32_t lenAtLastDelimiter = 0;
+ const char *origText = text;
+ const char *previousText;
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+
+ while ((textLen) && (maxNbLines > 0)) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+
+ previousText = text;
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+ // memorize cursors at last found delimiter
+ if ((wrapping == true) && (IS_WORD_DELIM(unicode))) {
+ lastDelimiter = text;
+ lenAtLastDelimiter = textLen;
+ }
+
+ // if \n, reset width
+ if (unicode == '\n') {
+ maxNbLines--;
+ width = 0;
+ continue;
+ }
+ // if \f, exit
+ else if (unicode == '\f') {
+ maxNbLines = 0;
+ continue;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ continue;
+ }
+
+ char_width = getCharWidth(font, unicode, is_unicode);
+ if (char_width == 0) {
+ continue;
+ }
+
+ if ((width + char_width) > maxWidth) {
+ if ((wrapping == true) && (lastDelimiter != NULL)) {
+ text = lastDelimiter;
+ lastDelimiter = NULL;
+ textLen = lenAtLastDelimiter;
+ }
+ else {
+ textLen += text - previousText;
+ text = previousText;
+ }
+ width = 0;
+ maxNbLines--;
+ if (maxNbLines == 0) {
+ break;
+ }
+ continue;
+ }
+ width += char_width;
+ }
+ *len = text - origText;
+ return (maxNbLines == 0);
+}
+
+/**
+ * @brief compute the len and width of the given text fitting in the maxWidth, starting from end of
+ * text
+ * @note works only with ASCII string
+ *
+ * @param fontId font ID
+ * @param text input ascii string, possibly multi-line (but only first line is handled)
+ * @param maxWidth maximum width in bytes, if text is greater than that the parsing is escaped
+ * @param len (output) consumed bytes in text fitting in maxWidth
+ * @param width (output) set to maximum width in pixels in text fitting in maxWidth
+ *
+ * @return true if maxWidth is reached, false otherwise
+ *
+ */
+bool nbgl_getTextMaxLenAndWidthFromEnd(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ uint16_t *len,
+ uint16_t *width)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t textLen = nbgl_getTextLength(text);
+
+ *width = 0;
+ *len = 0;
+ while (textLen) {
+ const nbgl_font_character_t *character;
+ uint8_t char_width;
+ char cur_char;
+
+ textLen--;
+ cur_char = text[textLen];
+ // if \n, exit
+ if (cur_char == '\n') {
+ *len = *len + 1;
+ continue;
+ }
+
+ // skip not printable char
+ if ((cur_char < font->first_char) || (cur_char > font->last_char)) {
+ continue;
+ }
+ character
+ = (const nbgl_font_character_t *) PIC(&font->characters[cur_char - font->first_char]);
+ char_width = character->width;
+
+ if ((*width + char_width) > maxWidth) {
+ return true;
+ }
+ *len = *len + 1;
+ *width = *width + char_width;
+ }
+ return false;
+}
+
+/**
+ * @brief compute the number of lines of the given text fitting in the given maxWidth
+ *
+ * @param fontId font ID
+ * @param text UTF-8 text to get the number of lines from
+ * @param maxWidth maximum width in which the text must fit
+ * @param wrapping if true, lines are split on separators like spaces, \n...
+ * @return the number of lines in the given text
+ */
+uint16_t nbgl_getTextNbLinesInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ bool wrapping)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t width = 0;
+ uint16_t nbLines = 1;
+ uint16_t textLen = strlen(text);
+ const char *lastDelimiter = NULL;
+ uint32_t lenAtLastDelimiter = 0;
+ const char *prevText = NULL;
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ // end loop when a '\0' is uncountered
+ while (textLen) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+
+ // memorize the last char
+ prevText = text;
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+
+ // memorize cursors at last found space
+ if ((wrapping == true) && (IS_WORD_DELIM(unicode))) {
+ lastDelimiter = prevText;
+ lenAtLastDelimiter = textLen;
+ }
+ // if \f, exit loop
+ if (unicode == '\f') {
+ break;
+ }
+ // if \n, increment the number of lines
+ else if (unicode == '\n') {
+ nbLines++;
+ width = 0;
+ lastDelimiter = NULL;
+ continue;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ continue;
+ }
+
+ char_width = getCharWidth(font, unicode, is_unicode);
+ if (char_width == 0) {
+ continue;
+ }
+
+ // if about to reach max len, increment the number of lines
+ if ((width + char_width) > maxWidth) {
+ if ((wrapping == true) && (lastDelimiter != NULL)) {
+ text = lastDelimiter + 1;
+ lastDelimiter = NULL;
+ textLen = lenAtLastDelimiter;
+ width = 0;
+ }
+ else {
+ width = char_width;
+ }
+ nbLines++;
+ }
+ else {
+ width += char_width;
+ }
+ }
+ return nbLines;
+}
+
+/**
+ * @brief compute the number of pages of nbLinesPerPage lines per page of the given text fitting in
+ * the given maxWidth
+ *
+ * @param fontId font ID
+ * @param text UTF-8 text to get the number of pages from
+ * @param nbLinesPerPage number of lines in a page
+ * @param maxWidth maximum width in which the text must fit
+ * @return the number of pages in the given text
+ */
+uint8_t nbgl_getTextNbPagesInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint8_t nbLinesPerPage,
+ uint16_t maxWidth)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t width = 0;
+ uint16_t nbLines = 0;
+ uint8_t nbPages = 1;
+ uint16_t textLen = strlen(text);
+ const char *lastDelimiter = NULL;
+ uint32_t lenAtLastDelimiter = 0;
+ const char *prevText = NULL;
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ // end loop when a '\0' is uncountered
+ while (textLen) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+
+ // memorize the last char
+ prevText = text;
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+
+ // memorize cursors at last found space
+ if (IS_WORD_DELIM(unicode)) {
+ lastDelimiter = prevText;
+ lenAtLastDelimiter = textLen;
+ }
+ // if \f, updates page number
+ if (unicode == '\f') {
+ nbPages++;
+ nbLines = 0;
+ width = 0;
+ continue;
+ }
+ // if \n, increment the number of lines
+ else if (unicode == '\n') {
+ nbLines++;
+ if (nbLines == nbLinesPerPage) {
+ nbPages++;
+ nbLines = 0;
+ }
+
+ width = 0;
+ lastDelimiter = NULL;
+ continue;
+ }
+ // if \b, switch fontId
+ else if (unicode == '\b') {
+ if (fontId == BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp) { // switch to bold
+ fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ else if (fontId == BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp) { // switch to regular
+ fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif // HAVE_UNICODE_SUPPORT
+ font = nbgl_getFont(fontId);
+ }
+ continue;
+ }
+
+ char_width = getCharWidth(font, unicode, is_unicode);
+ if (char_width == 0) {
+ continue;
+ }
+
+ // if about to reach max len, increment the number of lines/pages
+ if ((width + char_width) > maxWidth) {
+ if (lastDelimiter != NULL) {
+ text = lastDelimiter + 1;
+ lastDelimiter = NULL;
+ textLen = lenAtLastDelimiter;
+ width = 0;
+ }
+ else {
+ width = char_width;
+ }
+ nbLines++;
+ if (nbLines == nbLinesPerPage) {
+ nbPages++;
+ nbLines = 0;
+ }
+ }
+ else {
+ width += char_width;
+ }
+ }
+ return nbPages;
+}
+
+/**
+ * @brief return the height of the given multiline text, with the given font.
+ *
+ * @param fontId font ID
+ * @param text text to get the height from
+ * @param maxWidth maximum width in which the text must fit
+ * @param wrapping if true, lines are split on separators like spaces, \n...
+ * @return the height in pixels
+ */
+uint16_t nbgl_getTextHeightInWidth(nbgl_font_id_e fontId,
+ const char *text,
+ uint16_t maxWidth,
+ bool wrapping)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ return (nbgl_getTextNbLinesInWidth(fontId, text, maxWidth, wrapping) * font->line_height);
+}
+
+/**
+ * @brief Modifies the given text to wrap it on the given max width (in pixels), in the given
+ * nbLines If possible,
+ *
+ * @param fontId font ID
+ * @param text (input/output) UTF-8 string, possibly multi-line
+ * @param maxWidth maximum width in pixels
+ * @param nbLines (input) If the text doesn't fit in this number of lines, the last chars will be
+ * replaced by ...
+ *
+ */
+void nbgl_textWrapOnNbLines(nbgl_font_id_e fontId, char *text, uint16_t maxWidth, uint8_t nbLines)
+{
+ const nbgl_font_t *font = nbgl_getFont(fontId);
+ uint16_t textLen = nbgl_getTextLength(text);
+ uint16_t width = 0;
+ uint8_t currentNbLines = 1;
+ char *lastDelimiter = NULL;
+ uint32_t lenAtLastDelimiter = 0;
+ char *prevText = NULL;
+
+#ifdef HAVE_UNICODE_SUPPORT
+ nbgl_getUnicodeFont(fontId);
+#endif
+
+ while (*text) {
+ uint8_t char_width;
+ uint32_t unicode;
+ bool is_unicode;
+ char *prevPrevText;
+
+ // memorize the two last chars
+ prevPrevText = prevText;
+ prevText = text;
+ unicode = nbgl_popUnicodeChar((const uint8_t **) &text, &textLen, &is_unicode);
+ // if \n, reset width
+ if (unicode == '\n') {
+ width = 0;
+ currentNbLines++;
+ lastDelimiter = NULL;
+ continue;
+ }
+
+ char_width = getCharWidth(font, unicode, is_unicode);
+ if (char_width == 0) {
+ continue;
+ }
+
+ // memorize cursors at last found space
+ if (IS_WORD_DELIM(unicode)) {
+ lastDelimiter = prevText;
+ lenAtLastDelimiter = textLen + 1;
+ }
+ // if the width is about to overpass maxWidth, do something
+ if ((width + char_width) > maxWidth) {
+ // if the max number of lines has not been reached, try to wrap on last space
+ // encountered
+ if (currentNbLines < nbLines) {
+ currentNbLines++;
+ // replace last found space by a \n
+ if (lastDelimiter != NULL) {
+ *lastDelimiter++ = '\n';
+ text = lastDelimiter;
+ lastDelimiter = NULL;
+ textLen = lenAtLastDelimiter;
+ }
+ else {
+ textLen += text - prevText;
+ text = prevText;
+ }
+ // reset width for next line
+ width = 0;
+ }
+ else {
+ // replace the 2 last chars by '...' (should be same width)
+ if (prevPrevText != NULL) {
+ *prevPrevText++ = '.';
+ *prevPrevText++ = '.';
+ *prevPrevText++ = '.';
+ *prevPrevText = '\0';
+ }
+ return;
+ }
+ }
+ width += char_width;
+ }
+}
+
+#ifdef HAVE_UNICODE_SUPPORT
+/**
+ * @brief Get the font entry for the given font id (sparse font array support)
+ *
+ * @param font_id font ID (from @ref nbgl_font_id_e)
+
+ * @return the found unicode context structure or NULL if not found
+ */
+nbgl_unicode_ctx_t *nbgl_getUnicodeFont(nbgl_font_id_e fontId)
+{
+ if ((unicodeCtx.font != NULL) && (unicodeCtx.font->font_id == fontId)) {
+ return &unicodeCtx;
+ }
+#if defined(HAVE_LANGUAGE_PACK)
+ // Be sure we need to change font
+ const uint8_t *ptr = (const uint8_t *) language_pack;
+ const nbgl_font_unicode_t *font = (const void *) (ptr + language_pack->fonts_offset);
+ unicodeCtx.characters
+ = (const nbgl_font_unicode_character_t *) (ptr + language_pack->characters_offset);
+ unicodeCtx.bitmap = (const uint8_t *) (ptr + language_pack->bitmaps_offset);
+
+ for (uint32_t i = 0; i < language_pack->nb_fonts; i++) {
+ if (font->font_id == fontId) {
+ // Update all other global variables
+ unicodeCtx.font = font;
+ return &unicodeCtx;
+ }
+ // Compute next Bitmap offset
+ unicodeCtx.bitmap += font->bitmap_len;
+
+ // Update all pointers for next font
+ unicodeCtx.characters += language_pack->nb_characters;
+ font++;
+ }
+#endif // defined(HAVE_LANGUAGE_PACK)
+ // id not found
+ return NULL;
+}
+
+/**
+ * @brief Get the unicode character object matching the given unicode (a unicode character is
+ encoded on max of 3 chars)
+ * in the current language
+ *
+ * @param unicode the unicode value of the character
+
+ * @return the found character or NULL if not found
+ */
+const nbgl_font_unicode_character_t *nbgl_getUnicodeFontCharacter(uint32_t unicode)
+{
+#if defined(HAVE_LANGUAGE_PACK)
+ const nbgl_font_unicode_character_t *characters
+ = (const nbgl_font_unicode_character_t *) PIC(unicodeCtx.characters);
+ uint32_t n = language_pack->nb_characters;
+ if (characters == NULL) {
+ return NULL;
+ }
+ // For the moment, let just parse the full array, but at the end let use
+ // binary search as data are sorted by unicode value !
+ for (unsigned i = 0; i < n - 1; i++, characters++) {
+ if (characters->char_unicode == unicode) {
+ // Compute & store the number of bytes used to display this character
+ unicodeCtx.unicode_character_byte_count
+ = (characters + 1)->bitmap_offset - characters->bitmap_offset;
+ return characters;
+ }
+ }
+ // By default, let's use the last Unicode character, which should be the
+ // 0x00FFFD one, used to replace unrecognized or unrepresentable character.
+
+ // Compute & store the number of bytes used to display this character
+ unicodeCtx.unicode_character_byte_count
+ = unicodeCtx.font->bitmap_len - characters->bitmap_offset;
+ return characters;
+#else // defined(HAVE_LANGUAGE_PACK)
+ UNUSED(unicode);
+ // id not found
+ return NULL;
+#endif // defined(HAVE_LANGUAGE_PACK)
+}
+
+/**
+ * @brief Get the bitmap byte count of the latest used unicode character.
+ * (the one returned by nbgl_getUnicodeFontCharacter)
+ *
+ * @return bitmap byte count of that character (0 for empty ones, ie space)
+ */
+uint32_t nbgl_getUnicodeFontCharacterByteCount(void)
+{
+#ifdef HAVE_LANGUAGE_PACK
+ return unicodeCtx.unicode_character_byte_count;
+#else // defined(HAVE_LANGUAGE_PACK)
+ return 0;
+#endif // HAVE_LANGUAGE_PACK
+}
+
+#ifdef HAVE_LANGUAGE_PACK
+/**
+ * @brief Function to be called when a change on the current language pack is notified by the OS,
+ * to be sure that the current unicodeCtx variable will be set again at next @ref
+ * nbgl_getUnicodeFont() call
+ *
+ */
+void nbgl_refreshUnicodeFont(void)
+{
+ unicodeCtx.font = NULL;
+ unicodeCtx.characters = NULL;
+}
+#endif // HAVE_LANGUAGE_PACK
+
+#endif // HAVE_UNICODE_SUPPORT
diff --git a/sdk_lib_nbgl/src/nbgl_layout.c b/sdk_lib_nbgl/src/nbgl_layout.c
new file mode 100644
index 00000000..ecc72240
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_layout.c
@@ -0,0 +1,3891 @@
+/**
+ * @file nbgl_layout.c
+ * @brief Implementation of predefined layouts management for Applications
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include
+#include "nbgl_debug.h"
+#include "nbgl_front.h"
+#include "nbgl_layout.h"
+#include "nbgl_obj.h"
+#include "nbgl_draw.h"
+#include "nbgl_screen.h"
+#include "nbgl_touch.h"
+#include "glyphs.h"
+#include "os_pic.h"
+#include "os_helpers.h"
+#include "lcx_rng.h"
+
+/*********************
+ * DEFINES
+ *********************/
+// half internal margin, between items
+#define INTERNAL_SPACE 16
+// internal margin, between sub-items
+#define INTERNAL_MARGIN 8
+// inner margin, between buttons
+#define INNER_MARGIN 12
+
+#define NB_MAX_LAYOUTS 3
+
+// used by container
+#ifdef HAVE_SE_TOUCH
+#define NB_MAX_CONTAINER_CHILDREN 20
+#endif // HAVE_SE_TOUCH
+
+// used by screen
+#define NB_MAX_SCREEN_CHILDREN 7
+
+/**
+ * @brief Max number of complex objects with callback retrievable from pool
+ *
+ */
+#ifdef HAVE_SE_TOUCH
+#define LAYOUT_OBJ_POOL_LEN 10
+
+#define TAG_VALUE_ICON_WIDTH 32
+
+#define TOUCHABLE_BAR_HEIGHT 88
+#define FOOTER_HEIGHT 80
+#endif // HAVE_SE_TOUCH
+
+// refresh period of the spinner, in ms
+#define SPINNER_REFRESH_PERIOD 400
+
+/**********************
+ * MACROS
+ **********************/
+#define ASSERT_ENOUGH_PLACE_FOR_MAIN_PANEL_CHILD(__layout) \
+ { \
+ if ((__layout)->panel.nbChildren == (NB_MAX_MAIN_PANEL_CHILDREN - 1)) \
+ return NO_MORE_OBJ_ERROR; \
+ }
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+#ifdef HAVE_SE_TOUCH
+typedef struct {
+ nbgl_obj_t *obj;
+ uint8_t token; // user token, attached to callback
+ uint8_t index; // index within the token
+ tune_index_e tuneId; // if not @ref NBGL_NO_TUNE, a tune will be played
+} layoutObj_t;
+#endif // HAVE_SE_TOUCH
+
+/**
+ * @brief Structure containing all information about the current layout.
+ * @note It shall not be used externally
+ *
+ */
+typedef struct nbgl_layoutInternal_s {
+ bool modal; ///< if true, means the screen is a modal
+#ifdef HAVE_SE_TOUCH
+ bool withLeftBorder; ///< if true, draws a light gray left border on the whole height of the
+ ///< screen
+#endif // HAVE_SE_TOUCH
+ uint8_t layer; ///< if >0, puts the layout on top of screen stack (modal). Otherwise puts on
+ ///< background (for apps)
+ uint8_t nbChildren; ///< number of children in above array
+ nbgl_obj_t **children; ///< children for main screen
+
+#ifdef HAVE_SE_TOUCH
+ nbgl_obj_type_t bottomContainerUsage;
+ uint8_t nbPages; ///< number of pages for navigation bar
+ uint8_t activePage; ///< index of active page for navigation bar
+ nbgl_container_t *bottomContainer; // Used for navigation bar
+ nbgl_text_area_t *tapText;
+ nbgl_layoutTouchCallback_t callback; // user callback for all controls
+ // This is the pool of callback objects, potentially used by this layout
+ layoutObj_t callbackObjPool[LAYOUT_OBJ_POOL_LEN];
+ // number of callback objects used by the whole layout in callbackObjPool
+ uint8_t nbUsedCallbackObjs;
+
+ nbgl_container_t *container;
+#else // HAVE_SE_TOUCH
+ nbgl_layoutButtonCallback_t callback; // user callback for all controls
+#endif // HAVE_SE_TOUCH
+
+} nbgl_layoutInternal_t;
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**
+ * @brief array of layouts, if used by modal
+ *
+ */
+static nbgl_layoutInternal_t gLayout[NB_MAX_LAYOUTS] = {0};
+
+#ifdef HAVE_SE_TOUCH
+#ifdef NBGL_KEYBOARD
+static nbgl_button_t *choiceButtons[NB_MAX_SUGGESTION_BUTTONS];
+#endif // NBGL_KEYBOARD
+
+#ifdef NBGL_KEYBOARD
+static char numText[5];
+#endif
+
+// numbers of touchable controls for the whole page
+static uint8_t nbTouchableControls = 0;
+#endif // HAVE_SE_TOUCH
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+#ifdef HAVE_SE_TOUCH
+#ifdef HAVE_DISPLAY_FAST_MODE
+// Unit step in % of touchable progress bar
+#define HOLD_TO_APPROVE_STEP_PERCENT (10)
+// Duration in ms the user must hold the progress bar
+// to make it progress HOLD_TO_APPROVE_STEP_PERCENT %.
+// This duration must be higher than the screen refresh duration.
+#define HOLD_TO_APPROVE_STEP_DURATION_MS (150)
+#else
+#define HOLD_TO_APPROVE_STEP_PERCENT (17)
+#define HOLD_TO_APPROVE_STEP_DURATION_MS (400)
+#endif // HAVE_DISPLAY_FAST_MODE
+
+static inline uint8_t get_hold_to_approve_percent(uint32_t touch_duration)
+{
+ uint8_t current_step_nb = (touch_duration / HOLD_TO_APPROVE_STEP_DURATION_MS) + 1;
+ return (current_step_nb * HOLD_TO_APPROVE_STEP_PERCENT);
+}
+
+// function used to retrieve the concerned layout and layout obj matching the given touched obj
+static bool getLayoutAndLayoutObj(nbgl_obj_t *obj,
+ nbgl_layoutInternal_t **layout,
+ layoutObj_t **layoutObj)
+{
+ uint8_t i = NB_MAX_LAYOUTS;
+
+ // parse all layouts (starting with modals) to find the object
+ *layout = NULL;
+ while (i > 0) {
+ i--;
+ if (gLayout[i].nbChildren > 0) {
+ uint8_t j;
+
+ // search index of obj in this layout
+ for (j = 0; j < gLayout[i].nbUsedCallbackObjs; j++) {
+ if (obj == gLayout[i].callbackObjPool[j].obj) {
+ LOG_DEBUG(LAYOUT_LOGGER,
+ "getLayoutAndLayoutObj(): obj found in layout[%d], index = %d, "
+ "nbUsedCallbackObjs = %d\n",
+ i,
+ j,
+ gLayout[i].nbUsedCallbackObjs);
+ *layout = &gLayout[i];
+ *layoutObj = &(gLayout[i].callbackObjPool[j]);
+ return true;
+ }
+ }
+ }
+ }
+ // not found
+ return false;
+}
+
+static void radioTouchCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ nbgl_layoutInternal_t *layout);
+static void longTouchCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ nbgl_layoutInternal_t *layout,
+ layoutObj_t *layoutObj);
+
+// callback for most touched object
+static void touchCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType)
+{
+ nbgl_layoutInternal_t *layout;
+ layoutObj_t *layoutObj;
+ bool needRefresh = false;
+
+ UNUSED(eventType);
+
+ if (getLayoutAndLayoutObj(obj, &layout, &layoutObj) == false) {
+ // try with parent, if existing
+ if (getLayoutAndLayoutObj(obj->parent, &layout, &layoutObj) == false) {
+ LOG_WARN(
+ LAYOUT_LOGGER,
+ "touchCallback(): eventType = %d, obj = %p, no active layout or obj not found\n",
+ eventType,
+ obj);
+ return;
+ }
+ }
+
+ // case of navigation bar
+ if ((obj->parent == (nbgl_obj_t *) layout->bottomContainer)
+ && (layout->bottomContainerUsage == PAGE_INDICATOR)) {
+ if (nbgl_navigationCallback(obj, eventType, layout->nbPages, &layout->activePage)
+ == false) {
+ // navigation was impossible
+ return;
+ }
+ layoutObj->index = layout->activePage;
+ }
+
+ // case of switch
+ if ((obj->type == CONTAINER) && (((nbgl_container_t *) obj)->nbChildren >= 2)
+ && (((nbgl_container_t *) obj)->children[1] != NULL)
+ && (((nbgl_container_t *) obj)->children[1]->type == SWITCH)) {
+ nbgl_switch_t *lSwitch = (nbgl_switch_t *) ((nbgl_container_t *) obj)->children[1];
+ lSwitch->state = (lSwitch->state == ON_STATE) ? OFF_STATE : ON_STATE;
+ nbgl_redrawObject((nbgl_obj_t *) lSwitch, false, false);
+ // refresh will be done after tune playback
+ needRefresh = true;
+ // index is used for state
+ layoutObj->index = lSwitch->state;
+ }
+ // case of radio
+ else if ((obj->type == CONTAINER) && (((nbgl_container_t *) obj)->nbChildren == 2)
+ && (((nbgl_container_t *) obj)->children[1] != NULL)
+ && (((nbgl_container_t *) obj)->children[1]->type == RADIO_BUTTON)) {
+ radioTouchCallback(obj, eventType, layout);
+ return;
+ }
+ // case of long press
+ else if ((obj->type == CONTAINER) && (((nbgl_container_t *) obj)->nbChildren == 4)
+ && (((nbgl_container_t *) obj)->children[3] != NULL)
+ && (((nbgl_container_t *) obj)->children[3]->type == PROGRESS_BAR)) {
+ longTouchCallback(obj, eventType, layout, layoutObj);
+ return;
+ }
+ LOG_DEBUG(LAYOUT_LOGGER, "touchCallback(): layout->callback = %p\n", layout->callback);
+ if (layout->callback != NULL) {
+#ifdef HAVE_PIEZO_SOUND
+ if (layoutObj->tuneId < NBGL_NO_TUNE) {
+ io_seproxyhal_play_tune(layoutObj->tuneId);
+ }
+#endif // HAVE_PIEZO_SOUND
+ if (needRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+ layout->callback(layoutObj->token, layoutObj->index);
+ }
+}
+
+// callback for long press button
+static void longTouchCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ nbgl_layoutInternal_t *layout,
+ layoutObj_t *layoutObj)
+{
+ nbgl_container_t *container = (nbgl_container_t *) obj;
+ // 4th child of container is the progress bar
+ nbgl_progress_bar_t *progressBar = (nbgl_progress_bar_t *) container->children[3];
+
+ LOG_DEBUG(LAYOUT_LOGGER,
+ "longTouchCallback(): eventType = %d, obj = %p, gLayout[1].nbChildren = %d\n",
+ eventType,
+ obj,
+ gLayout[1].nbChildren);
+
+ // case of pressing a long press button
+ if (eventType == TOUCHING) {
+ uint32_t touchDuration = nbgl_touchGetTouchDuration(obj);
+
+ // Compute the new progress bar state in %
+ uint8_t new_state = get_hold_to_approve_percent(touchDuration);
+
+ // Ensure the callback is triggered once,
+ // when the progress bar state reaches 100%
+ bool trigger_callback = (new_state >= 100) && (progressBar->state < 100);
+
+ // Cap progress bar state at 100%
+ if (new_state >= 100) {
+ new_state = 100;
+ }
+
+ // Update progress bar state
+ if (new_state != progressBar->state) {
+ progressBar->state = new_state;
+ nbgl_redrawObject((nbgl_obj_t *) progressBar, false, false);
+ // Ensure progress bar is fully drawn
+ // before calling the callback.
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_FAST_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+
+ if (trigger_callback) {
+ // End of progress bar reached: trigger callback
+ if (layout->callback != NULL) {
+ layout->callback(layoutObj->token, layoutObj->index);
+ }
+ }
+ }
+ // case of releasing a long press button (or getting out of it)
+ else if ((eventType == TOUCH_RELEASED) || (eventType == OUT_OF_TOUCH)) {
+ progressBar->state = 0;
+ nbgl_redrawObject((nbgl_obj_t *) progressBar, false, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH, POST_REFRESH_FORCE_POWER_OFF);
+ }
+}
+
+// callback for radio button touch
+static void radioTouchCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ nbgl_layoutInternal_t *layout)
+{
+ uint8_t i = NB_MAX_LAYOUTS, radioIndex = 0, foundRadio = 0xFF, foundRadioIndex;
+
+ if (eventType != TOUCHED) {
+ return;
+ }
+
+ i = 0;
+ // parse all objs to find all containers of radio buttons
+ while (i < layout->nbUsedCallbackObjs) {
+ if ((obj == (nbgl_obj_t *) layout->callbackObjPool[i].obj)
+ && (layout->callbackObjPool[i].obj->type == CONTAINER)) {
+ nbgl_radio_t *radio
+ = (nbgl_radio_t *) ((nbgl_container_t *) layout->callbackObjPool[i].obj)
+ ->children[1];
+ nbgl_text_area_t *textArea
+ = (nbgl_text_area_t *) ((nbgl_container_t *) layout->callbackObjPool[i].obj)
+ ->children[0];
+ foundRadio = i;
+ foundRadioIndex = radioIndex;
+ // set text as active (black and bold)
+ textArea->textColor = BLACK;
+ textArea->fontId = SMALL_BOLD_FONT;
+ // ensure that radio button is ON
+ radio->state = ON_STATE;
+ // redraw container
+ nbgl_redrawObject((nbgl_obj_t *) obj, NULL, false);
+ }
+ else if ((layout->callbackObjPool[i].obj->type == CONTAINER)
+ && (((nbgl_container_t *) layout->callbackObjPool[i].obj)->nbChildren == 2)
+ && (((nbgl_container_t *) layout->callbackObjPool[i].obj)->children[1]->type
+ == RADIO_BUTTON)) {
+ nbgl_radio_t *radio
+ = (nbgl_radio_t *) ((nbgl_container_t *) layout->callbackObjPool[i].obj)
+ ->children[1];
+ nbgl_text_area_t *textArea
+ = (nbgl_text_area_t *) ((nbgl_container_t *) layout->callbackObjPool[i].obj)
+ ->children[0];
+ radioIndex++;
+ // set to OFF the one that was in ON
+ if (radio->state == ON_STATE) {
+ radio->state = OFF_STATE;
+ // set text it as inactive (gray and normal)
+ textArea->textColor = DARK_GRAY;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ // redraw container
+ nbgl_redrawObject((nbgl_obj_t *) layout->callbackObjPool[i].obj, NULL, false);
+ }
+ }
+ i++;
+ }
+ // call callback after redraw to avoid asynchronicity
+ if (foundRadio != 0xFF) {
+ if (layout->callback != NULL) {
+#ifdef HAVE_PIEZO_SOUND
+ if (layout->callbackObjPool[foundRadio].tuneId < NBGL_NO_TUNE) {
+ io_seproxyhal_play_tune(layout->callbackObjPool[foundRadio].tuneId);
+ }
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+#endif // HAVE_PIEZO_SOUND
+ layout->callback(layout->callbackObjPool[foundRadio].token, foundRadioIndex);
+ }
+ }
+}
+#else // HAVE_SE_TOUCH
+static void buttonCallback(nbgl_screen_t *screen, nbgl_buttonEvent_t buttonEvent)
+{
+ uint8_t i = NB_MAX_LAYOUTS;
+ nbgl_layoutInternal_t *layout = NULL;
+
+ // parse all layouts (starting with modals) to find the object
+ while (i > 0) {
+ i--;
+ if ((screen->index == gLayout[i].layer) && (gLayout[i].nbChildren > 0)) {
+ // found
+ layout = &gLayout[i];
+ break;
+ }
+ }
+ if (layout == NULL) {
+ LOG_WARN(
+ LAYOUT_LOGGER,
+ "touchCallback(): screen->index = %d, buttonEvent = %d, no matching active layout\n",
+ screen->index,
+ buttonEvent);
+ return;
+ }
+
+#ifdef NBGL_KEYPAD
+ // special case of keypad
+ nbgl_obj_t *kpd = nbgl_screenContainsObjType(screen, KEYPAD);
+ if (kpd) {
+ nbgl_keypadCallback(kpd, buttonEvent);
+ return;
+ }
+ else
+#endif // NBGL_KEYPAD
+#ifdef NBGL_KEYBOARD
+ {
+ nbgl_obj_t *kbd = nbgl_screenContainsObjType(screen, KEYBOARD);
+ if (kbd) {
+ nbgl_keyboardCallback(kbd, buttonEvent);
+ return;
+ }
+ }
+#endif // NBGL_KEYBOARD
+ if (layout->callback != NULL) {
+ layout->callback((nbgl_layout_t *) layout, buttonEvent);
+ }
+}
+#endif // HAVE_SE_TOUCH
+
+#ifdef HAVE_SE_TOUCH
+
+// callback for spinner ticker
+static void spinnerTickerCallback(void)
+{
+ nbgl_spinner_t *spinner;
+ uint8_t i = 0;
+ nbgl_layoutInternal_t *layout;
+
+ // gLayout[1] is on top of gLayout[0] so if gLayout[1] is active, it must catch the event
+ if (gLayout[1].nbChildren > 0) {
+ layout = &gLayout[1];
+ }
+ else {
+ layout = &gLayout[0];
+ }
+
+ // get index of obj
+ while (i < layout->container->nbChildren) {
+ if (layout->container->children[i]->type == SPINNER) {
+ spinner = (nbgl_spinner_t *) layout->container->children[i];
+ spinner->position++;
+ spinner->position &= 3; // modulo 4
+ nbgl_redrawObject((nbgl_obj_t *) spinner, NULL, false);
+ nbgl_refreshSpecial(BLACK_AND_WHITE_FAST_REFRESH);
+ return;
+ }
+ i++;
+ }
+}
+
+static nbgl_line_t *createHorizontalLine(uint8_t layer)
+{
+ nbgl_line_t *line;
+
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, layer);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.area.width = SCREEN_WIDTH;
+ line->obj.area.height = 4;
+ line->direction = HORIZONTAL;
+ line->thickness = 1;
+ return line;
+}
+
+static nbgl_line_t *createLeftVerticalLine(uint8_t layer)
+{
+ nbgl_line_t *line;
+
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, layer);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.area.width = 1;
+ line->obj.area.height = SCREEN_HEIGHT;
+ line->direction = VERTICAL;
+ line->thickness = 1;
+ line->obj.alignment = MID_LEFT;
+ return line;
+}
+
+/**
+ * @brief This function creates a bottom area with a centered button and a top line. Returns it as a
+ * container
+ *
+ * @param icon icon to place in centered button
+ * @param separationLine if set to true, adds a light gray separation line on top of the container
+ * @param layer screen layer to use
+ * @return the created container object
+ */
+static nbgl_container_t *createBottomButton(const nbgl_icon_details_t *icon,
+ bool separationLine,
+ uint8_t layer)
+{
+ nbgl_button_t *button;
+ nbgl_container_t *container;
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layer);
+ container->obj.area.width = SCREEN_WIDTH;
+ container->obj.area.height = BUTTON_DIAMETER + 2 * BORDER_MARGIN;
+ container->layout = HORIZONTAL;
+ container->nbChildren = 2;
+ container->children = (nbgl_obj_t **) nbgl_containerPoolGet(container->nbChildren, layer);
+ container->obj.alignment = NO_ALIGNMENT;
+
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layer);
+ button->innerColor = WHITE;
+ button->borderColor = LIGHT_GRAY;
+ button->obj.area.width = BUTTON_DIAMETER;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->icon = icon;
+ button->obj.alignment = CENTER;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = BOTTOM_BUTTON_ID;
+ container->children[0] = (nbgl_obj_t *) button;
+
+ if (separationLine) {
+ nbgl_line_t *line;
+ // create horizontal line
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, 0);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.area.width = SCREEN_WIDTH;
+ line->obj.area.height = 4;
+ line->direction = HORIZONTAL;
+ line->thickness = 1;
+ line->obj.alignmentMarginY = BORDER_MARGIN - 4;
+ line->obj.alignTo = (nbgl_obj_t *) button;
+ line->obj.alignment = TOP_MIDDLE;
+ container->children[1] = (nbgl_obj_t *) line;
+ }
+
+ return container;
+}
+
+// function adding a layout object in the callbackObjPool array for the given layout, and
+// configuring it
+static layoutObj_t *addCallbackObj(nbgl_layoutInternal_t *layout,
+ nbgl_obj_t *obj,
+ uint8_t token,
+ tune_index_e tuneId)
+{
+ layoutObj_t *layoutObj = NULL;
+
+ if (layout->nbUsedCallbackObjs < (LAYOUT_OBJ_POOL_LEN - 1)) {
+ layoutObj = &layout->callbackObjPool[layout->nbUsedCallbackObjs];
+ layout->nbUsedCallbackObjs++;
+ layoutObj->obj = obj;
+ layoutObj->token = token;
+ layoutObj->tuneId = tuneId;
+ }
+
+ return layoutObj;
+}
+
+/**
+ * @brief adds the given obj to the main container
+ *
+ * @param layout
+ * @param obj
+ */
+static void addObjectToLayout(nbgl_layoutInternal_t *layout, nbgl_obj_t *obj)
+{
+ if (layout->container->nbChildren == NB_MAX_CONTAINER_CHILDREN) {
+ LOG_FATAL(LAYOUT_LOGGER, "addObjectToLayout(): No more object\n");
+ }
+ layout->container->children[layout->container->nbChildren] = obj;
+ layout->container->nbChildren++;
+}
+#else // HAVE_SE_TOUCH
+
+/**
+ * @brief adds the given obj to the layout
+ *
+ * @param layout
+ * @param obj
+ */
+static void addObjectToLayout(nbgl_layoutInternal_t *layout, nbgl_obj_t *obj)
+{
+ if (layout->nbChildren == NB_MAX_SCREEN_CHILDREN) {
+ LOG_FATAL(LAYOUT_LOGGER, "addObjectToLayout(): No more object\n");
+ }
+ layout->children[layout->nbChildren] = obj;
+ layout->nbChildren++;
+}
+#endif // HAVE_SE_TOUCH
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief returns a layout of the given type. The layout is reset
+ *
+ * @param description description of layout
+ * @return a pointer to the corresponding layout
+ */
+nbgl_layout_t *nbgl_layoutGet(const nbgl_layoutDescription_t *description)
+{
+ nbgl_layoutInternal_t *layout = NULL;
+
+ // find an empty layout in the proper "layer"
+ if (description->modal) {
+ if (gLayout[1].nbChildren == 0) {
+ layout = &gLayout[1];
+ }
+ else if (gLayout[2].nbChildren == 0) {
+ layout = &gLayout[2];
+ }
+ }
+ else {
+ // automatically "release" a potentially opened non-modal layout
+ gLayout[0].nbChildren = 0;
+ layout = &gLayout[0];
+ }
+ if (layout == NULL) {
+ LOG_WARN(LAYOUT_LOGGER, "nbgl_layoutGet(): impossible to get a layout!\n");
+ return NULL;
+ }
+
+ // reset globals
+ memset(layout, 0, sizeof(nbgl_layoutInternal_t));
+
+ nbTouchableControls = 0;
+
+ layout->callback = (nbgl_layoutTouchCallback_t) PIC(description->onActionCallback);
+ layout->modal = description->modal;
+ layout->withLeftBorder = description->withLeftBorder;
+ if (description->modal) {
+ layout->layer = nbgl_screenPush(&layout->children,
+ NB_MAX_SCREEN_CHILDREN,
+ &description->ticker,
+ (nbgl_touchCallback_t) touchCallback);
+ }
+ else {
+ nbgl_screenSet(&layout->children,
+ NB_MAX_SCREEN_CHILDREN,
+ &description->ticker,
+ (nbgl_touchCallback_t) touchCallback);
+ layout->layer = 0;
+ }
+ layout->container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layout->layer);
+ layout->container->obj.area.width = SCREEN_WIDTH;
+ layout->container->obj.area.height = SCREEN_HEIGHT;
+ layout->container->layout = VERTICAL;
+ layout->container->children = nbgl_containerPoolGet(NB_MAX_CONTAINER_CHILDREN, layout->layer);
+ layout->children[layout->nbChildren] = (nbgl_obj_t *) layout->container;
+ layout->nbChildren++;
+
+ // if a tap text is defined, make the container tapable and display this text in gray
+ if (description->tapActionText != NULL) {
+ layoutObj_t *obj;
+
+ obj = &layout->callbackObjPool[layout->nbUsedCallbackObjs];
+ layout->nbUsedCallbackObjs++;
+ obj->obj = (nbgl_obj_t *) layout->container;
+ obj->token = description->tapActionToken;
+ obj->tuneId = description->tapTuneId;
+ layout->container->obj.touchMask = (1 << TOUCHED);
+ layout->container->obj.touchId = WHOLE_SCREEN_ID;
+
+ // create 'tap to continue' text area
+ layout->tapText = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, 0);
+ layout->tapText->localized = false;
+ layout->tapText->text = PIC(description->tapActionText);
+ layout->tapText->textColor = DARK_GRAY;
+ layout->tapText->fontId = SMALL_REGULAR_FONT;
+ layout->tapText->obj.area.width = SCREEN_WIDTH - 2 * BORDER_MARGIN;
+ layout->tapText->obj.area.height = nbgl_getFontLineHeight(layout->tapText->fontId);
+ layout->tapText->textAlignment = CENTER;
+ layout->tapText->obj.alignmentMarginY = BORDER_MARGIN;
+ layout->tapText->obj.alignment = BOTTOM_MIDDLE;
+ }
+
+ return (nbgl_layout_t *) layout;
+}
+
+/**
+ * @brief Creates a Top-right button in the top right corner of the top panel
+ *
+ * @param layout the current layout
+ * @param icon icon configuration
+ * @param token the token that will be used as argument of the callback
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when button is pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddTopRightButton(nbgl_layout_t *layout,
+ const nbgl_icon_details_t *icon,
+ uint8_t token,
+ tune_index_e tuneId)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ nbgl_button_t *button;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddTopRightButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) button, token, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) button);
+ button->obj.area.width = BUTTON_DIAMETER;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->obj.alignmentMarginX = BORDER_MARGIN;
+ button->obj.alignmentMarginY = BORDER_MARGIN;
+ button->foregroundColor = BLACK;
+ button->innerColor = WHITE;
+ button->borderColor = LIGHT_GRAY;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = TOP_RIGHT_BUTTON_ID;
+ button->icon = PIC(icon);
+ button->obj.alignment = TOP_RIGHT;
+
+ return 0;
+}
+
+/**
+ * @brief Creates a navigation bar on bottom of main container
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of the navigation bar
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddNavigationBar(nbgl_layout_t *layout, const nbgl_layoutNavigationBar_t *info)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddNavigationBar():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ layoutInt->bottomContainer = nbgl_navigationPopulate(
+ info->nbPages, info->activePage, info->withExitKey, layoutInt->layer);
+ obj = addCallbackObj(
+ layoutInt, (nbgl_obj_t *) layoutInt->bottomContainer, info->token, info->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ layoutInt->activePage = info->activePage;
+ layoutInt->nbPages = info->nbPages;
+ layoutInt->bottomContainer->obj.alignTo = NULL;
+ layoutInt->bottomContainer->obj.alignment = BOTTOM_MIDDLE;
+ layoutInt->bottomContainerUsage = PAGE_INDICATOR; // used for navigation bar
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) layoutInt->bottomContainer;
+ layoutInt->nbChildren++;
+
+ layoutInt->container->obj.area.height -= layoutInt->bottomContainer->obj.area.height;
+
+ if (info->withSeparationLine) {
+ nbgl_line_t *line = createHorizontalLine(layoutInt->layer);
+ line->obj.alignTo = (nbgl_obj_t *) layoutInt->bottomContainer;
+ line->obj.alignment = TOP_MIDDLE;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) line;
+ layoutInt->nbChildren++;
+
+ layoutInt->container->obj.area.height -= 4;
+ }
+
+ return 0;
+}
+
+#else // HAVE_SE_TOUCH
+/**
+ * @brief returns a layout of the given type. The layout is reset
+ *
+ * @param description description of layout
+ * @return a pointer to the corresponding layout
+ */
+nbgl_layout_t *nbgl_layoutGet(const nbgl_layoutDescription_t *description)
+{
+ nbgl_layoutInternal_t *layout = NULL;
+
+ // find an empty layout in the proper "layer"
+ if (description->modal) {
+ if (gLayout[1].nbChildren == 0) {
+ layout = &gLayout[1];
+ }
+ else if (gLayout[2].nbChildren == 0) {
+ layout = &gLayout[2];
+ }
+ }
+ else {
+ // automatically "release" a potentially opened non-modal layout
+ gLayout[0].nbChildren = 0;
+ layout = &gLayout[0];
+ }
+ if (layout == NULL) {
+ LOG_WARN(LAYOUT_LOGGER, "nbgl_layoutGet(): impossible to get a layout!\n");
+ return NULL;
+ }
+
+ // reset globals
+ memset(layout, 0, sizeof(nbgl_layoutInternal_t));
+
+ layout->callback = (nbgl_layoutButtonCallback_t) PIC(description->onActionCallback);
+ layout->modal = description->modal;
+ if (description->modal) {
+ layout->layer = nbgl_screenPush(&layout->children,
+ NB_MAX_SCREEN_CHILDREN,
+ &description->ticker,
+ (nbgl_buttonCallback_t) buttonCallback);
+ }
+ else {
+ nbgl_screenSet(&layout->children,
+ NB_MAX_SCREEN_CHILDREN,
+ &description->ticker,
+ (nbgl_buttonCallback_t) buttonCallback);
+ layout->layer = 0;
+ }
+
+ return (nbgl_layout_t *) layout;
+}
+
+/**
+ * @brief Creates navigation arrows on side(s) of the screen
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of the navigation
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddNavigation(nbgl_layout_t *layout, nbgl_layoutNavigation_t *info)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddNavigation():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ nbgl_image_t *image;
+ if (info->indication & LEFT_ARROW) {
+ image = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ image->foregroundColor = WHITE;
+ image->buffer = (info->direction == HORIZONTAL_NAV) ? &C_icon_left : &C_icon_up;
+ image->obj.area.bpp = NBGL_BPP_1;
+ image->obj.alignment = MID_LEFT;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) image);
+ }
+ if (info->indication & RIGHT_ARROW) {
+ image = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ image->foregroundColor = WHITE;
+ image->buffer = (info->direction == HORIZONTAL_NAV) ? &C_icon_right : &C_icon_down;
+ image->obj.area.bpp = NBGL_BPP_1;
+ image->obj.alignment = MID_RIGHT;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) image);
+ }
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+
+#ifdef HAVE_SE_TOUCH
+
+/**
+ * @brief Creates a centered button at bottom of main container
+ * @brief incompatible with navigation bar
+ *
+ * @param layout the current layout
+ * @param icon icon inside the round button
+ * @param token used as parameter of userCallback when button is touched
+ * @param separationLine if set to true, adds a light gray separation line on top of the container
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when button is pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddBottomButton(nbgl_layout_t *layout,
+ const nbgl_icon_details_t *icon,
+ uint8_t token,
+ bool separationLine,
+ tune_index_e tuneId)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddBottomButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ layoutInt->bottomContainer = createBottomButton(icon, separationLine, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) layoutInt->bottomContainer, token, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+ layoutInt->bottomContainer->obj.alignment = BOTTOM_MIDDLE;
+ layoutInt->bottomContainerUsage = BUTTON; // used for a button
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) layoutInt->bottomContainer;
+ layoutInt->nbChildren++;
+
+ layoutInt->container->obj.area.height -= layoutInt->bottomContainer->obj.area.height;
+
+ return 0;
+}
+
+/**
+ * @brief Creates a touchable bar in main panel
+ *
+ * @param layout the current layout
+ * @param barLayout the properties of the bar
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddTouchableBar(nbgl_layout_t *layout, const nbgl_layoutBar_t *barLayout)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ nbgl_text_area_t *textArea;
+ nbgl_image_t *imageLeft = NULL, *imageRight = NULL;
+ nbgl_container_t *container;
+ color_t color = (barLayout->inactive != true) ? BLACK : LIGHT_GRAY;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddTouchableBar():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) container, barLayout->token, barLayout->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ // get container children (up to 4)
+ container->children = nbgl_containerPoolGet(4, layoutInt->layer);
+ container->nbChildren = 0;
+
+ container->obj.area.width = AVAILABLE_WIDTH;
+ container->obj.area.height = TOUCHABLE_BAR_HEIGHT;
+ container->layout = HORIZONTAL;
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignment = NO_ALIGNMENT;
+ container->obj.alignTo = NULL;
+ // the bar can only be touched if not inactive AND if one of the icon is present
+ // otherwise it is seen as a title
+ if ((barLayout->inactive != true)
+ && ((barLayout->iconLeft != NULL) || (barLayout->iconRight != NULL))) {
+ container->obj.touchMask = (1 << TOUCHED);
+ container->obj.touchId = CONTROLS_ID + nbTouchableControls;
+ nbTouchableControls++;
+ }
+
+ if (barLayout->iconLeft != NULL) {
+ imageLeft = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ imageLeft->foregroundColor = color;
+ imageLeft->buffer = PIC(barLayout->iconLeft);
+ imageLeft->obj.alignment = MID_LEFT;
+ imageLeft->obj.alignTo = (nbgl_obj_t *) NULL;
+ container->children[container->nbChildren] = (nbgl_obj_t *) imageLeft;
+ container->nbChildren++;
+ }
+ if (barLayout->text != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = color;
+ textArea->text = PIC(barLayout->text);
+ textArea->onDrawCallback = NULL;
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->obj.area.width = container->obj.area.width;
+ if (barLayout->iconLeft != NULL) {
+ textArea->obj.area.width -= imageLeft->buffer->width + 12;
+ }
+ if (barLayout->iconRight != NULL) {
+ textArea->obj.area.width -= ((nbgl_icon_details_t *) PIC(barLayout->iconRight))->width;
+ }
+ textArea->obj.area.height = container->obj.area.height;
+ textArea->style = NO_STYLE;
+ if ((barLayout->iconLeft != NULL) && (barLayout->centered != true)) {
+ textArea->obj.alignmentMarginX = 12;
+ }
+ if (barLayout->iconLeft != NULL) {
+ textArea->obj.alignTo = (nbgl_obj_t *) imageLeft;
+ textArea->obj.alignment = MID_RIGHT;
+ }
+ else {
+ textArea->obj.alignTo = (nbgl_obj_t *) NULL;
+ textArea->obj.alignment = NO_ALIGNMENT;
+ }
+ if (barLayout->centered != true) {
+ textArea->textAlignment = MID_LEFT;
+ }
+ else {
+ textArea->textAlignment = CENTER;
+ }
+ textArea->wrapping = true;
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ if (barLayout->iconRight != NULL) {
+ imageRight = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ imageRight->foregroundColor = color;
+ imageRight->buffer = PIC(barLayout->iconRight);
+ imageRight->obj.alignment = MID_RIGHT;
+ if (barLayout->text == NULL) {
+ imageRight->obj.alignTo = (nbgl_obj_t *) NULL;
+ }
+ else {
+ imageRight->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ }
+ container->children[container->nbChildren] = (nbgl_obj_t *) imageRight;
+ container->nbChildren++;
+ }
+ if (barLayout->subText != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+
+ textArea->textColor = BLACK;
+ textArea->text = PIC(barLayout->subText);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ textArea->style = NO_STYLE;
+ textArea->wrapping = true;
+ textArea->obj.alignment = BOTTOM_LEFT;
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ textArea->obj.area.width = container->obj.area.width;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ container->obj.area.height += textArea->obj.area.height + 16;
+ }
+
+ // set this new container as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a switch with the given text and its state
+ *
+ * @param layout the current layout
+ * @param switchLayout description of the parameters of the switch
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddSwitch(nbgl_layout_t *layout, const nbgl_layoutSwitch_t *switchLayout)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ nbgl_text_area_t *textArea;
+ nbgl_text_area_t *subTextArea;
+ nbgl_switch_t *switchObj;
+ nbgl_container_t *container;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddSwitch():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ obj = addCallbackObj(
+ layoutInt, (nbgl_obj_t *) container, switchLayout->token, switchLayout->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ // get container children
+ container->children = nbgl_containerPoolGet(3, layoutInt->layer);
+ container->obj.area.width = AVAILABLE_WIDTH;
+ container->obj.area.height = 2 * BORDER_MARGIN;
+ container->layout = VERTICAL;
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignment = NO_ALIGNMENT;
+ container->obj.touchMask = (1 << TOUCHED);
+ container->obj.touchId = CONTROLS_ID + nbTouchableControls;
+ nbTouchableControls++;
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(switchLayout->text);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->obj.area.width = container->obj.area.width - 60; // the switch icon has 60px width
+ textArea->obj.area.height = nbgl_getTextHeight(textArea->fontId, textArea->text);
+ container->obj.area.height += textArea->obj.area.height;
+ textArea->obj.alignment = TOP_LEFT;
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ container->children[0] = (nbgl_obj_t *) textArea;
+
+ switchObj = (nbgl_switch_t *) nbgl_objPoolGet(SWITCH, layoutInt->layer);
+ switchObj->onColor = BLACK;
+ switchObj->offColor = LIGHT_GRAY;
+ switchObj->state = switchLayout->initState;
+ switchObj->obj.alignment = MID_RIGHT;
+ switchObj->obj.alignTo = (nbgl_obj_t *) textArea;
+ container->children[1] = (nbgl_obj_t *) switchObj;
+
+ if (switchLayout->subText != NULL) {
+ subTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ subTextArea->textColor = BLACK;
+ subTextArea->text = PIC(switchLayout->subText);
+ subTextArea->textAlignment = MID_LEFT;
+ subTextArea->fontId = SMALL_REGULAR_FONT;
+ subTextArea->wrapping = true;
+ subTextArea->obj.area.width = container->obj.area.width;
+ subTextArea->obj.area.height = nbgl_getTextHeightInWidth(subTextArea->fontId,
+ subTextArea->text,
+ subTextArea->obj.area.width,
+ subTextArea->wrapping);
+ container->obj.area.height += subTextArea->obj.area.height + INNER_MARGIN;
+ subTextArea->obj.alignment = NO_ALIGNMENT;
+ subTextArea->obj.alignmentMarginY = INNER_MARGIN;
+ container->children[2] = (nbgl_obj_t *) subTextArea;
+ container->nbChildren = 3;
+ }
+ else {
+ container->nbChildren = 2;
+ }
+ // set this new container as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates an area with given text and sub text (in gray)
+ *
+ * @param layout the current layout
+ * @param text main text for the switch
+ * @param subText description under main text (NULL terminated, single line, may be null)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddText(nbgl_layout_t *layout, const char *text, const char *subText)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea;
+ nbgl_text_area_t *subTextArea;
+ uint16_t fullHeight = 0;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // get container children
+ if (text != NULL) {
+ container->nbChildren++;
+ }
+ if (subText != NULL) {
+ container->nbChildren++;
+ }
+
+ container->children = nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ container->obj.area.width = AVAILABLE_WIDTH;
+
+ if (text != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+
+ textArea->textColor = BLACK;
+ textArea->text = PIC(text);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->style = NO_STYLE;
+ textArea->wrapping = true;
+ textArea->obj.alignment = NO_ALIGNMENT;
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ textArea->obj.area.width = container->obj.area.width;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ fullHeight += textArea->obj.area.height;
+ container->children[0] = (nbgl_obj_t *) textArea;
+ }
+ if (subText != NULL) {
+ subTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ subTextArea->textColor = BLACK;
+ subTextArea->text = PIC(subText);
+ subTextArea->fontId = SMALL_REGULAR_FONT;
+ subTextArea->style = NO_STYLE;
+ subTextArea->wrapping = true;
+ subTextArea->obj.area.width = container->obj.area.width;
+ subTextArea->obj.area.height = nbgl_getTextHeightInWidth(
+ subTextArea->fontId, subTextArea->text, subTextArea->obj.area.width, false);
+ subTextArea->textAlignment = MID_LEFT;
+ subTextArea->obj.alignment = NO_ALIGNMENT;
+ fullHeight += subTextArea->obj.area.height;
+ if (text != NULL) {
+ subTextArea->obj.alignmentMarginY = INTERNAL_MARGIN;
+ fullHeight += INTERNAL_MARGIN;
+ container->children[1] = (nbgl_obj_t *) subTextArea;
+ }
+ else {
+ subTextArea->obj.alignmentMarginY = BORDER_MARGIN;
+ container->children[0] = (nbgl_obj_t *) subTextArea;
+ }
+ }
+ container->obj.area.height = fullHeight + 2 * BORDER_MARGIN;
+ container->layout = VERTICAL;
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignment = NO_ALIGNMENT;
+ // set this new obj as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates an area with given text in 32px font (in Black)
+ *
+ * @param layout the current layout
+ * @param text text to be displayed (auto-wrap)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddLargeCaseText(nbgl_layout_t *layout, const char *text)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_area_t *textArea;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddLargeCaseText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+
+ textArea->textColor = BLACK;
+ textArea->text = PIC(text);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = LARGE_MEDIUM_FONT;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->wrapping = true;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = NO_ALIGNMENT;
+ textArea->obj.alignmentMarginX = BORDER_MARGIN;
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ // if first object of container, increase the margin from top
+ if (layoutInt->container->nbChildren == 0) {
+ textArea->obj.alignmentMarginY += BORDER_MARGIN;
+ }
+
+ // set this new obj as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a list of radio buttons (on the right)
+ *
+ * @param layout the current layout
+ * @param choices structure giving the list of choices and the current selected one
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddRadioChoice(nbgl_layout_t *layout, const nbgl_layoutRadioChoice_t *choices)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ uint8_t i;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddRadioChoice():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ for (i = 0; i < choices->nbChoices; i++) {
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea;
+ nbgl_radio_t *button;
+ nbgl_line_t *line;
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ button = (nbgl_radio_t *) nbgl_objPoolGet(RADIO_BUTTON, layoutInt->layer);
+
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) container, choices->token, choices->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ // get container children (max 2)
+ container->nbChildren = 2;
+ container->children = nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+
+ // init text area for this choice
+ if (choices->localized == true) {
+ textArea->localized = true;
+#if defined(HAVE_LANGUAGE_PACK)
+ textArea->textId = choices->nameIds[i];
+#endif // defined(HAVE_LANGUAGE_PACK)
+ }
+ else {
+ textArea->text = PIC(choices->names[i]);
+ }
+
+ textArea->textAlignment = MID_LEFT;
+ textArea->obj.area.width = 300;
+ textArea->obj.area.height = 24;
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = MID_LEFT;
+ textArea->obj.alignTo = (nbgl_obj_t *) container;
+ container->children[0] = (nbgl_obj_t *) textArea;
+
+ // init button for this choice
+ button->activeColor = BLACK;
+ button->borderColor = LIGHT_GRAY;
+ button->obj.alignmentMarginX = INNER_MARGIN - 4;
+ button->obj.alignTo = (nbgl_obj_t *) container;
+ button->obj.alignment = MID_RIGHT;
+ button->state = OFF_STATE;
+ container->children[1] = (nbgl_obj_t *) button;
+
+ container->obj.area.width = SCREEN_WIDTH - 2 * BORDER_MARGIN;
+ container->obj.area.height = 32;
+ container->obj.alignment = NO_ALIGNMENT;
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignmentMarginY = BORDER_MARGIN;
+ container->obj.alignTo = (nbgl_obj_t *) NULL;
+ // whole container should be touchable
+ container->obj.touchMask = (1 << TOUCHED);
+ container->obj.touchId = CONTROLS_ID + nbTouchableControls;
+ nbTouchableControls++;
+
+ // highlight init choice
+ if (i == choices->initChoice) {
+ button->state = ON_STATE;
+ textArea->textColor = BLACK;
+ textArea->fontId = SMALL_BOLD_FONT;
+ }
+ else {
+ button->state = OFF_STATE;
+ textArea->textColor = DARK_GRAY;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ }
+ line = createHorizontalLine(layoutInt->layer);
+ line->obj.alignmentMarginY = BORDER_MARGIN;
+
+ // set these new objs as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) line);
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Creates an area on the center of the main panel, with a possible icon/image,
+ * a possible text in black under it, and a possible text in gray under it
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of buttons (texts, icons, layout)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddCenteredInfo(nbgl_layout_t *layout, const nbgl_layoutCenteredInfo_t *info)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea = NULL;
+ nbgl_image_t *image = NULL;
+ uint16_t fullHeight = 0;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddCenteredInfo():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // get container children (max 5 if PLUGIN_INFO)
+ container->children
+ = nbgl_containerPoolGet((info->style == PLUGIN_INFO) ? 5 : 4, layoutInt->layer);
+ container->nbChildren = 0;
+
+ if (info->icon != NULL) {
+ image = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ image->foregroundColor = BLACK;
+ image->buffer = PIC(info->icon);
+ image->obj.area.bpp = NBGL_BPP_1;
+ image->obj.alignment = TOP_MIDDLE;
+ image->obj.alignTo = NULL;
+
+ fullHeight += image->buffer->height;
+ if ((info->style != PLUGIN_INFO)) {
+ container->children[container->nbChildren] = (nbgl_obj_t *) image;
+ container->nbChildren++;
+ }
+ }
+ if (info->text1 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(info->text1);
+ textArea->textAlignment = CENTER;
+ if ((info->style == LARGE_CASE_INFO) || (info->style == LARGE_CASE_BOLD_INFO)
+ || (info->style == PLUGIN_INFO)) {
+ textArea->fontId = LARGE_MEDIUM_FONT;
+ }
+ else {
+ textArea->fontId = SMALL_BOLD_FONT;
+ }
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+
+ textArea->style = NO_STYLE;
+ if (container->nbChildren > 0) {
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = BORDER_MARGIN + 4;
+ }
+ else {
+ textArea->obj.alignment = TOP_MIDDLE;
+ textArea->obj.alignTo = NULL;
+ }
+
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ if (info->text2 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ if ((info->style != LARGE_CASE_INFO) && (info->style != LARGE_CASE_BOLD_INFO)
+ && (info->style != PLUGIN_INFO)) {
+ textArea->textColor = DARK_GRAY;
+ }
+ else {
+ textArea->textColor = BLACK;
+ }
+ textArea->text = PIC(info->text2);
+ textArea->textAlignment = CENTER;
+ textArea->fontId
+ = (info->style != LARGE_CASE_BOLD_INFO) ? SMALL_REGULAR_FONT : SMALL_BOLD_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+
+ textArea->style = NO_STYLE;
+ if (container->nbChildren > 0) {
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ if (info->text1 != NULL) {
+ // if previous element is text1, only space of 16 px
+ textArea->obj.alignmentMarginY -= 4;
+ }
+ else {
+ // else if icon, space of 24 px
+ textArea->obj.alignmentMarginY += 4;
+ }
+ }
+ else {
+ textArea->obj.alignment = TOP_MIDDLE;
+ }
+
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ // draw small horizontal line if PLUGIN_INFO
+ if (info->style == PLUGIN_INFO) {
+ nbgl_line_t *line = createHorizontalLine(layoutInt->layer);
+ line->obj.area.width = 120;
+ line->obj.alignmentMarginY = 32;
+ line->obj.alignmentMarginX = 0;
+ line->obj.alignment = BOTTOM_MIDDLE;
+ line->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ fullHeight += 32;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) line;
+ container->nbChildren++;
+ if (image) {
+ // add icon here, under line
+ image->obj.alignmentMarginY = 32;
+ image->obj.alignment = BOTTOM_MIDDLE;
+ image->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ container->children[container->nbChildren] = (nbgl_obj_t *) image;
+ container->nbChildren++;
+ fullHeight += 32;
+ }
+ }
+ if (info->text3 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(info->text3);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->style = NO_STYLE;
+ if (container->nbChildren > 0) {
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ }
+ else {
+ textArea->obj.alignment = TOP_MIDDLE;
+ textArea->obj.alignTo = NULL;
+ }
+
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ container->obj.area.height = fullHeight;
+ container->layout = VERTICAL;
+ if (info->onTop) {
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignmentMarginY = BORDER_MARGIN + info->offsetY;
+ container->obj.alignment = NO_ALIGNMENT;
+ }
+ else {
+ container->obj.alignmentMarginY = info->offsetY;
+ container->obj.alignment = CENTER;
+ }
+
+ container->obj.area.width = AVAILABLE_WIDTH;
+
+ // set this new container as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+#else // HAVE_SE_TOUCH
+/**
+ * @brief Creates an area with given text and sub text, using the given style
+ *
+ * @param layout the current layout
+ * @param text main text for the switch
+ * @param subText description under main text (NULL terminated, single line, may be null)
+ * @param style if @ref REGULAR_INFO, use regular font for text, otherwise use bold font for text
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddText(nbgl_layout_t *layout,
+ const char *text,
+ const char *subText,
+ nbgl_centeredInfoStyle_t style)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea;
+ uint16_t fullHeight = 0;
+
+ UNUSED(subText);
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // get container children
+ container->nbChildren = 1;
+ if (subText != NULL) {
+ container->nbChildren++;
+ }
+
+ container->children = nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ container->obj.area.width = AVAILABLE_WIDTH;
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(text);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = (style == REGULAR_INFO) ? BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp
+ : BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+
+ uint16_t nbLines
+ = nbgl_getTextNbLinesInWidth(textArea->fontId, textArea->text, AVAILABLE_WIDTH, true);
+ // if more than available lines on screen
+ if (nbLines > NB_MAX_LINES) {
+ uint16_t len;
+
+ nbLines = NB_MAX_LINES;
+ textArea->nbMaxLines = NB_MAX_LINES;
+ nbgl_getTextMaxLenInNbLines(
+ textArea->fontId, textArea->text, AVAILABLE_WIDTH, nbLines, &len, true);
+ textArea->len = len;
+ }
+ const nbgl_font_t *font = nbgl_getFont(textArea->fontId);
+ textArea->obj.area.height = nbLines * font->line_height;
+ textArea->wrapping = true;
+ textArea->obj.alignment = TOP_MIDDLE;
+ fullHeight += textArea->obj.area.height;
+ container->children[0] = (nbgl_obj_t *) textArea;
+
+ if (subText != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(subText);
+ textArea->wrapping = true;
+ textArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ nbLines
+ = nbgl_getTextNbLinesInWidth(textArea->fontId, textArea->text, AVAILABLE_WIDTH, true);
+ // if more than available lines on screen
+ if (nbLines > (NB_MAX_LINES - 1)) {
+ uint16_t len;
+ nbLines = NB_MAX_LINES - 1;
+ textArea->nbMaxLines = nbLines;
+ nbgl_getTextMaxLenInNbLines(
+ textArea->fontId, textArea->text, AVAILABLE_WIDTH, nbLines, &len, true);
+ textArea->len = len;
+ }
+ textArea->obj.area.height = nbLines * font->line_height;
+ textArea->textAlignment = CENTER;
+ textArea->obj.alignment = NO_ALIGNMENT;
+ textArea->obj.alignmentMarginY = 2;
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+ container->children[1] = (nbgl_obj_t *) textArea;
+ }
+ container->obj.area.height = fullHeight;
+ container->layout = VERTICAL;
+ container->obj.alignment = CENTER;
+ // set this new obj as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a menu list (only for nanos) with the given parameters. The navigation (and
+ * selection) must be handled by the caller
+ *
+ * @param layout the current layout
+ * @param list structure giving the list of choices and the current selected one
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddMenuList(nbgl_layout_t *layout, nbgl_layoutMenuList_t *list)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ uint8_t i;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddMenuList():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ for (i = 0; i < list->nbChoices; i++) {
+ nbgl_text_area_t *textArea;
+
+ // check whether this object is visible or not
+ // only the two objects above or below the selected one are visible
+ if (((list->selectedChoice > 2) && (i < (list->selectedChoice - 2)))
+ || (i > (list->selectedChoice + 2))) {
+ continue;
+ }
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+
+ // init text area for this choice
+ textArea->text = list->callback(i);
+ textArea->textAlignment = CENTER;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = 12;
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = CENTER;
+ textArea->obj.alignmentMarginY = ((i - list->selectedChoice) * 16);
+ textArea->textColor = WHITE;
+
+ // highlight init choice
+ if (i == list->selectedChoice) {
+ textArea->fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+ }
+ else {
+ textArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ }
+
+ // set this new obj as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Creates an area on the center of the main panel, with a possible icon/image,
+ * a possible text in black under it, and a possible text in gray under it
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of buttons (texts, icons, layout)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddCenteredInfo(nbgl_layout_t *layout, const nbgl_layoutCenteredInfo_t *info)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea = NULL;
+ nbgl_image_t *image = NULL;
+ uint16_t fullHeight = 0;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddCenteredInfo():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // 3 children at max
+ container->children = nbgl_containerPoolGet(3, layoutInt->layer);
+ container->nbChildren = 0;
+ if (info->icon != NULL) {
+ image = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ image->foregroundColor = WHITE;
+ image->buffer = PIC(info->icon);
+ image->obj.area.bpp = NBGL_BPP_1;
+ image->obj.alignment = TOP_MIDDLE;
+ image->obj.alignTo = NULL;
+
+ fullHeight += image->buffer->height;
+ container->children[container->nbChildren] = (nbgl_obj_t *) image;
+ container->nbChildren++;
+ }
+ if (info->text1 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(info->text1);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = (info->style == REGULAR_INFO) ? BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp
+ : BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->wrapping = true;
+ uint16_t nbLines
+ = nbgl_getTextNbLinesInWidth(textArea->fontId, textArea->text, AVAILABLE_WIDTH, true);
+ // if more than available lines on screen
+ if (nbLines > NB_MAX_LINES) {
+ uint16_t len;
+ nbLines = NB_MAX_LINES;
+ textArea->nbMaxLines = NB_MAX_LINES;
+ nbgl_getTextMaxLenInNbLines(
+ textArea->fontId, textArea->text, AVAILABLE_WIDTH, nbLines, &len, true);
+ textArea->len = len;
+ }
+ const nbgl_font_t *font = nbgl_getFont(textArea->fontId);
+ textArea->obj.area.height = nbLines * font->line_height;
+ textArea->style = NO_STYLE;
+ if (info->icon != NULL) {
+ textArea->obj.alignment = BOTTOM_MIDDLE; // under icon
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = (nbLines < 3) ? 4 : 0;
+ }
+ else if (info->text2 == NULL) {
+ textArea->obj.alignment = CENTER;
+ textArea->obj.alignTo = NULL;
+ }
+ else {
+ textArea->obj.alignment = TOP_MIDDLE;
+ textArea->obj.alignTo = NULL;
+ }
+
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ if (info->text2 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(info->text2);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ uint16_t nbLines
+ = nbgl_getTextNbLinesInWidth(textArea->fontId, textArea->text, AVAILABLE_WIDTH, true);
+ // if more than available lines on screen
+ if (nbLines > (NB_MAX_LINES - 1)) {
+ uint16_t len;
+ nbLines = NB_MAX_LINES - 1;
+ textArea->nbMaxLines = nbLines;
+ nbgl_getTextMaxLenInNbLines(
+ textArea->fontId, textArea->text, AVAILABLE_WIDTH, nbLines, &len, true);
+ textArea->len = len;
+ }
+ const nbgl_font_t *font = nbgl_getFont(textArea->fontId);
+ textArea->obj.area.height = nbLines * font->line_height;
+
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = 2;
+
+ fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ container->obj.area.height = fullHeight;
+ container->layout = VERTICAL;
+ container->obj.alignmentMarginY = 0;
+ if (info->onTop) {
+ container->obj.alignment = TOP_MIDDLE;
+ }
+ else {
+ container->obj.alignment = CENTER;
+ }
+
+ container->obj.area.width = AVAILABLE_WIDTH;
+
+ // set this new container as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+
+#ifdef NBGL_QRCODE
+/**
+ * @brief Creates an area on the center of the main panel, with a QRCode,
+ * a possible text in black (bold) under it, and a possible text in black under it
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of buttons (texts, icons, layout)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddQRCode(nbgl_layout_t *layout, const nbgl_layoutQRCode_t *info)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_text_area_t *textArea = NULL;
+ nbgl_qrcode_t *qrcode;
+ uint16_t fullHeight = 0;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddQRCode():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // get container children (max 2 (QRCode + text1/text2))
+ container->children = nbgl_containerPoolGet(2, layoutInt->layer);
+ container->nbChildren = 0;
+
+ qrcode = (nbgl_qrcode_t *) nbgl_objPoolGet(QR_CODE, layoutInt->layer);
+ // version is forced to V10 if url is longer than 62 characters
+ if (strlen(PIC(info->url)) > 62) {
+ qrcode->version = QRCODE_V10;
+ }
+ else {
+ qrcode->version = QRCODE_V4;
+ }
+ qrcode->foregroundColor = BLACK;
+ // in QR V4, we use 8*8 screen pixels for one QR pixel
+ // in QR V10, we use 4*4 screen pixels for one QR pixel
+ qrcode->obj.area.width
+ = (qrcode->version == QRCODE_V4) ? (QR_V4_NB_PIX_SIZE * 8) : (QR_V10_NB_PIX_SIZE * 4);
+ qrcode->obj.area.height = qrcode->obj.area.width;
+ qrcode->text = PIC(info->url);
+ qrcode->obj.area.bpp = NBGL_BPP_1;
+ qrcode->obj.alignment = TOP_MIDDLE;
+ qrcode->obj.alignmentMarginY = 24;
+
+ fullHeight += qrcode->obj.area.height;
+ container->children[container->nbChildren] = (nbgl_obj_t *) qrcode;
+ container->nbChildren++;
+
+ if (info->text1 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(info->text1);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = (info->largeText1 == true) ? LARGE_MEDIUM_FONT : SMALL_REGULAR_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = 40;
+
+ fullHeight += textArea->obj.area.height;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ else if (info->text2 != NULL) {
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = DARK_GRAY;
+ textArea->text = PIC(info->text2);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.alignTo = (nbgl_obj_t *) container->children[container->nbChildren - 1];
+ textArea->obj.alignmentMarginY = 40;
+
+ fullHeight += textArea->obj.area.height;
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) textArea;
+ container->nbChildren++;
+ }
+ container->obj.area.height = fullHeight;
+ container->layout = VERTICAL;
+ // center the QRCode only if it's the first (and probably only) child
+ if (layoutInt->container->nbChildren == 0) {
+ container->obj.alignment = CENTER;
+ }
+ else {
+ container->obj.alignment = BOTTOM_MIDDLE;
+ container->obj.alignmentMarginY = BORDER_MARGIN;
+ container->obj.alignTo
+ = layoutInt->container->children[layoutInt->container->nbChildren - 1];
+ }
+
+ container->obj.area.width = AVAILABLE_WIDTH;
+
+ // set this new container as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+#endif // NBGL_QRCODE
+
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief Creates two buttons to make a choice. Both buttons are mandatory
+ *
+ * @param layout the current layout
+ * @param info structure giving the description of buttons (texts, icons, layout)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddChoiceButtons(nbgl_layout_t *layout, const nbgl_layoutChoiceButtons_t *info)
+{
+ layoutObj_t *obj;
+ nbgl_button_t *topButton, *bottomButton;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddChoiceButtons():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // texts cannot be NULL
+ if ((info->bottomText == NULL) || (info->topText == NULL)) {
+ return -1;
+ }
+
+ // create bottomButton (in white) at first
+ bottomButton = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) bottomButton, info->token, info->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+ // associate with with index 1
+ obj->index = 1;
+ bottomButton->obj.alignment = BOTTOM_MIDDLE;
+ if (info->style == ROUNDED_AND_FOOTER_STYLE) {
+ bottomButton->obj.alignmentMarginY = 4; // 4 pixels from screen bottom
+ bottomButton->borderColor = WHITE;
+ }
+ else if (info->style == BOTH_ROUNDED_STYLE) {
+ bottomButton->obj.alignmentMarginY = BORDER_MARGIN; // 24 pixels from screen bottom
+ bottomButton->borderColor = LIGHT_GRAY;
+ }
+ bottomButton->innerColor = WHITE;
+ bottomButton->foregroundColor = BLACK;
+ bottomButton->obj.area.width = AVAILABLE_WIDTH;
+ bottomButton->obj.area.height = BUTTON_DIAMETER;
+ bottomButton->radius = BUTTON_RADIUS;
+ bottomButton->text = PIC(info->bottomText);
+ bottomButton->fontId = SMALL_BOLD_FONT;
+ bottomButton->obj.touchMask = (1 << TOUCHED);
+ bottomButton->obj.touchId = CHOICE_2_ID;
+ // set this new button as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) bottomButton);
+
+ // then black button, on top of it
+ topButton = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) topButton, info->token, info->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+ // associate with with index 0
+ obj->index = 0;
+ topButton->obj.alignment = TOP_MIDDLE;
+ topButton->obj.alignTo = (nbgl_obj_t *) bottomButton;
+ if (info->style == BOTH_ROUNDED_STYLE) {
+ topButton->obj.alignmentMarginY = INNER_MARGIN; // 12 pixels from bottom button
+ }
+ else {
+ topButton->obj.alignmentMarginY = 4; // 4 pixels from bottom button
+ }
+ topButton->innerColor = BLACK;
+ topButton->borderColor = BLACK;
+ topButton->foregroundColor = WHITE;
+ topButton->obj.area.width = bottomButton->obj.area.width;
+ topButton->obj.area.height = BUTTON_DIAMETER;
+ topButton->radius = BUTTON_RADIUS;
+ topButton->text = PIC(info->topText);
+ topButton->fontId = SMALL_BOLD_FONT;
+ topButton->obj.touchMask = (1 << TOUCHED);
+ topButton->obj.touchId = CHOICE_1_ID;
+ // set this new button as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) topButton);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a list of [tag,value] pairs
+ *
+ * @param layout the current layout
+ * @param list structure giving the list of [tag,value] pairs
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddTagValueList(nbgl_layout_t *layout, const nbgl_layoutTagValueList_t *list)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_area_t *itemTextArea;
+ nbgl_text_area_t *valueTextArea;
+ nbgl_container_t *container;
+ uint8_t i;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddTagValueList():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ for (i = 0; i < list->nbPairs; i++) {
+ const nbgl_layoutTagValue_t *pair;
+ uint16_t fullHeight = 0, usableWidth;
+
+ if (list->pairs != NULL) {
+ pair = &list->pairs[i];
+ }
+ else {
+ pair = list->callback(list->startIndex + i);
+ }
+ // width that can be used for item and text
+ usableWidth = AVAILABLE_WIDTH;
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+
+ // get container children (max 3 if a valueIcon, otherwise 2)
+ container->children
+ = nbgl_containerPoolGet((pair->valueIcon != NULL) ? 3 : 2, layoutInt->layer);
+
+ itemTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ valueTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+
+ // init text area for this choice
+ itemTextArea->textColor = DARK_GRAY;
+ itemTextArea->text = PIC(pair->item);
+ itemTextArea->textAlignment = MID_LEFT;
+ itemTextArea->fontId = SMALL_REGULAR_FONT;
+ itemTextArea->wrapping = true;
+ itemTextArea->obj.area.width = usableWidth;
+ itemTextArea->obj.area.height = nbgl_getTextHeightInWidth(
+ itemTextArea->fontId, itemTextArea->text, usableWidth, itemTextArea->wrapping);
+ itemTextArea->style = NO_STYLE;
+ itemTextArea->obj.alignment = NO_ALIGNMENT;
+ itemTextArea->obj.alignmentMarginX = 0;
+ itemTextArea->obj.alignmentMarginY = 0;
+ itemTextArea->obj.alignTo = NULL;
+ container->children[container->nbChildren] = (nbgl_obj_t *) itemTextArea;
+ container->nbChildren++;
+
+ fullHeight += itemTextArea->obj.area.height;
+
+ // init button for this choice
+ valueTextArea->textColor = BLACK;
+ valueTextArea->text = PIC(pair->value);
+ valueTextArea->textAlignment = MID_LEFT;
+ if (list->smallCaseForValue) {
+ valueTextArea->fontId = SMALL_REGULAR_FONT;
+ }
+ else {
+ valueTextArea->fontId = LARGE_MEDIUM_FONT;
+ }
+ if (pair->valueIcon == NULL) {
+ valueTextArea->obj.area.width = usableWidth;
+ }
+ else {
+ // we assume that value is single line
+ valueTextArea->obj.area.width
+ = nbgl_getTextWidth(valueTextArea->fontId, valueTextArea->text);
+ }
+
+ // handle the nbMaxLinesForValue parameter, used to automatically keep only
+ // nbMaxLinesForValue lines
+ uint16_t nbLines = nbgl_getTextNbLinesInWidth(
+ valueTextArea->fontId, valueTextArea->text, usableWidth, list->wrapping);
+ // use this nbMaxLinesForValue parameter only if >0
+ if ((list->nbMaxLinesForValue > 0) && (nbLines > list->nbMaxLinesForValue)) {
+ nbLines = list->nbMaxLinesForValue;
+ valueTextArea->nbMaxLines = list->nbMaxLinesForValue;
+ }
+ const nbgl_font_t *font = nbgl_getFont(valueTextArea->fontId);
+ valueTextArea->obj.area.height = nbLines * font->line_height;
+ valueTextArea->style = NO_STYLE;
+ valueTextArea->obj.alignment = BOTTOM_LEFT;
+ valueTextArea->obj.alignmentMarginY = 4;
+ valueTextArea->obj.alignTo = (nbgl_obj_t *) itemTextArea;
+ valueTextArea->wrapping = list->wrapping;
+ container->children[container->nbChildren] = (nbgl_obj_t *) valueTextArea;
+ container->nbChildren++;
+
+ fullHeight += valueTextArea->obj.area.height;
+ if (pair->valueIcon != NULL) {
+ nbgl_image_t *image = (nbgl_image_t *) nbgl_objPoolGet(IMAGE, layoutInt->layer);
+ layoutObj_t *obj
+ = addCallbackObj(layoutInt, (nbgl_obj_t *) image, list->token, TUNE_TAP_CASUAL);
+ obj->index = i;
+ image->foregroundColor = BLACK;
+ image->buffer = PIC(pair->valueIcon);
+ image->obj.alignment = MID_RIGHT;
+ image->obj.alignmentMarginX = 4;
+ image->obj.alignTo = (nbgl_obj_t *) valueTextArea;
+ image->obj.touchMask = (1 << TOUCHED);
+
+ container->children[container->nbChildren] = (nbgl_obj_t *) image;
+ container->nbChildren++;
+ }
+
+ container->obj.area.width = usableWidth;
+ container->obj.area.height = fullHeight;
+ container->layout = VERTICAL;
+ container->obj.alignmentMarginX = BORDER_MARGIN;
+ container->obj.alignmentMarginY = 12;
+ container->obj.alignment = NO_ALIGNMENT;
+
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+ }
+
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+
+/**
+ * @brief Creates an area in main panel to display a progress bar, with a title text and a
+ * description under the progress
+ *
+ * @param layout the current layout
+ * @param barLayout structure giving the description of progress bar
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddProgressBar(nbgl_layout_t *layout, const nbgl_layoutProgressBar_t *barLayout)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_progress_bar_t *progress;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddProgressBar():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+#ifdef HAVE_SE_TOUCH
+ if (barLayout->text != NULL) {
+ nbgl_text_area_t *textArea;
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA,
+ ((nbgl_layoutInternal_t *) layout)->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(barLayout->text);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = NO_ALIGNMENT;
+ textArea->obj.alignmentMarginX = BORDER_MARGIN;
+ textArea->obj.alignmentMarginY = BORDER_MARGIN;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+ }
+ progress = (nbgl_progress_bar_t *) nbgl_objPoolGet(PROGRESS_BAR,
+ ((nbgl_layoutInternal_t *) layout)->layer);
+ progress->foregroundColor = BLACK;
+ progress->withBorder = true;
+ progress->state = barLayout->percentage;
+ progress->obj.area.width = 120;
+ progress->obj.area.height = 12;
+ progress->obj.alignment = NO_ALIGNMENT;
+ progress->obj.alignmentMarginX = (AVAILABLE_WIDTH - progress->obj.area.width) / 2;
+ progress->obj.alignmentMarginY = BORDER_MARGIN;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) progress);
+
+ if (barLayout->subText != NULL) {
+ nbgl_text_area_t *subTextArea;
+
+ subTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(
+ TEXT_AREA, ((nbgl_layoutInternal_t *) layout)->layer);
+ subTextArea->textColor = LIGHT_GRAY;
+ subTextArea->text = PIC(barLayout->subText);
+ subTextArea->textAlignment = MID_LEFT;
+ subTextArea->fontId = SMALL_REGULAR_FONT;
+ subTextArea->wrapping = true;
+ subTextArea->obj.area.width = AVAILABLE_WIDTH;
+ subTextArea->obj.area.height = nbgl_getTextHeightInWidth(subTextArea->fontId,
+ subTextArea->text,
+ subTextArea->obj.area.width,
+ subTextArea->wrapping);
+ subTextArea->style = NO_STYLE;
+ subTextArea->obj.alignment = NO_ALIGNMENT;
+ subTextArea->obj.alignmentMarginX = BORDER_MARGIN;
+ subTextArea->obj.alignmentMarginY = BORDER_MARGIN;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) subTextArea);
+ }
+#else // HAVE_SE_TOUCH
+ if (barLayout->text != NULL) {
+ nbgl_text_area_t *textArea;
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA,
+ ((nbgl_layoutInternal_t *) layout)->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(barLayout->text);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeight(textArea->fontId, textArea->text);
+ textArea->obj.alignment = TOP_MIDDLE;
+ textArea->obj.alignmentMarginX = 0;
+ textArea->obj.alignmentMarginY = 16; // 16 px from top
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+ }
+ progress = (nbgl_progress_bar_t *) nbgl_objPoolGet(PROGRESS_BAR,
+ ((nbgl_layoutInternal_t *) layout)->layer);
+ progress->foregroundColor = WHITE;
+ progress->withBorder = true;
+ progress->state = barLayout->percentage;
+ progress->obj.area.width = 102;
+ progress->obj.area.height = 14;
+ progress->obj.alignment = TOP_MIDDLE;
+ progress->obj.alignmentMarginX = 0;
+ progress->obj.alignmentMarginY = 33; // 33px from top
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) progress);
+
+ if (barLayout->subText != NULL) {
+ nbgl_text_area_t *subTextArea;
+
+ subTextArea = (nbgl_text_area_t *) nbgl_objPoolGet(
+ TEXT_AREA, ((nbgl_layoutInternal_t *) layout)->layer);
+ subTextArea->textColor = WHITE;
+ subTextArea->text = PIC(barLayout->subText);
+ subTextArea->textAlignment = CENTER;
+ subTextArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ subTextArea->obj.area.width = AVAILABLE_WIDTH;
+ subTextArea->obj.area.height = nbgl_getTextHeight(subTextArea->fontId, subTextArea->text);
+ subTextArea->obj.alignment = BOTTOM_MIDDLE;
+ subTextArea->obj.alignTo = (nbgl_obj_t *) progress;
+ subTextArea->obj.alignmentMarginX = 0;
+ subTextArea->obj.alignmentMarginY = 4;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) subTextArea);
+ }
+#endif // HAVE_SE_TOUCH
+
+ return 0;
+}
+
+#ifdef HAVE_SE_TOUCH
+
+/**
+ * @brief adds a separation line on bottom of the last added item
+ *
+ * @param layout the current layout
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddSeparationLine(nbgl_layout_t *layout)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_line_t *line;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddSeparationLine():\n");
+ line = createHorizontalLine(layoutInt->layer);
+ line->obj.alignmentMarginY = -4;
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) line);
+ return 0;
+}
+
+/**
+ * @brief Creates a rounded button in the main container.
+ *
+ * @param layout the current layout
+ * @param buttonInfo structure giving the description of button (text, icon, layout)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddButton(nbgl_layout_t *layout, const nbgl_layoutButton_t *buttonInfo)
+{
+ layoutObj_t *obj;
+ nbgl_button_t *button;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) button, buttonInfo->token, buttonInfo->tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ button->obj.alignmentMarginY = BORDER_MARGIN;
+ if (buttonInfo->onBottom != true) {
+ button->obj.alignmentMarginX = BORDER_MARGIN;
+ button->obj.alignment = NO_ALIGNMENT;
+ }
+ else {
+ button->obj.alignment = BOTTOM_MIDDLE;
+ }
+ if (buttonInfo->style == BLACK_BACKGROUND) {
+ button->innerColor = BLACK;
+ button->foregroundColor = WHITE;
+ }
+ else {
+ button->innerColor = WHITE;
+ button->foregroundColor = BLACK;
+ }
+ if (buttonInfo->style == NO_BORDER) {
+ button->borderColor = WHITE;
+ }
+ else {
+ if (buttonInfo->style == BLACK_BACKGROUND) {
+ button->borderColor = BLACK;
+ }
+ else {
+ button->borderColor = LIGHT_GRAY;
+ }
+ }
+ button->text = PIC(buttonInfo->text);
+ button->fontId = SMALL_BOLD_FONT;
+ button->icon = PIC(buttonInfo->icon);
+ if (buttonInfo->fittingContent == true) {
+ button->obj.area.width = nbgl_getTextWidth(button->fontId, button->text) + 64
+ + ((button->icon) ? (button->icon->width + 8) : 0);
+ button->obj.area.height = 64;
+ button->radius = RADIUS_32_PIXELS;
+ if (buttonInfo->onBottom != true) {
+ button->obj.alignmentMarginX
+ += (SCREEN_WIDTH - 2 * BORDER_MARGIN - button->obj.area.width) / 2;
+ }
+ }
+ else {
+ button->obj.area.width = AVAILABLE_WIDTH;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ }
+ button->obj.alignTo = NULL;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = SINGLE_BUTTON_ID;
+ // set this new button as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) button);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a long press button in the main container.
+ *
+ * @param layout the current layout
+ * @param text text of the button button
+ * @param token token attached to actionCallback when long time of press is elapsed
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when button is long pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddLongPressButton(nbgl_layout_t *layout,
+ const char *text,
+ uint8_t token,
+ tune_index_e tuneId)
+{
+ layoutObj_t *obj;
+ nbgl_button_t *button;
+ nbgl_text_area_t *textArea;
+ nbgl_progress_bar_t *progressBar;
+ nbgl_container_t *container;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_line_t *line;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddLongPressButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) container, token, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ container->obj.area.width = SCREEN_WIDTH;
+ container->obj.area.height = 128;
+ container->layout = VERTICAL;
+ container->nbChildren = 4; // progress-bar + text + line + button
+ container->children
+ = (nbgl_obj_t **) nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ container->obj.alignment = BOTTOM_MIDDLE;
+ container->obj.touchId = LONG_PRESS_BUTTON_ID;
+ container->obj.touchMask = ((1 << TOUCHING) | (1 << TOUCH_RELEASED) | (1 << OUT_OF_TOUCH));
+
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ button->obj.alignmentMarginX = BORDER_MARGIN;
+ button->obj.alignment = MID_RIGHT;
+ button->innerColor = BLACK;
+ button->foregroundColor = WHITE;
+ button->borderColor = BLACK;
+ button->obj.area.width = BUTTON_DIAMETER;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->icon = PIC(&C_check32px);
+ container->children[0] = (nbgl_obj_t *) button;
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(text);
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = LARGE_MEDIUM_FONT;
+ textArea->wrapping = true;
+ textArea->obj.area.width
+ = container->obj.area.width - 3 * BORDER_MARGIN - button->obj.area.width;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->style = NO_STYLE;
+ textArea->obj.alignment = MID_LEFT;
+ textArea->obj.alignmentMarginX = BORDER_MARGIN;
+ container->children[1] = (nbgl_obj_t *) textArea;
+
+ line = createHorizontalLine(layoutInt->layer);
+ line->offset = 3;
+ line->obj.alignment = TOP_MIDDLE;
+ container->children[2] = (nbgl_obj_t *) line;
+
+ progressBar = (nbgl_progress_bar_t *) nbgl_objPoolGet(PROGRESS_BAR, layoutInt->layer);
+ progressBar->withBorder = false;
+ progressBar->obj.area.width = container->obj.area.width;
+ progressBar->obj.area.height = 8;
+ progressBar->obj.alignment = TOP_MIDDLE;
+ progressBar->obj.alignmentMarginY = 4;
+ progressBar->obj.alignTo = NULL;
+ container->children[3] = (nbgl_obj_t *) progressBar;
+
+ // set this new container as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a touchable text at the footer of the screen, separated with a thin line from the
+ * rest of the screen.
+ *
+ * @param layout the current layout
+ * @param text text to used in the footer
+ * @param token token to use when the footer is touched
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when button is long pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddFooter(nbgl_layout_t *layout,
+ const char *text,
+ uint8_t token,
+ tune_index_e tuneId)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ nbgl_text_area_t *textArea;
+ nbgl_line_t *line;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddFooter():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) textArea, token, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->textColor = BLACK;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = BUTTON_DIAMETER;
+ textArea->text = PIC(text);
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->textAlignment = CENTER;
+ textArea->obj.touchMask = (1 << TOUCHED);
+ textArea->obj.touchId = BOTTOM_BUTTON_ID;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) textArea;
+ layoutInt->nbChildren++;
+
+ line = createHorizontalLine(layoutInt->layer);
+ line->obj.alignTo = (nbgl_obj_t *) textArea;
+ line->obj.alignment = TOP_MIDDLE;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) line;
+ layoutInt->nbChildren++;
+
+ layoutInt->container->obj.area.height -= textArea->obj.area.height + line->obj.area.height;
+
+ return 0;
+}
+
+/**
+ * @brief Creates 2 touchable texts at the footer of the screen, separated with a thin line from the
+ * rest of the screen, and from each other.
+ *
+ * @param layout the current layout
+ * @param leftText text to used in the left part of footer
+ * @param leftToken token to use when the left part of footer is touched
+ * @param rightText text to used in the right part of footer
+ * @param rightToken token to use when the right part of footer is touched
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when button is long pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddSplitFooter(nbgl_layout_t *layout,
+ const char *leftText,
+ uint8_t leftToken,
+ const char *rightText,
+ uint8_t rightToken,
+ tune_index_e tuneId)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ layoutObj_t *obj;
+ nbgl_text_area_t *textArea;
+ nbgl_line_t *line;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddSplitFooter():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create left touchable text
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) textArea, leftToken, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ textArea->obj.alignment = BOTTOM_LEFT;
+ textArea->textColor = BLACK;
+ textArea->obj.area.width = AVAILABLE_WIDTH / 2;
+ textArea->obj.area.height = BUTTON_DIAMETER;
+ textArea->text = PIC(leftText);
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->textAlignment = CENTER;
+ textArea->obj.touchMask = (1 << TOUCHED);
+ textArea->obj.touchId = BOTTOM_BUTTON_ID;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) textArea;
+ layoutInt->nbChildren++;
+
+ // create right touchable text
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) textArea, rightToken, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ textArea->obj.alignment = BOTTOM_RIGHT;
+ textArea->textColor = BLACK;
+ textArea->obj.area.width = AVAILABLE_WIDTH / 2;
+ textArea->obj.area.height = BUTTON_DIAMETER;
+ textArea->text = PIC(rightText);
+ textArea->fontId = SMALL_BOLD_FONT;
+ textArea->textAlignment = CENTER;
+ textArea->obj.touchMask = (1 << TOUCHED);
+ textArea->obj.touchId = RIGHT_BUTTON_ID;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) textArea;
+ layoutInt->nbChildren++;
+
+ // create horizontal line separating footer from main container
+ line = createHorizontalLine(layoutInt->layer);
+ line->obj.alignTo = layoutInt->children[layoutInt->nbChildren - 2];
+ line->obj.alignment = TOP_LEFT;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) line;
+ layoutInt->nbChildren++;
+
+ // create vertical line separating both text areas
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, layoutInt->layer);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.area.width = 1;
+ line->obj.area.height = textArea->obj.area.height + 4;
+ line->direction = VERTICAL;
+ line->thickness = 1;
+ line->obj.alignment = BOTTOM_MIDDLE;
+ layoutInt->children[layoutInt->nbChildren] = (nbgl_obj_t *) line;
+ layoutInt->nbChildren++;
+
+ layoutInt->container->obj.area.height -= textArea->obj.area.height + 4;
+
+ return 0;
+}
+
+/**
+ * @brief Creates a kind of navigation bar with an optional <- arrow on the left. This widget is
+ * placed on top of the main container
+ *
+ * @param layout the current layout
+ * @param activePage current page [O,(nbPages-1)]
+ * @param nbPages number of pages
+ * @param withBack if true, the back arrow is drawn
+ * @param backToken token used with actionCallback is withBack is true
+ * @param tuneId if not @ref NBGL_NO_TUNE, a tune will be played when back button is pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddProgressIndicator(nbgl_layout_t *layout,
+ uint8_t activePage,
+ uint8_t nbPages,
+ bool withBack,
+ uint8_t backToken,
+ tune_index_e tuneId)
+{
+ layoutObj_t *obj;
+ nbgl_container_t *container;
+ nbgl_button_t *button;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddProgressIndicator():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ container->obj.area.width = SCREEN_WIDTH;
+ container->obj.area.height = BUTTON_DIAMETER + 8;
+ container->layout = VERTICAL;
+ container->nbChildren = 2;
+ container->children
+ = (nbgl_obj_t **) nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ container->obj.alignment = TOP_MIDDLE;
+ container->obj.alignTo = NULL;
+
+ if (nbPages > 1) {
+ nbgl_page_indicator_t *navigationBar;
+
+ navigationBar = (nbgl_page_indicator_t *) nbgl_objPoolGet(PAGE_INDICATOR, layoutInt->layer);
+ navigationBar->activePage = activePage;
+ navigationBar->nbPages = nbPages;
+ navigationBar->obj.area.width = SCREEN_WIDTH - 2 * 100;
+ navigationBar->obj.alignment = CENTER;
+ container->children[0] = (nbgl_obj_t *) navigationBar;
+ }
+
+ if ((withBack == true) && ((nbPages < 2) || (activePage > 0))) {
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) button, backToken, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ button->obj.alignment = MID_LEFT;
+ button->innerColor = WHITE;
+ button->foregroundColor = BLACK;
+ button->borderColor = WHITE;
+ button->obj.area.width = BUTTON_DIAMETER;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->text = NULL;
+ button->icon = PIC(&C_leftArrow32px);
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = BACK_BUTTON_ID;
+ container->children[1] = (nbgl_obj_t *) button;
+ }
+
+ // set this new container as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ return 0;
+}
+
+/**
+ * @brief Creates a centered (vertically & horizontally) spinner with a text under it
+ *
+ * @param layout the current layout
+ * @param text text to draw under the spinner
+ * @param fixed if set to true, the spinner won't spin and be entirely black
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddSpinner(nbgl_layout_t *layout, const char *text, bool fixed)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_area_t *textArea;
+ nbgl_spinner_t *spinner;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddSpinner():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create spinner
+ spinner = (nbgl_spinner_t *) nbgl_objPoolGet(SPINNER, layoutInt->layer);
+ spinner->position = fixed ? 0xFF : 0;
+ spinner->obj.alignmentMarginY = -20;
+ spinner->obj.alignTo = NULL;
+ spinner->obj.alignment = CENTER;
+ // set this new spinner as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) spinner);
+
+ // create text area
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ textArea->text = PIC(text);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = SMALL_REGULAR_FONT;
+ textArea->wrapping = true;
+ textArea->obj.alignmentMarginY = 20;
+ textArea->obj.alignTo = (nbgl_obj_t *) spinner;
+ textArea->obj.alignment = BOTTOM_MIDDLE;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = nbgl_getTextHeightInWidth(
+ textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
+ textArea->style = NO_STYLE;
+
+ // set this new spinner as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+
+ if (!fixed) {
+ // update ticker to update the spinner periodically
+ nbgl_screenTickerConfiguration_t tickerCfg;
+
+ tickerCfg.tickerIntervale = SPINNER_REFRESH_PERIOD; // ms
+ tickerCfg.tickerValue = SPINNER_REFRESH_PERIOD; // ms
+ tickerCfg.tickerCallback = &spinnerTickerCallback;
+ nbgl_screenUpdateTicker(layoutInt->layer, &tickerCfg);
+ }
+
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+
+#ifdef NBGL_KEYBOARD
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief Creates a keyboard on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param kbdInfo configuration of the keyboard to draw (including the callback when touched)
+ * @return the index of keyboard, to use in @ref nbgl_layoutUpdateKeyboard()
+ */
+int nbgl_layoutAddKeyboard(nbgl_layout_t *layout, const nbgl_layoutKbd_t *kbdInfo)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keyboard_t *keyboard;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddKeyboard():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create keyboard
+ keyboard = (nbgl_keyboard_t *) nbgl_objPoolGet(KEYBOARD, layoutInt->layer);
+ keyboard->obj.alignmentMarginY = 64;
+ keyboard->obj.alignment = BOTTOM_MIDDLE;
+ keyboard->borderColor = LIGHT_GRAY;
+ keyboard->callback = PIC(kbdInfo->callback);
+ keyboard->lettersOnly = kbdInfo->lettersOnly;
+ keyboard->mode = kbdInfo->mode;
+ keyboard->keyMask = kbdInfo->keyMask;
+ keyboard->casing = kbdInfo->casing;
+ // set this new keyboard as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) keyboard);
+
+ // return index of keyboard to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing keyboard on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddKeyboard()
+ * @param keyMask mask of keys to activate/deactivate on keyboard
+ * @param updateCasing if true, update keyboard casing with given value
+ * @param casing casing to use
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateKeyboard(nbgl_layout_t *layout,
+ uint8_t index,
+ uint32_t keyMask,
+ bool updateCasing,
+ keyboardCase_t casing)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keyboard_t *keyboard;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateKeyboard(): keyMask = 0x%X\n", keyMask);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get keyboard at given index
+ keyboard = (nbgl_keyboard_t *) layoutInt->container->children[index];
+ if ((keyboard == NULL) || (keyboard->obj.type != KEYBOARD)) {
+ return -1;
+ }
+ keyboard->keyMask = keyMask;
+ if (updateCasing) {
+ keyboard->casing = casing;
+ }
+
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+
+ return 0;
+}
+
+/**
+ * @brief function called to know whether the keyboard has been redrawn and needs a refresh
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddKeyboard()
+ * @return true if keyboard needs a refresh
+ */
+bool nbgl_layoutKeyboardNeedsRefresh(nbgl_layout_t *layout, uint8_t index)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keyboard_t *keyboard;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutKeyboardNeedsRefresh(): \n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get keyboard at given index
+ keyboard = (nbgl_keyboard_t *) layoutInt->container->children[index];
+ if ((keyboard == NULL) || (keyboard->obj.type != KEYBOARD)) {
+ return -1;
+ }
+ if (keyboard->needsRefresh) {
+ keyboard->needsRefresh = false;
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * @brief Adds up to 4 black suggestion buttons under the previously added object
+ *
+ * @param layout the current layout
+ * @param nbUsedButtons the number of actually used buttons
+ * @param buttonTexts array of 4 strings for buttons (last ones can be NULL)
+ * @param firstButtonToken first token used for buttons, provided in onActionCallback (the next 3
+ * values will be used for other buttons)
+ * @param tuneId tune to play when any button is pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddSuggestionButtons(nbgl_layout_t *layout,
+ uint8_t nbUsedButtons,
+ const char *buttonTexts[NB_MAX_SUGGESTION_BUTTONS],
+ int firstButtonToken,
+ tune_index_e tuneId)
+{
+ layoutObj_t *obj;
+ nbgl_container_t *container;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddSuggestionButtons():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ container->obj.area.width = SCREEN_WIDTH;
+ container->obj.area.height = 2 * 64 + 8;
+ container->layout = VERTICAL;
+ container->nbChildren = NB_MAX_SUGGESTION_BUTTONS;
+ container->children
+ = (nbgl_obj_t **) nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ container->obj.alignmentMarginY = BORDER_MARGIN;
+ container->obj.alignment = TOP_MIDDLE;
+ container->obj.alignTo = layoutInt->container->children[layoutInt->container->nbChildren - 1];
+
+ // create suggestion buttons, even if not displayed at first
+ nbgl_objPoolGetArray(BUTTON, NB_MAX_SUGGESTION_BUTTONS, 0, (nbgl_obj_t **) &choiceButtons);
+ for (int i = 0; i < NB_MAX_SUGGESTION_BUTTONS; i++) {
+ obj = addCallbackObj(
+ layoutInt, (nbgl_obj_t *) choiceButtons[i], firstButtonToken + i, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ choiceButtons[i]->innerColor = BLACK;
+ choiceButtons[i]->borderColor = BLACK;
+ choiceButtons[i]->foregroundColor = WHITE;
+ choiceButtons[i]->obj.area.width = (SCREEN_WIDTH - 2 * BORDER_MARGIN - 8) / 2;
+ choiceButtons[i]->obj.area.height = 64;
+ choiceButtons[i]->radius = RADIUS_32_PIXELS;
+ choiceButtons[i]->fontId = SMALL_BOLD_1BPP_FONT;
+ choiceButtons[i]->icon = NULL;
+ if ((i % 2) == 0) {
+ choiceButtons[i]->obj.alignmentMarginX = BORDER_MARGIN;
+ if (i != 0) {
+ choiceButtons[i]->obj.alignmentMarginY = 8;
+ }
+ choiceButtons[i]->obj.alignment = NO_ALIGNMENT;
+ }
+ else {
+ choiceButtons[i]->obj.alignmentMarginX = 8;
+ choiceButtons[i]->obj.alignment = MID_RIGHT;
+ choiceButtons[i]->obj.alignTo = (nbgl_obj_t *) choiceButtons[i - 1];
+ }
+ choiceButtons[i]->text = buttonTexts[i];
+ choiceButtons[i]->obj.touchMask = (1 << TOUCHED);
+ choiceButtons[i]->obj.touchId = CONTROLS_ID + i;
+ // some buttons may not be visible
+ if (i < nbUsedButtons) {
+ container->children[i] = (nbgl_obj_t *) choiceButtons[i];
+ }
+ else {
+ container->children[i] = NULL;
+ }
+ }
+ // set this new container as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ // return index of container to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates the number and/or the text suggestion buttons created with @ref
+ * nbgl_layoutAddSuggestionButtons()
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddSuggestionButtons()
+ * @param nbUsedButtons the number of actually used buttons
+ * @param buttonTexts array of 4 strings for buttons (last ones can be NULL)
+ * @return >= 0 if OK
+ */
+int nbgl_layoutUpdateSuggestionButtons(nbgl_layout_t *layout,
+ uint8_t index,
+ uint8_t nbUsedButtons,
+ const char *buttonTexts[NB_MAX_SUGGESTION_BUTTONS])
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateSuggestionButtons():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ container = (nbgl_container_t *) layoutInt->container->children[index];
+ if ((container == NULL) || (container->obj.type != CONTAINER)) {
+ return -1;
+ }
+
+ // update suggestion buttons
+ for (int i = 0; i < NB_MAX_SUGGESTION_BUTTONS; i++) {
+ choiceButtons[i]->text = buttonTexts[i];
+ // some buttons may not be visible
+ if (i < nbUsedButtons) {
+ container->children[i] = (nbgl_obj_t *) choiceButtons[i];
+ }
+ else {
+ container->children[i] = NULL;
+ }
+ }
+ container->forceClean = true;
+
+ nbgl_redrawObject((nbgl_obj_t *) container, NULL, false);
+
+ return 0;
+}
+
+/**
+ * @brief Adds a "text entry" area under the previously entered object. This area can be preceded
+ * (beginning of line) by an index, indicating for example the entered world. A vertical gray line
+ * is placed under the text. This text must be vertical placed in the screen with offsetY
+ *
+ * @note This area is touchable
+ *
+ * @param layout the current layout
+ * @param numbered if true, the "number" param is used as index
+ * @param number index of the text
+ * @param text string to display in the area
+ * @param grayedOut if true, the text is grayed out (but not the potential number)
+ * @param offsetY vertical offset from the top of the page
+ * @param token token provided in onActionCallback when this area is touched
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddEnteredText(nbgl_layout_t *layout,
+ bool numbered,
+ uint8_t number,
+ const char *text,
+ bool grayedOut,
+ int offsetY,
+ int token)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_area_t *textArea;
+ nbgl_line_t *line;
+ layoutObj_t *obj;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddEnteredText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create gray line
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, layoutInt->layer);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.alignmentMarginY = offsetY;
+ line->obj.alignTo = layoutInt->container->children[layoutInt->container->nbChildren - 1];
+ line->obj.alignment = TOP_MIDDLE;
+ line->obj.area.width = SCREEN_WIDTH - 2 * 32;
+ line->obj.area.height = 4;
+ line->direction = HORIZONTAL;
+ line->thickness = 2;
+ line->offset = 2;
+ // set this new line as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) line);
+
+ if (numbered) {
+ // create Word num typed text
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = BLACK;
+ snprintf(numText, sizeof(numText), "%d.", number);
+ textArea->text = numText;
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = LARGE_MEDIUM_1BPP_FONT;
+ textArea->obj.alignmentMarginY = 12;
+ textArea->obj.alignTo = (nbgl_obj_t *) line;
+ textArea->obj.alignment = TOP_LEFT;
+ textArea->obj.area.width = 50;
+ textArea->obj.area.height = nbgl_getFontLineHeight(textArea->fontId);
+ // set this new text area as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+ }
+
+ // create text area
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = grayedOut ? LIGHT_GRAY : BLACK;
+ textArea->text = text;
+ textArea->textAlignment = MID_LEFT;
+ textArea->fontId = LARGE_MEDIUM_1BPP_FONT;
+ textArea->obj.alignmentMarginY = 12;
+ textArea->obj.alignTo = (nbgl_obj_t *) line;
+ textArea->obj.alignment = TOP_MIDDLE;
+ if (numbered) {
+ textArea->obj.area.width = line->obj.area.width - 2 * 50;
+ }
+ else {
+ textArea->obj.area.width = line->obj.area.width;
+ }
+ textArea->obj.area.height = nbgl_getFontLineHeight(textArea->fontId);
+ textArea->autoHideLongLine = true;
+
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) textArea, token, NBGL_NO_TUNE);
+ if (obj == NULL) {
+ return -1;
+ }
+ textArea->token = token;
+ textArea->obj.touchMask = (1 << TOUCHED);
+ textArea->obj.touchId = ENTERED_TEXT_ID;
+
+ // set this new text area as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+
+ // return index of text area to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing "text entry" area, created with @ref nbgl_layoutAddEnteredText()
+ *
+ * @param layout the current layout
+ * @param index index of the text (return value of @ref nbgl_layoutAddEnteredText())
+ * @param numbered if set to true, the text is preceded on the left by 'number.'
+ * @param number if numbered is true, number used to build 'number.' text
+ * @param text string to display in the area
+ * @param grayedOut if true, the text is grayed out (but not the potential number)
+ * @return <0 if error, 0 if OK with text fitting the area, 1 of 0K with text
+ * not fitting the area
+ */
+int nbgl_layoutUpdateEnteredText(nbgl_layout_t *layout,
+ uint8_t index,
+ bool numbered,
+ uint8_t number,
+ const char *text,
+ bool grayedOut)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_area_t *textArea;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateEnteredText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // update main text area
+ textArea = (nbgl_text_area_t *) layoutInt->container->children[index];
+ if ((textArea == NULL) || (textArea->obj.type != TEXT_AREA)) {
+ return -1;
+ }
+ textArea->text = text;
+ textArea->textColor = grayedOut ? LIGHT_GRAY : BLACK;
+ textArea->textAlignment = MID_LEFT;
+ nbgl_redrawObject((nbgl_obj_t *) textArea, NULL, false);
+
+ // update number text area
+ if (numbered) {
+ // it is the previously created object
+ textArea = (nbgl_text_area_t *) layoutInt->container->children[index - 1];
+ snprintf(numText, sizeof(numText), "%d.", number);
+ textArea->text = numText;
+ nbgl_redrawObject((nbgl_obj_t *) textArea, NULL, false);
+ }
+ // if the text doesn't fit, indicate it by returning 1 instead of 0, for different refresh
+ if (nbgl_getSingleLineTextWidth(textArea->fontId, text) > textArea->obj.area.width) {
+ return 1;
+ }
+ return 0;
+}
+
+/**
+ * @brief Adds a black full width confirmation button on top of the previously added keyboard.
+ *
+ * @param layout the current layout
+ * @param active if true, button is active, otherwise inactive (grayed-out)
+ * @param text text of the button
+ * @param token token of the button, used in onActionCallback
+ * @param tuneId tune to play when button is pressed
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddConfirmationButton(nbgl_layout_t *layout,
+ bool active,
+ const char *text,
+ int token,
+ tune_index_e tuneId)
+{
+ layoutObj_t *obj;
+ nbgl_button_t *button;
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddConfirmationButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layoutInt->layer);
+ obj = addCallbackObj(layoutInt, (nbgl_obj_t *) button, token, tuneId);
+ if (obj == NULL) {
+ return -1;
+ }
+
+ button->obj.alignmentMarginY = BORDER_MARGIN;
+ button->obj.alignment = TOP_MIDDLE;
+ button->foregroundColor = WHITE;
+ if (active) {
+ button->innerColor = BLACK;
+ button->borderColor = BLACK;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = BOTTOM_BUTTON_ID;
+ }
+ else {
+ button->borderColor = LIGHT_GRAY;
+ button->innerColor = LIGHT_GRAY;
+ }
+ button->text = PIC(text);
+ button->fontId = SMALL_BOLD_1BPP_FONT;
+ button->obj.area.width = AVAILABLE_WIDTH;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->obj.alignTo = layoutInt->container->children[layoutInt->container->nbChildren - 1];
+ // set this new button as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) button);
+
+ // return index of button to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing black full width confirmation button on top of the previously added
+keyboard.
+ *
+ * @param layout the current layout
+ * @param index returned value of @ref nbgl_layoutAddConfirmationButton()
+ * @param active if true, button is active
+ * @param text text of the button
+= * @return >= 0 if OK
+ */
+int nbgl_layoutUpdateConfirmationButton(nbgl_layout_t *layout,
+ uint8_t index,
+ bool active,
+ const char *text)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_button_t *button;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateConfirmationButton():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // update main text area
+ button = (nbgl_button_t *) layoutInt->container->children[index];
+ if ((button == NULL) || (button->obj.type != BUTTON)) {
+ return -1;
+ }
+ button->text = text;
+
+ if (active) {
+ button->innerColor = BLACK;
+ button->borderColor = BLACK;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = BOTTOM_BUTTON_ID;
+ }
+ else {
+ button->borderColor = LIGHT_GRAY;
+ button->innerColor = LIGHT_GRAY;
+ }
+ nbgl_redrawObject((nbgl_obj_t *) button, NULL, false);
+ return 0;
+}
+#else // HAVE_SE_TOUCH
+/**
+ * @brief Creates a keyboard on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param kbdInfo configuration of the keyboard to draw (including the callback when touched)
+ * @return the index of keyboard, to use in @ref nbgl_layoutUpdateKeyboard()
+ */
+int nbgl_layoutAddKeyboard(nbgl_layout_t *layout, const nbgl_layoutKbd_t *kbdInfo)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keyboard_t *keyboard;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddKeyboard():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create keyboard
+ keyboard = (nbgl_keyboard_t *) nbgl_objPoolGet(KEYBOARD, layoutInt->layer);
+ keyboard->obj.alignmentMarginY = 0;
+ keyboard->obj.alignment = CENTER;
+ keyboard->enableBackspace = kbdInfo->enableBackspace;
+ keyboard->enableValidate = kbdInfo->enableValidate;
+ if (kbdInfo->lettersOnly) {
+ keyboard->selectedCharIndex = cx_rng_u32() % 26;
+ keyboard->mode = MODE_LOWER_LETTERS;
+ }
+ else {
+ keyboard->mode = MODE_NONE;
+ }
+ keyboard->callback = PIC(kbdInfo->callback);
+ keyboard->lettersOnly = kbdInfo->lettersOnly;
+ keyboard->keyMask = kbdInfo->keyMask;
+ // set this new keyboard as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) keyboard);
+
+ // return index of keyboard to be modified later on
+ return (layoutInt->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing keyboard on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddKeyboard()
+ * @param keyMask mask of keys to activate/deactivate on keyboard
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateKeyboard(nbgl_layout_t *layout, uint8_t index, uint32_t keyMask)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keyboard_t *keyboard;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateKeyboard(): keyMask = 0x%X\n", keyMask);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get keyboard at given index
+ keyboard = (nbgl_keyboard_t *) layoutInt->children[index];
+ if ((keyboard == NULL) || (keyboard->obj.type != KEYBOARD)) {
+ return -1;
+ }
+ keyboard->keyMask = keyMask;
+ if (keyboard->lettersOnly) {
+ if (keyMask & (1 << 26)) {
+ keyboard->selectedCharIndex = cx_rng_u32() % 26;
+ }
+ else {
+ keyboard->selectedCharIndex = 0;
+ }
+ }
+
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+
+ return 0;
+}
+
+/**
+ * @brief Adds a "text entry" area under the previously entered object.
+ * The max number of really displayable characters is 8, even if there are 9 placeholders (_)
+ * If longer than 8 chars, the first ones are replaced by a '..'
+ * The 9th placeholder is never filled
+ *
+ * @param layout the current layout
+ * @param text string to display in the area
+ * @param lettersOnly if true, display 8 chars placeholders, otherwise 9
+ * @return >= 0 if OK
+ */
+int nbgl_layoutAddEnteredText(nbgl_layout_t *layout, const char *text, bool lettersOnly)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_entry_t *textEntry;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddEnteredText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create text area
+ textEntry = (nbgl_text_entry_t *) nbgl_objPoolGet(TEXT_ENTRY, layoutInt->layer);
+ textEntry->text = text;
+ textEntry->fontId = BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp;
+ textEntry->nbChars = lettersOnly ? 8 : 9;
+ textEntry->obj.alignmentMarginY = 5;
+ textEntry->obj.alignment = BOTTOM_MIDDLE;
+ textEntry->obj.area.width = 98;
+ textEntry->obj.area.height = 16;
+
+ // set this new text area as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textEntry);
+
+ // return index of text area to be modified later on
+ return (layoutInt->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing "text entry" area, created with @ref nbgl_layoutAddEnteredText()
+ *
+ * @param layout the current layout
+ * @param index index of the text (return value of @ref nbgl_layoutAddEnteredText())
+ * @param text string to display in the area
+ * @return <0 if error, 0 if OK with text fitting the area, 1 of 0K with text
+ * not fitting the area
+ */
+int nbgl_layoutUpdateEnteredText(nbgl_layout_t *layout, uint8_t index, const char *text)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_text_entry_t *textEntry;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateEnteredText():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // update main text area
+ textEntry = (nbgl_text_entry_t *) layoutInt->children[index];
+ if ((textEntry == NULL) || (textEntry->obj.type != TEXT_ENTRY)) {
+ return -1;
+ }
+ textEntry->text = text;
+ nbgl_redrawObject((nbgl_obj_t *) textEntry, NULL, false);
+
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYBOARD
+
+#ifdef NBGL_KEYPAD
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief Adds a keypad on bottom of the screen, with the associated callback
+ *
+ * @note Validate and Backspace keys are not enabled at start-up
+ *
+ * @param layout the current layout
+ * @param callback function called when any of the key is touched
+ * @param shuffled if set to true, digits are shuffled in keypad
+ * @return the index of keypad, to use in @ref nbgl_layoutUpdateKeypad()
+ */
+int nbgl_layoutAddKeypad(nbgl_layout_t *layout, keyboardCallback_t callback, bool shuffled)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keypad_t *keypad;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddKeypad():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create keypad
+ keypad = (nbgl_keypad_t *) nbgl_objPoolGet(KEYPAD, layoutInt->layer);
+ keypad->obj.alignmentMarginY = 0;
+ keypad->obj.alignment = BOTTOM_MIDDLE;
+ keypad->obj.alignTo = NULL;
+ keypad->borderColor = LIGHT_GRAY;
+ keypad->callback = PIC(callback);
+ keypad->enableDigits = true;
+ keypad->enableBackspace = false;
+ keypad->enableValidate = false;
+ keypad->shuffled = shuffled;
+ // set this new keypad as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) keypad);
+
+ // return index of keypad to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing keypad on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddKeypad()
+ * @param enableValidate if true, enable Validate key
+ * @param enableBackspace if true, enable Backspace key
+ * @param enableDigits if true, enable all digit keys
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateKeypad(nbgl_layout_t *layout,
+ uint8_t index,
+ bool enableValidate,
+ bool enableBackspace,
+ bool enableDigits)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keypad_t *keypad;
+
+ LOG_DEBUG(LAYOUT_LOGGER,
+ "nbgl_layoutUpdateKeypad(): enableValidate = %d, enableBackspace = %d\n",
+ enableValidate,
+ enableBackspace);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get existing keypad
+ keypad = (nbgl_keypad_t *) layoutInt->container->children[index];
+ if ((keypad == NULL) || (keypad->obj.type != KEYPAD)) {
+ return -1;
+ }
+ keypad->enableValidate = enableValidate;
+ keypad->enableBackspace = enableBackspace;
+ keypad->enableDigits = enableDigits;
+
+ nbgl_redrawObject((nbgl_obj_t *) keypad, NULL, false);
+
+ return 0;
+}
+
+/**
+ * @brief Adds a placeholder for hidden digits on top of a keypad, to represent the entered digits,
+ * as full circles The placeholder is "underligned" with a thin horizontal line of the expected full
+ * length
+ *
+ * @note It must be the last added object, after potential back key, title, and keypad. Vertical
+ * positions of title and hidden digits will be computed here
+ *
+ * @param layout the current layout
+ * @param nbDigits number of digits to be displayed
+ * @return the index of digits set, to use in @ref nbgl_layoutUpdateHiddenDigits()
+ */
+int nbgl_layoutAddHiddenDigits(nbgl_layout_t *layout, uint8_t nbDigits)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_line_t *line;
+ uint8_t space;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddHiddenDigits():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+ if (nbDigits > 12) {
+ return -1;
+ }
+ if (nbDigits > 8) {
+ space = 4;
+ }
+ else {
+ space = 12;
+ }
+
+ // create a container, invisible or bordered
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ container->nbChildren = nbDigits + 1; // +1 for the line
+ container->children = nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ // pixels between each icon (knowing that the effective round are 18px large and the
+ // icon 24px)
+ container->obj.area.width = nbDigits * C_round_24px.width + (nbDigits + 1) * space;
+ container->obj.area.height = 48;
+ // distance from digits to title is fixed to 20 px, except if title is more than 1 line and a
+ // back key is present
+ if ((layoutInt->container->nbChildren != 3)
+ || (layoutInt->container->children[1]->area.height == 32)) {
+ container->obj.alignmentMarginY = 20;
+ }
+ else {
+ container->obj.alignmentMarginY = 12;
+ }
+
+ // item N-2 is the title
+ container->obj.alignTo = layoutInt->container->children[layoutInt->container->nbChildren - 2];
+ container->obj.alignment = BOTTOM_MIDDLE;
+
+ // set this new container as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ // create children of the container, as images (empty circles)
+ nbgl_objPoolGetArray(IMAGE, nbDigits, layoutInt->layer, (nbgl_obj_t **) container->children);
+ for (int i = 0; i < nbDigits; i++) {
+ nbgl_image_t *image = (nbgl_image_t *) container->children[i];
+ image->buffer = &C_round_24px;
+ image->foregroundColor = WHITE;
+ image->obj.alignmentMarginX = space;
+ if (i > 0) {
+ image->obj.alignment = MID_RIGHT;
+ image->obj.alignTo = (nbgl_obj_t *) container->children[i - 1];
+ }
+ else {
+ image->obj.alignment = NO_ALIGNMENT;
+ image->obj.alignmentMarginY = (container->obj.area.height - C_round_24px.width) / 2;
+ }
+ }
+ // create gray line
+ line = (nbgl_line_t *) nbgl_objPoolGet(LINE, layoutInt->layer);
+ line->lineColor = LIGHT_GRAY;
+ line->obj.alignmentMarginY = 0;
+ line->obj.alignTo = NULL;
+ line->obj.alignment = BOTTOM_MIDDLE;
+ line->obj.area.width = container->obj.area.width;
+ line->obj.area.height = 4;
+ line->direction = HORIZONTAL;
+ line->thickness = 2;
+ line->offset = 2;
+ container->children[nbDigits] = (nbgl_obj_t *) line;
+
+ // return index of keypad to be modified later on
+ return (layoutInt->container->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing set of hidden digits, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddHiddenDigits()
+ * @param nbActive number of "active" digits (represented by discs instead of circles)
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateHiddenDigits(nbgl_layout_t *layout, uint8_t index, uint8_t nbActive)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_image_t *image;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateHiddenDigits(): nbActive = %d\n", nbActive);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get container
+ container = (nbgl_container_t *) layoutInt->container->children[index];
+ // sanity check
+ if ((container == NULL) || (container->obj.type != CONTAINER)) {
+ return -1;
+ }
+ if (nbActive > container->nbChildren) {
+ return -1;
+ }
+ if (nbActive == 0) {
+ // deactivate the first digit
+ image = (nbgl_image_t *) container->children[0];
+ if ((image == NULL) || (image->obj.type != IMAGE)) {
+ return -1;
+ }
+ image->foregroundColor = WHITE;
+ }
+ else {
+ image = (nbgl_image_t *) container->children[nbActive - 1];
+ if ((image == NULL) || (image->obj.type != IMAGE)) {
+ return -1;
+ }
+ // if the last "active" is already active, it means that we are decreasing the number of
+ // active otherwise we are increasing it
+ if (image->foregroundColor == BLACK) {
+ // all digits are already active
+ if (nbActive == container->nbChildren) {
+ return 0;
+ }
+ // deactivate the next digit
+ image = (nbgl_image_t *) container->children[nbActive];
+ image->foregroundColor = WHITE;
+ }
+ else {
+ image->buffer = &C_round_24px;
+ image->foregroundColor = BLACK;
+ }
+ }
+
+ nbgl_redrawObject((nbgl_obj_t *) image, NULL, false);
+
+ return 0;
+}
+#else // HAVE_SE_TOUCH
+/**
+ * @brief Adds a keypad on bottom of the screen, with the associated callback
+ *
+ * @note Validate and Backspace keys are not enabled at start-up
+ *
+ * @param layout the current layout
+ * @param callback function called when any of the key is touched
+ * @param text text to use as title for the keypad
+ * @param shuffled if set to true, digits are shuffled in keypad
+ * @return the index of keypad in layout, to use in @ref nbgl_layoutUpdateKeypad()
+ */
+int nbgl_layoutAddKeypad(nbgl_layout_t *layout,
+ keyboardCallback_t callback,
+ const char *text,
+ bool shuffled)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keypad_t *keypad;
+ nbgl_text_area_t *textArea;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddKeypad():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ textArea = (nbgl_text_area_t *) nbgl_objPoolGet(TEXT_AREA, layoutInt->layer);
+ textArea->textColor = WHITE;
+ textArea->text = PIC(text);
+ textArea->textAlignment = CENTER;
+ textArea->fontId = BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp;
+ textArea->obj.area.width = AVAILABLE_WIDTH;
+ textArea->obj.area.height = 12;
+ textArea->wrapping = false;
+ textArea->obj.alignment = TOP_MIDDLE;
+ textArea->obj.alignmentMarginY = 3;
+ // set this new obj as child of main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) textArea);
+
+ // create keypad
+ keypad = (nbgl_keypad_t *) nbgl_objPoolGet(KEYPAD, layoutInt->layer);
+ keypad->obj.alignment = BOTTOM_MIDDLE;
+ keypad->obj.alignmentMarginY = 6;
+ keypad->obj.alignTo = NULL;
+ keypad->callback = PIC(callback);
+ keypad->enableBackspace = false;
+ keypad->enableValidate = false;
+ keypad->selectedKey = 0xFF; // to be picked
+ keypad->shuffled = shuffled;
+ // set this new keypad as child of the container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) keypad);
+
+ // return index of keypad to be modified later on
+ return (layoutInt->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing keypad on bottom of the screen, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddKeypad()
+ * @param enableValidate if true, enable Validate key
+ * @param enableBackspace if true, enable Backspace key
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateKeypad(nbgl_layout_t *layout,
+ uint8_t index,
+ bool enableValidate,
+ bool enableBackspace)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_keypad_t *keypad;
+
+ LOG_DEBUG(LAYOUT_LOGGER,
+ "nbgl_layoutUpdateKeypad(): enableValidate = %d, enableBackspace = %d\n",
+ enableValidate,
+ enableBackspace);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get existing keypad
+ keypad = (nbgl_keypad_t *) layoutInt->children[index];
+ if ((keypad == NULL) || (keypad->obj.type != KEYPAD)) {
+ LOG_WARN(LAYOUT_LOGGER, "nbgl_layoutUpdateKeypad(): keypad not found\n");
+ return -1;
+ }
+ if (enableValidate && !keypad->enableValidate) {
+ // if validate key is enabled and was not, select it directly
+ keypad->selectedKey = 11;
+ }
+ else {
+ // otherwise let the draw function pick a new selected
+ keypad->selectedKey = 0xFF;
+ }
+ keypad->enableValidate = enableValidate;
+ keypad->enableBackspace = enableBackspace;
+
+ nbgl_redrawObject((nbgl_obj_t *) keypad, NULL, false);
+
+ return 0;
+}
+
+/**
+ * @brief Adds a placeholder for hidden digits on top of a keypad, to represent the entered digits,
+ * as full circles
+ *
+ * @note It must be the last added object, after keypad. Vertical positions of title and hidden
+ * digits will be computed here
+ *
+ * @param layout the current layout
+ * @param nbDigits number of digits to be displayed
+ * @return the index of digits set, to use in @ref nbgl_layoutUpdateHiddenDigits()
+ */
+int nbgl_layoutAddHiddenDigits(nbgl_layout_t *layout, uint8_t nbDigits)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutAddHiddenDigits():\n");
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // create a container, invisible or bordered
+ container = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layoutInt->layer);
+ container->nbChildren = nbDigits;
+ container->children = nbgl_containerPoolGet(container->nbChildren, layoutInt->layer);
+ // 1 pixel between each icon (knowing that the effective bullets are 8px large)
+ container->obj.area.width = nbDigits * C_pin_bullet_empty.width + (nbDigits - 1);
+ container->obj.area.height = C_pin_bullet_empty.height;
+ // distance from top to digits is fixed to 24 px
+ container->obj.alignmentMarginY = 24;
+ container->obj.alignTo = NULL;
+ container->obj.alignment = TOP_MIDDLE;
+
+ // set this new container as child of the main container
+ addObjectToLayout(layoutInt, (nbgl_obj_t *) container);
+
+ // create children of the container, as images (empty circles)
+ nbgl_objPoolGetArray(IMAGE, nbDigits, layoutInt->layer, (nbgl_obj_t **) container->children);
+ for (int i = 0; i < nbDigits; i++) {
+ nbgl_image_t *image = (nbgl_image_t *) container->children[i];
+ image->buffer = &C_pin_bullet_empty;
+ image->foregroundColor = WHITE;
+ if (i > 0) {
+ image->obj.alignment = MID_RIGHT;
+ image->obj.alignTo = (nbgl_obj_t *) container->children[i - 1];
+ image->obj.alignmentMarginX = 1;
+ }
+ else {
+ image->obj.alignment = NO_ALIGNMENT;
+ }
+ }
+ // return index of container to be modified later on
+ return (layoutInt->nbChildren - 1);
+}
+
+/**
+ * @brief Updates an existing set of hidden digits, with the given configuration
+ *
+ * @param layout the current layout
+ * @param index index returned by @ref nbgl_layoutAddHiddenDigits()
+ * @param nbActive number of "active" digits (represented by discs instead of circles)
+ * @return >=0 if OK
+ */
+int nbgl_layoutUpdateHiddenDigits(nbgl_layout_t *layout, uint8_t index, uint8_t nbActive)
+{
+ nbgl_layoutInternal_t *layoutInt = (nbgl_layoutInternal_t *) layout;
+ nbgl_container_t *container;
+ nbgl_image_t *image;
+
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutUpdateHiddenDigits(): nbActive = %d\n", nbActive);
+ if (layout == NULL) {
+ return -1;
+ }
+
+ // get container
+ container = (nbgl_container_t *) layoutInt->children[index];
+ // sanity check
+ if ((container == NULL) || (container->obj.type != CONTAINER)) {
+ return -1;
+ }
+ if (nbActive > container->nbChildren) {
+ return -1;
+ }
+ if (nbActive == 0) {
+ // deactivate the first digit
+ image = (nbgl_image_t *) container->children[0];
+ if ((image == NULL) || (image->obj.type != IMAGE)) {
+ return -1;
+ }
+ image->buffer = &C_pin_bullet_empty;
+ }
+ else {
+ image = (nbgl_image_t *) container->children[nbActive - 1];
+ if ((image == NULL) || (image->obj.type != IMAGE)) {
+ return -1;
+ }
+ // if the last "active" is already active, it means that we are decreasing the number of
+ // active otherwise we are increasing it
+ if (image->buffer == &C_pin_bullet_filled) {
+ // all digits are already active
+ if (nbActive == container->nbChildren) {
+ return 0;
+ }
+ // deactivate the next digit
+ image = (nbgl_image_t *) container->children[nbActive];
+ image->buffer = &C_pin_bullet_empty;
+ }
+ else {
+ image->buffer = &C_pin_bullet_filled;
+ }
+ }
+
+ nbgl_redrawObject((nbgl_obj_t *) image, NULL, false);
+
+ return 0;
+}
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYPAD
+
+/**
+ * @brief Applies given layout. The screen will be redrawn
+ *
+ * @param layoutParam layout to redraw
+ * @return a pointer to the corresponding layout
+ */
+int nbgl_layoutDraw(nbgl_layout_t *layoutParam)
+{
+ nbgl_layoutInternal_t *layout = (nbgl_layoutInternal_t *) layoutParam;
+
+ if (layout == NULL) {
+ return -1;
+ }
+#ifdef HAVE_SE_TOUCH
+ LOG_DEBUG(LAYOUT_LOGGER,
+ "nbgl_layoutDraw(): container.nbChildren =%d, layout->nbChildren = %d\n",
+ layout->container->nbChildren,
+ layout->nbChildren);
+ if (layout->tapText) {
+ // set this new container as child of main container
+ addObjectToLayout(layout, (nbgl_obj_t *) layout->tapText);
+ }
+ if (layout->withLeftBorder == true) {
+ // draw now the line
+ nbgl_line_t *line = createLeftVerticalLine(layout->layer);
+ layout->children[layout->nbChildren] = (nbgl_obj_t *) line;
+ layout->nbChildren++;
+ }
+#else // HAVE_SE_TOUCH
+ LOG_DEBUG(LAYOUT_LOGGER, "nbgl_layoutDraw(): layout->nbChildren = %d\n", layout->nbChildren);
+#endif // HAVE_SE_TOUCH
+ nbgl_screenRedraw();
+
+ return 0;
+}
+
+/**
+ * @brief Release the layout obtained with @ref nbgl_layoutGet()
+ *
+ * @param layoutParam layout to release
+ * @return >= 0 if OK
+ */
+int nbgl_layoutRelease(nbgl_layout_t *layoutParam)
+{
+ nbgl_layoutInternal_t *layout = (nbgl_layoutInternal_t *) layoutParam;
+ LOG_DEBUG(PAGE_LOGGER, "nbgl_layoutRelease(): \n");
+ if (layout == NULL) {
+ return -1;
+ }
+ // if modal
+ if (layout->modal) {
+ nbgl_screenPop(layout->layer);
+ }
+ layout->nbChildren = 0;
+ return 0;
+}
diff --git a/sdk_lib_nbgl/src/nbgl_navigation.c b/sdk_lib_nbgl/src/nbgl_navigation.c
new file mode 100644
index 00000000..832d3f0f
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_navigation.c
@@ -0,0 +1,206 @@
+
+/**
+ * @file nbgl_navigation.c
+ * @brief The construction of a navigation bar with buttons super-object
+ *
+ */
+
+#ifdef HAVE_SE_TOUCH
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_debug.h"
+#include "nbgl_draw.h"
+#include "nbgl_obj.h"
+#include "glyphs.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define INTERNAL_SMALL_MARGIN 8
+
+/**********************
+ * TYPEDEFS
+ **********************/
+enum {
+ EXIT_BUTTON_INDEX = 0,
+ PREVIOUS_PAGE_INDEX,
+ NEXT_PAGE_INDEX,
+ NB_MAX_CHILDREN
+};
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void configButtons(nbgl_container_t *navContainer, uint8_t navNbPages, uint8_t navActivePage)
+{
+ nbgl_button_t *buttonPrevious = (nbgl_button_t *) navContainer->children[PREVIOUS_PAGE_INDEX];
+ nbgl_button_t *buttonNext = (nbgl_button_t *) navContainer->children[NEXT_PAGE_INDEX];
+
+ buttonPrevious->foregroundColor = (navActivePage == 0) ? LIGHT_GRAY : BLACK;
+ buttonNext->foregroundColor = (navActivePage == (navNbPages - 1)) ? LIGHT_GRAY : BLACK;
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief function to be called when any of the controls in navigation bar is touched
+ *
+ * @param obj touched object (button)
+ * @param eventType type of touch (only TOUCHED is accepted)
+ * @param nbPages number of pages for navigation (if < 2, no navigation keys)
+ * @param activePage current active page
+ * @return true if actually navigated (page change)
+ */
+bool nbgl_navigationCallback(nbgl_obj_t *obj,
+ nbgl_touchType_t eventType,
+ uint8_t nbPages,
+ uint8_t *activePage)
+{
+ nbgl_container_t *navContainer;
+
+ if (eventType != TOUCHED) {
+ return false;
+ }
+ navContainer = (nbgl_container_t *) obj->parent;
+
+ if (obj == navContainer->children[EXIT_BUTTON_INDEX]) {
+ // fake page when Quit button is touched
+ *activePage = EXIT_PAGE;
+ return true;
+ }
+ else if (obj == navContainer->children[PREVIOUS_PAGE_INDEX]) {
+ if (*activePage > 0) {
+ *activePage = *activePage - 1;
+ configButtons(navContainer, nbPages, *activePage);
+ return true;
+ }
+ }
+ else if (obj == navContainer->children[NEXT_PAGE_INDEX]) {
+ if (*activePage < (nbPages - 1)) {
+ *activePage = *activePage + 1;
+ configButtons(navContainer, nbPages, *activePage);
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief This function creates a full navigation bar "object", with buttons and returns it as a
+ * container
+ *
+ * @param nbPages max number of pages for navigation (if < 2, no navigation keys)
+ * @param activePage active page at start-up in [0-(nbPages-1)]
+ * @param withExitKey if set to true, on page 0 the left key is replaced by a exit key
+ * @param layer layer (screen) to create the navigation bar in
+ *
+ * @return the created navigation bar container object
+ */
+nbgl_container_t *nbgl_navigationPopulate(uint8_t nbPages,
+ uint8_t activePage,
+ bool withExitKey,
+ uint8_t layer)
+{
+ nbgl_button_t *button;
+ nbgl_container_t *navContainer;
+
+ navContainer = (nbgl_container_t *) nbgl_objPoolGet(CONTAINER, layer);
+ navContainer->obj.area.width = SCREEN_WIDTH - 2 * BORDER_MARGIN;
+ navContainer->obj.area.height = BUTTON_DIAMETER + 2 * BORDER_MARGIN;
+ navContainer->layout = HORIZONTAL;
+ navContainer->nbChildren = NB_MAX_CHILDREN;
+ navContainer->children = (nbgl_obj_t **) nbgl_containerPoolGet(navContainer->nbChildren, layer);
+ navContainer->obj.alignmentMarginX = 0;
+ navContainer->obj.alignmentMarginY = 0;
+ navContainer->obj.alignment = NO_ALIGNMENT;
+
+ if (withExitKey) {
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layer);
+ button->innerColor = WHITE;
+ button->borderColor = LIGHT_GRAY;
+ button->obj.area.width = BUTTON_DIAMETER;
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->text = NULL;
+ button->icon = &C_cross32px;
+ button->obj.alignmentMarginX = 0;
+ button->obj.alignmentMarginY = 0;
+
+ button->obj.alignment = (nbPages > 1) ? MID_LEFT : CENTER;
+ button->obj.alignTo = NULL;
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = BOTTOM_BUTTON_ID;
+ navContainer->children[EXIT_BUTTON_INDEX] = (nbgl_obj_t *) button;
+ }
+ if (nbPages > 1) {
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layer);
+ button->innerColor = WHITE;
+ button->borderColor = LIGHT_GRAY;
+ button->obj.area.width
+ = (SCREEN_WIDTH - (2 * BORDER_MARGIN + 2 * INTERNAL_SMALL_MARGIN + BUTTON_DIAMETER))
+ / 2;
+ if (!withExitKey) {
+ button->obj.area.width += BUTTON_DIAMETER / 2;
+ }
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->text = NULL;
+ button->icon = &C_leftArrow32px;
+ button->obj.alignmentMarginY = 0;
+ if (withExitKey) {
+ button->obj.alignmentMarginX = INTERNAL_SMALL_MARGIN;
+ button->obj.alignment = MID_RIGHT;
+ button->obj.alignTo = navContainer->children[EXIT_BUTTON_INDEX];
+ }
+ else {
+ button->obj.alignmentMarginX = 0;
+ button->obj.alignment = MID_LEFT;
+ button->obj.alignTo = NULL;
+ }
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = LEFT_BUTTON_ID;
+ navContainer->children[PREVIOUS_PAGE_INDEX] = (nbgl_obj_t *) button;
+
+ // create next page button
+ button = (nbgl_button_t *) nbgl_objPoolGet(BUTTON, layer);
+ button->innerColor = WHITE;
+ button->borderColor = LIGHT_GRAY;
+ button->foregroundColor = BLACK;
+ button->obj.area.width
+ = (SCREEN_WIDTH - (2 * BORDER_MARGIN + 2 * INTERNAL_SMALL_MARGIN + BUTTON_DIAMETER))
+ / 2;
+ if (!withExitKey) {
+ button->obj.area.width += BUTTON_DIAMETER / 2;
+ }
+ button->obj.area.height = BUTTON_DIAMETER;
+ button->radius = BUTTON_RADIUS;
+ button->text = NULL;
+ button->icon = &C_rightArrow32px;
+ button->obj.alignmentMarginX = INTERNAL_SMALL_MARGIN;
+ button->obj.alignmentMarginY = 0;
+ button->obj.alignment = MID_RIGHT;
+ button->obj.alignTo = navContainer->children[PREVIOUS_PAGE_INDEX];
+ button->obj.touchMask = (1 << TOUCHED);
+ button->obj.touchId = RIGHT_BUTTON_ID;
+ navContainer->children[NEXT_PAGE_INDEX] = (nbgl_obj_t *) button;
+
+ configButtons(navContainer, nbPages, activePage);
+ }
+
+ return navContainer;
+}
+
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/src/nbgl_obj.c b/sdk_lib_nbgl/src/nbgl_obj.c
new file mode 100644
index 00000000..7db8be9f
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj.c
@@ -0,0 +1,1564 @@
+/**
+ * @file nbgl_obj.c
+ * @brief Implementation of API to draw all basic graphic objects
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_obj.h"
+#include "nbgl_draw.h"
+#include "nbgl_front.h"
+#include "nbgl_debug.h"
+#include "os_print.h"
+#include "glyphs.h"
+#ifdef HAVE_SERIALIZED_NBGL
+#include "nbgl_serialize.h"
+#include "os_io_seproxyhal.h"
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+#define NB_MAX_PAGES_WITH_DASHES 10
+
+// max number of letters in TEXT_ENTRY
+#define NB_MAX_LETTERS 9
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void extendRefreshArea(nbgl_obj_t *obj);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+// area to resfresh
+static nbgl_area_t refreshArea;
+
+// boolean used to enable/forbid drawing/refresh
+static bool objDrawingDisabled;
+
+/**********************
+ * VARIABLES
+ **********************/
+// buffer used either for image file uncompression and side screen string drawing
+uint8_t ramBuffer[GZLIB_UNCOMPRESSED_CHUNK];
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+extern const char *get_ux_loc_string(uint32_t index);
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+static void compute_relativePosition(nbgl_obj_t *obj, nbgl_obj_t *prevObj)
+{
+ nbgl_container_t *parent = (nbgl_container_t *) (obj->parent);
+ // LOG_DEBUG(OBJ_LOGGER,"compute_relativePosition()\n");
+ // compute object absolute position thanks to layout/alignment
+ if (obj->alignment == NO_ALIGNMENT) {
+ LOG_DEBUG(
+ OBJ_LOGGER,
+ "compute_relativePosition() without align to, parent->layout = %d, prevObj = %p\n",
+ parent->layout,
+ prevObj);
+ // align to parent, depending of layout
+ if (parent->layout == VERTICAL) {
+ obj->rel_x0 = obj->alignmentMarginX;
+ if (prevObj != NULL) {
+ obj->rel_y0 = prevObj->rel_y0 + prevObj->area.height + obj->alignmentMarginY;
+ }
+ else {
+ obj->rel_y0 = obj->alignmentMarginY;
+ }
+ }
+ else { // HORIZONTAL
+ if (prevObj != NULL) {
+ obj->rel_x0 = prevObj->rel_x0 + prevObj->area.width + obj->alignmentMarginX;
+ }
+ else {
+ obj->rel_x0 = obj->alignmentMarginX;
+ }
+ obj->rel_y0 = obj->alignmentMarginY;
+ }
+ }
+ else {
+ nbgl_obj_t *alignToObj = obj->alignTo;
+ if (alignToObj == NULL) {
+ alignToObj = obj->parent;
+ LOG_DEBUG(OBJ_LOGGER, "compute_relativePosition() with align to parent\n");
+ }
+ else {
+ LOG_DEBUG(OBJ_LOGGER, "compute_relativePosition() with align to = %p\n", alignToObj);
+ }
+ // align to the given object, with the given constraints
+ if (alignToObj == obj->parent) {
+ // align inside if the reference is the parent
+ switch (obj->alignment) {
+ case TOP_LEFT:
+ obj->rel_x0 = obj->alignmentMarginX;
+ obj->rel_y0 = obj->alignmentMarginY;
+ break;
+ case TOP_MIDDLE:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) / 2 + obj->alignmentMarginX;
+ obj->rel_y0 = obj->alignmentMarginY;
+ break;
+ case TOP_RIGHT:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) - obj->alignmentMarginX;
+ obj->rel_y0 = obj->alignmentMarginY;
+ break;
+ case MID_LEFT:
+ obj->rel_x0 = obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) / 2 + obj->alignmentMarginY;
+ break;
+ case CENTER:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) / 2 + obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) / 2 + obj->alignmentMarginY;
+ break;
+ case MID_RIGHT:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) - obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) / 2 + obj->alignmentMarginY;
+ break;
+ case BOTTOM_LEFT:
+ obj->rel_x0 = obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) - obj->alignmentMarginY;
+ break;
+ case BOTTOM_MIDDLE:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) / 2 + obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) - obj->alignmentMarginY;
+ break;
+ case BOTTOM_RIGHT:
+ obj->rel_x0
+ = (parent->obj.area.width - obj->area.width) - obj->alignmentMarginX;
+ obj->rel_y0
+ = (parent->obj.area.height - obj->area.height) - obj->alignmentMarginY;
+ break;
+ default:
+ // not supported
+ break;
+ }
+ }
+ else {
+ // align outside if the reference is a "brother"
+ switch (obj->alignment) {
+ case TOP_LEFT:
+ obj->rel_x0 = alignToObj->rel_x0 + obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 - obj->area.height - obj->alignmentMarginY;
+ break;
+ case TOP_MIDDLE:
+ obj->rel_x0 = alignToObj->rel_x0
+ + (alignToObj->area.width - obj->area.width) / 2
+ + obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 - obj->area.height - obj->alignmentMarginY;
+ break;
+ case TOP_RIGHT:
+ obj->rel_x0 = alignToObj->rel_x0 + (alignToObj->area.width - obj->area.width)
+ - obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 - obj->area.height - obj->alignmentMarginY;
+ break;
+
+ case LEFT_TOP:
+ obj->rel_x0 = alignToObj->rel_x0 - obj->area.width - obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 + obj->alignmentMarginY;
+ break;
+ case MID_LEFT:
+ obj->rel_x0 = alignToObj->rel_x0 - obj->area.width - obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0
+ + (alignToObj->area.height - obj->area.height) / 2
+ + obj->alignmentMarginY;
+ break;
+ case LEFT_BOTTOM:
+ obj->rel_x0 = alignToObj->rel_x0 - obj->area.width - obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 + (alignToObj->area.height - obj->area.height)
+ + obj->alignmentMarginY;
+ break;
+
+ case RIGHT_TOP:
+ obj->rel_x0
+ = alignToObj->rel_x0 + alignToObj->area.width + obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 + obj->alignmentMarginY;
+ break;
+ case MID_RIGHT:
+ obj->rel_x0
+ = alignToObj->rel_x0 + alignToObj->area.width + obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0
+ + (alignToObj->area.height - obj->area.height) / 2
+ + obj->alignmentMarginY;
+ break;
+ case RIGHT_BOTTOM:
+ obj->rel_x0
+ = alignToObj->rel_x0 + alignToObj->area.width + obj->alignmentMarginX;
+ obj->rel_y0 = alignToObj->rel_y0 + (alignToObj->area.height - obj->area.height)
+ + obj->alignmentMarginY;
+ break;
+
+ case BOTTOM_LEFT:
+ obj->rel_x0 = alignToObj->rel_x0 + obj->alignmentMarginX;
+ obj->rel_y0
+ = alignToObj->rel_y0 + alignToObj->area.height + obj->alignmentMarginY;
+ break;
+ case BOTTOM_MIDDLE:
+ obj->rel_x0 = alignToObj->rel_x0
+ + (alignToObj->area.width - obj->area.width) / 2
+ + obj->alignmentMarginX;
+ obj->rel_y0
+ = alignToObj->rel_y0 + alignToObj->area.height + obj->alignmentMarginY;
+ break;
+ case BOTTOM_RIGHT:
+ obj->rel_x0 = alignToObj->rel_x0 + (alignToObj->area.width - obj->area.width)
+ - obj->alignmentMarginX;
+ obj->rel_y0
+ = alignToObj->rel_y0 + alignToObj->area.height + obj->alignmentMarginY;
+ break;
+ default:
+ // not supported
+ break;
+ }
+ }
+ }
+#ifdef HAVE_SE_TOUCH
+ // align on multiples of 4
+ obj->rel_y0 &= ~0x3;
+#endif // HAVE_SE_TOUCH
+}
+
+static void compute_position(nbgl_obj_t *obj, nbgl_obj_t *prevObj)
+{
+ nbgl_container_t *parent = (nbgl_container_t *) (obj->parent);
+
+ compute_relativePosition(obj, prevObj);
+
+ if (parent == NULL) {
+ // HUGE issue
+ return;
+ }
+ // LOG_DEBUG(OBJ_LOGGER,"compute_position(), parent.type = %d, parent->obj.area.x0 = %d,
+ // obj->rel_x0=%d\n",parent->type,parent->obj.area.x0,obj->rel_x0);
+ // LOG_DEBUG(OBJ_LOGGER,"compute_position(), parent->obj.area.y0 = %d,
+ // obj->rel_y0=%d\n",parent->obj.area.y0,obj->rel_y0);
+
+ obj->area.x0 = parent->obj.area.x0 + obj->rel_x0;
+ obj->area.y0 = parent->obj.area.y0 + obj->rel_y0;
+
+ if ((obj->area.x0 + obj->area.width) > SCREEN_WIDTH) {
+ LOG_FATAL(OBJ_LOGGER,
+ "compute_position(), forbidden width, obj->type = %d, x0=%d, width=%d\n",
+ obj->type,
+ obj->area.x0,
+ obj->area.width);
+ }
+#ifdef HAVE_SE_TOUCH
+ if ((obj->area.y0 + obj->area.height) > SCREEN_HEIGHT) {
+ LOG_FATAL(OBJ_LOGGER,
+ "compute_position(), forbidden height, obj->type = %d, y0=%d, height=%d\n",
+ obj->type,
+ obj->area.y0,
+ obj->area.height);
+ }
+#endif // HAVE_SE_TOUCH
+}
+
+static void draw_screen(nbgl_container_t *obj)
+{
+ nbgl_area_t rectArea;
+
+ if (objDrawingDisabled) {
+ return;
+ }
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+}
+
+static void draw_container(nbgl_container_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_container(), x0 = %d, y0 = %d, width = %d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->obj.area.width);
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ if (obj->forceClean) {
+ nbgl_frontDrawRect((nbgl_area_t *) obj);
+ }
+}
+
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief internal function used to draw a button
+ * @note The button contains an icon AND/OR a single-line UTF-8 text
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if true, force to compute the object position
+ */
+static void draw_button(nbgl_button_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ uint16_t textWidth = 0;
+ const char *text = NULL;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_button(), x0 = %d, y0 = %d, width = %d, height = %d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->obj.area.width,
+ obj->obj.area.height);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ // draw the rounded corner rectangle
+ if (obj->innerColor == obj->borderColor) {
+ nbgl_drawRoundedRect((nbgl_area_t *) obj, obj->radius, obj->innerColor);
+ }
+ else {
+ nbgl_drawRoundedBorderedRect(
+ (nbgl_area_t *) obj, obj->radius, 2, obj->innerColor, obj->borderColor);
+ }
+ // get the text of the button from the callback if not NULL
+ if (obj->onDrawCallback != NULL) {
+ obj->text = obj->onDrawCallback(obj->token);
+ }
+ else {
+ if (obj->localized == true) {
+#if defined(HAVE_LANGUAGE_PACK)
+ obj->text = get_ux_loc_string(obj->textId);
+#endif // HAVE_LANGUAGE_PACK
+ }
+ }
+ text = obj->text;
+ // draw the text (right of the icon, with 8 pixels between them)
+ if (text != NULL) {
+ nbgl_area_t rectArea;
+ textWidth = nbgl_getTextWidth(obj->fontId, text);
+ if (obj->icon != NULL) {
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width / 2
+ - (textWidth + obj->icon->width + 8) / 2 + obj->icon->width + 8;
+ }
+ else {
+ rectArea.x0 = obj->obj.area.x0 + (obj->obj.area.width - textWidth) / 2;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_button(), text = %s\n", text);
+ rectArea.y0
+ = obj->obj.area.y0 + (obj->obj.area.height - nbgl_getFontHeight(obj->fontId)) / 2;
+ rectArea.width = textWidth;
+ rectArea.height = nbgl_getFontHeight(obj->fontId);
+ rectArea.backgroundColor = obj->innerColor;
+ nbgl_drawText(&rectArea, text, nbgl_getTextLength(text), obj->fontId, obj->foregroundColor);
+ }
+ // draw the icon, if any
+ if (obj->icon != NULL) {
+ uint16_t iconX0, iconY0;
+ nbgl_area_t rectArea;
+
+ if (text != NULL) {
+ iconX0
+ = obj->obj.area.x0 + (obj->obj.area.width - (textWidth + obj->icon->width + 8)) / 2;
+ }
+ else {
+ iconX0 = obj->obj.area.x0 + (obj->obj.area.width - obj->icon->width) / 2;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_button(), obj->obj.area.height = %d, obj->iconHeight = %d\n",
+ obj->obj.area.height,
+ obj->icon->height);
+ iconY0 = obj->obj.area.y0 + (obj->obj.area.height - obj->icon->height) / 2;
+
+ rectArea.backgroundColor = obj->innerColor;
+ rectArea.x0 = iconX0;
+ rectArea.y0 = iconY0;
+ rectArea.width = obj->icon->width;
+ rectArea.height = obj->icon->height;
+ rectArea.bpp = obj->icon->bpp;
+
+ nbgl_drawIcon(&rectArea, obj->foregroundColor, obj->icon);
+ }
+}
+
+/**
+ * @brief internal function used to draw a vertical or horizontal line, up to 4 pixels thick (@ref
+ * LINE type)
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if true, force to compute the object position
+ */
+static void draw_line(nbgl_line_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_line(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_line(), backgroundColor = %d, lineColor = %d\n",
+ obj->obj.area.backgroundColor,
+ obj->lineColor);
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ if (obj->direction == VERTICAL) {
+ rectArea.width = obj->obj.area.width = obj->thickness;
+ rectArea.backgroundColor = obj->lineColor;
+ rectArea.height = obj->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ else {
+ uint8_t mask;
+ if (obj->thickness == 1) {
+ mask = 0x1 << (obj->offset & 0x3);
+ }
+ else if (obj->thickness == 2) {
+ mask = 0x3 << ((obj->offset < 3) ? obj->offset : 2);
+ }
+ else if (obj->thickness == 3) {
+ mask = 0x7 << (obj->offset & 0x1);
+ }
+ else if (obj->thickness == 4) {
+ mask = 0xF;
+ }
+ else {
+ LOG_WARN(OBJ_LOGGER, "draw_line(), forbidden thickness = %d\n", obj->thickness);
+ return;
+ }
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height = 4;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ nbgl_frontDrawHorizontalLine(&rectArea, mask, obj->lineColor);
+ }
+}
+#endif // HAVE_SE_TOUCH
+
+static void draw_image(nbgl_image_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ const nbgl_icon_details_t *iconDetails;
+ nbgl_color_map_t colorMap;
+
+ // if buffer is NULL, let's try to call onDrawCallback, if not NULL, to get it
+ if (obj->buffer == NULL) {
+ if (obj->onDrawCallback != NULL) {
+ iconDetails = obj->onDrawCallback(obj->token);
+ }
+ else {
+ return;
+ }
+ }
+ else {
+ iconDetails = obj->buffer;
+ }
+ if (iconDetails == NULL) {
+ return;
+ }
+
+ // use dimension and bpp from the icon details
+ obj->obj.area.width = iconDetails->width;
+ obj->obj.area.height = iconDetails->height;
+ obj->obj.area.bpp = iconDetails->bpp;
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_image(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ if (obj->obj.area.bpp == NBGL_BPP_1) {
+ colorMap = obj->foregroundColor;
+ }
+ else if (obj->obj.area.bpp == NBGL_BPP_2) {
+ colorMap = ((WHITE << 6) | (LIGHT_GRAY << 4) | (DARK_GRAY << 2) | BLACK);
+ }
+ else {
+ colorMap = obj->foregroundColor;
+ }
+
+ nbgl_drawIcon((nbgl_area_t *) obj, colorMap, iconDetails);
+}
+
+#ifdef HAVE_SE_TOUCH
+static void draw_switch(nbgl_switch_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+
+ // force dimensions
+ obj->obj.area.width = C_switch_60_40.width;
+ obj->obj.area.height = C_switch_60_40.height;
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_switch(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.bpp = NBGL_BPP_1;
+ if (obj->state == OFF_STATE) {
+ nbgl_frontDrawImage(&rectArea, C_switch_60_40.bitmap, NO_TRANSFORMATION, obj->offColor);
+ }
+ else {
+ nbgl_frontDrawImage(&rectArea, C_switch_60_40.bitmap, VERTICAL_MIRROR, obj->onColor);
+ }
+}
+
+static void draw_radioButton(nbgl_radio_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+
+ // force dimensions
+ obj->obj.area.width = 32;
+ obj->obj.area.height = 32;
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_radioButton(), x0 = %d, y0 = %d, state = %d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->state);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.bpp = NBGL_BPP_1;
+ if (obj->state == OFF_STATE) {
+ nbgl_drawIcon(&rectArea, obj->borderColor, &C_radio_inactive_32px);
+ }
+ else {
+ nbgl_drawIcon(&rectArea, obj->activeColor, &C_radio_active_32px);
+ }
+}
+#endif // HAVE_SE_TOUCH
+
+/**
+ * @brief internal function used to draw a progress bar object (@ref PROGRESS_BAR type)
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_progressBar(nbgl_progress_bar_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+#ifdef HAVE_SE_TOUCH
+ uint8_t stroke = 3; // 3 pixels for border
+ uint16_t levelWidth;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_progressBar(), x0 = %d, y0 = %d, level = %d %%\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->state);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ // draw external part if necessary
+ if (obj->withBorder) {
+ nbgl_drawRoundedBorderedRect((nbgl_area_t *) obj,
+ RADIUS_0_PIXELS,
+ stroke,
+ obj->obj.area.backgroundColor,
+ obj->foregroundColor);
+ }
+ else {
+ nbgl_drawRoundedRect((nbgl_area_t *) obj, RADIUS_0_PIXELS, obj->obj.area.backgroundColor);
+ }
+ // draw level
+ levelWidth = MIN(obj->obj.area.width * obj->state / 100, obj->obj.area.width);
+ if (levelWidth > 0) {
+ uint16_t tmp_width = obj->obj.area.width;
+ obj->obj.area.width = levelWidth;
+ nbgl_drawRoundedRect((nbgl_area_t *) obj, RADIUS_0_PIXELS, obj->foregroundColor);
+ obj->obj.area.width = tmp_width;
+ }
+#else // HAVE_SE_TOUCH
+ uint8_t stroke = 1; // 1 pixels for border
+ uint16_t levelWidth;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_progressBar(), x0 = %d, y0 = %d, level = %d %%\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->state);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ // draw external part if necessary
+ if (obj->withBorder) {
+ nbgl_drawRoundedBorderedRect((nbgl_area_t *) obj,
+ RADIUS_3_PIXELS,
+ stroke,
+ obj->obj.area.backgroundColor,
+ obj->foregroundColor);
+ }
+ else {
+ nbgl_drawRoundedRect((nbgl_area_t *) obj, RADIUS_3_PIXELS, obj->obj.area.backgroundColor);
+ }
+ // draw level
+ levelWidth = MIN((obj->obj.area.width - 2) * obj->state / 100, (obj->obj.area.width - 2));
+ if (levelWidth > 0) {
+ nbgl_area_t rectArea;
+ rectArea.width = levelWidth;
+ rectArea.height = obj->obj.area.height - 2;
+ rectArea.backgroundColor = obj->foregroundColor;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = obj->obj.area.x0 + 1;
+ rectArea.y0 = obj->obj.area.y0 + 1;
+
+ nbgl_frontDrawRect(&rectArea);
+ }
+#endif // HAVE_SE_TOUCH
+}
+
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief internal function used to draw a navigation indicator object (@ref PAGE_INDICATOR type)
+ * @note It is represented as a dashed line with as many dashes as pages
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_pageIndicator(nbgl_page_indicator_t *obj,
+ nbgl_obj_t *prevObj,
+ bool computePosition)
+{
+ nbgl_area_t rectArea;
+ uint16_t dashWidth;
+
+ if (obj->nbPages <= NB_MAX_PAGES_WITH_DASHES) {
+ uint8_t i;
+#define INTER_DASHES 10 // pixels
+ // force height
+ obj->obj.area.height = 4;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_pageIndicator(), x0 = %d, y0 = %d, page = %d/%d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->activePage,
+ obj->nbPages);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ dashWidth = (obj->obj.area.width - ((obj->nbPages - 1) * INTER_DASHES)) / obj->nbPages;
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = dashWidth;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.bpp = NBGL_BPP_1;
+ // draw dashes
+ for (i = 0; i <= obj->activePage; i++) {
+ nbgl_frontDrawHorizontalLine(&rectArea, 0xF, BLACK);
+ rectArea.x0 += dashWidth + INTER_DASHES;
+ }
+ for (; i < obj->nbPages; i++) {
+ nbgl_frontDrawHorizontalLine(&rectArea, 0xF, LIGHT_GRAY);
+ rectArea.x0 += dashWidth + INTER_DASHES;
+ }
+ }
+ else {
+ char navText[11]; // worst case is "ccc of nnn"
+
+ SPRINTF(navText, "%d of %d", obj->activePage + 1, obj->nbPages);
+ // force height
+ obj->obj.area.height = nbgl_getFontHeight(SMALL_REGULAR_FONT);
+ // the width must be at least 80
+ obj->obj.area.width = nbgl_getTextWidth(SMALL_REGULAR_FONT, navText);
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_pageIndicator(), x0 = %d, y0 = %d, page = %d/%d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->activePage,
+ obj->nbPages);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ // draw active page
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.bpp = NBGL_BPP_1;
+ nbgl_drawText(&rectArea, navText, strlen(navText), SMALL_REGULAR_FONT, DARK_GRAY);
+ }
+}
+#endif // HAVE_SE_TOUCH
+
+/**
+ * @brief internal function used to draw a text area
+ * @note the text itself is placed in the given area depending of textAlignment member of obj
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_textArea(nbgl_text_area_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+ uint16_t textWidth, fontHeight, lineHeight, textHeight, midHeight;
+ uint8_t line, nbLines;
+ const char *text;
+ nbgl_font_id_e fontId = obj->fontId;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ // get the text of the button from the callback if not NULL
+ if (obj->onDrawCallback != NULL) {
+ obj->text = obj->onDrawCallback(obj->token);
+ }
+ else {
+ if (obj->localized == true) {
+#if defined(HAVE_LANGUAGE_PACK)
+ obj->text = get_ux_loc_string(obj->textId);
+#endif // HAVE_LANGUAGE_PACK
+ }
+ }
+ text = obj->text;
+ if (text == NULL) {
+ return;
+ }
+
+ LOG_DEBUG(
+ OBJ_LOGGER,
+ "draw_textArea(), wrapping = %d, x0 = %d, y0 = %d, width = %d, height = %d, text = %s\n",
+ obj->wrapping,
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->obj.area.width,
+ obj->obj.area.height,
+ text);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ // draw background to make sure it's clean
+ if (obj->style == INVERTED_COLORS) {
+ obj->obj.area.backgroundColor = WHITE;
+ rectArea.backgroundColor = BLACK;
+ }
+ else {
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ }
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ if (obj->style == INVERTED_COLORS) {
+ nbgl_drawRoundedRect(&rectArea, RADIUS_1_PIXEL, WHITE);
+ }
+ else {
+ nbgl_frontDrawRect(&rectArea);
+ }
+
+ fontHeight = nbgl_getFontHeight(fontId);
+ lineHeight = nbgl_getFontLineHeight(fontId);
+ // special case of autoHideLongLine, when the text is too long for a line, draw '...' at the
+ // beginning
+ if (obj->autoHideLongLine == true) {
+ textWidth = nbgl_getSingleLineTextWidth(fontId, text);
+ if (textWidth > obj->obj.area.width) {
+ uint16_t lineWidth, lineLen;
+ uint16_t dotsWidth;
+
+ // at first draw "..." at beginning
+ dotsWidth = nbgl_getTextWidth(fontId, "...");
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0 + (obj->obj.area.height - fontHeight) / 2;
+ rectArea.width = dotsWidth;
+ nbgl_drawText(&rectArea, "...", 3, fontId, obj->textColor);
+ // then draw the end of text
+ nbgl_getTextMaxLenAndWidthFromEnd(
+ fontId, text, obj->obj.area.width - dotsWidth, &lineLen, &lineWidth);
+ rectArea.x0 += dotsWidth;
+ rectArea.width = lineWidth;
+ nbgl_drawText(&rectArea,
+ &text[nbgl_getTextLength(text) - lineLen],
+ lineLen,
+ obj->fontId,
+ obj->textColor);
+ return;
+ }
+ }
+
+ // get nb lines in the given width (depending of wrapping)
+ nbLines = nbgl_getTextNbLinesInWidth(fontId, text, obj->obj.area.width, obj->wrapping);
+ // saturate nb lines if nbMaxLines is greater than 0
+ if ((obj->nbMaxLines > 0) && (obj->nbMaxLines < nbLines)) {
+ nbLines = obj->nbMaxLines;
+ }
+
+ textHeight = (nbLines - 1) * lineHeight + fontHeight;
+
+ midHeight = (obj->obj.area.height - textHeight) / 2;
+ // Be sure midHeight is modulo 4
+#ifdef HAVE_SE_TOUCH
+ if (midHeight % 4) {
+ midHeight -= midHeight % 4;
+ }
+#else // HAVE_SE_TOUCH
+ if (obj->style == INVERTED_COLORS) {
+ midHeight--;
+ }
+#endif // HAVE_SE_TOUCH
+
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.height = fontHeight;
+ // draw each line
+ for (line = 0; line < nbLines; line++) {
+ uint16_t lineWidth, lineLen;
+
+ nbgl_getTextMaxLenAndWidth(
+ fontId, text, obj->obj.area.width, &lineLen, &lineWidth, obj->wrapping);
+ if (obj->textAlignment == MID_LEFT) {
+ rectArea.x0 = obj->obj.area.x0;
+ }
+ else if (obj->textAlignment == CENTER) {
+ rectArea.x0 = obj->obj.area.x0 + (obj->obj.area.width - lineWidth) / 2;
+ }
+ else if (obj->textAlignment == MID_RIGHT) {
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - lineWidth;
+ }
+ else {
+ LOG_FATAL(OBJ_LOGGER, "Forbidden obj->textAlignment = %d\n", obj->textAlignment);
+ }
+ rectArea.y0 = obj->obj.area.y0 + midHeight + line * lineHeight;
+ rectArea.width = lineWidth;
+
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_textArea(), %s line %d, lineLen %d lineWidth = %d, obj.area.height = %d, "
+ "textHeight = %d, nbMaxLines = %d, wrapping = %d\n",
+ text + 3,
+ line,
+ lineLen,
+ lineWidth,
+ obj->obj.area.height,
+ textHeight,
+ obj->nbMaxLines,
+ obj->wrapping);
+ if ((obj->nbMaxLines == 0) || (line < (obj->nbMaxLines - 1))) {
+ fontId = nbgl_drawText(&rectArea, text, lineLen, fontId, obj->textColor);
+ }
+ else {
+#ifdef HAVE_SE_TOUCH
+ // for last chunk, if nbMaxLines is used, replace the 3 last chars by "..."
+ // draw line except 3 last chars
+ nbgl_drawText(&rectArea, text, lineLen - 3, obj->fontId, obj->textColor);
+ // draw "..." after the other chars
+ rectArea.x0 += nbgl_getSingleLineTextWidthInLen(obj->fontId, text, lineLen - 3);
+ rectArea.width = nbgl_getSingleLineTextWidth(obj->fontId, "...");
+ nbgl_drawText(&rectArea, "...", 3, obj->fontId, obj->textColor);
+#else // HAVE_SE_TOUCH
+ nbgl_drawText(&rectArea, text, lineLen, fontId, obj->textColor);
+#endif // HAVE_SE_TOUCH
+ return;
+ }
+ text += lineLen;
+ /* skip trailing \n */
+ if (*text == '\n') {
+ text++;
+ }
+ }
+}
+
+#ifdef NBGL_QRCODE
+/**
+ * @brief internal function used to draw a QR Code
+ * @note the QRCode is centered in the given object area
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_qrCode(nbgl_qrcode_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_qrCode(), x0 = %d, y0 = %d, width = %d, height = %d, text = %s\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->obj.area.width,
+ obj->obj.area.height,
+ obj->text);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ nbgl_drawQrCode(
+ &rectArea, (obj->version == QRCODE_V4) ? 4 : 10, obj->text, obj->foregroundColor);
+}
+#endif // NBGL_QRCODE
+
+#ifdef NBGL_KEYBOARD
+/**
+ * @brief internal function used to draw a Keyboard object
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_keyboard(nbgl_keyboard_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+#ifdef HAVE_SE_TOUCH
+ obj->obj.area.width = SCREEN_WIDTH;
+ obj->obj.area.height = 3 * KEYBOARD_KEY_HEIGHT;
+ if (!obj->lettersOnly) {
+ obj->obj.area.height += KEYBOARD_KEY_HEIGHT;
+ }
+#else // HAVE_SE_TOUCH
+ obj->obj.area.width = KEYBOARD_WIDTH;
+ obj->obj.area.height = KEYBOARD_KEY_HEIGHT;
+#endif // HAVE_SE_TOUCH
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(
+ OBJ_LOGGER, "draw_keyboard(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ nbgl_objDrawKeyboard(obj);
+}
+#endif // NBGL_KEYBOARD
+
+#ifdef NBGL_KEYPAD
+/**
+ * @brief internal function used to draw a Keypad object
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_keypad(nbgl_keypad_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+#ifdef HAVE_SE_TOUCH
+ obj->obj.area.width = SCREEN_WIDTH;
+ obj->obj.area.height = 4 * KEYPAD_KEY_HEIGHT;
+#else // HAVE_SE_TOUCH
+ obj->obj.area.height = KEYPAD_HEIGHT;
+ obj->obj.area.width = KEYPAD_WIDTH;
+#endif // HAVE_SE_TOUCH
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_keypad(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+
+ nbgl_objDrawKeypad(obj);
+}
+#endif // NBGL_KEYPAD
+
+#ifdef HAVE_SE_TOUCH
+/**
+ * @brief internal function used to draw a Spinner object
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_spinner(nbgl_spinner_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+ color_t foreColor;
+
+ obj->obj.area.width = 60;
+ obj->obj.area.height = 44;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+ LOG_DEBUG(OBJ_LOGGER, "draw_spinner(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+
+ // inherit background from parent
+ obj->obj.area.backgroundColor = obj->obj.parent->area.backgroundColor;
+ // foreground color is the opposite of background one
+ foreColor = (obj->obj.area.backgroundColor == WHITE) ? BLACK : WHITE;
+
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ // if position is OxFF, it means "fixed" so draw 4 corners
+ if (obj->position == 0xFF) {
+ // draw horizontal segments
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = 20;
+ rectArea.height = 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x7, foreColor); // top left
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x7, foreColor); // top right
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0xE, foreColor); // bottom right
+ rectArea.x0 = obj->obj.area.x0;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0xE, foreColor); // bottom left
+ // draw vertical segments
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = 3;
+ rectArea.height = 12;
+ rectArea.backgroundColor = foreColor;
+ nbgl_frontDrawRect(&rectArea); // top left
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ nbgl_frontDrawRect(&rectArea); // top right
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - rectArea.height;
+ nbgl_frontDrawRect(&rectArea); // bottom right
+ rectArea.x0 = obj->obj.area.x0;
+ nbgl_frontDrawRect(&rectArea); // bottom left
+ }
+ else {
+ uint8_t mask;
+ // clean up full rectangle
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ nbgl_frontDrawRect(&rectArea); // top left
+
+ // draw horizontal segment in foreColor
+ rectArea.width = 20;
+ rectArea.height = 4;
+ switch (obj->position) {
+ case 0: // top left corner
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ mask = 0x7;
+ break;
+ case 1: // top right
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ rectArea.y0 = obj->obj.area.y0;
+ mask = 0x7;
+ break;
+ case 2: // bottom right
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - 4;
+ mask = 0xE;
+ break;
+ case 3: // bottom left
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - 4;
+ mask = 0xE;
+ break;
+ default:
+ return;
+ }
+ nbgl_frontDrawHorizontalLine(&rectArea, mask, foreColor);
+
+ // draw vertical segment in foreColor
+ rectArea.width = 3;
+ rectArea.height = 12;
+ rectArea.backgroundColor = foreColor;
+ switch (obj->position) {
+ case 0: // top left corner
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ break;
+ case 1: // top right corner
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ rectArea.y0 = obj->obj.area.y0;
+ break;
+ case 2: // bottom right corner
+ rectArea.x0 = obj->obj.area.x0 + obj->obj.area.width - rectArea.width;
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - rectArea.height;
+ break;
+ case 3: // bottom left corner
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0 + obj->obj.area.height - rectArea.height;
+ break;
+ default:
+ return;
+ }
+ nbgl_frontDrawRect(&rectArea);
+ }
+}
+
+#else // HAVE_SE_TOUCH
+
+/**
+ * @brief internal function used to draw a text entry
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_textEntry(nbgl_text_entry_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ nbgl_area_t rectArea;
+ int textLen = strlen(obj->text);
+ uint32_t offsetX;
+
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+
+ LOG_DEBUG(OBJ_LOGGER,
+ "draw_textEntry(), x0 = %d, y0 = %d, width = %d, height = %d\n",
+ obj->obj.area.x0,
+ obj->obj.area.y0,
+ obj->obj.area.width,
+ obj->obj.area.height);
+
+ // draw background to make sure it's clean
+ obj->obj.area.backgroundColor = WHITE;
+ rectArea.backgroundColor = BLACK;
+ rectArea.x0 = obj->obj.area.x0;
+ rectArea.y0 = obj->obj.area.y0;
+ rectArea.width = obj->obj.area.width;
+ rectArea.height = obj->obj.area.height;
+ rectArea.bpp = NBGL_BPP_1;
+ nbgl_drawRoundedRect(&rectArea, RADIUS_3_PIXELS, WHITE);
+
+ rectArea.backgroundColor = obj->obj.area.backgroundColor;
+ rectArea.height = nbgl_getFontHeight(obj->fontId);
+ if (obj->nbChars > NB_MAX_LETTERS) {
+ return;
+ }
+ offsetX = (obj->obj.area.width - (obj->nbChars * 10)) / 2;
+ // draw each of the nb chars
+ for (int i = 0; i < obj->nbChars; i++) {
+ char digit;
+ rectArea.x0 = obj->obj.area.x0 + offsetX + (i * 10);
+ rectArea.y0 = obj->obj.area.y0 - 2;
+ rectArea.width = 8;
+ if (textLen < obj->nbChars) {
+ if (i < textLen) {
+ digit = obj->text[i];
+ }
+ else {
+ digit = '_';
+ }
+ }
+ else {
+ // first char is '..' to notify continuing
+ if (i == 0) {
+ nbgl_drawText(&rectArea, "..", 2, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp, BLACK);
+ continue;
+ }
+ else if (i < (obj->nbChars - 1)) {
+ digit = obj->text[textLen - obj->nbChars + 1 + i];
+ }
+ else {
+ digit = '_';
+ }
+ }
+ nbgl_drawText(&rectArea, &digit, 1, BAGL_FONT_OPEN_SANS_EXTRABOLD_11px_1bpp, BLACK);
+ }
+}
+#endif // HAVE_SE_TOUCH
+
+/**
+ * @brief internal function used to draw an image file
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+static void draw_image_file(nbgl_image_file_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ if (obj->buffer == NULL) {
+ return;
+ }
+ if (computePosition) {
+ compute_position((nbgl_obj_t *) obj, prevObj);
+ }
+ if (objDrawingDisabled) {
+ return;
+ }
+
+ LOG_DEBUG(
+ OBJ_LOGGER, "draw_image_file(), x0 = %d, y0 = %d\n", obj->obj.area.x0, obj->obj.area.y0);
+ nbgl_frontDrawImageFile((nbgl_area_t *) obj, obj->buffer, 0, ramBuffer);
+}
+
+/**
+ * @brief internal function used to draw an object of any type
+ *
+ * @param obj the object to draw
+ * @param prevObj the previous object drawned in the same container, with the default layout
+ * @param computePosition if TRUE, force to compute the object position
+ */
+#ifdef __GNUC__
+#ifndef __clang__
+__attribute__((optimize("O0")))
+#endif
+#endif
+static void
+draw_object(nbgl_obj_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ LOG_DEBUG(OBJ_LOGGER, "draw_object() obj->type = %d, prevObj = %p\n", obj->type, prevObj);
+ switch (obj->type) {
+ case SCREEN:
+ draw_screen((nbgl_container_t *) obj);
+ break;
+ case CONTAINER:
+ draw_container((nbgl_container_t *) obj, prevObj, computePosition);
+ break;
+#ifdef HAVE_SE_TOUCH
+ case BUTTON:
+ draw_button((nbgl_button_t *) obj, prevObj, computePosition);
+ break;
+ case LINE:
+ draw_line((nbgl_line_t *) obj, prevObj, computePosition);
+ break;
+#endif // HAVE_SE_TOUCH
+ case IMAGE:
+ draw_image((nbgl_image_t *) obj, prevObj, computePosition);
+ break;
+#ifdef HAVE_SE_TOUCH
+ case SWITCH:
+ draw_switch((nbgl_switch_t *) obj, prevObj, computePosition);
+ break;
+ case RADIO_BUTTON:
+ draw_radioButton((nbgl_radio_t *) obj, prevObj, computePosition);
+ break;
+#endif // HAVE_SE_TOUCH
+ case PROGRESS_BAR:
+ draw_progressBar((nbgl_progress_bar_t *) obj, prevObj, computePosition);
+ break;
+#ifdef HAVE_SE_TOUCH
+ case PAGE_INDICATOR:
+ draw_pageIndicator((nbgl_page_indicator_t *) obj, prevObj, computePosition);
+ break;
+#endif // HAVE_SE_TOUCH
+ case TEXT_AREA:
+ draw_textArea((nbgl_text_area_t *) obj, prevObj, computePosition);
+ break;
+#ifdef NBGL_QRCODE
+ case QR_CODE:
+ draw_qrCode((nbgl_qrcode_t *) obj, prevObj, computePosition);
+ break;
+#endif // NBGL_QRCODE
+#ifdef NBGL_KEYBOARD
+ case KEYBOARD:
+ draw_keyboard((nbgl_keyboard_t *) obj, prevObj, computePosition);
+ break;
+#endif // NBGL_KEYBOARD
+#ifdef NBGL_KEYPAD
+ case KEYPAD:
+ draw_keypad((nbgl_keypad_t *) obj, prevObj, computePosition);
+ break;
+#endif // NBGL_KEYPAD
+#ifdef HAVE_SE_TOUCH
+ case SPINNER:
+ draw_spinner((nbgl_spinner_t *) obj, prevObj, computePosition);
+ break;
+#endif // HAVE_SE_TOUCH
+ case IMAGE_FILE:
+ draw_image_file((nbgl_image_file_t *) obj, prevObj, computePosition);
+ break;
+#ifndef HAVE_SE_TOUCH
+ case TEXT_ENTRY:
+ draw_textEntry((nbgl_text_entry_t *) obj, prevObj, computePosition);
+ break;
+#endif // HAVE_SE_TOUCH
+ default:
+ LOG_DEBUG(OBJ_LOGGER, "Not existing object type\n");
+ break;
+ }
+
+#ifdef HAVE_SERIALIZED_NBGL
+ io_seproxyhal_send_nbgl_serialized(NBGL_DRAW_OBJ, obj);
+#endif
+ if (!objDrawingDisabled) {
+ extendRefreshArea(obj);
+ }
+}
+
+/**
+ * @brief internal function used when an object is drawn, to extend the area to be refresh in
+ * display
+ *
+ * @param obj the object drawn
+ */
+static void extendRefreshArea(nbgl_obj_t *obj)
+{
+ int16_t x1, y1; // bottom right corner
+ x1 = refreshArea.x0 + refreshArea.width;
+ y1 = refreshArea.y0 + refreshArea.height;
+
+ // if obj top-left is on left of current top-left corner, move top-left corner
+ if (obj->area.x0 < refreshArea.x0) {
+ refreshArea.x0 = obj->area.x0;
+ }
+ // if obj bottom-right is on right of current bottom-right corner, move bottom-right corner
+ if (((obj->area.x0 + obj->area.width) > x1) || (refreshArea.width == 0)) {
+ x1 = obj->area.x0 + obj->area.width;
+ }
+ // if obj top-left is on top of current top-left corner, move top-left corner
+ if (obj->area.y0 < refreshArea.y0) {
+ refreshArea.y0 = obj->area.y0;
+ }
+ // if obj bottom-right is on bottom of current bottom-right corner, move bottom-right corner
+ if (((obj->area.y0 + obj->area.height) > y1) || (refreshArea.height == 0)) {
+ y1 = obj->area.y0 + obj->area.height;
+ }
+
+ // sanity check
+ if (x1 > SCREEN_WIDTH) {
+ LOG_FATAL(OBJ_LOGGER,
+ "extendRefreshArea: Impossible area x0 = %d width %d\n",
+ refreshArea.x0,
+ refreshArea.width);
+ }
+ if (y1 > SCREEN_HEIGHT) {
+#ifdef HAVE_SE_TOUCH
+ LOG_FATAL(OBJ_LOGGER,
+ "extendRefreshArea: Impossible area y0 = %d height %d\n",
+ refreshArea.y0,
+ refreshArea.height);
+#else // HAVE_SE_TOUCH
+ y1 = SCREEN_HEIGHT;
+#endif // HAVE_SE_TOUCH
+ }
+ // recompute width and height
+ refreshArea.width = x1 - refreshArea.x0;
+ refreshArea.height = y1 - refreshArea.y0;
+
+ // revaluate area bpp
+ if (obj->area.bpp > refreshArea.bpp) {
+ refreshArea.bpp = obj->area.bpp;
+ }
+}
+
+/**
+ * @brief This function redraws the given object and its children (recursive version)
+ *
+ * @param obj the object to redraw
+ * @param prevObj the previous child of this object in the parent's children array (may be NULL for
+ * first element of the array)
+ * @param computePosition if set to true, means that the position of the object will be recomputed
+ * (needs prevObj if alignment on this object)
+ */
+void nbgl_redrawObject(nbgl_obj_t *obj, nbgl_obj_t *prevObj, bool computePosition)
+{
+ uint8_t i = 0;
+ LOG_DEBUG(OBJ_LOGGER, "nbgl_redrawObject(): obj = %p\n", obj);
+ // draw the object itself
+ draw_object(obj, prevObj, computePosition);
+
+ if ((obj->type == SCREEN) || (obj->type == CONTAINER)) {
+ nbgl_container_t *container = (nbgl_container_t *) obj;
+ nbgl_obj_t *prev = NULL;
+ LOG_DEBUG(
+ OBJ_LOGGER, "nbgl_redrawObject(): container->children = %p\n", container->children);
+ // draw the children, if any
+ if (container->children != NULL) {
+ for (i = 0; i < container->nbChildren; i++) {
+ nbgl_obj_t *current = container->children[i];
+ if (current != NULL) {
+ current->parent = (nbgl_obj_t *) container;
+ nbgl_redrawObject(current, prev, true);
+ if (current->alignTo == NULL) {
+ prev = current;
+ }
+ }
+ }
+ }
+ }
+}
+
+/**
+ * @brief This functions refreshes the actual screen on display with what has changed since the last
+ * refresh
+ *
+ */
+void nbgl_refresh(void)
+{
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+}
+
+/**
+ * @brief This functions refreshes the actual screen on display with what has changed since the last
+ * refresh, according to the given mode (Black&White and other)
+ * @param mode mode of refresh
+ */
+void nbgl_refreshSpecial(nbgl_refresh_mode_t mode)
+{
+ if ((refreshArea.width == 0) || (refreshArea.height == 0)) {
+ return;
+ }
+
+ nbgl_frontRefreshArea(&refreshArea, mode, POST_REFRESH_FORCE_POWER_OFF);
+ LOG_DEBUG(OBJ_LOGGER,
+ "nbgl_refreshSpecial(), x0,y0 = [%d, %d], w,h = [%d, %d]\n",
+ refreshArea.x0,
+ refreshArea.y0,
+ refreshArea.width,
+ refreshArea.height);
+ nbgl_refreshReset();
+}
+
+void nbgl_refreshSpecialWithPostRefresh(nbgl_refresh_mode_t mode, nbgl_post_refresh_t post_refresh)
+{
+ if ((refreshArea.width == 0) || (refreshArea.height == 0)) {
+ return;
+ }
+
+ nbgl_frontRefreshArea(&refreshArea, mode, post_refresh);
+ LOG_DEBUG(OBJ_LOGGER,
+ "nbgl_refreshSpecialNoPoff(), x0,y0 = [%d, %d], w,h = [%d, %d]\n",
+ refreshArea.x0,
+ refreshArea.y0,
+ refreshArea.width,
+ refreshArea.height);
+ nbgl_refreshReset();
+}
+
+/**
+ * @brief This functions returns true if there is something to refresh
+ * @return true if there is something to refresh
+ */
+bool nbgl_refreshIsNeeded(void)
+{
+ if ((refreshArea.width == 0) || (refreshArea.height == 0)) {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * @brief This functions resets all changes since the last refresh
+ *
+ */
+void nbgl_refreshReset(void)
+{
+#ifdef HAVE_SERIALIZED_NBGL
+ io_seproxyhal_send_nbgl_serialized(NBGL_REFRESH_AREA, (nbgl_obj_t *) &refreshArea);
+#endif
+ refreshArea.x0 = SCREEN_WIDTH - 1;
+ refreshArea.width = 0;
+ refreshArea.y0 = SCREEN_HEIGHT - 1;
+ refreshArea.height = 0;
+ refreshArea.bpp = NBGL_BPP_2;
+}
+
+/**
+ * @brief This functions inits all internal of nbgl objects layer
+ *
+ */
+void nbgl_objInit(void)
+{
+ // init area to the smallest size
+ nbgl_refreshReset();
+}
+
+/**
+ * @brief This functions enables or disables drawing/refresh for all further calls
+ *
+ * @param enable if true, enables drawing/refresh, otherwise disables
+ */
+void nbgl_objAllowDrawing(bool enable)
+{
+ objDrawingDisabled = !enable;
+}
diff --git a/sdk_lib_nbgl/src/nbgl_obj_keyboard.c b/sdk_lib_nbgl/src/nbgl_obj_keyboard.c
new file mode 100644
index 00000000..9332cd12
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj_keyboard.c
@@ -0,0 +1,699 @@
+
+/**
+ * @file nbgl_obj_keyboard.c
+ * @brief The construction and touch management of a keyboard object
+ *
+ */
+
+#ifdef NBGL_KEYBOARD
+#ifdef HAVE_SE_TOUCH
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_debug.h"
+#include "nbgl_front.h"
+#include "nbgl_draw.h"
+#include "nbgl_obj.h"
+#include "nbgl_fonts.h"
+#include "nbgl_touch.h"
+#include "glyphs.h"
+#include "os_io.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+#define FIRST_LINE_CHAR_COUNT 10
+#define SECOND_LINE_CHAR_COUNT 9
+
+#define NORMAL_KEY_WIDTH 40
+#define LETTER_OFFSET_Y (((KEYBOARD_KEY_HEIGHT - 32) / 2) & 0xFFC)
+#define SHIFT_KEY_WIDTH (NORMAL_KEY_WIDTH + SECOND_LINE_OFFSET)
+#define SECOND_LINE_OFFSET ((SCREEN_WIDTH - (SECOND_LINE_CHAR_COUNT * NORMAL_KEY_WIDTH)) / 2)
+#define SPACE_KEY_WIDTH 276
+#define SWITCH_KEY_WIDTH (SCREEN_WIDTH - SPACE_KEY_WIDTH)
+#define SPECIAL_CHARS_KEY_WIDTH (NORMAL_KEY_WIDTH * 2 + SECOND_LINE_OFFSET)
+#define BACKSPACE_KEY_WIDTH_FULL SHIFT_KEY_WIDTH
+#define BACKSPACE_KEY_WIDTH_DIGITS SPECIAL_CHARS_KEY_WIDTH
+#define BACKSPACE_KEY_WIDTH_LETTERS_ONLY (SCREEN_WIDTH - 7 * NORMAL_KEY_WIDTH)
+
+#define SHIFT_KEY_INDEX 26
+#define DIGITS_SWITCH_KEY_INDEX 27
+#define BACKSPACE_KEY_INDEX 28
+#define SPACE_KEY_INDEX 29
+#define SPECIAL_KEYS_INDEX 30
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static const char kbd_chars[] = "qwertyuiopasdfghjklzxcvbnm";
+static const char kbd_chars_upper[] = "QWERTYUIOPASDFGHJKLZXCVBNM";
+const char kbd_digits[] = "1234567890-/:;()&@\".,?!\'";
+static const char kbd_specials[] = "[]{}#%^*+=_\\|~<>$`\".,?!\'";
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+static uint8_t getKeyboardIndex(nbgl_keyboard_t *keyboard, nbgl_touchStatePosition_t *position)
+{
+ uint8_t i = 0;
+ // get index of key pressed
+ if (position->y < KEYBOARD_KEY_HEIGHT) {
+ // 1st row:
+ i = position->x / NORMAL_KEY_WIDTH;
+ }
+ else if (position->y < (2 * KEYBOARD_KEY_HEIGHT)) {
+ // 2nd row:
+ i = FIRST_LINE_CHAR_COUNT + (position->x - SECOND_LINE_OFFSET) / NORMAL_KEY_WIDTH;
+ if (i >= FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT) {
+ i = FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT - 1;
+ }
+ }
+ else if (position->y < (3 * KEYBOARD_KEY_HEIGHT)) {
+ // 3rd row:
+ if (keyboard->mode == MODE_LETTERS) {
+ // shift does not exist in letters only mode
+ if (!keyboard->lettersOnly) {
+ if (position->x < SHIFT_KEY_WIDTH) {
+ i = SHIFT_KEY_INDEX;
+ }
+ else {
+ i = FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT
+ + (position->x - SHIFT_KEY_WIDTH) / NORMAL_KEY_WIDTH;
+ // Backspace key is a bit larger...
+ if (i >= 26) {
+ i = BACKSPACE_KEY_INDEX;
+ }
+ }
+ }
+ else {
+ i = FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT + position->x / NORMAL_KEY_WIDTH;
+ // Backspace key is larger...
+ if (i >= 26) {
+ i = BACKSPACE_KEY_INDEX;
+ }
+ }
+ }
+ else {
+ if (position->x < SPECIAL_CHARS_KEY_WIDTH) {
+ i = SPECIAL_KEYS_INDEX;
+ }
+ else {
+ i = FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT
+ + (position->x - SPECIAL_CHARS_KEY_WIDTH) / NORMAL_KEY_WIDTH;
+ // Backspace key is a bit larger...
+ if (i >= 24) {
+ i = BACKSPACE_KEY_INDEX;
+ }
+ }
+ }
+ }
+ else if (!keyboard->lettersOnly && (position->y < (4 * KEYBOARD_KEY_HEIGHT))) {
+ // 4th row
+ if (position->x < SWITCH_KEY_WIDTH) {
+ i = DIGITS_SWITCH_KEY_INDEX;
+ }
+ else {
+ i = SPACE_KEY_INDEX;
+ }
+ }
+ return i;
+}
+
+// draw parts common to all modes of keyboard
+static void keyboardDrawCommonLines(nbgl_keyboard_t *keyboard)
+{
+ nbgl_area_t rectArea;
+
+ // clean full area
+ rectArea.backgroundColor = keyboard->obj.area.backgroundColor;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = keyboard->obj.area.width;
+ rectArea.height = keyboard->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+
+ /// draw horizontal lines
+ rectArea.backgroundColor = keyboard->obj.area.backgroundColor;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = keyboard->obj.area.width;
+ rectArea.height = 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor); // 1st line (top)
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor); // 2nd line
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor); // 3rd line
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor); // 4th line
+ if (!keyboard->lettersOnly) {
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor); // 5th line
+ }
+ /// then draw vertical lines
+ rectArea.backgroundColor = keyboard->borderColor;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT * 3;
+ if (!keyboard->lettersOnly) {
+ rectArea.height += KEYBOARD_KEY_HEIGHT;
+ }
+ nbgl_frontDrawRect(&rectArea); // 1st full line, on the left
+}
+
+// draw full grid for letters mode
+static void keyboardDrawLetterGrid(nbgl_keyboard_t *keyboard)
+{
+ nbgl_area_t rectArea;
+ uint8_t i;
+
+ /// draw common lines
+ keyboardDrawCommonLines(keyboard);
+
+ // then all vertical lines separating keys
+ rectArea.backgroundColor = keyboard->borderColor;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT;
+ // First row of keys: 10 letters (qwertyuiop)
+ for (i = 0; i < 9; i++) {
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+
+ // Second row: 9 letters (asdfghjkl)
+ rectArea.x0 = keyboard->obj.area.x0 + SECOND_LINE_OFFSET;
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawRect(&rectArea);
+ for (i = 10; i < 19; i++) {
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ // Third row: Shift key, 7 letters (zxcvbnm) and backspace in normal mode
+ // Third row: 7 letters (zxcvbnm) and backspace in letters only mode
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ if (!keyboard->lettersOnly) {
+ rectArea.x0 = keyboard->obj.area.x0 + SHIFT_KEY_WIDTH;
+ }
+ else {
+ rectArea.x0 = NORMAL_KEY_WIDTH;
+ }
+ for (i = 0; i < 6; i++) {
+ nbgl_frontDrawRect(&rectArea);
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ }
+ if (!keyboard->lettersOnly) {
+ nbgl_frontDrawRect(&rectArea);
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ }
+ nbgl_frontDrawRect(&rectArea);
+
+ // 4th row, only in Full mode
+ if (!keyboard->lettersOnly) {
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ rectArea.x0 = keyboard->obj.area.x0 + SWITCH_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+}
+
+// draw full grid for digits/special mode
+static void keyboardDrawDigitsGrid(nbgl_keyboard_t *keyboard)
+{
+ nbgl_area_t rectArea;
+ uint8_t i;
+
+ /// draw common lines
+ keyboardDrawCommonLines(keyboard);
+
+ // then all vertical lines separating keys
+ rectArea.backgroundColor = keyboard->borderColor;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT;
+ // First row of keys: 10 keys so 9 separations
+ for (i = 0; i < 9; i++) {
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+
+ // Second row: 9 keys
+ rectArea.x0 = keyboard->obj.area.x0 + SECOND_LINE_OFFSET;
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawRect(&rectArea);
+ for (i = 10; i < 19; i++) {
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ // Third row: Special char key, 5 keys and backspace
+ rectArea.x0 = keyboard->obj.area.x0 + SPECIAL_CHARS_KEY_WIDTH;
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ nbgl_frontDrawRect(&rectArea);
+ for (i = 0; i < 5; i++) {
+ rectArea.x0 += NORMAL_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+ }
+
+ // 4th row, switch to letters and space
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ rectArea.x0 = keyboard->obj.area.x0 + SWITCH_KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea);
+}
+
+// draw letters for letters mode
+static void keyboardDrawLetters(nbgl_keyboard_t *keyboard)
+{
+ uint8_t i;
+ nbgl_area_t rectArea;
+ const char *keys;
+
+ if (keyboard->casing != LOWER_CASE) {
+ keys = kbd_chars_upper;
+ }
+ else {
+ keys = kbd_chars;
+ }
+
+ rectArea.backgroundColor = keyboard->obj.area.backgroundColor;
+ rectArea.y0 = keyboard->obj.area.y0 + LETTER_OFFSET_Y;
+ rectArea.width = 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT * 3;
+ rectArea.x0 = keyboard->obj.area.x0;
+
+ // First row of keys: 10 letters (qwertyuiop)
+ for (i = 0; i < 10; i++) {
+ rectArea.x0 = keyboard->obj.area.x0 + i * NORMAL_KEY_WIDTH;
+
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // Second row: 9 letters (asdfghjkl)
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ for (i = 10; i < 19; i++) {
+ rectArea.x0 = keyboard->obj.area.x0 + SECOND_LINE_OFFSET + (i - 10) * NORMAL_KEY_WIDTH;
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // Third row: Shift key, 7 letters (zxcvbnm) and backspace
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ uint16_t offsetX;
+ if (!keyboard->lettersOnly) {
+ // draw background rectangle
+ rectArea.width = SHIFT_KEY_WIDTH - 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2;
+ rectArea.x0 = 1;
+ rectArea.backgroundColor = (keyboard->casing != LOWER_CASE) ? BLACK : WHITE;
+ nbgl_frontDrawRect(&rectArea);
+ // draw horizontal line
+ rectArea.width = SHIFT_KEY_WIDTH - 1;
+ rectArea.height = 4;
+ rectArea.x0 = 1;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2;
+ rectArea.backgroundColor = (keyboard->casing != LOWER_CASE) ? BLACK : WHITE;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keyboard->borderColor);
+ // draw Shift key
+ rectArea.width = C_shift32px.width;
+ rectArea.height = C_shift32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.y0 = (keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2
+ + (KEYBOARD_KEY_HEIGHT - rectArea.height) / 2)
+ & 0xFFC;
+ rectArea.x0 = (SHIFT_KEY_WIDTH - rectArea.width) / 2;
+ rectArea.backgroundColor = (keyboard->casing != LOWER_CASE) ? BLACK : WHITE;
+ nbgl_drawIcon(
+ &rectArea,
+ (keyboard->casing != LOWER_CASE) ? WHITE : BLACK,
+ (keyboard->casing != LOCKED_UPPER_CASE) ? (&C_shift_lock32px) : (&C_shift32px));
+ rectArea.backgroundColor = WHITE;
+ offsetX = keyboard->obj.area.x0 + SHIFT_KEY_WIDTH;
+ }
+ else {
+ offsetX = 0;
+ }
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2 + LETTER_OFFSET_Y;
+ for (i = 19; i < 26; i++) {
+ rectArea.x0 = offsetX + (i - 19) * NORMAL_KEY_WIDTH;
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // draw backspace
+ rectArea.width = C_backspace32px.width;
+ rectArea.height = C_backspace32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = offsetX + 7 * NORMAL_KEY_WIDTH;
+ rectArea.y0 = (keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2
+ + (KEYBOARD_KEY_HEIGHT - rectArea.height) / 2)
+ & 0xFFC;
+ if (!keyboard->lettersOnly) {
+ rectArea.x0 += (BACKSPACE_KEY_WIDTH_FULL - rectArea.width) / 2;
+ }
+ else {
+ rectArea.x0 += (BACKSPACE_KEY_WIDTH_LETTERS_ONLY - rectArea.width) / 2;
+ }
+ nbgl_drawIcon(&rectArea, (keyboard->keyMask & (1 << 26)) ? WHITE : BLACK, &C_backspace32px);
+
+ // 4th row, only in Full mode
+ if (!keyboard->lettersOnly) {
+ rectArea.x0 = (SWITCH_KEY_WIDTH - nbgl_getTextWidth(SMALL_REGULAR_1BPP_FONT, ".?123")) / 2;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 3 + LETTER_OFFSET_Y;
+ nbgl_drawText(&rectArea, ".?123", 5, SMALL_REGULAR_1BPP_FONT, BLACK);
+
+ rectArea.x0 = SWITCH_KEY_WIDTH + (SPACE_KEY_WIDTH - C_space32px.width) / 2;
+ nbgl_drawIcon(
+ &rectArea, (keyboard->keyMask & (1 << SPACE_KEY_INDEX)) ? WHITE : BLACK, &C_space32px);
+ }
+}
+
+// draw digits/special chars for digits/special mode
+static void keyboardDrawDigits(nbgl_keyboard_t *keyboard)
+{
+ uint8_t i;
+ nbgl_area_t rectArea;
+ const char *keys;
+
+ if (keyboard->mode == MODE_DIGITS) {
+ keys = kbd_digits;
+ }
+ else {
+ keys = kbd_specials;
+ }
+
+ rectArea.backgroundColor = keyboard->obj.area.backgroundColor;
+ rectArea.y0 = keyboard->obj.area.y0 + LETTER_OFFSET_Y;
+ rectArea.width = 1;
+ rectArea.height = KEYBOARD_KEY_HEIGHT * 3;
+ rectArea.x0 = keyboard->obj.area.x0;
+
+ // First row of keys: 10 digits (1234567890)
+ for (i = 0; i < 10; i++) {
+ rectArea.x0 = keyboard->obj.area.x0 + i * NORMAL_KEY_WIDTH;
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // Second row: 9 keys ()
+ rectArea.y0 += KEYBOARD_KEY_HEIGHT;
+ for (i = 10; i < 19; i++) {
+ rectArea.x0 = keyboard->obj.area.x0 + (i - 10) * NORMAL_KEY_WIDTH + SECOND_LINE_OFFSET;
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // Third row: special key, 5 keys and backspace
+
+ // draw "#+=" key
+ if (keyboard->mode == MODE_DIGITS) {
+ rectArea.x0
+ = (SPECIAL_CHARS_KEY_WIDTH - nbgl_getTextWidth(SMALL_REGULAR_1BPP_FONT, "#+=")) / 2;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2 + LETTER_OFFSET_Y;
+ nbgl_drawText(&rectArea, "#+=", 3, SMALL_REGULAR_1BPP_FONT, BLACK);
+ }
+ else {
+ rectArea.x0
+ = (SPECIAL_CHARS_KEY_WIDTH - nbgl_getTextWidth(SMALL_REGULAR_1BPP_FONT, "123")) / 2;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2 + LETTER_OFFSET_Y;
+ nbgl_drawText(&rectArea, "123", 3, SMALL_REGULAR_1BPP_FONT, BLACK);
+ }
+
+ for (i = 19; i < 24; i++) {
+ rectArea.x0 = SPECIAL_CHARS_KEY_WIDTH + (i - 19) * NORMAL_KEY_WIDTH;
+ rectArea.x0
+ += (NORMAL_KEY_WIDTH - nbgl_getCharWidth(SMALL_REGULAR_1BPP_FONT, &keys[i])) / 2;
+ nbgl_drawText(&rectArea,
+ &keys[i],
+ 1,
+ SMALL_REGULAR_1BPP_FONT,
+ (keyboard->keyMask & (1 << i)) ? WHITE : BLACK);
+ }
+ // draw backspace
+ rectArea.width = C_backspace32px.width;
+ rectArea.height = C_backspace32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = SPECIAL_CHARS_KEY_WIDTH + 5 * NORMAL_KEY_WIDTH;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 2
+ + (((KEYBOARD_KEY_HEIGHT - rectArea.height) / 2) & 0xFFC);
+ rectArea.x0 += (BACKSPACE_KEY_WIDTH_DIGITS - rectArea.width) / 2;
+ nbgl_drawIcon(&rectArea, BLACK, &C_backspace32px);
+
+ // 4th row
+ rectArea.x0 = (SWITCH_KEY_WIDTH - nbgl_getTextWidth(SMALL_REGULAR_1BPP_FONT, "ABC")) / 2;
+ rectArea.y0 = keyboard->obj.area.y0 + KEYBOARD_KEY_HEIGHT * 3 + LETTER_OFFSET_Y;
+ nbgl_drawText(&rectArea, "ABC", 3, SMALL_REGULAR_1BPP_FONT, BLACK);
+
+ rectArea.x0 = SWITCH_KEY_WIDTH + (SPACE_KEY_WIDTH - C_space32px.width) / 2;
+ nbgl_drawIcon(
+ &rectArea, (keyboard->keyMask & (1 << SPACE_KEY_INDEX)) ? WHITE : BLACK, &C_space32px);
+}
+
+static void keyboardDraw(nbgl_keyboard_t *keyboard)
+{
+ if (keyboard->mode == MODE_LETTERS) {
+ // At first, draw grid
+ keyboardDrawLetterGrid(keyboard);
+
+ // then draw key content
+ keyboardDrawLetters(keyboard);
+ }
+ else {
+ ////// At first, draw grid //////
+ keyboardDrawDigitsGrid(keyboard);
+
+ ////// then draw key content //////
+ keyboardDrawDigits(keyboard);
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief function to be called when the keyboard object is touched
+ *
+ * @param obj touched object (keyboard)
+ * @param eventType type of touch (only TOUCHED is accepted)
+ * @return none
+ */
+void nbgl_keyboardTouchCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType)
+{
+ uint8_t firstIndex, lastIndex;
+ nbgl_touchStatePosition_t *firstPosition, *lastPosition;
+ nbgl_keyboard_t *keyboard = (nbgl_keyboard_t *) obj;
+
+ LOG_DEBUG(MISC_LOGGER, "keyboardTouchCallback(): eventType = %d\n", eventType);
+ if (eventType != TOUCHED) {
+ return;
+ }
+ if (nbgl_touchGetTouchedPosition(obj, &firstPosition, &lastPosition) == false) {
+ return;
+ }
+ // modify positions with keyboard position
+ firstPosition->x -= obj->area.x0;
+ firstPosition->y -= obj->area.y0;
+ lastPosition->x -= obj->area.x0;
+ lastPosition->y -= obj->area.y0;
+
+ firstIndex = getKeyboardIndex(keyboard, firstPosition);
+ if (firstIndex > SPECIAL_KEYS_INDEX) {
+ return;
+ }
+ lastIndex = getKeyboardIndex(keyboard, lastPosition);
+ if (lastIndex > SPECIAL_KEYS_INDEX) {
+ return;
+ }
+ // if position of finger has moved durinng press to another "key", drop it
+ if (lastIndex != firstIndex) {
+ return;
+ }
+
+ if (keyboard->mode == MODE_LETTERS) {
+ keyboardCase_t cur_casing = keyboard->casing;
+ // if the casing mode was upper (not-locked), go back to lower case
+ if ((keyboard->casing == UPPER_CASE) && (firstIndex != SHIFT_KEY_INDEX)) {
+ keyboard->casing = LOWER_CASE;
+ // just redraw, refresh will be done by client (user of keyboard)
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ keyboard->needsRefresh = true;
+ }
+ if ((firstIndex < 26) && ((keyboard->keyMask & (1 << firstIndex)) == 0)) {
+ keyboard->callback((cur_casing != LOWER_CASE) ? kbd_chars_upper[firstIndex]
+ : kbd_chars[firstIndex]);
+ }
+ else if (firstIndex == SHIFT_KEY_INDEX) {
+ switch (keyboard->casing) {
+ case LOWER_CASE:
+ keyboard->casing = UPPER_CASE;
+ break;
+ case UPPER_CASE:
+ keyboard->casing = LOCKED_UPPER_CASE;
+ break;
+ case LOCKED_UPPER_CASE:
+ keyboard->casing = LOWER_CASE;
+ break;
+ }
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ else if (firstIndex == DIGITS_SWITCH_KEY_INDEX) { // switch to digits
+ keyboard->mode = MODE_DIGITS;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ }
+ else if (keyboard->mode == MODE_DIGITS) {
+ if (firstIndex < 26) {
+ keyboard->callback(kbd_digits[firstIndex]);
+ }
+ else if (firstIndex == SPECIAL_KEYS_INDEX) {
+ keyboard->mode = MODE_SPECIAL;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ else if (firstIndex == DIGITS_SWITCH_KEY_INDEX) { // switch to letters
+ keyboard->mode = MODE_LETTERS;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ }
+ else if (keyboard->mode == MODE_SPECIAL) {
+ if (firstIndex < 26) {
+ keyboard->callback(kbd_specials[firstIndex]);
+ }
+ else if (firstIndex == SPECIAL_KEYS_INDEX) {
+ keyboard->mode = MODE_DIGITS;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ else if (firstIndex == DIGITS_SWITCH_KEY_INDEX) { // switch to letters
+ keyboard->mode = MODE_LETTERS;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refreshSpecialWithPostRefresh(BLACK_AND_WHITE_REFRESH,
+ POST_REFRESH_FORCE_POWER_ON);
+ }
+ }
+ if (firstIndex == BACKSPACE_KEY_INDEX) { // backspace
+ keyboard->callback(BACKSPACE_KEY);
+ }
+ else if ((firstIndex == SPACE_KEY_INDEX)
+ && ((keyboard->keyMask & (1 << SPACE_KEY_INDEX)) == 0)) { // space
+ keyboard->callback(' ');
+ }
+}
+
+/**
+ * @brief This function gets the position (top-left corner) of the key at the
+ * given index. (to be used for Testing purpose)
+ *
+ * @param kbd the object to be drawned
+ * @param index ascii character (in lower-case)
+ * @param x [out] the top-left position
+ * @param y [out] the top-left position
+ * @return true if found, false otherwise
+ */
+bool nbgl_keyboardGetPosition(nbgl_keyboard_t *kbd, char index, uint16_t *x, uint16_t *y)
+{
+ uint8_t charIndex = 0;
+
+ while (charIndex < 26) {
+ if (index == kbd_chars[charIndex]) {
+ break;
+ }
+ charIndex++;
+ }
+
+ // if in first line
+ if (charIndex < FIRST_LINE_CHAR_COUNT) {
+ *x = kbd->obj.area.x0 + charIndex * NORMAL_KEY_WIDTH;
+ *y = kbd->obj.area.y0;
+ }
+ else if (charIndex < (FIRST_LINE_CHAR_COUNT + SECOND_LINE_CHAR_COUNT)) {
+ *x = kbd->obj.area.x0 + (charIndex - FIRST_LINE_CHAR_COUNT) * NORMAL_KEY_WIDTH
+ + SECOND_LINE_OFFSET;
+ *y = kbd->obj.area.y0 + KEYBOARD_KEY_HEIGHT;
+ }
+ else if (charIndex < sizeof(kbd_chars)) {
+ if (kbd->mode == MODE_LETTERS) {
+ *x = kbd->obj.area.x0
+ + (charIndex - FIRST_LINE_CHAR_COUNT - SECOND_LINE_CHAR_COUNT) * NORMAL_KEY_WIDTH;
+ // shift does not exist in letters only mode
+ if (!kbd->lettersOnly) {
+ *x = *x + SHIFT_KEY_WIDTH;
+ }
+ }
+ else {
+ *x = kbd->obj.area.x0
+ + (charIndex - FIRST_LINE_CHAR_COUNT - SECOND_LINE_CHAR_COUNT) * NORMAL_KEY_WIDTH
+ + SPECIAL_CHARS_KEY_WIDTH;
+ }
+ *y = kbd->obj.area.y0 + 2 * KEYBOARD_KEY_HEIGHT;
+ }
+ else {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * @brief This function draws a keyboard object
+ *
+ * @param kbd the object to be drawned
+ */
+void nbgl_objDrawKeyboard(nbgl_keyboard_t *kbd)
+{
+ kbd->obj.touchMask = (1 << TOUCHED);
+ kbd->obj.touchId = KEYBOARD_ID;
+ kbd->needsRefresh = false;
+
+ keyboardDraw(kbd);
+
+ // If a keyboard in the screen, exclude only top border from touch, to avoid missing touch on
+ // left keys
+ touch_exclude_borders(TOP_BORDER);
+}
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYBOARD
diff --git a/sdk_lib_nbgl/src/nbgl_obj_keyboard_nanos.c b/sdk_lib_nbgl/src/nbgl_obj_keyboard_nanos.c
new file mode 100644
index 00000000..d26f7033
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj_keyboard_nanos.c
@@ -0,0 +1,386 @@
+
+/**
+ * @file nbgl_obj_keyboard_nanos.c
+ * @brief The construction and touch management of a keyboard object for Nanos
+ *
+ */
+
+#ifdef NBGL_KEYBOARD
+#ifndef HAVE_SE_TOUCH
+
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_debug.h"
+#include "nbgl_front.h"
+#include "nbgl_draw.h"
+#include "nbgl_obj.h"
+#include "nbgl_fonts.h"
+#include "nbgl_touch.h"
+#include "glyphs.h"
+#include "os_io.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+#define BACKSPACE_KEY_INDEX 26
+#define VALIDATE_INDEX 27
+#define SHIFT_KEY_INDEX 28
+#define LETTER_TO_DIGITS_OFFSET (sizeof(keysByMode[DIGITS_AND_SPECIALS]) - 29)
+#define GET_CHAR(mode, char_idx) ((const char *) PIC(screen_keyboard_keys_by_mode[mode]))[char_idx]
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef enum {
+ LOWER_LETTERS,
+ UPPER_LETTERS,
+ DIGITS_AND_SPECIALS
+} KbdMode_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+const char *const keysByMode[] = {
+ // when first letter is already entered
+ "abcdefghijklmnopqrstuvwxyz\b\n\r",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ\b\n\r",
+ "0123456789 '\"`&/?!:;.,~*$=+-[](){}^<>\\_#@|%\b\n\r",
+};
+
+// these icons will be centered
+const nbgl_icon_details_t *const keyboardIcons[] = {
+ &C_icon_lowercase,
+ &C_icon_uppercase,
+ &C_icon_digits,
+ &C_icon_backspace,
+ &C_icon_validate,
+ &C_icon_classes,
+ &C_icon_lowercase_invert,
+ &C_icon_uppercase_invert,
+ &C_icon_digits_invert,
+ &C_icon_backspace_invert,
+ &C_icon_validate_invert,
+ &C_icon_classes_invert,
+};
+
+static const nbgl_icon_details_t *const modeIcons[] = {
+ &C_icon_lowercase,
+ &C_icon_uppercase,
+ &C_icon_digits,
+};
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void keyboardDrawIcon(int16_t x0, int8_t y0, bool inverted, const nbgl_icon_details_t *icon)
+{
+ nbgl_area_t rectArea;
+
+ rectArea.backgroundColor = inverted ? WHITE : BLACK;
+ rectArea.width = icon->width;
+ rectArea.height = icon->height;
+ rectArea.bpp = NBGL_BPP_1;
+ // center
+ rectArea.x0 = x0 + (KEYBOARD_KEY_WIDTH - icon->width) / 2;
+ rectArea.y0 = y0 + (KEYBOARD_KEY_HEIGHT - icon->height) / 2;
+ nbgl_drawIcon(&rectArea, inverted ? BLACK : WHITE, icon);
+}
+
+static void keyboardDrawChar(int16_t x0, int8_t y0, bool inverted, const char *charPtr)
+{
+ nbgl_area_t rectArea;
+
+ rectArea.backgroundColor = inverted ? WHITE : BLACK;
+ rectArea.width = nbgl_getCharWidth(BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, charPtr);
+ rectArea.height = 12;
+ rectArea.bpp = NBGL_BPP_1;
+ // center
+ rectArea.x0 = x0 + (KEYBOARD_KEY_WIDTH - rectArea.width) / 2;
+ rectArea.y0 = y0 + (KEYBOARD_KEY_HEIGHT - rectArea.height) / 2 - 3;
+ nbgl_drawText(
+ &rectArea, charPtr, 1, BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, inverted ? BLACK : WHITE);
+}
+
+static void keyboardDrawCommon(nbgl_keyboard_t *keyboard)
+{
+ nbgl_area_t rectArea;
+
+ // clean full area
+ rectArea.backgroundColor = BLACK;
+ rectArea.x0 = keyboard->obj.area.x0;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = keyboard->obj.area.width;
+ rectArea.height = keyboard->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+
+ // draw select 'key' in white
+ rectArea.x0 = keyboard->obj.area.x0 + 2 * KEYBOARD_KEY_WIDTH;
+ rectArea.y0 = keyboard->obj.area.y0;
+ rectArea.width = KEYBOARD_KEY_WIDTH;
+ rectArea.height = keyboard->obj.area.height;
+ nbgl_drawRoundedRect(&rectArea, RADIUS_3_PIXELS, WHITE);
+
+ // draw separating '-' in white
+ rectArea.backgroundColor = WHITE;
+ rectArea.x0 = keyboard->obj.area.x0 + KEYBOARD_KEY_WIDTH + 5;
+ rectArea.y0 = keyboard->obj.area.y0 + 6;
+ rectArea.width = 3;
+ rectArea.height = 1;
+ nbgl_frontDrawRect(&rectArea);
+ rectArea.x0 = keyboard->obj.area.x0 + 3 * KEYBOARD_KEY_WIDTH + 5;
+ nbgl_frontDrawRect(&rectArea);
+}
+
+// draw letters for letters mode
+static void keyboardDrawLettersOnly(nbgl_keyboard_t *keyboard)
+{
+ uint8_t i;
+ const char *keys = keysByMode[keyboard->mode];
+
+ if (keyboard->keyMask == 0x07FFFFFF) {
+ return;
+ }
+
+ keyboardDrawCommon(keyboard);
+
+ // if selectedChar is masked, move to the first unmasked
+ while (keyboard->keyMask & (1 << keyboard->selectedCharIndex)) {
+ if (keyboard->selectedCharIndex < BACKSPACE_KEY_INDEX) {
+ keyboard->selectedCharIndex++;
+ }
+ else {
+ keyboard->selectedCharIndex = 0;
+ }
+ }
+
+ // fill the letters at position middle and right
+ uint8_t j = 1;
+ i = keyboard->selectedCharIndex;
+ while (j < 3) {
+ // use the provided mask to check what letters(+backspace at 27th position) to use
+ if ((keyboard->keyMask & (1 << i)) == 0) {
+ if (i == BACKSPACE_KEY_INDEX) { // backspace
+ keyboardDrawIcon(keyboard->obj.area.x0 + 2 * j * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (j == 1),
+ &C_icon_backspace);
+ }
+ else { // any char
+ keyboardDrawChar(keyboard->obj.area.x0 + 2 * j * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (j == 1),
+ &keys[i]);
+ }
+ j++;
+ }
+ i++;
+ i %= 27;
+ // safe check in case mask is full of 1s
+ if (i == keyboard->selectedCharIndex) {
+ break;
+ }
+ }
+ // fill the letters at left position from end
+ i = (keyboard->selectedCharIndex + 26) % 27;
+ while (true) {
+ if ((keyboard->keyMask & (1 << i)) == 0) {
+ if (i == BACKSPACE_KEY_INDEX) { // backspace
+ keyboardDrawIcon(
+ keyboard->obj.area.x0, keyboard->obj.area.y0, false, &C_icon_backspace);
+ }
+ else { // any char
+ keyboardDrawChar(keyboard->obj.area.x0, keyboard->obj.area.y0, false, &keys[i]);
+ }
+ break;
+ }
+ if (i > 0) {
+ i--;
+ }
+ else {
+ i = BACKSPACE_KEY_INDEX;
+ }
+ // safe check in case mask is full of 1s
+ if (i == (keyboard->selectedCharIndex + 26) % 27) {
+ break;
+ }
+ }
+}
+
+// draw letters for regular mode
+static void keyboardDrawRegular(nbgl_keyboard_t *keyboard)
+{
+ int8_t i;
+
+ keyboardDrawCommon(keyboard);
+
+ // if mode is not already defined, display the 3 icons of keyboard modes to let user choose it:
+ // "ab, AB and 0? "
+ if (keyboard->mode == MODE_NONE) {
+ for (i = 0; i < 3; i++) {
+ uint8_t charIndex = (keyboard->selectedCharIndex + 2 + i) % 3;
+ keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (i == 1),
+ modeIcons[charIndex]);
+ }
+ return;
+ }
+
+ const char *keys = keysByMode[keyboard->mode];
+ uint8_t maxLen = strlen(keys);
+
+ // mode is defined, so draw the proper 3 letters (or icons)
+ for (i = 0; i < 3; i++) {
+ uint8_t charIndex = (keyboard->selectedCharIndex + maxLen - 1 + i) % maxLen;
+ if (keys[charIndex] == '\r') {
+ keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (i == 1),
+ &C_icon_classes);
+ }
+ else if (keys[charIndex] == '\n') {
+ keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (i == 1),
+ &C_icon_validate_10);
+ }
+ else if (keys[charIndex] == '\b') {
+ keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (i == 1),
+ &C_icon_backspace);
+ }
+ else {
+ keyboardDrawChar(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
+ keyboard->obj.area.y0,
+ (i == 1),
+ &keys[charIndex]);
+ }
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief function to be called when the keyboard object is receiving a button press
+ *
+ * @param obj touched object (keyboard)
+ * @param buttonEvent type of button event
+ * @return none
+ */
+void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
+{
+ nbgl_keyboard_t *keyboard = (nbgl_keyboard_t *) obj;
+ uint8_t nbMax;
+
+ LOG_DEBUG(MISC_LOGGER, "nbgl_keyboardCallback(): buttonEvent = %d\n", buttonEvent);
+
+ if (keyboard->mode == MODE_NONE) {
+ nbMax = 2;
+ }
+ else {
+ if (keyboard->lettersOnly) {
+ nbMax = BACKSPACE_KEY_INDEX;
+ }
+ else {
+ nbMax = strlen(keysByMode[keyboard->mode]) - 1;
+ }
+ }
+ if (buttonEvent == BUTTON_BOTH_PRESSED) {
+ if (keyboard->mode == MODE_NONE) {
+ // apply the selected mode
+ keyboard->mode = keyboard->selectedCharIndex;
+ // reset the selected index to start with "a" (or first char of selected mode)
+ keyboard->selectedCharIndex = 0;
+ }
+ else {
+ if (keyboard->lettersOnly) {
+ if ((keyboard->selectedCharIndex < 26)
+ && ((keyboard->keyMask & (1 << keyboard->selectedCharIndex)) == 0)) {
+ const char *keys = keysByMode[keyboard->mode];
+ keyboard->callback(keys[keyboard->selectedCharIndex]);
+ }
+ else if (keyboard->selectedCharIndex == BACKSPACE_KEY_INDEX) { // backspace
+ keyboard->callback(BACKSPACE_KEY);
+ }
+ }
+ else {
+ char key = keysByMode[keyboard->mode][keyboard->selectedCharIndex];
+ if (key == '\r') {
+ // go back to mode choice
+ keyboard->mode = MODE_NONE;
+ // reset the selected index
+ keyboard->selectedCharIndex = 0;
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refresh();
+ }
+ else if (key == '\n') {
+ keyboard->callback(VALIDATE_KEY);
+ }
+ else if (key == '\b') {
+ keyboard->callback(BACKSPACE_KEY);
+ }
+ else {
+ keyboard->callback(key);
+ }
+ }
+ return;
+ }
+ }
+ else if (buttonEvent == BUTTON_LEFT_PRESSED) {
+ do {
+ if (keyboard->selectedCharIndex > 0) {
+ keyboard->selectedCharIndex--;
+ }
+ else {
+ keyboard->selectedCharIndex = nbMax;
+ }
+ } while (keyboard->keyMask & (1 << keyboard->selectedCharIndex));
+ }
+ else if (buttonEvent == BUTTON_RIGHT_PRESSED) {
+ do {
+ if (keyboard->selectedCharIndex < nbMax) {
+ keyboard->selectedCharIndex++;
+ }
+ else {
+ keyboard->selectedCharIndex = 0;
+ }
+ } while (keyboard->keyMask & (1 << keyboard->selectedCharIndex));
+ }
+ else {
+ return;
+ }
+ nbgl_redrawObject((nbgl_obj_t *) keyboard, NULL, false);
+ nbgl_refresh();
+}
+
+/**
+ * @brief This function draws a keyboard object
+ *
+ * @param kbd the object to be drawned
+ */
+void nbgl_objDrawKeyboard(nbgl_keyboard_t *kbd)
+{
+ if (kbd->lettersOnly) {
+ keyboardDrawLettersOnly(kbd);
+ }
+ else {
+ keyboardDrawRegular(kbd);
+ }
+}
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYBOARD
diff --git a/sdk_lib_nbgl/src/nbgl_obj_keypad.c b/sdk_lib_nbgl/src/nbgl_obj_keypad.c
new file mode 100644
index 00000000..38b18ed3
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj_keypad.c
@@ -0,0 +1,388 @@
+
+/**
+ * @file nbgl_obj_keypad.c
+ * @brief The construction and touch management of a keypad object
+ *
+ */
+
+#ifdef NBGL_KEYPAD
+#ifdef HAVE_SE_TOUCH
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_debug.h"
+#include "nbgl_front.h"
+#include "nbgl_draw.h"
+#include "nbgl_obj.h"
+#include "nbgl_fonts.h"
+#include "nbgl_touch.h"
+#include "glyphs.h"
+#include "os_io_seproxyhal.h"
+#include "lcx_rng.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define KEY_WIDTH (SCREEN_WIDTH / 3)
+#define DIGIT_OFFSET_Y (((KEYPAD_KEY_HEIGHT - 48) / 2) & 0xFFC)
+
+#define BACKSPACE_KEY_INDEX 10
+#define VALIDATE_KEY_INDEX 11
+
+// to save RAM we use 5 uint8, and 4 bits per digit (MSBs for odd digits, LSBs for even ones)
+#define GET_DIGIT_INDEX(_keypad, _digit) \
+ ((_digit & 1) ? (_keypad->digitIndexes[_digit >> 1] >> 4) \
+ : (_keypad->digitIndexes[_digit >> 1] & 0xF))
+#define SET_DIGIT_INDEX(_keypad, _digit, _index) \
+ (_keypad->digitIndexes[_digit >> 1] |= (_digit & 1) ? (_index << 4) : _index)
+
+extern uint8_t ramBuffer[GZLIB_UNCOMPRESSED_CHUNK];
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static uint8_t getKeypadIndex(uint16_t x, uint16_t y)
+{
+ uint8_t i = 0;
+ // get index of key pressed
+ if (y < KEYPAD_KEY_HEIGHT) {
+ // 1st line:
+ i = 1 + x / KEY_WIDTH;
+ }
+ else if (y < (2 * KEYPAD_KEY_HEIGHT)) {
+ // 2nd line:
+ i = 4 + x / KEY_WIDTH;
+ }
+ else if (y < (3 * KEYPAD_KEY_HEIGHT)) {
+ // 3rd line:
+ i = 7 + x / KEY_WIDTH;
+ }
+ else if (y < (4 * KEYPAD_KEY_HEIGHT)) {
+ // 4th line
+ if (x < KEY_WIDTH) {
+ i = BACKSPACE_KEY_INDEX;
+ }
+ else if (x < (2 * KEY_WIDTH)) {
+ i = 0;
+ }
+ else {
+ i = VALIDATE_KEY_INDEX;
+ }
+ }
+ return i;
+}
+
+static void keypadDrawGrid(nbgl_keypad_t *keypad)
+{
+ nbgl_area_t rectArea;
+
+ // clean full area
+ rectArea.backgroundColor = keypad->obj.area.backgroundColor;
+ rectArea.x0 = keypad->obj.area.x0;
+ rectArea.y0 = keypad->obj.area.y0;
+ rectArea.width = keypad->obj.area.width;
+ rectArea.height = keypad->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+
+ /// draw horizontal lines
+ rectArea.backgroundColor = keypad->obj.area.backgroundColor;
+ rectArea.x0 = keypad->obj.area.x0;
+ rectArea.y0 = keypad->obj.area.y0;
+ rectArea.width = keypad->obj.area.width;
+ rectArea.height = 4;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keypad->borderColor); // 1st line (top)
+ rectArea.y0 += KEYPAD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keypad->borderColor); // 2nd line
+ rectArea.y0 += KEYPAD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keypad->borderColor); // 3rd line
+ rectArea.y0 += KEYPAD_KEY_HEIGHT;
+ nbgl_frontDrawHorizontalLine(&rectArea, 0x1, keypad->borderColor); // 4th line
+
+ /// then draw 3 vertical lines
+ rectArea.backgroundColor = keypad->borderColor;
+ rectArea.x0 = keypad->obj.area.x0;
+ rectArea.y0 = keypad->obj.area.y0;
+ rectArea.width = 1;
+ rectArea.height = KEYPAD_KEY_HEIGHT * 4;
+ nbgl_frontDrawRect(&rectArea); // 1st full line, on the left
+ rectArea.x0 += KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea); // 2nd line
+ rectArea.x0 += KEY_WIDTH;
+ nbgl_frontDrawRect(&rectArea); // 3rd line
+}
+
+static void keypadDrawDigits(nbgl_keypad_t *keypad)
+{
+ uint8_t i;
+ nbgl_area_t rectArea;
+ char key_value;
+
+ rectArea.backgroundColor = keypad->obj.area.backgroundColor;
+ rectArea.y0 = keypad->obj.area.y0 + DIGIT_OFFSET_Y;
+
+ // First row of keys: 1 2 3
+ for (i = 0; i < 3; i++) {
+ key_value = GET_DIGIT_INDEX(keypad, (i + 1)) + 0x30;
+
+ rectArea.x0 = keypad->obj.area.x0 + i * KEY_WIDTH;
+ rectArea.x0 += (KEY_WIDTH - nbgl_getCharWidth(LARGE_MEDIUM_FONT, &key_value)) / 2;
+ nbgl_drawText(
+ &rectArea, &key_value, 1, LARGE_MEDIUM_FONT, keypad->enableDigits ? BLACK : WHITE);
+ }
+ // Second row: 4 5 6
+ rectArea.y0 += KEYPAD_KEY_HEIGHT;
+ for (; i < 6; i++) {
+ key_value = GET_DIGIT_INDEX(keypad, (i + 1)) + 0x30;
+ rectArea.x0 = keypad->obj.area.x0 + (i - 3) * KEY_WIDTH;
+ rectArea.x0 += (KEY_WIDTH - nbgl_getCharWidth(LARGE_MEDIUM_FONT, &key_value)) / 2;
+ nbgl_drawText(
+ &rectArea, &key_value, 1, LARGE_MEDIUM_FONT, keypad->enableDigits ? BLACK : WHITE);
+ }
+ // Third row: 7 8 9
+ rectArea.y0 += KEYPAD_KEY_HEIGHT;
+ for (; i < 9; i++) {
+ key_value = GET_DIGIT_INDEX(keypad, (i + 1)) + 0x30;
+ rectArea.x0 = keypad->obj.area.x0 + (i - 6) * KEY_WIDTH;
+ rectArea.x0 += (KEY_WIDTH - nbgl_getCharWidth(LARGE_MEDIUM_FONT, &key_value)) / 2;
+ nbgl_drawText(
+ &rectArea, &key_value, 1, LARGE_MEDIUM_FONT, keypad->enableDigits ? BLACK : WHITE);
+ }
+ // 4th raw, Backspace, 0 and Validate
+ // draw backspace
+ rectArea.width = C_backspace32px.width;
+ rectArea.height = C_backspace32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = keypad->obj.area.x0 + (KEY_WIDTH - rectArea.width) / 2;
+ rectArea.y0
+ = keypad->obj.area.y0 + KEYPAD_KEY_HEIGHT * 3 + (KEYPAD_KEY_HEIGHT - rectArea.height) / 2;
+#if GLYPH_backspace32px_ISFILE
+ nbgl_frontDrawImageFile(&rectArea,
+ (uint8_t *) C_backspace32px.bitmap,
+ keypad->enableBackspace ? BLACK : WHITE,
+ ramBuffer);
+#else
+ nbgl_frontDrawImage(&rectArea,
+ (uint8_t *) C_backspace32px.bitmap,
+ NO_TRANSFORMATION,
+ keypad->enableBackspace ? BLACK : WHITE);
+#endif
+
+ // draw 0
+ key_value = GET_DIGIT_INDEX(keypad, 0) + 0x30;
+ rectArea.x0 = keypad->obj.area.x0 + KEY_WIDTH;
+ rectArea.x0 += (KEY_WIDTH - nbgl_getCharWidth(LARGE_MEDIUM_FONT, &key_value)) / 2;
+ rectArea.y0 = keypad->obj.area.y0 + KEYPAD_KEY_HEIGHT * 3 + DIGIT_OFFSET_Y;
+ nbgl_drawText(
+ &rectArea, &key_value, 1, LARGE_MEDIUM_FONT, keypad->enableDigits ? BLACK : WHITE);
+
+ // draw validate on gray with white background if not enabled
+ if (!keypad->enableValidate) {
+ rectArea.width = C_check32px.width;
+ rectArea.height = C_check32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = keypad->obj.area.x0 + 2 * KEY_WIDTH + (KEY_WIDTH - rectArea.width) / 2;
+ rectArea.y0 = keypad->obj.area.y0 + KEYPAD_KEY_HEIGHT * 3
+ + (KEYPAD_KEY_HEIGHT - rectArea.height) / 2;
+ rectArea.backgroundColor = WHITE;
+ nbgl_frontDrawRect(&rectArea);
+ }
+ else {
+ // if enabled, draw icon in white on a black background
+ rectArea.backgroundColor = BLACK;
+ rectArea.x0 = keypad->obj.area.x0 + 2 * KEY_WIDTH;
+ rectArea.y0 = keypad->obj.area.y0 + KEYPAD_KEY_HEIGHT * 3;
+ rectArea.width = KEY_WIDTH;
+ rectArea.height = KEYPAD_KEY_HEIGHT;
+ nbgl_frontDrawRect(&rectArea);
+ rectArea.width = C_check32px.width;
+ rectArea.height = C_check32px.height;
+ rectArea.bpp = NBGL_BPP_1;
+ rectArea.x0 = keypad->obj.area.x0 + 2 * KEY_WIDTH + (KEY_WIDTH - rectArea.width) / 2;
+ rectArea.y0 = keypad->obj.area.y0 + KEYPAD_KEY_HEIGHT * 3
+ + (KEYPAD_KEY_HEIGHT - rectArea.height) / 2;
+#if GLYPH_check32px_ISFILE
+ nbgl_frontDrawImageFile(&rectArea, (uint8_t *) C_check32px.bitmap, WHITE, ramBuffer);
+#else
+ nbgl_frontDrawImage(&rectArea, (uint8_t *) C_check32px.bitmap, NO_TRANSFORMATION, WHITE);
+#endif
+ }
+}
+
+static void keypadDraw(nbgl_keypad_t *keypad)
+{
+ // At first, draw grid
+ keypadDrawGrid(keypad);
+
+ // then draw key content
+ keypadDrawDigits(keypad);
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief function to be called when the keypad object is touched
+ *
+ * @param obj touched object (keypad)
+ * @param eventType type of touch (only TOUCHED is accepted)
+ * @return none
+ */
+void nbgl_keypadTouchCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType)
+{
+ uint8_t firstIndex, lastIndex;
+ nbgl_touchStatePosition_t *firstPosition, *lastPosition;
+ nbgl_keypad_t *keypad = (nbgl_keypad_t *) obj;
+
+ LOG_DEBUG(MISC_LOGGER, "nbgl_keypadTouchCallback(): eventType = %d\n", eventType);
+ if ((eventType != TOUCHED) && (eventType != TOUCH_PRESSED)) {
+ return;
+ }
+ if (nbgl_touchGetTouchedPosition(obj, &firstPosition, &lastPosition) == false) {
+ return;
+ }
+
+ // use positions relative to keypad position
+ firstIndex = getKeypadIndex(firstPosition->x - obj->area.x0, firstPosition->y - obj->area.y0);
+ if (firstIndex > VALIDATE_KEY_INDEX) {
+ return;
+ }
+ lastIndex = getKeypadIndex(lastPosition->x - obj->area.x0, lastPosition->y - obj->area.y0);
+ if (lastIndex > VALIDATE_KEY_INDEX) {
+ return;
+ }
+
+ // if position of finger has moved during press to another "key", drop it
+ if (lastIndex != firstIndex) {
+ return;
+ }
+
+ if ((firstIndex < 10) && (keypad->enableDigits)) {
+ // only call callback if event is TOUCHED, otherwise play tune on touch event (and not on
+ // release)
+ if (eventType == TOUCHED) {
+ keypad->callback(GET_DIGIT_INDEX(keypad, firstIndex) + 0x30);
+ }
+ else {
+ io_seproxyhal_play_tune(TUNE_TAP_CASUAL);
+ }
+ }
+ if ((firstIndex == BACKSPACE_KEY_INDEX) && (keypad->enableBackspace)) { // backspace
+ // only call callback if event is TOUCHED, otherwise play tune on touch event (and not on
+ // release)
+ if (eventType == TOUCHED) {
+ keypad->callback(BACKSPACE_KEY);
+ }
+ else {
+ io_seproxyhal_play_tune(TUNE_TAP_CASUAL);
+ }
+ }
+ else if ((firstIndex == VALIDATE_KEY_INDEX) && (keypad->enableValidate)) { // validate
+ // only call callback if event is TOUCHED
+ if (eventType == TOUCHED) {
+ keypad->callback(VALIDATE_KEY);
+ }
+ }
+}
+
+/**
+ * @brief This function gets the position (top-left corner) of the key at the
+ * given index. (to be used for Testing purpose). Only works without shuffling
+ *
+ * @param kpd the object to be drawned
+ * @param index the char of the key
+ * @param x [out] the top-left position
+ * @param y [out] the top-left position
+ * @return true if found, false otherwise
+ */
+bool nbgl_keypadGetPosition(nbgl_keypad_t *kpd, char index, uint16_t *x, uint16_t *y)
+{
+ // if in first line
+ if ((index >= '1') && (index <= '3')) {
+ *x = kpd->obj.area.x0 + (index - '1') * KEY_WIDTH;
+ *y = kpd->obj.area.y0;
+ }
+ else if ((index >= '4') && (index <= '6')) {
+ *x = kpd->obj.area.x0 + (index - '4') * KEY_WIDTH;
+ *y = kpd->obj.area.y0 + KEYPAD_KEY_HEIGHT;
+ }
+ else if ((index >= '7') && (index <= '9')) {
+ *x = kpd->obj.area.x0 + (index - '7') * KEY_WIDTH;
+ *y = kpd->obj.area.y0 + (2 * KEYPAD_KEY_HEIGHT);
+ }
+ else if (index == BACKSPACE_KEY) { // backspace
+ *x = kpd->obj.area.x0;
+ *y = kpd->obj.area.y0 + (3 * KEYPAD_KEY_HEIGHT);
+ }
+ else if (index == '0') {
+ *x = kpd->obj.area.x0 + KEY_WIDTH;
+ *y = kpd->obj.area.y0 + (3 * KEYPAD_KEY_HEIGHT);
+ }
+ else if (index == VALIDATE_KEY) { // validate
+ *x = kpd->obj.area.x0 + (2 * KEY_WIDTH);
+ *y = kpd->obj.area.y0 + (3 * KEYPAD_KEY_HEIGHT);
+ }
+ else {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * @brief This function draws a keypad object
+ *
+ * @param kpd keypad object to draw
+ * @return the keypad keypad object
+ */
+void nbgl_objDrawKeypad(nbgl_keypad_t *kpd)
+{
+ kpd->obj.touchMask = (1 << TOUCHED) | (1 << TOUCH_PRESSED);
+ kpd->obj.touchId = KEYPAD_ID;
+
+ // if the object has not been already used, prepare indexes of digits
+ if (kpd->digitIndexes[0] == 0) {
+ uint32_t i;
+ if (kpd->shuffled) {
+ uint8_t shuffledDigits[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+
+ // modern version of the Fisher-Yates shuffle
+ for (i = 0; i < 9; i++) {
+ // pick a random number k in [i:9] intervale
+ uint32_t j = cx_rng_u32_range(i, 10);
+ uint8_t tmp = shuffledDigits[j];
+
+ // exchange shuffledDigits[i] and shuffledDigits[j]
+ shuffledDigits[j] = shuffledDigits[i];
+ shuffledDigits[i] = tmp;
+ }
+ for (i = 0; i < 10; i++) {
+ // apply the permuted value to digit i
+ SET_DIGIT_INDEX(kpd, i, shuffledDigits[i]);
+ }
+ }
+ else {
+ // no shuffling
+ for (i = 0; i < 10; i++) {
+ SET_DIGIT_INDEX(kpd, i, i);
+ }
+ }
+ }
+ keypadDraw(kpd);
+}
+
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYPAD
diff --git a/sdk_lib_nbgl/src/nbgl_obj_keypad_nanos.c b/sdk_lib_nbgl/src/nbgl_obj_keypad_nanos.c
new file mode 100644
index 00000000..75dd229d
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj_keypad_nanos.c
@@ -0,0 +1,281 @@
+
+/**
+ * @file nbgl_obj_keypad_nanos.c
+ * @brief The construction and key management of a keypad object for nanos
+ *
+ */
+
+#ifdef NBGL_KEYPAD
+#ifndef HAVE_SE_TOUCH
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_debug.h"
+#include "nbgl_front.h"
+#include "nbgl_draw.h"
+#include "nbgl_obj.h"
+#include "nbgl_fonts.h"
+#include "nbgl_screen.h"
+#include "glyphs.h"
+#include "os_io_seproxyhal.h"
+#include "lcx_rng.h"
+
+/*********************
+ * DEFINES
+ *********************/
+#define KEY_WIDTH 9
+#define DIGIT_HEIGHT 12
+#define DIGIT_OFFSET_X 13
+#define DIGIT_OFFSET_Y ((KEYPAD_HEIGHT - DIGIT_HEIGHT) / 2)
+#define INIT_DIGIT_VALUE 5
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static const nbgl_icon_details_t *digits_icons[] = {&C_digit_0,
+ &C_digit_1,
+ &C_digit_2,
+ &C_digit_3,
+ &C_digit_4,
+ &C_digit_5,
+ &C_digit_6,
+ &C_digit_7,
+ &C_digit_8,
+ &C_digit_9};
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+static char positionToChar(uint8_t pos)
+{
+ if (pos == 0) {
+ return BACKSPACE_KEY;
+ }
+ else if (pos == 11) {
+ return VALIDATE_KEY;
+ }
+ else {
+ return 0x30 + (pos - 1);
+ }
+}
+
+static void keypadDrawDigits(nbgl_keypad_t *keypad)
+{
+ uint8_t i;
+ nbgl_area_t rectArea;
+
+ // clean full area
+ rectArea.backgroundColor = BLACK;
+ rectArea.x0 = keypad->obj.area.x0;
+ rectArea.y0 = keypad->obj.area.y0;
+ rectArea.width = keypad->obj.area.width;
+ rectArea.height = keypad->obj.area.height;
+ nbgl_frontDrawRect(&rectArea);
+
+ rectArea.backgroundColor = BLACK;
+ rectArea.y0 = keypad->obj.area.y0 + DIGIT_OFFSET_Y;
+ rectArea.bpp = NBGL_BPP_1;
+ // row of digits: 0 1 2 3... 9
+ for (i = 0; i < 10; i++) {
+ rectArea.width = digits_icons[i]->width;
+ rectArea.height = digits_icons[i]->height;
+
+ rectArea.x0 = keypad->obj.area.x0 + DIGIT_OFFSET_X + i * KEY_WIDTH;
+ nbgl_frontDrawImage(&rectArea, digits_icons[i]->bitmap, NO_TRANSFORMATION, WHITE);
+ }
+ // draw backspace
+ if (keypad->enableBackspace) {
+ rectArea.width = C_icon_backspace.width;
+ rectArea.height = C_icon_backspace.height;
+ rectArea.x0 = keypad->obj.area.x0;
+ rectArea.y0 = keypad->obj.area.y0 + ((KEYPAD_HEIGHT - C_icon_backspace.height) / 2);
+ nbgl_frontDrawImage(&rectArea, C_icon_backspace.bitmap, NO_TRANSFORMATION, WHITE);
+ }
+
+ // draw validate
+ if (keypad->enableValidate) {
+ rectArea.width = C_digit_validate_bold.width;
+ rectArea.height = C_digit_validate_bold.height;
+ rectArea.x0 = keypad->obj.area.x0 + KEYPAD_WIDTH - C_digit_validate_bold.width;
+ rectArea.y0 = keypad->obj.area.y0 + ((KEYPAD_HEIGHT - C_digit_validate_bold.height) / 2);
+ nbgl_frontDrawImage(&rectArea, C_digit_validate_bold.bitmap, NO_TRANSFORMATION, WHITE);
+ }
+}
+
+static void keypadDrawSelected(nbgl_keypad_t *keypad)
+{
+ nbgl_area_t rectArea;
+ /// then draw 1 horizontal line
+ rectArea.backgroundColor = WHITE;
+
+ if (keypad->selectedKey == 0) {
+ rectArea.x0 = keypad->obj.area.x0;
+ }
+ else if (keypad->selectedKey < 11) { // if it's a digit
+ rectArea.x0 = keypad->obj.area.x0 + DIGIT_OFFSET_X + (keypad->selectedKey - 1) * KEY_WIDTH;
+ }
+ else if (keypad->selectedKey == 11) {
+ rectArea.x0 = keypad->obj.area.x0 + KEYPAD_WIDTH - C_digit_validate_bold.width;
+ }
+ else {
+ return;
+ }
+ rectArea.y0 = keypad->obj.area.y0 + keypad->obj.area.height - 2;
+ rectArea.width = 8;
+ rectArea.height = 2;
+ nbgl_frontDrawRect(&rectArea);
+}
+
+static void keypadDrawSelectedTouched(nbgl_keypad_t *keypad)
+{
+ nbgl_area_t rectArea;
+ /// draw 1 horizontal line upper selected key
+ rectArea.backgroundColor = WHITE;
+
+ if (keypad->selectedKey == 0) {
+ rectArea.x0 = keypad->obj.area.x0;
+ }
+ else if (keypad->selectedKey < 11) { // if it's a digit
+ rectArea.x0 = keypad->obj.area.x0 + DIGIT_OFFSET_X + (keypad->selectedKey - 1) * KEY_WIDTH;
+ }
+ else if (keypad->selectedKey == 11) {
+ rectArea.x0 = keypad->obj.area.x0 + KEYPAD_WIDTH - C_digit_validate_bold.width;
+ }
+ else {
+ return;
+ }
+ rectArea.y0 = keypad->obj.area.y0;
+ rectArea.width = 8;
+ rectArea.height = 2;
+ nbgl_frontDrawRect(&rectArea);
+ nbgl_frontRefreshArea(&rectArea, FULL_COLOR_CLEAN_REFRESH, POST_REFRESH_KEEP_POWER_STATE);
+}
+
+static void keypadInitSelected(nbgl_keypad_t *keypad)
+{
+ if (!keypad->shuffled) {
+ keypad->selectedKey = 1 + INIT_DIGIT_VALUE;
+ }
+ else {
+ uint8_t nbChoices = 10;
+ uint8_t random;
+ if (keypad->enableBackspace) {
+ nbChoices++;
+ }
+ if (keypad->enableValidate) {
+ nbChoices++;
+ }
+ random = cx_rng_u32_range(0, nbChoices);
+ if (random < 10) {
+ keypad->selectedKey = 1 + random;
+ }
+ else if (random == 10) {
+ keypad->selectedKey = 0;
+ }
+ else if (random == 11) {
+ keypad->selectedKey = 11;
+ }
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief function to be called when the keypad object is touched
+ *
+ * @param obj touched object (keypad)
+ * @param buttonEvent type of key event
+ * @return none
+ */
+void nbgl_keypadCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
+{
+ nbgl_keypad_t *keypad = (nbgl_keypad_t *) obj;
+
+ LOG_DEBUG(OBJ_LOGGER, "nbgl_keypadCallback(): buttonEvent = %d\n", buttonEvent);
+
+ if (buttonEvent == BUTTON_BOTH_TOUCHED) {
+ // draw bar upper selected key
+ keypadDrawSelectedTouched(keypad);
+ }
+ else if (buttonEvent == BUTTON_BOTH_PRESSED) {
+ keypad->callback(positionToChar(keypad->selectedKey));
+ }
+ else if ((buttonEvent == BUTTON_LEFT_PRESSED)
+ || (buttonEvent == BUTTON_LEFT_CONTINUOUS_PRESSED)) {
+ switch (keypad->selectedKey) {
+ case 1:
+ if (keypad->enableBackspace) {
+ keypad->selectedKey = 0;
+ }
+ else {
+ keypad->selectedKey = 10;
+ }
+ break;
+ case 0: // backspace
+ if (keypad->enableValidate) {
+ keypad->selectedKey = 11;
+ }
+ else {
+ keypad->selectedKey = 10;
+ }
+ break;
+ default:
+ keypad->selectedKey--;
+ break;
+ }
+ nbgl_screenRedraw();
+ }
+ else if ((buttonEvent == BUTTON_RIGHT_PRESSED)
+ || (buttonEvent == BUTTON_RIGHT_CONTINUOUS_PRESSED)) {
+ switch (keypad->selectedKey) {
+ case 10: // '9'
+ if (keypad->enableValidate) {
+ keypad->selectedKey = 11;
+ }
+ else if (keypad->enableBackspace) {
+ keypad->selectedKey = 0;
+ }
+ else {
+ keypad->selectedKey = 1;
+ }
+ break;
+ case 11: // validate
+ keypad->selectedKey = 0;
+ break;
+ default:
+ keypad->selectedKey++;
+ break;
+ }
+ nbgl_screenRedraw();
+ }
+}
+
+/**
+ * @brief This function draws a keypad object
+ *
+ * @param keypad keypad object to draw
+ * @return the keypad object
+ */
+void nbgl_objDrawKeypad(nbgl_keypad_t *keypad)
+{
+ LOG_DEBUG(OBJ_LOGGER, "nbgl_objDrawKeypad keypad->shuffled= %d\n", keypad->shuffled);
+ // draw digits content
+ keypadDrawDigits(keypad);
+ if (keypad->selectedKey == 0xFF) {
+ keypadInitSelected(keypad);
+ }
+ keypadDrawSelected(keypad);
+}
+
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_KEYPAD
diff --git a/sdk_lib_nbgl/src/nbgl_obj_pool.c b/sdk_lib_nbgl/src/nbgl_obj_pool.c
new file mode 100644
index 00000000..4da5a2d7
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_obj_pool.c
@@ -0,0 +1,342 @@
+
+/**
+ * @file nbgl_obj_pool.c
+ * @brief Implementation of a graphical objects pool, to be used by any page, or by
+ * predefined layout management
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_obj.h"
+#include "nbgl_debug.h"
+#include
+
+/*********************
+ * DEFINES
+ *********************/
+/**
+ * @brief Max number of objects retrievable from pool
+ *
+ */
+#ifdef HAVE_SE_TOUCH
+#define OBJ_POOL_LEN 80
+#else // HAVE_SE_TOUCH
+#define OBJ_POOL_LEN 40
+#endif // HAVE_SE_TOUCH
+/**
+ * @brief Max number of objects pointers usable for container pool
+ *
+ */
+#ifdef HAVE_SE_TOUCH
+#define OBJ_CONTAINER_POOL_LEN 128
+#else // HAVE_SE_TOUCH
+#define OBJ_CONTAINER_POOL_LEN 64
+#endif // HAVE_SE_TOUCH
+
+#define INVALID_LAYER 0xFF
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ union {
+ nbgl_obj_t obj;
+ nbgl_text_area_t textAreaObj;
+ nbgl_progress_bar_t progressBarObj;
+ nbgl_container_t containerObj;
+ nbgl_image_t imageObj;
+#ifdef HAVE_SE_TOUCH
+ nbgl_radio_t radioObj;
+ nbgl_switch_t switchObj;
+ nbgl_button_t buttonObj;
+ nbgl_page_indicator_t navBarObj;
+ nbgl_line_t lineObj;
+ nbgl_spinner_t spinnerObj;
+#else // HAVE_SE_TOUCH
+ nbgl_text_entry_t entryObj;
+#endif // HAVE_SE_TOUCH
+#ifdef NBGL_KEYBOARD
+ nbgl_keyboard_t keyboardObj;
+#endif // NBGL_KEYBOARD
+#ifdef NBGL_KEYPAD
+ nbgl_keypad_t keypadObj;
+#endif // NBGL_KEYPAD
+ };
+} genericObj_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+// This is the pool of graphic objects
+static genericObj_t objPool[OBJ_POOL_LEN];
+// This is the array of layer per object in pool
+static uint8_t objPoolLayers[OBJ_POOL_LEN];
+// This is the number of graphic objects currently used from the objPool
+static uint8_t nbUsedObjsInPool = 0;
+
+// This is the pool of graphic objects pointers for containers
+static nbgl_obj_t *objContainerPool[OBJ_CONTAINER_POOL_LEN];
+// This is the array of layer per object pointers in pool
+static uint8_t objPointersPoolLayers[OBJ_CONTAINER_POOL_LEN];
+// This is the number of graphic objects currently used from the objContainerPool
+static uint8_t nbUsedObjsInContainerPool = 0;
+
+static bool initialized;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * VARIABLES
+ **********************/
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief Release the objects from the pool for the given layer
+ * @param layer layer to release object from
+ */
+void nbgl_objPoolRelease(uint8_t layer)
+{
+ uint8_t i;
+ LOG_DEBUG(OBJ_POOL_LOGGER,
+ "nbgl_objPoolRelease(): used objs in pool %d, for layer (%d)\n",
+ nbUsedObjsInPool,
+ layer);
+ if (nbUsedObjsInPool == 0) {
+ return;
+ }
+ for (i = 0; i < OBJ_POOL_LEN; i++) {
+ if (layer == objPoolLayers[i]) {
+ objPoolLayers[i] = INVALID_LAYER;
+ nbUsedObjsInPool--;
+ }
+ }
+}
+
+/**
+ * @brief returns the number of objects currently used in the pool
+ */
+uint8_t nbgl_objPoolGetNbUsed(uint8_t layer)
+{
+ uint8_t i, nbFound = 0;
+ for (i = 0; i < OBJ_POOL_LEN; i++) {
+ if (layer == objPoolLayers[i]) {
+ nbFound++;
+ }
+ }
+ return nbFound;
+}
+
+/**
+ * @brief Gets a new graphic object from the pool, with the given type. The type field of the object
+ * is set.
+ * @param type type of object to get from the pool
+ * @param layer layer to get object for
+ */
+nbgl_obj_t *nbgl_objPoolGet(nbgl_obj_type_t type, uint8_t layer)
+{
+ uint8_t i;
+ nbgl_obj_t *obj;
+
+ if (initialized == false) {
+ memset(objPoolLayers, INVALID_LAYER, OBJ_POOL_LEN);
+ memset(objPointersPoolLayers, INVALID_LAYER, OBJ_CONTAINER_POOL_LEN);
+ initialized = true;
+ }
+ if (nbUsedObjsInPool == (OBJ_POOL_LEN - 1)) {
+ LOG_FATAL(
+ OBJ_POOL_LOGGER, "nbgl_objPoolGet(): NO ENOUGH OBJ in POOL. max = %d\n", OBJ_POOL_LEN);
+ // TODO: crash here?
+ return NULL;
+ }
+ for (i = 0; i < OBJ_POOL_LEN; i++) {
+ if (INVALID_LAYER == objPoolLayers[i]) {
+ obj = &objPool[i].obj;
+ memset(obj, 0, sizeof(genericObj_t));
+ obj->type = type;
+ objPoolLayers[i] = layer;
+ nbUsedObjsInPool++;
+ return obj;
+ }
+ }
+ // should never happen
+ return NULL;
+}
+
+/**
+ * @brief Gets a link to the previous object in the pool, for the given layer. (to be used with
+ * care)
+ * @param obj object to get previous from
+ * @param layer layer (screen) in which to retrieve the object
+ * @return a pointer to the previous object in the pool
+ */
+nbgl_obj_t *nbgl_objPoolGetPrevious(nbgl_obj_t *obj, uint8_t layer)
+{
+ uint8_t index;
+
+ // retrieve object index
+ index = (genericObj_t *) obj - objPool;
+
+ while (index > 0) {
+ index--;
+ if (objPoolLayers[index] == layer) {
+ return &objPool[index].obj;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * @brief Gets a unique index for the given object, in the pool
+ * @param obj object to get id from
+ * @return an unique index of the object
+ */
+uint8_t nbgl_objPoolGetId(nbgl_obj_t *obj)
+{
+ uint8_t index;
+
+ // retrieve object index
+ index = (genericObj_t *) obj - objPool;
+
+ return index;
+}
+
+/**
+ * @brief Gets nbObjects new graphic object from the pool, with the given type, for the given layer
+ * (screen). The type field of the object is set.
+ * @param type type of objects to get from the pool
+ * @param nbObjs number of objects to get from the pool
+ * @param layer layer (screen) to get the object to
+ * @param objArray array of objs pointers
+ * @return >= 0 if OK
+ */
+int nbgl_objPoolGetArray(nbgl_obj_type_t type, uint8_t nbObjs, uint8_t layer, nbgl_obj_t **objArray)
+{
+ uint8_t i;
+
+ if ((nbUsedObjsInPool + nbObjs) >= OBJ_POOL_LEN) {
+ LOG_FATAL(OBJ_POOL_LOGGER,
+ "nbgl_objPoolGetArray(): NO ENOUGH OBJ in POOL. Asked: %d, max = %d\n",
+ (nbUsedObjsInPool + nbObjs),
+ OBJ_POOL_LEN);
+ // TODO: crash here?
+ return -1;
+ }
+ for (i = 0; i < nbObjs; i++) {
+ objArray[i] = nbgl_objPoolGet(type, layer);
+ }
+
+ return 0;
+}
+
+/**
+ * @brief Release the objects pointers from the pool for the given layer
+ * @param layer layer to release objects pointers from
+ */
+void nbgl_containerPoolRelease(uint8_t layer)
+{
+ uint8_t i;
+ LOG_DEBUG(OBJ_POOL_LOGGER,
+ "nbgl_containerPoolRelease(): %d used obj containers in pool, trying to release for "
+ "layer %d\n",
+ nbUsedObjsInContainerPool,
+ layer);
+ if (nbUsedObjsInContainerPool == 0) {
+ return;
+ }
+ for (i = 0; i < OBJ_CONTAINER_POOL_LEN; i++) {
+ if (layer == objPointersPoolLayers[i]) {
+ objContainerPool[i] = NULL;
+ objPointersPoolLayers[i] = INVALID_LAYER;
+ nbUsedObjsInContainerPool--;
+ }
+ }
+}
+
+/**
+ * @brief Gets a new container from the pool, with the given number of obj pointers
+ * @param nbObjs number of objects pointers for the container
+ * @param layer layer (screen) to get the container to
+ */
+nbgl_obj_t **nbgl_containerPoolGet(uint8_t nbObjs, uint8_t layer)
+{
+ uint8_t i = 0, nbContiguousFree = 0;
+ nbgl_obj_t **container;
+ LOG_DEBUG(OBJ_POOL_LOGGER,
+ "nbgl_containerPoolGet(): getting %d obj containers for layer %d\n",
+ nbObjs,
+ layer);
+ if (initialized == false) {
+ memset(objPoolLayers, INVALID_LAYER, OBJ_POOL_LEN);
+ memset(objPointersPoolLayers, INVALID_LAYER, OBJ_CONTAINER_POOL_LEN);
+ initialized = true;
+ }
+ if ((nbUsedObjsInContainerPool + nbObjs) >= (OBJ_CONTAINER_POOL_LEN - 1)) {
+ LOG_FATAL(OBJ_POOL_LOGGER,
+ "nbgl_containerPoolGet(): NO ENOUGH OBJ in POOL. Asked: %d, max = %d\n",
+ (nbUsedObjsInContainerPool + nbObjs),
+ OBJ_CONTAINER_POOL_LEN);
+ // TODO: crash here?
+ return NULL;
+ }
+ while (i < OBJ_CONTAINER_POOL_LEN) {
+ if (INVALID_LAYER == objPointersPoolLayers[i]) {
+ nbContiguousFree++;
+ }
+ else {
+ nbContiguousFree = 0;
+ }
+ i++;
+ if (nbContiguousFree == nbObjs) {
+ container = &objContainerPool[i - nbObjs];
+ memset(container, 0, nbObjs * sizeof(nbgl_obj_t *));
+ // mark slots as used
+ memset(&objPointersPoolLayers[i - nbObjs], layer, nbObjs);
+ nbUsedObjsInContainerPool += nbObjs;
+ return container;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * @brief returns the number of containers currently used in the pool
+ */
+uint8_t nbgl_containerPoolGetNbUsed(uint8_t layer)
+{
+ uint8_t i, nbFound = 0;
+ for (i = 0; i < OBJ_CONTAINER_POOL_LEN; i++) {
+ if (layer == objPointersPoolLayers[i]) {
+ nbFound++;
+ }
+ }
+ return nbFound;
+}
diff --git a/sdk_lib_nbgl/src/nbgl_page.c b/sdk_lib_nbgl/src/nbgl_page.c
new file mode 100644
index 00000000..50181934
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_page.c
@@ -0,0 +1,523 @@
+/**
+ * @file nbgl_page.c
+ * @brief Implementation of predefined pages management for Applications
+ */
+
+#ifdef NBGL_PAGE
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_debug.h"
+#include "nbgl_page.h"
+#include "glyphs.h"
+#include "os_pic.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void addContent(nbgl_pageContent_t *content, nbgl_layout_t *layout)
+{
+ if (content->title != NULL) {
+ nbgl_layoutBar_t bar;
+ bar.text = content->title;
+ bar.subText = NULL;
+ bar.iconRight = NULL;
+ bar.iconLeft = content->isTouchableTitle ? &C_leftArrow32px : NULL;
+ bar.token = content->titleToken;
+ bar.centered = true;
+ bar.inactive = false;
+ bar.tuneId = content->tuneId;
+ nbgl_layoutAddTouchableBar(layout, &bar);
+ nbgl_layoutAddSeparationLine(layout);
+ }
+ switch (content->type) {
+ case INFO_LONG_PRESS: {
+ nbgl_layoutCenteredInfo_t centeredInfo;
+ centeredInfo.icon = content->infoLongPress.icon;
+ centeredInfo.text1 = content->infoLongPress.text;
+ centeredInfo.text2 = NULL;
+ centeredInfo.text3 = NULL;
+ centeredInfo.style = LARGE_CASE_INFO;
+ centeredInfo.offsetY = -32;
+ centeredInfo.onTop = false;
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+ nbgl_layoutAddLongPressButton(layout,
+ content->infoLongPress.longPressText,
+ content->infoLongPress.longPressToken,
+ content->infoLongPress.tuneId);
+ break;
+ }
+ case INFO_BUTTON: {
+ nbgl_layoutCenteredInfo_t centeredInfo;
+ nbgl_layoutButton_t buttonInfo;
+
+ centeredInfo.icon = content->infoButton.icon;
+ centeredInfo.text1 = content->infoButton.text;
+ centeredInfo.text2 = NULL;
+ centeredInfo.text3 = NULL;
+ centeredInfo.style = LARGE_CASE_INFO;
+ centeredInfo.offsetY = -40;
+ centeredInfo.onTop = false;
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+
+ buttonInfo.fittingContent = false;
+ buttonInfo.icon = NULL;
+ buttonInfo.onBottom = true;
+ buttonInfo.style = BLACK_BACKGROUND;
+ buttonInfo.text = content->infoButton.buttonText;
+ buttonInfo.token = content->infoButton.buttonToken;
+ buttonInfo.tuneId = content->infoButton.tuneId;
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ break;
+ }
+ case CENTERED_INFO:
+ nbgl_layoutAddCenteredInfo(layout, &content->centeredInfo);
+ break;
+ case TAG_VALUE_LIST:
+ nbgl_layoutAddTagValueList(layout, &content->tagValueList);
+ break;
+ case TAG_VALUE_DETAILS: {
+ uint16_t nbLines = nbgl_getTextNbLinesInWidth(
+ content->tagValueDetails.tagValueList.smallCaseForValue ? SMALL_REGULAR_FONT
+ : LARGE_MEDIUM_FONT,
+ content->tagValueDetails.tagValueList.pairs[0].value,
+ SCREEN_WIDTH - 2 * BORDER_MARGIN,
+ content->tagValueDetails.tagValueList.wrapping);
+ // automatically display a button if content is longer that nbMaxLinesForValue
+ if (nbLines > (content->tagValueDetails.tagValueList.nbMaxLinesForValue)) {
+ nbgl_layoutButton_t buttonInfo;
+ content->tagValueDetails.tagValueList.nbMaxLinesForValue -= 3;
+ nbgl_layoutAddTagValueList(layout, &content->tagValueDetails.tagValueList);
+ buttonInfo.fittingContent = true;
+ buttonInfo.icon = content->tagValueDetails.detailsButtonIcon;
+ buttonInfo.style = WHITE_BACKGROUND;
+ buttonInfo.text = content->tagValueDetails.detailsButtonText;
+ buttonInfo.token = content->tagValueDetails.detailsButtonToken;
+ buttonInfo.tuneId = content->tagValueDetails.tuneId;
+ buttonInfo.onBottom = false;
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+ else {
+ nbgl_layoutAddTagValueList(layout, &content->tagValueDetails.tagValueList);
+ }
+ break;
+ }
+ case TAG_VALUE_CONFIRM: {
+ nbgl_layoutButton_t buttonInfo;
+ nbgl_layoutAddTagValueList(layout, &content->tagValueConfirm.tagValueList);
+ if (content->tagValueConfirm.detailsButtonText != NULL) {
+ buttonInfo.fittingContent = true;
+ buttonInfo.icon = content->tagValueConfirm.detailsButtonIcon;
+ buttonInfo.style = WHITE_BACKGROUND;
+ buttonInfo.text = content->tagValueConfirm.detailsButtonText;
+ buttonInfo.token = content->tagValueConfirm.detailsButtonToken;
+ buttonInfo.tuneId = content->tagValueConfirm.tuneId;
+ buttonInfo.onBottom = false;
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+ if (content->tagValueConfirm.confirmationText != NULL) {
+ buttonInfo.fittingContent = false;
+ buttonInfo.icon = NULL;
+ buttonInfo.style = BLACK_BACKGROUND;
+ buttonInfo.text = content->tagValueConfirm.confirmationText;
+ buttonInfo.token = content->tagValueConfirm.confirmationToken;
+ buttonInfo.tuneId = content->tagValueConfirm.tuneId;
+ buttonInfo.onBottom = true;
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+ break;
+ }
+ case SWITCHES_LIST: {
+ uint8_t i;
+ for (i = 0; i < content->switchesList.nbSwitches; i++) {
+ nbgl_layoutAddSwitch(layout, &content->switchesList.switches[i]);
+ nbgl_layoutAddSeparationLine(layout);
+ }
+ break;
+ }
+ case INFOS_LIST: {
+ uint8_t i;
+ for (i = 0; i < content->infosList.nbInfos; i++) {
+ nbgl_layoutAddText(
+ layout, content->infosList.infoTypes[i], content->infosList.infoContents[i]);
+ nbgl_layoutAddSeparationLine(layout);
+ }
+ break;
+ }
+ case CHOICES_LIST:
+ nbgl_layoutAddRadioChoice(layout, &content->choicesList);
+ break;
+ case BARS_LIST: {
+ uint8_t i;
+ for (i = 0; i < content->barsList.nbBars; i++) {
+ nbgl_layoutBar_t bar;
+ bar.text = content->barsList.barTexts[i];
+ bar.subText = NULL;
+ bar.iconRight = &C_Next32px;
+ bar.iconLeft = NULL;
+ bar.token = content->barsList.tokens[i];
+ bar.centered = false;
+ bar.tuneId = content->barsList.tuneId;
+ nbgl_layoutAddTouchableBar(layout, &bar);
+ nbgl_layoutAddSeparationLine(layout);
+ }
+ break;
+ }
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief draw a page with a centered text in large case, with a round check icon
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param ticker ticker configuration, set to NULL to disable it
+ * @param text text in LEDGER style (UPPER CASE only)
+ * @param tapActionToken token passed to onActionCallback, on a tap event
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawLedgerInfo(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ const char *text,
+ int tapActionToken)
+{
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layout_t *layout;
+ nbgl_layoutCenteredInfo_t centeredInfo = {.text1 = text,
+ .text2 = NULL,
+ .text3 = NULL,
+ .style = LARGE_CASE_INFO,
+ .icon = &C_round_check_64px,
+ .offsetY = 0};
+
+ layoutDescription.modal = false;
+ layoutDescription.withLeftBorder = true;
+
+ layoutDescription.onActionCallback = onActionCallback;
+ layoutDescription.tapActionText = "";
+ layoutDescription.tapActionToken = tapActionToken;
+ layoutDescription.tapTuneId = TUNE_TAP_CASUAL;
+
+ layoutDescription.ticker.tickerCallback = ticker->tickerCallback;
+ layoutDescription.ticker.tickerIntervale = ticker->tickerIntervale;
+ layoutDescription.ticker.tickerValue = ticker->tickerValue;
+ layout = nbgl_layoutGet(&layoutDescription);
+
+ nbgl_layoutAddCenteredInfo(layout, ¢eredInfo);
+
+ nbgl_layoutDraw(layout);
+
+ return (nbgl_page_t *) layout;
+}
+
+/**
+ * @brief draw a spinner page with the given parameters. The spinner will "rotate" automatically
+ * every 800 ms
+ *
+ * @param onActionCallback common callback for all actions on this page (unused, so set to NULL)
+ * @param text text to use under spinner
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawSpinner(nbgl_layoutTouchCallback_t onActionCallback, const char *text)
+{
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layout_t *layout;
+
+ layoutDescription.modal = false;
+ layoutDescription.withLeftBorder = true;
+
+ layoutDescription.onActionCallback = onActionCallback;
+ layoutDescription.tapActionText = NULL;
+
+ layoutDescription.ticker.tickerCallback = NULL;
+ layout = nbgl_layoutGet(&layoutDescription);
+
+ nbgl_layoutAddSpinner(layout, text, false);
+
+ nbgl_layoutDraw(layout);
+
+ return (nbgl_page_t *) layout;
+}
+
+/**
+ * @brief draw a page with a centered info (icon and/or texts) with a touchable footer,
+ * in a potential "tapable" area, with an optional top-right button, with an optional bottom button
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param ticker ticker configuration, set to NULL to disable it
+ * @param info structure describing the centered info and other controls of this page
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawInfo(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_screenTickerConfiguration_t *ticker,
+ const nbgl_pageInfoDescription_t *info)
+{
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layout_t *layout;
+
+ layoutDescription.modal = false;
+ layoutDescription.withLeftBorder = true;
+
+ layoutDescription.onActionCallback = onActionCallback;
+ layoutDescription.tapActionText = info->tapActionText;
+ layoutDescription.tapActionToken = info->tapActionToken;
+ layoutDescription.tapTuneId = info->tuneId;
+
+ if (ticker != NULL) {
+ layoutDescription.ticker.tickerCallback = ticker->tickerCallback;
+ layoutDescription.ticker.tickerIntervale = ticker->tickerIntervale;
+ layoutDescription.ticker.tickerValue = ticker->tickerValue;
+ }
+ else {
+ layoutDescription.ticker.tickerCallback = NULL;
+ }
+ layout = nbgl_layoutGet(&layoutDescription);
+
+ nbgl_layoutAddCenteredInfo(layout, &info->centeredInfo);
+
+ // if action button but not QUIT_APP_TEXT bottom button, use a small black button
+ if ((info->actionButtonText != NULL) && (info->bottomButtonStyle != QUIT_APP_TEXT)) {
+ nbgl_layoutButton_t buttonInfo = {.fittingContent = true,
+ .icon = NULL,
+ .onBottom = false,
+ .style = BLACK_BACKGROUND,
+ .text = info->actionButtonText,
+ .token = info->bottomButtonsToken,
+ .tuneId = info->tuneId};
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+
+ if (info->footerText != NULL) {
+ nbgl_layoutAddFooter(layout, PIC(info->footerText), info->footerToken, info->tuneId);
+ }
+ if (info->topRightStyle != NO_BUTTON_STYLE) {
+ const nbgl_icon_details_t *icon;
+ if (info->topRightStyle == SETTINGS_ICON) {
+ icon = &C_wheel32px;
+ }
+ else if (info->topRightStyle == INFO_ICON) {
+ icon = &C_info_i_32px;
+ }
+ else if (info->topRightStyle == QUIT_ICON) {
+ icon = &C_cross32px;
+ }
+ else {
+ return NULL;
+ }
+ nbgl_layoutAddTopRightButton(layout, PIC(icon), info->topRightToken, info->tuneId);
+ }
+ if (info->bottomButtonStyle == QUIT_APP_TEXT) {
+ // if action button and QUIT_APP_TEXT bottom button, use a pair of choice buttons
+ if ((info->actionButtonText != NULL)) {
+ nbgl_layoutChoiceButtons_t buttonsInfo = {.topText = info->actionButtonText,
+ .bottomText = "Quit app",
+ .token = info->bottomButtonsToken,
+ .style = BOTH_ROUNDED_STYLE,
+ .tuneId = info->tuneId};
+ nbgl_layoutAddChoiceButtons(layout, &buttonsInfo);
+ }
+ else {
+ nbgl_layoutButton_t buttonInfo = {.fittingContent = false,
+ .icon = NULL,
+ .onBottom = true,
+ .style = WHITE_BACKGROUND,
+ .text = "Quit app",
+ .token = info->bottomButtonsToken,
+ .tuneId = info->tuneId};
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+ }
+ else if (info->bottomButtonStyle != NO_BUTTON_STYLE) {
+ const nbgl_icon_details_t *icon;
+ if (info->bottomButtonStyle == SETTINGS_ICON) {
+ icon = &C_wheel32px;
+ }
+ else if (info->bottomButtonStyle == INFO_ICON) {
+ icon = &C_info_i_32px;
+ }
+ else if (info->bottomButtonStyle == QUIT_ICON) {
+ icon = &C_cross32px;
+ }
+ else {
+ return NULL;
+ }
+ nbgl_layoutAddBottomButton(
+ layout, PIC(icon), info->bottomButtonsToken, false, info->tuneId);
+ }
+ nbgl_layoutDraw(layout);
+
+ return (nbgl_page_t *) layout;
+}
+
+/**
+ * @brief draw a confirmation page, with a centered info (icon and/or text), a button to confirm and
+ * a footer to cancel
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param info structure describing the centered info and other controls of this page
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawConfirmation(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageConfirmationDescription_t *info)
+{
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layout_t *layout;
+
+ layoutDescription.modal = info->modal;
+ layoutDescription.withLeftBorder = true;
+
+ layoutDescription.onActionCallback = onActionCallback;
+ layoutDescription.tapActionText = NULL;
+
+ layoutDescription.ticker.tickerCallback = NULL;
+ layout = nbgl_layoutGet(&layoutDescription);
+ if (info->cancelText == NULL) {
+ nbgl_layoutButton_t buttonInfo = {.style = BLACK_BACKGROUND,
+ .text = info->confirmationText,
+ .icon = NULL,
+ .token = info->confirmationToken,
+ .fittingContent = false,
+ .tuneId = info->tuneId,
+ .onBottom = true};
+ nbgl_layoutAddBottomButton(
+ layout, PIC(&C_cross32px), info->cancelToken, true, info->tuneId);
+ nbgl_layoutAddButton(layout, &buttonInfo);
+ }
+ else {
+ nbgl_layoutChoiceButtons_t buttonsInfo = {.bottomText = PIC(info->cancelText),
+ .token = info->confirmationToken,
+ .topText = PIC(info->confirmationText),
+ .style = ROUNDED_AND_FOOTER_STYLE,
+ .tuneId = info->tuneId};
+ nbgl_layoutAddChoiceButtons(layout, &buttonsInfo);
+ }
+ nbgl_layoutAddCenteredInfo(layout, &info->centeredInfo);
+
+ nbgl_layoutDraw(layout);
+
+ return (nbgl_page_t *) layout;
+}
+
+/**
+ * @brief draw a generic content page, with the given content, and if nav parameter is not NULL,
+ * with the given navigation controls (either with navigation bar or with "tap" and "back")
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param nav structure describing the navigation controls of this page (no navigation if NULL)
+ * @param content structure describing the main content of this page
+ * @param modal set to true to draw as a modal
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawGenericContentExt(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageNavigationInfo_t *nav,
+ nbgl_pageContent_t *content,
+ bool modal)
+{
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layout_t *layout;
+
+ layoutDescription.modal = modal;
+ layoutDescription.withLeftBorder = true;
+ layoutDescription.onActionCallback = onActionCallback;
+ layoutDescription.ticker.tickerCallback = NULL;
+
+ if ((nav != NULL) && (nav->navType == NAV_WITH_TAP)) {
+ layoutDescription.tapActionText = nav->navWithTap.nextPageText;
+ layoutDescription.tapActionToken = nav->navWithTap.nextPageToken;
+ layoutDescription.tapTuneId = nav->tuneId;
+ }
+ else {
+ layoutDescription.tapActionText = NULL;
+ }
+
+ layout = nbgl_layoutGet(&layoutDescription);
+ if (nav != NULL) {
+ if (nav->navType == NAV_WITH_TAP) {
+ if (nav->navWithTap.skipText == NULL) {
+ nbgl_layoutAddFooter(layout, nav->navWithTap.quitText, nav->quitToken, nav->tuneId);
+ }
+ else {
+ nbgl_layoutAddSplitFooter(layout,
+ nav->navWithTap.quitText,
+ nav->quitToken,
+ nav->navWithTap.skipText,
+ nav->navWithTap.skipToken,
+ nav->tuneId);
+ }
+ if (nav->progressIndicator) {
+ nbgl_layoutAddProgressIndicator(layout,
+ nav->activePage,
+ nav->nbPages,
+ nav->navWithTap.backButton,
+ nav->navWithTap.backToken,
+ nav->tuneId);
+ }
+ }
+ else if (nav->navType == NAV_WITH_BUTTONS) {
+ nbgl_layoutNavigationBar_t navInfo = {.activePage = nav->activePage,
+ .nbPages = nav->nbPages,
+ .token = nav->navWithButtons.navToken,
+ .withExitKey = nav->navWithButtons.quitButton,
+ .withSeparationLine = true,
+ .tuneId = nav->tuneId};
+ nbgl_layoutAddNavigationBar(layout, &navInfo);
+ if (nav->progressIndicator) {
+ nbgl_layoutAddProgressIndicator(
+ layout, nav->activePage, nav->nbPages, false, 0, nav->tuneId);
+ }
+ }
+ }
+ addContent(content, layout);
+ nbgl_layoutDraw(layout);
+
+ return (nbgl_page_t *) layout;
+}
+
+/**
+ * @brief draw a generic content page, with the given content, and if nav parameter is not NULL,
+ * with the given navigation controls (either with navigation bar or with "tap" and "back")
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param nav structure describing the navigation controls of this page (no navigation if NULL)
+ * @param content structure describing the main content of this page
+ * @return the page context (or NULL if error)
+ */
+nbgl_page_t *nbgl_pageDrawGenericContent(nbgl_layoutTouchCallback_t onActionCallback,
+ const nbgl_pageNavigationInfo_t *nav,
+ nbgl_pageContent_t *content)
+{
+ return nbgl_pageDrawGenericContentExt(onActionCallback, nav, content, false);
+}
+
+/**
+ * @brief Release the page obtained with any of the nbgl_pageDrawXXX() functions
+ *
+ * @param page page to release
+ * @return >= 0 if OK
+ */
+int nbgl_pageRelease(nbgl_page_t *page)
+{
+ int ret;
+
+ LOG_DEBUG(PAGE_LOGGER, "nbgl_pageRelease(): \n");
+ ret = nbgl_layoutRelease((nbgl_layout_t *) page);
+
+ return ret;
+}
+#endif // NBGL_PAGE
diff --git a/sdk_lib_nbgl/src/nbgl_screen.c b/sdk_lib_nbgl/src/nbgl_screen.c
new file mode 100644
index 00000000..f1638e8e
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_screen.c
@@ -0,0 +1,535 @@
+/**
+ * @file nbgl_screen.c
+ * @brief Implementation of screens management API
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "nbgl_screen.h"
+#include "nbgl_debug.h"
+#include "os_pic.h"
+#include "os_io.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**
+ * @brief Max number of stackable screens
+ * @note Only the screen at the top of the stack is visible
+ *
+ * Only index 0 is always bottom of stack, for the others the index can change
+ *
+ * The worst case is (the order is not relevant)
+ *
+ * Validate pin
+ * ----------------
+ * BLE Pairing
+ * -------------
+ * Control Center
+ * ---------
+ * Dashboard
+ *
+ */
+#define SCREEN_STACK_SIZE 4
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * VARIABLES
+ **********************/
+static nbgl_screen_t screenStack[SCREEN_STACK_SIZE];
+// number of screens in the stack
+static uint8_t nbScreensOnStack = 0;
+// this is a pointer of the current top of stack screen
+static nbgl_screen_t *topOfStack;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief This function redraws the whole screen on top of stack and its children
+ *
+ */
+void nbgl_screenRedraw(void)
+{
+ if (nbScreensOnStack == 0) {
+ LOG_WARN(SCREEN_LOGGER, "nbgl_screenRedraw(): no screen to redraw\n");
+ return;
+ }
+ LOG_DEBUG(SCREEN_LOGGER, "nbgl_screenRedraw(): nbScreensOnStack = %d\n", nbScreensOnStack);
+#ifdef HAVE_SE_TOUCH
+ // by default, exclude left & top borders from touch
+ // if any sub-object is a keyboard, this will be modified when drawing it
+ touch_exclude_borders(TOP_BORDER | LEFT_BORDER);
+#endif // HAVE_SE_TOUCH
+
+ nbgl_screen_reinit();
+ nbgl_redrawObject((nbgl_obj_t *) topOfStack, NULL, true);
+}
+
+/**
+ * @brief Returns the screen on top layer, as a generic object
+ * @return the screen on top layer, or NULL if no screen in stack
+ */
+nbgl_obj_t *nbgl_screenGetTop(void)
+{
+ if (nbScreensOnStack > 0) {
+ return (nbgl_obj_t *) topOfStack;
+ }
+ else {
+ return NULL;
+ }
+}
+
+/**
+ * @brief Returns the number of used screens on stack
+ * @return the number of used screens on stack
+ */
+uint8_t nbgl_screenGetCurrentStackSize(void)
+{
+ if ((nbScreensOnStack == 1) && (screenStack[0].container.nbChildren == 0)) {
+ return 0;
+ }
+ return nbScreensOnStack;
+}
+
+/**
+ * @brief Set the children of the screen with the given array of nbgl_obj_t*
+ * It will replace the current children array.
+ * A @ref nbgl_screenRedraw() can be called after that to draw all the given objects (and their
+ * children)
+ *
+ * @param screenIndex index of the screen in the stack. 0 is the usual value, except for modal
+ * windows
+ * @param children an array of nbgl_obj_t*
+ * @param nbChildren number of elements in children array
+ * @param ticker configuration of ticker
+ * @param callback callback called when any touchable object of the screen is touched (except
+ * keyboard/keypad)
+ *
+ * @return >= 0 if OK
+ */
+static int nbgl_screenSetAt(uint8_t screenIndex,
+ nbgl_obj_t ***children,
+ uint8_t nbChildren,
+ const nbgl_screenTickerConfiguration_t *ticker,
+#ifdef HAVE_SE_TOUCH
+ nbgl_touchCallback_t callback)
+{
+#else // HAVE_SE_TOUCH
+ nbgl_buttonCallback_t callback)
+{
+#endif // HAVE_SE_TOUCH
+ if (screenIndex >= SCREEN_STACK_SIZE) {
+ LOG_WARN(SCREEN_LOGGER, "nbgl_screenSetAt(): forbidden screenIndex (%d)\n", screenIndex);
+ return -1;
+ }
+ *children = nbgl_containerPoolGet(nbChildren, screenIndex);
+ screenStack[screenIndex].container.obj.type = SCREEN;
+#ifdef HAVE_SE_TOUCH
+ screenStack[screenIndex].container.obj.area.backgroundColor = WHITE;
+#else // HAVE_SE_TOUCH
+ screenStack[screenIndex].container.obj.area.backgroundColor = BLACK;
+#endif // HAVE_SE_TOUCH
+ screenStack[screenIndex].container.obj.area.height = SCREEN_HEIGHT;
+ screenStack[screenIndex].container.obj.area.width = SCREEN_WIDTH;
+ screenStack[screenIndex].container.obj.area.x0 = 0;
+ screenStack[screenIndex].container.obj.area.y0 = 0;
+ screenStack[screenIndex].container.obj.rel_x0 = 0;
+ screenStack[screenIndex].container.obj.rel_y0 = 0;
+ screenStack[screenIndex].index = screenIndex;
+ screenStack[screenIndex].container.layout = VERTICAL;
+ screenStack[screenIndex].container.children = *children;
+ screenStack[screenIndex].container.nbChildren = nbChildren;
+#ifdef HAVE_SE_TOUCH
+ screenStack[screenIndex].touchCallback = callback;
+#else // HAVE_SE_TOUCH
+ screenStack[screenIndex].buttonCallback = callback;
+#endif // HAVE_SE_TOUCH
+ if (ticker != NULL) {
+ screenStack[screenIndex].ticker.tickerCallback
+ = (nbgl_tickerCallback_t) PIC(ticker->tickerCallback);
+ screenStack[screenIndex].ticker.tickerIntervale = ticker->tickerIntervale;
+ screenStack[screenIndex].ticker.tickerValue = ticker->tickerValue;
+ }
+ else {
+ screenStack[screenIndex].ticker.tickerCallback = NULL;
+ }
+ return 0;
+}
+
+/**
+ * @brief Configures the lowest layer screen. To be used by applications
+ * A @ref nbgl_screenRedraw() can be called after that to draw all the given objects (and their
+ * children)
+ *
+ * @param elements an pointer on an array of nbgl_obj_t* to get as children of the screen, it will
+ * be allocated by the function
+ * @param nbElements number of elements in elements array
+ * @param ticker if not NULL, configures the potential ticker to be used as a periodic timer
+ * @param callback callback called when any touchable object of the screen is touched (except
+ * keyboard/keypad) (can be NULL)
+ *
+ * @return >= 0 if OK
+ */
+int nbgl_screenSet(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+#ifdef HAVE_SE_TOUCH
+ nbgl_touchCallback_t callback)
+{
+#else // HAVE_SE_TOUCH
+ nbgl_buttonCallback_t callback)
+{
+#endif // HAVE_SE_TOUCH
+ // if no screen, consider it as a first fake push
+ if (nbScreensOnStack == 0) {
+ nbScreensOnStack++;
+ topOfStack = &screenStack[0];
+ }
+ // release used objects and containers
+ nbgl_objPoolRelease(0);
+ nbgl_containerPoolRelease(0);
+ // always use the first layer (background) for user application
+ return nbgl_screenSetAt(0, elements, nbElements, ticker, callback);
+}
+
+/**
+ * @brief Updates the number of children on given layer. can only be smaller than the number given
+ * in @ref nbgl_screenSet()
+ *
+ * @param screenIndex index of the screen in the stack. 0 is the usual value, except for modal
+ * windows
+ * @param nbElements number of elements in elements array
+ *
+ * @return >= 0 if OK
+ */
+int nbgl_screenUpdateNbElements(uint8_t screenIndex, uint8_t nbElements)
+{
+ screenStack[screenIndex].container.nbChildren = nbElements;
+ return 0;
+}
+
+/**
+ * @brief Updates the background color of the screen at the given screenIndex, always set at @ref
+ * WHITE in
+ *
+ * @param screenIndex index of the screen in the stack. 0 is the usual value, except for modal
+ * windows
+ * @param color color to set as background color for tge screen
+ *
+ * @return >= 0 if OK
+ */
+int nbgl_screenUpdateBackgroundColor(uint8_t screenIndex, color_t color)
+{
+ screenStack[screenIndex].container.obj.area.backgroundColor = color;
+ return 0;
+}
+
+/**
+ * @brief Updates the ticker configuration of the screen at the given screenIndex, always set at
+ * @ref WHITE in
+ *
+ * @param screenIndex index of the screen in the stack. 0 is the usual value, except for modal
+ * windows
+ * @param ticker if not NULL, configures the potential ticker to be used as a periodic timer
+ *
+ * @return >= 0 if OK
+ */
+int nbgl_screenUpdateTicker(uint8_t screenIndex, const nbgl_screenTickerConfiguration_t *ticker)
+{
+ if (ticker != NULL) {
+ screenStack[screenIndex].ticker.tickerCallback
+ = (nbgl_tickerCallback_t) PIC(ticker->tickerCallback);
+ screenStack[screenIndex].ticker.tickerIntervale = ticker->tickerIntervale;
+ screenStack[screenIndex].ticker.tickerValue = ticker->tickerValue;
+ }
+ else {
+ screenStack[screenIndex].ticker.tickerCallback = NULL;
+ }
+ return 0;
+}
+
+/**
+ * @brief Returns the array of elements (children) of the screen at the given index (return value of
+ * @ref nbgl_screenPush() or 0 for a screen created with @ref nbgl_screenSet())
+ *
+ * @param screenIndex index of the screen in the stack. 0 is the usual value, except for modal
+ * windows
+ *
+ * @return array of elements (children) of the screen
+ */
+nbgl_obj_t **nbgl_screenGetElements(uint8_t screenIndex)
+{
+ return screenStack[screenIndex].container.children;
+}
+
+/**
+ * @brief Pushes a screen on top of the stack, with the given number of elements, if possible. The
+ * array of children for this screen is set in given elements parameter A @ref
+ * nbgl_screenRedraw() can be called after that to draw all the given objects (and their children)
+ *
+ * @param elements (output) an array of nbgl_obj_t** to get
+ * @param nbElements number of elements to get in elements array
+ * @param ticker if not NULL, configures the potential ticker to be used as a periodic timer
+ * @param callback callback called when any touchable object of the screen is touched (except
+ * keyboard/keypad) (can be NULL)
+ *
+ * @return current screen index, or < 0 if error
+ */
+int nbgl_screenPush(nbgl_obj_t ***elements,
+ uint8_t nbElements,
+ const nbgl_screenTickerConfiguration_t *ticker,
+#ifdef HAVE_SE_TOUCH
+ nbgl_touchCallback_t callback)
+{
+#else // HAVE_SE_TOUCH
+ nbgl_buttonCallback_t callback)
+{
+#endif // HAVE_SE_TOUCH
+ uint8_t screenIndex;
+ if (nbScreensOnStack >= SCREEN_STACK_SIZE) {
+ LOG_WARN(SCREEN_LOGGER,
+ "nbgl_screenPush(): already in highest index in the stack(%d)\n",
+ nbScreensOnStack - 1);
+ return -1;
+ }
+ // if no screen, consider it as a first fake push
+ if (nbScreensOnStack == 0) {
+ screenIndex = 1; // push at position 1 because 0 is reserved for background
+ topOfStack = &screenStack[screenIndex];
+ topOfStack->next = NULL;
+ // link top of stack to background (even if empty)
+ topOfStack->previous = &screenStack[0];
+ screenStack[0].next = topOfStack;
+ screenStack[0].container.nbChildren = 0;
+ // count empty background as an active screen
+ nbScreensOnStack++;
+ }
+ else {
+ // find a non used screen in the array
+ for (screenIndex = 1; screenIndex < SCREEN_STACK_SIZE; screenIndex++) {
+ if (screenStack[screenIndex].previous == NULL) {
+ // if no previous, means unused, so take it
+ // update previous topOfStack
+ topOfStack->next = &screenStack[screenIndex];
+ screenStack[screenIndex].previous = topOfStack;
+ // new top of stack
+ topOfStack = &screenStack[screenIndex];
+ topOfStack->next = NULL;
+ break;
+ }
+ }
+ if (screenIndex == SCREEN_STACK_SIZE) {
+ // should never happen
+ LOG_WARN(SCREEN_LOGGER, "nbgl_screenPush(): corruption in stack\n");
+ }
+ }
+ if (nbgl_screenSetAt(screenIndex, elements, nbElements, ticker, callback) >= 0) {
+ nbScreensOnStack++;
+ LOG_DEBUG(SCREEN_LOGGER, "nbgl_screenPush(): screen %d is now top of stack\n", screenIndex);
+ return screenIndex;
+ }
+ else {
+ return -1;
+ }
+}
+
+/**
+ * @brief Release the screen at the given index in screen array (index returned by @ref
+ * nbgl_screenPush()). A @ref nbgl_screenRedraw() can be called after that to draw all objects in
+ * the new top of the stack
+ *
+ * @param screenIndex index of the screen to pop in the stack. 0 is the usual value, except for
+ * modal windows
+ * @return the index of screen on top of stack (if -1, the stack is empty)
+ */
+int nbgl_screenPop(uint8_t screenIndex)
+{
+ if (nbScreensOnStack == 0) {
+ LOG_WARN(SCREEN_LOGGER, "nbgl_screenPop(): already in lowest index in the stack\n");
+ return -1;
+ }
+ LOG_DEBUG(SCREEN_LOGGER, "nbgl_screenPop(): at index %d\n", screenIndex);
+ nbScreensOnStack--;
+ // move top of stack if needed
+ if (&screenStack[screenIndex] == topOfStack) {
+ if (nbScreensOnStack == 0) {
+ topOfStack = NULL;
+ }
+ else {
+ topOfStack = topOfStack->previous;
+ }
+ }
+ else {
+ // connect previous to next
+ if (screenStack[screenIndex].previous != NULL) {
+ screenStack[screenIndex].previous->next = screenStack[screenIndex].next;
+ }
+ if (screenStack[screenIndex].next != NULL) {
+ screenStack[screenIndex].next->previous = screenStack[screenIndex].previous;
+ }
+ }
+ // free slot
+ screenStack[screenIndex].previous = NULL;
+ screenStack[screenIndex].next = NULL;
+ screenStack[screenIndex].container.nbChildren = 0;
+ screenStack[screenIndex].container.children = NULL;
+ // release used objects and containers
+ nbgl_objPoolRelease(screenIndex);
+ nbgl_containerPoolRelease(screenIndex);
+ return 0;
+}
+
+/**
+ * @brief Releases all screens and objects and resets the screen stack.
+ * It is supposed to be called before running an app
+ *
+ * @return >= 0 if OK
+ */
+int nbgl_screenReset(void)
+{
+ uint8_t screenIndex;
+ for (screenIndex = 0; screenIndex < SCREEN_STACK_SIZE; screenIndex++) {
+ if ((screenStack[screenIndex].previous != NULL)
+ || (screenStack[screenIndex].next != NULL)) {
+ // release used objects and containers
+ nbgl_objPoolRelease(screenIndex);
+ nbgl_containerPoolRelease(screenIndex);
+ }
+ }
+ nbScreensOnStack = 0;
+ topOfStack = NULL;
+ return 1;
+}
+
+/**
+ * @brief Function to be called periodically by system to enable using ticker
+ *
+ * @param intervaleMs intervale or time since the last call, in ms
+ */
+void nbgl_screenHandler(uint32_t intervaleMs)
+{
+ // ensure a screen exists
+ if (nbScreensOnStack == 0) {
+ return;
+ }
+ // call ticker callback of top of stack if active and not expired yet (for a non periodic)
+ if ((topOfStack->ticker.tickerCallback != NULL) && (topOfStack->ticker.tickerValue != 0)) {
+ topOfStack->ticker.tickerValue -= MIN(topOfStack->ticker.tickerValue, intervaleMs);
+ if (topOfStack->ticker.tickerValue == 0) {
+ // rearm if intervale is not null, and call the registered function
+ topOfStack->ticker.tickerValue = topOfStack->ticker.tickerIntervale;
+ topOfStack->ticker.tickerCallback();
+ }
+ }
+}
+
+/**
+ * @brief return true if the given obj can be found in refObj or any of its children
+ *
+ * @param refObj the object to search obj into
+ * @param obj the object to search
+ * @return true if belongs, false otherwise
+ */
+static bool objIsIn(nbgl_obj_t *refObj, nbgl_obj_t *obj)
+{
+ uint8_t i;
+
+ if (obj == NULL) {
+ return false;
+ }
+ if ((nbgl_obj_t *) refObj == obj) {
+ LOG_DEBUG(SCREEN_LOGGER, "nbgl_screenContainsObj(): yes\n");
+ return true;
+ }
+
+ if ((refObj->type == SCREEN) || (refObj->type == CONTAINER)) {
+ nbgl_container_t *container = (nbgl_container_t *) refObj;
+ // draw the children, if any
+ if (container->children != NULL) {
+ for (i = 0; i < container->nbChildren; i++) {
+ nbgl_obj_t *current = container->children[i];
+ if (current != NULL) {
+ if (objIsIn(current, obj) == true) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief return true if the given obj can be found in refObj or any of its children
+ *
+ * @param refObj the object to search obj into
+ * @param obj the object to search
+ * @return found object or NULL if not found
+ */
+static nbgl_obj_t *objIsOfType(nbgl_obj_t *refObj, nbgl_obj_type_t type)
+{
+ uint8_t i;
+
+ if (refObj->type == type) {
+ LOG_DEBUG(SCREEN_LOGGER, "objIsOfType(): yes\n");
+ return refObj;
+ }
+
+ if ((refObj->type == SCREEN) || (refObj->type == CONTAINER)) {
+ nbgl_container_t *container = (nbgl_container_t *) refObj;
+ // draw the children, if any
+ if (container->children != NULL) {
+ for (i = 0; i < container->nbChildren; i++) {
+ nbgl_obj_t *current = container->children[i];
+ if (current != NULL) {
+ nbgl_obj_t *found = objIsOfType(current, type);
+ if (found) {
+ return found;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+/**
+ * @brief return true if the given obj can be found in refObj or any of its children
+ *
+ * @param obj the object to search
+ * @return true if belongs, false otherwise
+ */
+bool nbgl_screenContainsObj(nbgl_obj_t *obj)
+{
+ if (nbScreensOnStack == 0) {
+ return false;
+ }
+ return objIsIn((nbgl_obj_t *) topOfStack, obj);
+}
+
+/**
+ * @brief return an object of the given type in the given screen
+ *
+ * @param screen the screen in which to search
+ * @param type the type of object to search for
+ * @return the found object of given type
+ */
+nbgl_obj_t *nbgl_screenContainsObjType(nbgl_screen_t *screen, nbgl_obj_type_t type)
+{
+ if (nbScreensOnStack == 0) {
+ return NULL;
+ }
+
+ return objIsOfType((nbgl_obj_t *) screen, type);
+}
diff --git a/sdk_lib_nbgl/src/nbgl_serialize.c b/sdk_lib_nbgl/src/nbgl_serialize.c
new file mode 100644
index 00000000..ce4129de
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_serialize.c
@@ -0,0 +1,441 @@
+#include
+#include
+#include "nbgl_obj.h"
+#include "nbgl_serialize.h"
+#include "nbgl_image_utils.h"
+#include "os_pic.h"
+
+// Utility functions
+
+static void nbgl_appendU8(uint8_t value, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ if (*w_cnt < max_len) {
+ out[*w_cnt] = value;
+ (*w_cnt)++;
+ }
+}
+
+static void nbgl_appendU32(uint32_t value, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_appendU8((uint8_t) ((value >> 24) & 0xFF), out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) ((value >> 16) & 0xFF), out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) ((value >> 8) & 0xFF), out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) (value & 0xFF), out, w_cnt, max_len);
+}
+
+static void nbgl_appendPtr(const void *value, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ if (max_len < (*w_cnt + sizeof(void *))) {
+ return;
+ }
+ memcpy(&out[*w_cnt], &value, sizeof(void *));
+ (*w_cnt) = (*w_cnt) + sizeof(void *);
+}
+
+static void nbgl_appendU16(uint16_t value, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_appendU8((uint8_t) ((value >> 8) & 0xFF), out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) (value & 0xFF), out, w_cnt, max_len);
+}
+
+// serialize a nbgl_area_t structure
+static void nbgl_serializeArea(nbgl_area_t *area, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_appendU16(area->x0, out, w_cnt, max_len);
+ nbgl_appendU16(area->y0, out, w_cnt, max_len);
+ nbgl_appendU16(area->width, out, w_cnt, max_len);
+ nbgl_appendU16(area->height, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) area->backgroundColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) area->bpp, out, w_cnt, max_len);
+}
+
+static uint8_t getObjId(nbgl_obj_t *obj)
+{
+ if (obj->type != SCREEN) {
+ // return the internal offset + 1
+ return nbgl_objPoolGetId(obj) + 1;
+ }
+ // no ID for screen, because it's not a real object, and not taken from pool
+ return 0;
+}
+
+// serialize a nbgl_obj_t structure (including nbgl_area_t)
+static void nbgl_serializeObj(nbgl_obj_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ // at first serialize an id
+ nbgl_appendU8(getObjId(obj), out, w_cnt, max_len);
+ // the only field to be serialized is the object type
+ nbgl_appendU8((uint8_t) obj->type, out, w_cnt, max_len);
+ // then serialize the area
+ nbgl_serializeArea((nbgl_area_t *) &obj->area, out, w_cnt, max_len);
+}
+
+// Serialization functions
+
+static void nbgl_serializeText(const char *text,
+ uint16_t text_len,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ if (text == NULL) {
+ nbgl_appendU8('\0', out, w_cnt, max_len);
+ return;
+ }
+ while (*w_cnt < max_len) {
+ nbgl_appendU8(*text, out, w_cnt, max_len);
+ // if the text_len is provided, use it
+ if (text_len > 0) {
+ text_len--;
+ if (text_len == 0) {
+ return;
+ }
+ }
+ if (*text == '\0') {
+ return;
+ }
+ else {
+ text++;
+ }
+ }
+}
+
+/**
+ * Mapping of nbgl_bpp_t type and their associated driver configuration
+ * and actual number of bit per pixel.
+ */
+static const uint8_t NBGL_BPP_MAPPING[NB_NBGL_BPP]
+ = {[NBGL_BPP_1] = 1, [NBGL_BPP_2] = 2, [NBGL_BPP_4] = 4};
+
+/**
+ * @brief Returns the number of bits per pixel associated to the input nbgl_bpp
+ * @param nbgl_bpp Input nbgl_bpp
+ *
+ * @return
+ * - Number of bits per pixel if nbgl_bpp is valid
+ * - -1 otherwise
+ */
+static int8_t nbgl_bpp_get_number_of_bits_per_pixel(nbgl_bpp_t nbgl_bpp)
+{
+ if (nbgl_bpp >= NB_NBGL_BPP) {
+ return -1;
+ }
+
+ return NBGL_BPP_MAPPING[nbgl_bpp];
+}
+
+/**
+ * @brief Calculate the size in bytes of a window
+ * @param width Width of the input window
+ * @param height Height of the input window
+ * @param nbgl_bpp Bpp of the input window
+ *
+ * @return
+ * - Window size if parameters are correct
+ * - (-1) otherwise
+ */
+static int32_t nbgl_bpp_get_window_size(uint16_t width, uint16_t height, nbgl_bpp_t nbgl_bpp)
+{
+ if ((width > SCREEN_WIDTH) || (height > SCREEN_HEIGHT) || (nbgl_bpp >= NB_NBGL_BPP)) {
+ return -1;
+ }
+
+ int32_t nb_bits = (width * height * nbgl_bpp_get_number_of_bits_per_pixel(nbgl_bpp));
+ uint8_t remain = nb_bits % 8;
+
+ // Ceil division to ensure the output number of bytes contains
+ // all the bits of the window.
+ if (remain == 0) {
+ return nb_bits / 8;
+ }
+ else {
+ return (nb_bits + (8 - remain)) / 8;
+ }
+}
+
+static void nbgl_serializeIcon(const nbgl_icon_details_t *icon,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ int32_t size = 0;
+ if (icon == NULL) {
+ nbgl_appendU16(0, out, w_cnt, max_len);
+ nbgl_appendU16(0, out, w_cnt, max_len);
+ nbgl_appendU8(0, out, w_cnt, max_len);
+ nbgl_appendU8(0, out, w_cnt, max_len);
+ }
+ else {
+ nbgl_appendU16(icon->width, out, w_cnt, max_len);
+ nbgl_appendU16(icon->height, out, w_cnt, max_len);
+ nbgl_appendU8(icon->bpp, out, w_cnt, max_len);
+ nbgl_appendU8(icon->isFile, out, w_cnt, max_len);
+ if (!icon->isFile) {
+ size = nbgl_bpp_get_window_size(icon->width, icon->height, icon->bpp);
+ }
+ else {
+ size = GET_IMAGE_FILE_BUFFER_LEN(((const uint8_t *) PIC(icon->bitmap)))
+ + IMAGE_FILE_HEADER_SIZE;
+ }
+ }
+ nbgl_appendU32(size, out, w_cnt, max_len);
+#ifdef SERIALIZE_DATA
+ for (int32_t i = 0; i < size; i++) {
+ nbgl_appendU8(icon->bitmap[i], out, w_cnt, max_len);
+ }
+#endif // SERIALIZE_DATA
+}
+
+static void nbgl_serializeTextArea(nbgl_text_area_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->textColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->textAlignment, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->style, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->fontId, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->localized, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->autoHideLongLine, out, w_cnt, max_len);
+ nbgl_appendU16((uint16_t) obj->len, out, w_cnt, max_len);
+
+ nbgl_serializeText(PIC(obj->text), obj->len, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeLine(nbgl_line_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->direction, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->lineColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->thickness, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->offset, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeQrCode(nbgl_qrcode_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->foregroundColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->version, out, w_cnt, max_len);
+ nbgl_serializeText(PIC(obj->text), 0, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeRadio(nbgl_radio_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->activeColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->borderColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->state, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeSwitch(nbgl_switch_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->onColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->offColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->state, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeProgressBar(nbgl_progress_bar_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->withBorder, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->state, out, w_cnt, max_len);
+}
+
+static void nbgl_serializePageIndicator(nbgl_page_indicator_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->activePage, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->nbPages, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeButton(nbgl_button_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->innerColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->borderColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->foregroundColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->radius, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->fontId, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->localized, out, w_cnt, max_len);
+ nbgl_serializeText(PIC(obj->text), 0, out, w_cnt, max_len);
+ nbgl_serializeIcon(PIC(obj->icon), out, w_cnt, max_len);
+}
+
+static void nbgl_serializeImage(nbgl_image_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+ nbgl_serializeIcon(PIC(obj->buffer), out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->foregroundColor, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeSpinner(nbgl_spinner_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+ nbgl_appendU8(obj->position, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeKeyboard(nbgl_keyboard_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->textColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->borderColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->lettersOnly, out, w_cnt, max_len);
+#ifdef HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->casing, out, w_cnt, max_len);
+#else // HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->selectedCharIndex, out, w_cnt, max_len);
+#endif // HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->mode, out, w_cnt, max_len);
+ nbgl_appendU32(obj->keyMask, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeKeypad(nbgl_keypad_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+#ifdef HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->textColor, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->borderColor, out, w_cnt, max_len);
+#endif // HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->enableBackspace, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->enableValidate, out, w_cnt, max_len);
+#ifdef HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->enableDigits, out, w_cnt, max_len);
+#endif // HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->shuffled, out, w_cnt, max_len);
+#ifdef HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->digitIndexes[0], out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->digitIndexes[1], out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->digitIndexes[2], out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->digitIndexes[3], out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->digitIndexes[4], out, w_cnt, max_len);
+#else // HAVE_SE_TOUCH
+ nbgl_appendU8((uint8_t) obj->selectedKey, out, w_cnt, max_len);
+#endif // HAVE_SE_TOUCH
+}
+
+static void nbgl_serializeImageFile(nbgl_image_file_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+ nbgl_appendPtr((const void *) obj->buffer, out, w_cnt, max_len);
+}
+
+static void nbgl_serializeContainer(nbgl_container_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeObj((nbgl_obj_t *) &obj->obj, out, w_cnt, max_len);
+
+ nbgl_appendU8((uint8_t) obj->layout, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->nbChildren, out, w_cnt, max_len);
+ nbgl_appendU8((uint8_t) obj->forceClean, out, w_cnt, max_len);
+}
+
+static uint8_t nbgl_serializeObject(nbgl_obj_t *obj, uint8_t *out, size_t *w_cnt, size_t max_len)
+{
+ switch (obj->type) {
+ case SCREEN:
+ nbgl_serializeObj((nbgl_obj_t *) obj, out, w_cnt, max_len);
+ break;
+ case CONTAINER:
+ nbgl_serializeContainer((nbgl_container_t *) obj, out, w_cnt, max_len);
+ break;
+ case IMAGE:
+ nbgl_serializeImage((nbgl_image_t *) obj, out, w_cnt, max_len);
+ break;
+ case LINE:
+ nbgl_serializeLine((nbgl_line_t *) obj, out, w_cnt, max_len);
+ break;
+ case TEXT_AREA:
+ nbgl_serializeTextArea((nbgl_text_area_t *) obj, out, w_cnt, max_len);
+ break;
+ case BUTTON:
+ nbgl_serializeButton((nbgl_button_t *) obj, out, w_cnt, max_len);
+ break;
+ case SWITCH:
+ nbgl_serializeSwitch((nbgl_switch_t *) obj, out, w_cnt, max_len);
+ break;
+ case PAGE_INDICATOR:
+ nbgl_serializePageIndicator((nbgl_page_indicator_t *) obj, out, w_cnt, max_len);
+ break;
+ case PROGRESS_BAR:
+ nbgl_serializeProgressBar((nbgl_progress_bar_t *) obj, out, w_cnt, max_len);
+ break;
+ case RADIO_BUTTON:
+ nbgl_serializeRadio((nbgl_radio_t *) obj, out, w_cnt, max_len);
+ break;
+ case QR_CODE:
+ nbgl_serializeQrCode((nbgl_qrcode_t *) obj, out, w_cnt, max_len);
+ break;
+ case KEYBOARD:
+ nbgl_serializeKeyboard((nbgl_keyboard_t *) obj, out, w_cnt, max_len);
+ break;
+ case KEYPAD:
+ nbgl_serializeKeypad((nbgl_keypad_t *) obj, out, w_cnt, max_len);
+ break;
+ case SPINNER:
+ nbgl_serializeSpinner((nbgl_spinner_t *) obj, out, w_cnt, max_len);
+ break;
+ case IMAGE_FILE:
+ nbgl_serializeImageFile((nbgl_image_file_t *) obj, out, w_cnt, max_len);
+ break;
+ default:
+ return NBGL_SERIALIZE_ERROR;
+ }
+ return NBGL_SERIALIZE_OK;
+}
+
+static uint8_t nbgl_serializeRefreshEvent(nbgl_area_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ nbgl_serializeArea(obj, out, w_cnt, max_len);
+ return NBGL_SERIALIZE_OK;
+}
+
+uint8_t nbgl_serializeNbglEvent(nbgl_serialized_event_type_e type,
+ nbgl_obj_t *obj,
+ uint8_t *out,
+ size_t *w_cnt,
+ size_t max_len)
+{
+ // Write type
+ nbgl_appendU8((uint8_t) type, out, w_cnt, max_len);
+
+ // Write content
+ switch (type) {
+ case NBGL_DRAW_OBJ:
+ return nbgl_serializeObject(obj, out, w_cnt, max_len);
+ case NBGL_REFRESH_AREA:
+ return nbgl_serializeRefreshEvent((nbgl_area_t *) obj, out, w_cnt, max_len);
+ default:
+ return NBGL_SERIALIZE_ERROR;
+ }
+
+ return NBGL_SERIALIZE_OK;
+}
diff --git a/sdk_lib_nbgl/src/nbgl_step.c b/sdk_lib_nbgl/src/nbgl_step.c
new file mode 100644
index 00000000..ac96ec37
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_step.c
@@ -0,0 +1,562 @@
+/**
+ * @file nbgl_step.c
+ * @brief Implementation of predefined pages management for Applications
+ */
+
+#ifdef NBGL_STEP
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_debug.h"
+#include "nbgl_step.h"
+#include "glyphs.h"
+#include "os_pic.h"
+#include "os_print.h"
+
+/*********************
+ * DEFINES
+ *********************/
+// string to store the title for a multi-pages text+subtext
+#define TMP_STRING_MAX_LEN 24
+
+///< Maximum number of layers for steps, cannot be greater than max number of layout layers
+#define NB_MAX_LAYERS 3
+
+/**********************
+ * TYPEDEFS
+ **********************/
+/**
+ * type of step
+ */
+typedef enum {
+ TEXT_STEP = 0, ///< for a simple text step
+ CENTERED_INFO_STEP, ///< for a centered info step
+ MENU_LIST_STEP ///< for a menu list step
+} StepStype_t;
+
+/**
+ * definition of context for a @ref TEXT_STEP or @ref CENTERED_INFO_STEP step
+ */
+typedef struct TextContext_s {
+ uint8_t nbPages; ///< number of pages for this text step
+ uint8_t currentPage; ///< current page for this text step
+ const char *txtStart; ///< pointer on the start point of text (first page)
+ const char *nextPageStart; ///< pointer on the start point of text at the next page
+ const char *subTxtStart; ///< pointer on the start point of sub-text (first page)
+ nbgl_stepPosition_t pos; ///< position of the step within a flow (used for navigation arrows)
+ nbgl_stepButtonCallback_t onActionCallback; ///< function called when key actions done on this
+ ///< step (other than internal navigation)
+ char tmpString[TMP_STRING_MAX_LEN]; ///< temporary string used for title when text +
+ ///< multi-pages subText
+ nbgl_centeredInfoStyle_t style; ///< style to be used with a @ref CENTERED_INFO_STEP step
+} TextContext_t;
+
+/**
+ * definition of context for a @ref MENU_LIST_STEP step
+ */
+typedef struct MenuListContext_s {
+ nbgl_stepMenuListCallback_t
+ selectedCallback; ///< function to call when a menu list item is selected
+ nbgl_layoutMenuList_t
+ list; ///< structure to store the number of menu items and the way to select them
+} MenuListContext_t;
+
+typedef struct StepContext_s {
+ union {
+ TextContext_t textContext; ///< if type is @ref TEXT_STEP or @ref CENTERED_INFO_STEP
+ MenuListContext_t menuListContext; ///< if type is @ref MENU_LIST_STEP
+ };
+ nbgl_screenTickerConfiguration_t ticker; ///< structure containing information about ticker
+ nbgl_layout_t *layout; ///< handler of the used layout
+ StepStype_t type; ///< type of step
+ bool modal; ///< true if modal
+} StepContext_t;
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+///< array of step contexts. Index 0 is reserved for background
+static StepContext_t contexts[NB_MAX_LAYERS];
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void actionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event);
+static void menuListActionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event);
+
+// returns a non-used step context from the contexts[] array, or NULL if not found
+static StepContext_t *getFreeContext(StepStype_t type, bool modal)
+{
+ StepContext_t *ctx = NULL;
+
+ if (!modal) {
+ // Index 0 is reserved for background
+ ctx = &contexts[0];
+ }
+ else {
+ uint32_t i = 1;
+ while (i < NB_MAX_LAYERS) {
+ if (contexts[i].layout == NULL) {
+ ctx = &contexts[i];
+ break;
+ }
+ i++;
+ }
+ }
+ if (ctx == NULL) {
+ LOG_FATAL(STEP_LOGGER, "getFreeContext(): no available context\n");
+ }
+ else {
+ memset(ctx, 0, sizeof(StepContext_t));
+ ctx->type = type;
+ ctx->modal = modal;
+ }
+ return ctx;
+}
+
+// returns the step context from the contexts[] array matching with the given layout handler, or
+// NULL if not found
+static StepContext_t *getContextFromLayout(nbgl_layout_t layout)
+{
+ StepContext_t *ctx = NULL;
+ uint32_t i = 0;
+ while (i < NB_MAX_LAYERS) {
+ if (contexts[i].layout == layout) {
+ ctx = &contexts[i];
+ break;
+ }
+ i++;
+ }
+ if (ctx == NULL) {
+ LOG_WARN(STEP_LOGGER, "getContextFromLayout(): no matching context\n");
+ }
+ return ctx;
+}
+
+// from the current details context, return a pointer on the details at the given page
+static const char *getTextPageAt(StepContext_t *ctx, uint8_t textPage)
+{
+ uint8_t page = 0;
+ const char *currentChar = ctx->textContext.txtStart;
+ while (page < textPage) {
+ if (page < (ctx->textContext.nbPages - 1)) {
+ uint16_t len;
+ nbgl_getTextMaxLenInNbLines(BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp,
+ currentChar,
+ AVAILABLE_WIDTH,
+ NB_MAX_LINES,
+ &len,
+ true);
+ currentChar = currentChar + len;
+ }
+ page++;
+ }
+ return currentChar;
+}
+
+// from the current details context, return a pointer on the details at the given page, for subText
+static const char *getSubTextPageAt(StepContext_t *ctx, uint8_t textPage)
+{
+ uint8_t page = 0;
+ const char *currentChar = ctx->textContext.subTxtStart;
+ while (page < textPage) {
+ if (page < (ctx->textContext.nbPages - 1)) {
+ uint16_t len;
+ nbgl_getTextMaxLenInNbLines(BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp,
+ currentChar,
+ AVAILABLE_WIDTH,
+ NB_MAX_LINES - 1,
+ &len,
+ true);
+ currentChar = currentChar + len;
+ }
+ page++;
+ }
+ return currentChar;
+}
+
+// utility function to compute navigation arrows
+static nbgl_layoutNavIndication_t getNavigationInfo(nbgl_stepPosition_t pos,
+ uint8_t nbPages,
+ uint8_t currentPage)
+{
+ nbgl_layoutNavIndication_t indication = NO_ARROWS;
+
+ if (nbPages > 1) {
+ if (currentPage > 0) {
+ indication |= LEFT_ARROW;
+ }
+ if (currentPage < (nbPages - 1)) {
+ indication |= RIGHT_ARROW;
+ }
+ }
+ if (pos == FIRST_STEP) {
+ indication |= RIGHT_ARROW;
+ }
+ else if (pos == LAST_STEP) {
+ indication |= LEFT_ARROW;
+ }
+ else if (pos == NEITHER_FIRST_NOR_LAST_STEP) {
+ indication |= RIGHT_ARROW | LEFT_ARROW;
+ }
+ return indication;
+}
+
+// function used to display the current page in details review mode
+static void displayTextPage(StepContext_t *ctx, uint8_t textPage)
+{
+ const char *txt;
+
+ // if move backward or first page
+ if (textPage <= ctx->textContext.currentPage) {
+ // recompute current start from beginning
+ if (ctx->textContext.subTxtStart == NULL) {
+ txt = getTextPageAt(ctx, textPage);
+ }
+ else {
+ txt = getSubTextPageAt(ctx, textPage);
+ }
+ }
+ // else move forward
+ else {
+ txt = ctx->textContext.nextPageStart;
+ }
+ ctx->textContext.currentPage = textPage;
+
+ if (ctx->textContext.currentPage < (ctx->textContext.nbPages - 1)) {
+ uint16_t len;
+ uint8_t nbLines
+ = (ctx->textContext.subTxtStart == NULL) ? NB_MAX_LINES : (NB_MAX_LINES - 1);
+ nbgl_getTextMaxLenInNbLines(
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, txt, AVAILABLE_WIDTH, nbLines, &len, true);
+ // memorize next position to save processing
+ ctx->textContext.nextPageStart = txt + len;
+ }
+ else {
+ ctx->textContext.nextPageStart = NULL;
+ }
+ nbgl_layoutDescription_t layoutDescription;
+ nbgl_layoutNavigation_t navInfo = {
+ .direction = HORIZONTAL_NAV,
+ };
+
+ layoutDescription.modal = ctx->modal;
+ layoutDescription.onActionCallback = actionCallback;
+ layoutDescription.ticker.tickerCallback = ctx->ticker.tickerCallback;
+ layoutDescription.ticker.tickerIntervale = ctx->ticker.tickerIntervale;
+ layoutDescription.ticker.tickerValue = ctx->ticker.tickerValue;
+ ctx->layout = nbgl_layoutGet(&layoutDescription);
+
+ navInfo.indication = getNavigationInfo(
+ ctx->textContext.pos, ctx->textContext.nbPages, ctx->textContext.currentPage);
+
+ if (ctx->textContext.subTxtStart == NULL) {
+ nbgl_layoutAddText(ctx->layout, txt, NULL, ctx->textContext.style);
+ }
+ else {
+ if (ctx->textContext.nbPages == 1) {
+ nbgl_layoutAddText(ctx->layout, ctx->textContext.txtStart, txt, ctx->textContext.style);
+ }
+ else {
+ SPRINTF(ctx->textContext.tmpString,
+ "%s (%d/%d)",
+ ctx->textContext.txtStart,
+ ctx->textContext.currentPage + 1,
+ ctx->textContext.nbPages);
+ nbgl_layoutAddText(
+ ctx->layout, ctx->textContext.tmpString, txt, ctx->textContext.style);
+ }
+ }
+ if (navInfo.indication != NO_ARROWS) {
+ nbgl_layoutAddNavigation(ctx->layout, &navInfo);
+ }
+ nbgl_layoutDraw(ctx->layout);
+ nbgl_refresh();
+}
+
+// callback on key touch
+static void actionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event)
+{
+ StepContext_t *ctx = getContextFromLayout(layout);
+
+ if (!ctx) {
+ return;
+ }
+ if (event == BUTTON_LEFT_PRESSED) {
+ if (ctx->textContext.currentPage > 0) {
+ displayTextPage(ctx, ctx->textContext.currentPage - 1);
+ return;
+ }
+ else if ((ctx->textContext.pos == LAST_STEP)
+ || (ctx->textContext.pos == NEITHER_FIRST_NOR_LAST_STEP)) {
+ ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
+ }
+ }
+ else if (event == BUTTON_RIGHT_PRESSED) {
+ if (ctx->textContext.currentPage < (ctx->textContext.nbPages - 1)) {
+ displayTextPage(ctx, ctx->textContext.currentPage + 1);
+ return;
+ }
+ else if ((ctx->textContext.pos == FIRST_STEP)
+ || (ctx->textContext.pos == NEITHER_FIRST_NOR_LAST_STEP)) {
+ ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
+ }
+ }
+ else if (event == BUTTON_BOTH_PRESSED) {
+ ctx->textContext.onActionCallback((nbgl_step_t) ctx, event);
+ }
+}
+
+static void displayMenuList(StepContext_t *ctx)
+{
+ nbgl_layoutDescription_t layoutDescription
+ = {.modal = ctx->modal, .onActionCallback = menuListActionCallback};
+ nbgl_layoutMenuList_t *list = &ctx->menuListContext.list;
+
+ layoutDescription.ticker.tickerCallback = ctx->ticker.tickerCallback;
+ layoutDescription.ticker.tickerIntervale = ctx->ticker.tickerIntervale;
+ layoutDescription.ticker.tickerValue = ctx->ticker.tickerValue;
+
+ ctx->layout = nbgl_layoutGet(&layoutDescription);
+ nbgl_layoutAddMenuList(ctx->layout, list);
+ if (list->nbChoices > 1) {
+ nbgl_layoutNavigation_t navInfo = {.direction = VERTICAL_NAV};
+ navInfo.indication = 0;
+ if (list->selectedChoice > 0) {
+ navInfo.indication |= LEFT_ARROW;
+ }
+ if (list->selectedChoice < (list->nbChoices - 1)) {
+ navInfo.indication |= RIGHT_ARROW;
+ }
+
+ if (navInfo.indication != NO_ARROWS) {
+ nbgl_layoutAddNavigation(ctx->layout, &navInfo);
+ }
+ }
+ nbgl_layoutDraw(ctx->layout);
+ nbgl_refresh();
+}
+
+// callback on key touch
+static void menuListActionCallback(nbgl_layout_t *layout, nbgl_buttonEvent_t event)
+{
+ StepContext_t *ctx = getContextFromLayout(layout);
+ if (!ctx) {
+ return;
+ }
+
+ if (event == BUTTON_LEFT_PRESSED) {
+ if (ctx->menuListContext.list.selectedChoice > 0) {
+ ctx->menuListContext.list.selectedChoice--;
+ displayMenuList(ctx);
+ }
+ }
+ else if (event == BUTTON_RIGHT_PRESSED) {
+ if (ctx->menuListContext.list.selectedChoice < (ctx->menuListContext.list.nbChoices - 1)) {
+ ctx->menuListContext.list.selectedChoice++;
+ displayMenuList(ctx);
+ }
+ }
+ else if (event == BUTTON_BOTH_PRESSED) {
+ ctx->menuListContext.selectedCallback(ctx->menuListContext.list.selectedChoice);
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief draws a text type step, that can be multi-pages, depending of the length of text and
+ * subText. The navigation arrows are displayed depending of the given position of this step in a
+ * flow, and depending of the page in case of multi-pages
+ *
+ * @param pos position of this step in the flow (first, last, single, not_first_nor_last)
+ * @param onActionCallback common callback for all actions on this page
+ * @param ticker ticker configuration, set to NULL to disable it
+ * @param text text to display (depending of style)
+ * @param subText text to display under text (depending of style)
+ * @param style style to use for text and subText
+ * @param modal if true, means this step shall be displayed on top of existing one
+ * @return the step context (or NULL if error)
+ */
+nbgl_step_t nbgl_stepDrawText(nbgl_stepPosition_t pos,
+ nbgl_stepButtonCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ const char *text,
+ const char *subText,
+ nbgl_centeredInfoStyle_t style,
+ bool modal)
+{
+ StepContext_t *ctx = getFreeContext(TEXT_STEP, modal);
+ if (!ctx) {
+ return NULL;
+ }
+ // initialize context (already set to 0 by getFreeContext())
+ ctx->textContext.onActionCallback = onActionCallback;
+ if (ticker) {
+ ctx->ticker.tickerCallback = ticker->tickerCallback;
+ ctx->ticker.tickerIntervale = ticker->tickerIntervale;
+ ctx->ticker.tickerValue = ticker->tickerValue;
+ }
+
+ // if no subText, get the number of pages for main text
+ if (subText == NULL) {
+ ctx->textContext.nbPages = nbgl_getTextNbPagesInWidth(
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, text, NB_MAX_LINES, AVAILABLE_WIDTH);
+ }
+ else {
+ // NB_MAX_LINES-1 because first line is for main text
+ ctx->textContext.nbPages = nbgl_getTextNbPagesInWidth(
+ BAGL_FONT_OPEN_SANS_REGULAR_11px_1bpp, subText, NB_MAX_LINES - 1, AVAILABLE_WIDTH);
+ }
+ LOG_DEBUG(STEP_LOGGER,
+ "nbgl_stepDrawText: ctx = %p, nbPages = %d, pos = 0x%X\n",
+ ctx,
+ ctx->textContext.nbPages,
+ pos);
+ if (pos & BACKWARD_DIRECTION) {
+ // start with last page
+ ctx->textContext.currentPage = ctx->textContext.nbPages - 1;
+ }
+ ctx->textContext.txtStart = text;
+ ctx->textContext.subTxtStart = subText;
+ // keep only direction part of position
+ ctx->textContext.pos = pos & (RIGHT_ARROW | LEFT_ARROW);
+ ctx->textContext.style = style;
+ displayTextPage(ctx, ctx->textContext.currentPage);
+
+ return (nbgl_step_t) ctx;
+}
+
+/**
+ * @brief draw a step with a centered info (icon + text). This is always a single page step
+ *
+ * @param pos position of this step in the flow (first, last, single, not_first_nor_last)
+ * @param onActionCallback common callback for all actions on this page
+ * @param ticker ticker configuration, set to NULL to disable it
+ * @param info all information about the cenetered info to be displayed
+ * @param modal if true, means this step shall be displayed on top of existing one
+ * @return the step context (or NULL if error)
+ */
+nbgl_step_t nbgl_stepDrawCenteredInfo(nbgl_stepPosition_t pos,
+ nbgl_stepButtonCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_layoutCenteredInfo_t *info,
+ bool modal)
+{
+ nbgl_layoutDescription_t layoutDescription
+ = {.modal = modal, .onActionCallback = (nbgl_layoutButtonCallback_t) actionCallback};
+ nbgl_layoutNavigation_t navInfo = {
+ .direction = HORIZONTAL_NAV,
+ };
+ StepContext_t *ctx = getFreeContext(CENTERED_INFO_STEP, modal);
+ if (!ctx) {
+ return NULL;
+ }
+
+ // initialize context (already set to 0 by getFreeContext())
+ ctx->textContext.onActionCallback = onActionCallback;
+ if (ticker) {
+ ctx->ticker.tickerCallback = ticker->tickerCallback;
+ ctx->ticker.tickerIntervale = ticker->tickerIntervale;
+ ctx->ticker.tickerValue = ticker->tickerValue;
+ }
+
+ ctx->textContext.nbPages = 1;
+ // keep only direction part of position
+ ctx->textContext.pos = pos & (RIGHT_ARROW | LEFT_ARROW);
+ navInfo.indication = getNavigationInfo(
+ ctx->textContext.pos, ctx->textContext.nbPages, ctx->textContext.currentPage);
+
+ ctx->layout = nbgl_layoutGet(&layoutDescription);
+ nbgl_layoutAddCenteredInfo(ctx->layout, info);
+ if (navInfo.indication != NO_ARROWS) {
+ nbgl_layoutAddNavigation(ctx->layout, &navInfo);
+ }
+ nbgl_layoutDraw(ctx->layout);
+ nbgl_refresh();
+
+ LOG_DEBUG(STEP_LOGGER, "nbgl_stepDrawCenteredInfo(): step = %p\n", ctx);
+ return (nbgl_step_t) ctx;
+}
+
+/**
+ * @brief draw a step page with a menu list and navigation arrows to parse it. This step must be
+ * alone
+ *
+ * @param onActionCallback common callback for all actions on this page
+ * @param ticker ticker configuration, set to NULL to disable it
+ * @param list configuration of the menu list
+ * @param modal if true, means this step shall be displayed on top of existing one
+ * @return the step context (or NULL if error)
+ */
+nbgl_step_t nbgl_stepDrawMenuList(nbgl_stepMenuListCallback_t onActionCallback,
+ nbgl_screenTickerConfiguration_t *ticker,
+ nbgl_layoutMenuList_t *list,
+ bool modal)
+{
+ StepContext_t *ctx = getFreeContext(MENU_LIST_STEP, modal);
+ if (!ctx) {
+ return NULL;
+ }
+
+ // initialize context (already set to 0 by getFreeContext())
+ if (ticker) {
+ ctx->ticker.tickerCallback = ticker->tickerCallback;
+ ctx->ticker.tickerIntervale = ticker->tickerIntervale;
+ ctx->ticker.tickerValue = ticker->tickerValue;
+ }
+
+ ctx->menuListContext.list.nbChoices = list->nbChoices;
+ ctx->menuListContext.list.selectedChoice = list->selectedChoice;
+ ctx->menuListContext.list.callback = list->callback;
+ ctx->menuListContext.selectedCallback = onActionCallback;
+
+ displayMenuList(ctx);
+
+ LOG_DEBUG(STEP_LOGGER, "nbgl_stepDrawMenuList(): step = %p\n", ctx);
+
+ return (nbgl_step_t) ctx;
+}
+
+/**
+ * @brief Get the index of the currently selected item in the menulist
+ *
+ * @param step step from which to get the current menulist choice
+ * @return current menulist choice
+ */
+uint8_t nbgl_stepGetMenuListCurrent(nbgl_step_t step)
+{
+ StepContext_t *ctx = (StepContext_t *) step;
+ if (!ctx) {
+ return 0;
+ }
+ return (ctx->menuListContext.list.selectedChoice);
+}
+
+/**
+ * @brief Release the step obtained with any of the nbgl_stepDrawXXX() functions
+ *
+ * @param step step to release
+ * @return >= 0 if OK
+ */
+int nbgl_stepRelease(nbgl_step_t step)
+{
+ StepContext_t *ctx = (StepContext_t *) step;
+ int ret;
+
+ LOG_DEBUG(STEP_LOGGER, "nbgl_stepRelease(): ctx = %p\n", ctx);
+ if (!ctx) {
+ return -1;
+ }
+ ret = nbgl_layoutRelease((nbgl_layout_t *) ctx->layout);
+
+ ctx->layout = NULL;
+
+ return ret;
+}
+
+#endif // NBGL_STEP
diff --git a/sdk_lib_nbgl/src/nbgl_touch.c b/sdk_lib_nbgl/src/nbgl_touch.c
new file mode 100644
index 00000000..5a498bdf
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_touch.c
@@ -0,0 +1,285 @@
+/**
+ * @file nbgl_touch.c
+ * Implementation of touchscreen management in new BAGL
+ */
+
+#ifdef HAVE_SE_TOUCH
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include "nbgl_obj.h"
+#include "nbgl_debug.h"
+#include "nbgl_touch.h"
+#include "nbgl_screen.h"
+#include "os_pic.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+static uint32_t lastPressedTime = 0;
+static uint32_t lastCurrentTime = 0;
+static nbgl_obj_t *lastPressedObj = NULL;
+static nbgl_touchStatePosition_t firstTouchedPosition, lastTouchedPosition;
+
+/**********************
+ * VARIABLES
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**
+ * @brief This function applies the touch event of given type on the given graphic object
+ *
+ * @param obj object on which the event is applied
+ * @param eventType type of touchscreen event
+ */
+static void applytouchStatePosition(nbgl_obj_t *obj, nbgl_touchType_t eventType)
+{
+ nbgl_screen_t *screen = (nbgl_screen_t *) nbgl_screenGetTop();
+ LOG_DEBUG(TOUCH_LOGGER, "Apply event %d on object of type %d\n", eventType, obj->type);
+ if (!obj) {
+ return;
+ }
+ /* the first action is the one provided by the application */
+ if ((obj->touchMask & (1 << eventType)) != 0) {
+ // for some specific objects, call directly a specific callback
+ switch (obj->type) {
+#ifdef NBGL_KEYBOARD
+ case KEYBOARD:
+ nbgl_keyboardTouchCallback(obj, eventType);
+ break;
+#endif // NBGL_KEYBOARD
+#ifdef NBGL_KEYPAD
+ case KEYPAD:
+ nbgl_keypadTouchCallback(obj, eventType);
+ break;
+#endif // NBGL_KEYPAD
+ default:
+ if (screen->touchCallback != NULL) {
+ ((nbgl_touchCallback_t) PIC(screen->touchCallback))((void *) obj, eventType);
+ }
+ break;
+ }
+ }
+}
+
+/**
+ * @brief if the given obj contains the coordinates of the given event, parse
+ * all its children with the same criterion.
+ * If no children or none concerned, check whether this object can process the event or not
+ *
+ * @param obj
+ * @param event
+ * @return the concerned object or NULL if not found
+ */
+static nbgl_obj_t *getTouchedObject(nbgl_obj_t *obj, nbgl_touchStatePosition_t *event)
+{
+ if (obj == NULL) {
+ return NULL;
+ }
+ /* check coordinates
+ no need to go further if the touched point is not within the object
+ And because the children are also within the object, no need to check them either */
+ if ((event->x < obj->area.x0) || (event->x >= (obj->area.x0 + obj->area.width))
+ || (event->y < obj->area.y0) || (event->y >= (obj->area.y0 + obj->area.height))) {
+ return NULL;
+ }
+ if ((obj->type == SCREEN) || (obj->type == CONTAINER)) {
+ nbgl_container_t *container = (nbgl_container_t *) obj;
+ // parse the children, if any
+ if (container->children != NULL) {
+ uint8_t i;
+ for (i = 0; i < container->nbChildren; i++) {
+ nbgl_obj_t *current = container->children[i];
+ if (current != NULL) {
+ current = getTouchedObject(current, event);
+ if (current != NULL) {
+ return current;
+ }
+ }
+ }
+ }
+ }
+ /* now see if the object is interested by touch events (any of them) */
+ if (obj->touchMask != 0) {
+ // LOG_DEBUG(TOUCH_LOGGER,"%d %d \n",clickableObjectTypes ,(1<type));
+ return obj;
+ }
+ else {
+ return NULL;
+ }
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief Function to be called periodically to check touchscreen state
+ * and coordinates
+ * @param touchStatePosition state and position read from touch screen
+ * @param currentTime current time in ms
+ */
+void nbgl_touchHandler(nbgl_touchStatePosition_t *touchStatePosition, uint32_t currentTime)
+{
+ static nbgl_touchState_t lastState = RELEASED;
+ nbgl_obj_t *foundObj;
+
+ // save last received currentTime
+ lastCurrentTime = currentTime;
+
+ if (lastState == RELEASED) {
+ // filter out not realistic cases (successive RELEASE events)
+ if (RELEASED == touchStatePosition->state) {
+ lastState = touchStatePosition->state;
+ return;
+ }
+ // memorize first touched position
+ memcpy(&firstTouchedPosition, touchStatePosition, sizeof(nbgl_touchStatePosition_t));
+ }
+ // LOG_DEBUG(TOUCH_LOGGER,"state = %s, x = %d, y=%d\n",(touchStatePosition->state ==
+ // RELEASED)?"RELEASED":"PRESSED",touchStatePosition->x,touchStatePosition->y);
+
+ // parse the whole screen to find proper object
+ foundObj = getTouchedObject(nbgl_screenGetTop(), touchStatePosition);
+
+ // LOG_DEBUG(TOUCH_LOGGER,"nbgl_touchHandler: found obj %p, type = %d\n",foundObj,
+ // foundObj->type);
+ if (foundObj == NULL) {
+ LOG_DEBUG(TOUCH_LOGGER, "nbgl_touchHandler: no found obj\n");
+ if ((touchStatePosition->state == PRESSED) && (lastState == PRESSED)
+ && (lastPressedObj != NULL)) {
+ // finger has moved out of an object
+ // make sure lastPressedObj still belongs to current screen before warning it
+ if (nbgl_screenContainsObj(lastPressedObj)) {
+ applytouchStatePosition(lastPressedObj, OUT_OF_TOUCH);
+ }
+ }
+ // Released event has been handled, forget lastPressedObj
+ lastPressedObj = NULL;
+ lastState = touchStatePosition->state;
+ return;
+ }
+
+ // memorize last touched position
+ memcpy(&lastTouchedPosition, touchStatePosition, sizeof(nbgl_touchStatePosition_t));
+
+ if (touchStatePosition->state == RELEASED) {
+ // very strange if lastPressedObj != foundObj, let's consider that it's a normal release on
+ // lastPressedObj make sure lastPressedObj still belongs to current screen before
+ // "releasing" it
+ if ((lastPressedObj != NULL)
+ && ((foundObj == lastPressedObj) || (nbgl_screenContainsObj(lastPressedObj)))) {
+ applytouchStatePosition(lastPressedObj, TOUCH_RELEASED);
+ if (currentTime >= (lastPressedTime + LONG_TOUCH_DURATION)) {
+ applytouchStatePosition(lastPressedObj, LONG_TOUCHED);
+ }
+ else if (currentTime >= (lastPressedTime + SHORT_TOUCH_DURATION)) {
+ applytouchStatePosition(lastPressedObj, TOUCHED);
+ }
+ }
+ // Released event has been handled, forget lastPressedObj
+ lastPressedObj = NULL;
+ }
+ else { // PRESSED
+ if ((lastState == PRESSED) && (lastPressedObj != NULL)) {
+ if (foundObj != lastPressedObj) {
+ // finger has moved out of an object
+ // make sure lastPressedObj still belongs to current screen before warning it
+ if (nbgl_screenContainsObj(lastPressedObj)) {
+ applytouchStatePosition(lastPressedObj, OUT_OF_TOUCH);
+ }
+ lastPressedObj = NULL;
+ }
+ else {
+ // warn the concerned object that it is still touched
+ applytouchStatePosition(foundObj, TOUCHING);
+ }
+ }
+ else if (lastState == RELEASED) {
+ // newly touched object
+ lastPressedObj = foundObj;
+ lastPressedTime = currentTime;
+ applytouchStatePosition(foundObj, TOUCH_PRESSED);
+ applytouchStatePosition(foundObj, TOUCHING);
+ }
+ }
+
+ lastState = touchStatePosition->state;
+}
+
+bool nbgl_touchGetTouchedPosition(nbgl_obj_t *obj,
+ nbgl_touchStatePosition_t **firstPos,
+ nbgl_touchStatePosition_t **lastPos)
+{
+ LOG_DEBUG(TOUCH_LOGGER, "nbgl_touchGetTouchedPosition: %p %p\n", obj, lastPressedObj);
+ if (obj == lastPressedObj) {
+ *firstPos = &firstTouchedPosition;
+ *lastPos = &lastTouchedPosition;
+ return true;
+ }
+ return false;
+}
+
+uint32_t nbgl_touchGetTouchDuration(nbgl_obj_t *obj)
+{
+ if (obj == lastPressedObj) {
+ return (lastCurrentTime - lastPressedTime);
+ }
+ return 0;
+}
+
+/**
+ * @brief parse all the children of the given object, recursively, until an object with the given
+ * touch if is found.
+ *
+ * @param obj parent of the touched object
+ * @param id id of the touched object to find
+ * @return the concerned object or NULL if not found
+ */
+nbgl_obj_t *nbgl_touchGetObjectFromId(nbgl_obj_t *obj, uint8_t id)
+{
+ if (obj == NULL) {
+ return NULL;
+ }
+ if ((obj->type == SCREEN) || (obj->type == CONTAINER)) {
+ nbgl_container_t *container = (nbgl_container_t *) obj;
+ // parse the children, if any
+ if (container->children != NULL) {
+ uint8_t i;
+ for (i = 0; i < container->nbChildren; i++) {
+ nbgl_obj_t *current = container->children[i];
+ if (current != NULL) {
+ current = nbgl_touchGetObjectFromId(current, id);
+ if (current != NULL) {
+ return current;
+ }
+ }
+ }
+ }
+ }
+ /* now see if the object is interested by touch events (any of them) */
+ if ((obj->touchMask != 0) && (obj->touchId == id)) {
+ LOG_DEBUG(TOUCH_LOGGER, "found %p: id = %d, type = %d \n", obj, obj->touchId, obj->type);
+ return obj;
+ }
+ else {
+ return NULL;
+ }
+}
+#endif // HAVE_SE_TOUCH
diff --git a/sdk_lib_nbgl/src/nbgl_use_case.c b/sdk_lib_nbgl/src/nbgl_use_case.c
new file mode 100644
index 00000000..5f58eacd
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_use_case.c
@@ -0,0 +1,1530 @@
+/**
+ * @file nbgl_use_case.c
+ * @brief Implementation of typical pages (or sets of pages) for Applications
+ */
+
+#ifdef NBGL_USE_CASE
+#ifdef HAVE_SE_TOUCH
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include
+#include "nbgl_debug.h"
+#include "nbgl_use_case.h"
+#include "glyphs.h"
+#include "os_pic.h"
+#include "os_helpers.h"
+
+/*********************
+ * DEFINES
+ *********************/
+/**********************
+ * TYPEDEFS
+ **********************/
+enum {
+ BACK_TOKEN = 0,
+ NEXT_TOKEN,
+ QUIT_TOKEN,
+ NAV_TOKEN,
+ SKIP_TOKEN,
+ CONTINUE_TOKEN,
+ BUTTON_TOKEN,
+ ACTION_BUTTON_TOKEN,
+ CHOICE_TOKEN,
+ DETAILS_BUTTON_TOKEN,
+ CONFIRM_TOKEN,
+ REJECT_TOKEN,
+ ADDR_BACK_TOKEN,
+ ADDR_NEXT_TOKEN
+};
+
+typedef struct DetailsContext_s {
+ uint8_t nbPages;
+ uint8_t currentPage;
+ bool wrapping;
+ const char *tag;
+ const char *value;
+ const char *nextPageStart;
+} DetailsContext_t;
+
+typedef struct StaticReviewContext_s {
+ nbgl_layoutTagValueList_t tagValueList;
+ bool withLongPress;
+ nbgl_pageInfoLongPress_t infoLongPress;
+ uint8_t currentPairIndex;
+ uint8_t nbPairsInCurrentPage;
+} StaticReviewContext_t;
+
+typedef struct AddressConfirmationContext_s {
+ const char *address;
+ nbgl_layout_t modalLayout;
+ const nbgl_layoutTagValueList_t *tagValueList;
+} AddressConfirmationContext_t;
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+// char buffers to build some strings
+static char appDescription[APP_DESCRIPTION_MAX_LEN];
+static char plugInDescription[APP_DESCRIPTION_MAX_LEN];
+
+// multi-purposes callbacks
+static nbgl_callback_t onQuit;
+static nbgl_callback_t onContinue;
+static nbgl_callback_t onAction;
+static nbgl_navCallback_t onNav;
+static nbgl_layoutTouchCallback_t onControls;
+static nbgl_choiceCallback_t onChoice;
+static nbgl_callback_t onModalConfirm;
+
+// contexts for background and modal pages
+static nbgl_page_t *pageContext;
+static nbgl_page_t *modalPageContext;
+
+// context for settings pages
+static const char *settingsTitle;
+static bool touchableTitle;
+
+// context for navigation use case
+static nbgl_pageNavigationInfo_t navInfo;
+static bool forwardNavOnly;
+
+static DetailsContext_t detailsContext;
+
+static StaticReviewContext_t staticReviewContext;
+
+static AddressConfirmationContext_t addressConfirmationContext;
+
+// buffer of bits to store all numbers of tag/value pairs per page in static review
+// this number is from 1 to 4, so we can use 2 bits per page
+// there are up to 256 pages, so a buffer of 256/4 bytes is enough
+static uint8_t nbPairsPerPage[64];
+// same for too long to fit but with only one bit per page
+static uint8_t tooLongToFitPerPage[32];
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+static void displayReviewPage(uint8_t page, bool forceFullRefresh);
+static void displayDetailsPage(uint8_t page, bool forceFullRefresh);
+static void displaySettingsPage(uint8_t page, bool forceFullRefresh);
+static void displayStaticReviewPage(uint8_t page, bool forceFullRefresh);
+static void pageCallback(int token, uint8_t index);
+#ifdef NBGL_QRCODE
+static void addressLayoutTouchCallbackQR(int token, uint8_t index);
+#endif // NBGL_QRCODE
+static void displayAddressPage(uint8_t page, bool forceFullRefresh);
+static void displaySkipWarning(void);
+static uint8_t getNbPairs(uint8_t page, bool *tooLongToFit);
+
+static void reset_callbacks(void)
+{
+ onQuit = NULL;
+ onContinue = NULL;
+ onAction = NULL;
+ onNav = NULL;
+ onControls = NULL;
+ onChoice = NULL;
+ onModalConfirm = NULL;
+}
+
+// function called when navigating (or exiting) modal details pages
+// or when skip choice is displayed
+static void pageModalCallback(int token, uint8_t index)
+{
+ nbgl_pageRelease(modalPageContext);
+ modalPageContext = NULL;
+ if (token == NAV_TOKEN) {
+ if (index == EXIT_PAGE) {
+ // redraw the background layer
+ nbgl_screenRedraw();
+ nbgl_refresh();
+ }
+ else {
+ displayDetailsPage(index, false);
+ }
+ }
+ else if (token == SKIP_TOKEN) {
+ if (index == 0) {
+ // display the last forward only review page, whatever it is
+ displayReviewPage(LAST_PAGE_FOR_REVIEW, true);
+ }
+ else {
+ // display background, which should be the page where skip has been touched
+ nbgl_screenRedraw();
+ nbgl_refresh();
+ }
+ }
+ else if (token == CHOICE_TOKEN) {
+ if (index == 0) {
+ onModalConfirm();
+ }
+ else {
+ // display background, which should be the page where skip has been touched
+ nbgl_screenRedraw();
+ nbgl_refresh();
+ }
+ }
+}
+
+// generic callback for all pages except modal
+static void pageCallback(int token, uint8_t index)
+{
+ if (token == QUIT_TOKEN) {
+ if (onQuit != NULL) {
+ onQuit();
+ }
+ }
+ else if (token == CONTINUE_TOKEN) {
+ if (onContinue != NULL) {
+ onContinue();
+ }
+ }
+ else if (token == CHOICE_TOKEN) {
+ if (onChoice != NULL) {
+ onChoice((index == 0) ? true : false);
+ }
+ }
+ else if (token == ACTION_BUTTON_TOKEN) {
+ if ((index == 0) && (onAction != NULL)) {
+ onAction();
+ }
+ else if ((index == 1) && (onQuit != NULL)) {
+ onQuit();
+ }
+ }
+ else if (token == BUTTON_TOKEN) {
+#ifdef NBGL_QRCODE
+ // display the address as QR Code
+ nbgl_layoutDescription_t layoutDescription
+ = {.modal = true,
+ .withLeftBorder = true,
+ .onActionCallback = &addressLayoutTouchCallbackQR,
+ .tapActionText = NULL};
+
+ addressConfirmationContext.modalLayout = nbgl_layoutGet(&layoutDescription);
+ nbgl_layoutQRCode_t qrCode = {
+ .url = addressConfirmationContext.address,
+ .text1 = NULL,
+ .text2 = addressConfirmationContext.address // display as gray text
+ };
+ nbgl_layoutAddQRCode(addressConfirmationContext.modalLayout, &qrCode);
+
+ nbgl_layoutAddBottomButton(
+ addressConfirmationContext.modalLayout, &C_cross32px, 0, true, TUNE_TAP_CASUAL);
+ nbgl_layoutDraw(addressConfirmationContext.modalLayout);
+ nbgl_refresh();
+#endif // NBGL_QRCODE
+ }
+ else if (token == CONFIRM_TOKEN) {
+ if (onChoice != NULL) {
+ onChoice(true);
+ }
+ }
+ else if (token == REJECT_TOKEN) {
+ if (onChoice != NULL) {
+ onChoice(false);
+ }
+ }
+ else if (token == DETAILS_BUTTON_TOKEN) {
+ const nbgl_layoutTagValue_t *pair;
+ if (staticReviewContext.tagValueList.pairs != NULL) {
+ pair = &staticReviewContext.tagValueList.pairs[staticReviewContext.currentPairIndex];
+ }
+ else {
+ pair = staticReviewContext.tagValueList.callback(staticReviewContext.currentPairIndex);
+ }
+ nbgl_useCaseViewDetails(pair->item, pair->value, staticReviewContext.tagValueList.wrapping);
+ }
+ else if (token == NAV_TOKEN) {
+ if (index == EXIT_PAGE) {
+ if (onQuit != NULL) {
+ onQuit();
+ }
+ }
+ else {
+ displaySettingsPage(index, false);
+ }
+ }
+ else if (token == NEXT_TOKEN) {
+ if (onNav != NULL) {
+ displayReviewPage(navInfo.activePage + 1, false);
+ }
+ else {
+ displayStaticReviewPage(navInfo.activePage + 1, false);
+ }
+ }
+ else if (token == BACK_TOKEN) {
+ if (onNav != NULL) {
+ displayReviewPage(navInfo.activePage - 1, true);
+ }
+ else {
+ displayStaticReviewPage(navInfo.activePage - 1, true);
+ }
+ }
+ else if (token == SKIP_TOKEN) {
+ // display a modal warning to confirm skip
+ displaySkipWarning();
+ }
+ else if (token == ADDR_BACK_TOKEN) {
+ displayAddressPage(navInfo.activePage - 1, true);
+ }
+ else if (token == ADDR_NEXT_TOKEN) {
+ displayAddressPage(navInfo.activePage + 1, false);
+ }
+ else { // probably a control provided by caller
+ if (onControls != NULL) {
+ onControls(token, index);
+ }
+ }
+}
+
+// callback used for confirmation
+static void tickerCallback(void)
+{
+ nbgl_pageRelease(pageContext);
+ if (onQuit != NULL) {
+ onQuit();
+ }
+}
+
+// function used to display the current page in review
+static void displaySettingsPage(uint8_t page, bool forceFullRefresh)
+{
+ nbgl_pageContent_t content = {0};
+
+ if ((onNav == NULL) || (onNav(page, &content) == false)) {
+ return;
+ }
+
+ // override some fields
+ content.title = settingsTitle;
+ content.isTouchableTitle = touchableTitle;
+ content.titleToken = QUIT_TOKEN;
+ content.tuneId = TUNE_TAP_CASUAL;
+
+ navInfo.activePage = page;
+ pageContext = nbgl_pageDrawGenericContent(&pageCallback, &navInfo, &content);
+
+ if (forceFullRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+ }
+ else {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+}
+
+// function used to display the current page in review
+static void displayReviewPage(uint8_t page, bool forceFullRefresh)
+{
+ nbgl_pageContent_t content = {0};
+
+ // ensure the page is valid
+ if ((navInfo.nbPages != 0) && (page >= (navInfo.nbPages))) {
+ return;
+ }
+ navInfo.activePage = page;
+ if ((onNav == NULL) || (onNav(navInfo.activePage, &content) == false)) {
+ return;
+ }
+
+ // override some fields
+ content.title = NULL;
+ content.isTouchableTitle = false;
+ content.tuneId = TUNE_TAP_CASUAL;
+
+ if (!forwardNavOnly) {
+ navInfo.navWithTap.backButton = (navInfo.activePage == 0) ? false : true;
+ }
+
+ if (content.type == INFO_LONG_PRESS) { // last page
+ navInfo.navWithTap.nextPageText = NULL;
+ content.infoLongPress.longPressToken = CONFIRM_TOKEN;
+ if (forwardNavOnly) {
+ // remove the "Skip" button in Footer
+ navInfo.navWithTap.skipText = NULL;
+ }
+ }
+ else {
+ navInfo.navWithTap.nextPageText = "Tap to continue";
+ }
+
+ // override smallCaseForValue for tag/value types to false
+ if (content.type == TAG_VALUE_DETAILS) {
+ content.tagValueDetails.tagValueList.smallCaseForValue = false;
+ // the maximum displayable number of lines for value is NB_MAX_LINES_IN_REVIEW (without More
+ // button)
+ content.tagValueDetails.tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW;
+ }
+ else if (content.type == TAG_VALUE_LIST) {
+ content.tagValueList.smallCaseForValue = false;
+ }
+ else if (content.type == TAG_VALUE_CONFIRM) {
+ content.tagValueConfirm.tagValueList.smallCaseForValue = false;
+ // no next because confirmation is always the last page
+ navInfo.navWithTap.nextPageText = NULL;
+ // use confirm token for black button
+ content.tagValueConfirm.confirmationToken = CONFIRM_TOKEN;
+ }
+
+ pageContext = nbgl_pageDrawGenericContent(&pageCallback, &navInfo, &content);
+
+ if (forceFullRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+ }
+ else {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+}
+
+// function used to display the current page in static review (no call to user to get content)
+static void displayStaticReviewPage(uint8_t page, bool forceFullRefresh)
+{
+ nbgl_pageContent_t content;
+
+ // if it's the last page, display a long press button (or a simple button) with the info
+ // provided by user (except token)
+ if (page == (navInfo.nbPages - 1)) {
+ if (staticReviewContext.withLongPress) {
+ content.type = INFO_LONG_PRESS;
+ content.infoLongPress.icon = staticReviewContext.infoLongPress.icon;
+ content.infoLongPress.longPressText = staticReviewContext.infoLongPress.longPressText;
+ content.infoLongPress.text = staticReviewContext.infoLongPress.text;
+ content.infoLongPress.longPressToken = CONFIRM_TOKEN;
+ content.tuneId = TUNE_TAP_CASUAL;
+ }
+ else {
+ // simple button
+ content.type = INFO_BUTTON;
+ content.infoButton.icon = staticReviewContext.infoLongPress.icon;
+ content.infoButton.buttonText = staticReviewContext.infoLongPress.longPressText;
+ content.infoButton.text = staticReviewContext.infoLongPress.text;
+ content.infoButton.buttonToken = CONFIRM_TOKEN;
+ content.tuneId = TUNE_TAP_CASUAL;
+ }
+ }
+ else {
+ bool tooLongToFit;
+
+ if (page > navInfo.activePage) { // forward, so add to current index the number of pairs of
+ // the previous page
+ staticReviewContext.currentPairIndex += staticReviewContext.nbPairsInCurrentPage;
+ }
+ staticReviewContext.nbPairsInCurrentPage = getNbPairs(page, &tooLongToFit);
+ // if the page is not the last tag/value or when going forward, adapt index
+ if ((page != (navInfo.nbPages - 2)) && (page < navInfo.activePage)) { // backward
+ staticReviewContext.currentPairIndex -= staticReviewContext.nbPairsInCurrentPage;
+ }
+ // if the pair is too long to fit, we use a TAG_VALUE_DETAILS content
+ if (tooLongToFit) {
+ content.type = TAG_VALUE_DETAILS;
+ content.tagValueDetails.detailsButtonText = "More";
+ content.tagValueDetails.detailsButtonIcon = NULL;
+ content.tagValueDetails.detailsButtonToken = DETAILS_BUTTON_TOKEN;
+ content.tagValueDetails.tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW;
+ content.tagValueDetails.tagValueList.nbPairs = 1;
+ if (staticReviewContext.tagValueList.pairs != NULL) {
+ content.tagValueDetails.tagValueList.pairs
+ = &staticReviewContext.tagValueList.pairs[staticReviewContext.currentPairIndex];
+ }
+ else {
+ content.tagValueDetails.tagValueList.pairs
+ = staticReviewContext.tagValueList.callback(
+ staticReviewContext.currentPairIndex);
+ }
+ content.tagValueDetails.tagValueList.smallCaseForValue = false;
+ content.tagValueDetails.tagValueList.wrapping
+ = staticReviewContext.tagValueList.wrapping;
+ }
+ else {
+ content.type = TAG_VALUE_LIST;
+ content.tagValueList.nbPairs = staticReviewContext.nbPairsInCurrentPage;
+ if (staticReviewContext.tagValueList.pairs != NULL) {
+ content.tagValueList.pairs
+ = &staticReviewContext.tagValueList.pairs[staticReviewContext.currentPairIndex];
+ }
+ else {
+ content.tagValueList.pairs = NULL;
+ content.tagValueList.callback = staticReviewContext.tagValueList.callback;
+ content.tagValueList.startIndex = staticReviewContext.currentPairIndex;
+ }
+ content.tagValueList.smallCaseForValue = false;
+ content.tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_REVIEW;
+ content.tagValueList.wrapping = staticReviewContext.tagValueList.wrapping;
+ }
+ content.tuneId = TUNE_TAP_CASUAL;
+ }
+ navInfo.activePage = page;
+
+ // common fields
+ content.title = NULL;
+ content.isTouchableTitle = false;
+
+ navInfo.navWithTap.backButton = (navInfo.activePage == 0) ? false : true;
+
+ if (navInfo.activePage == (navInfo.nbPages - 1)) {
+ navInfo.navWithTap.nextPageText = NULL;
+ }
+ else {
+ navInfo.navWithTap.nextPageText = "Tap to continue";
+ }
+
+ pageContext = nbgl_pageDrawGenericContent(&pageCallback, &navInfo, &content);
+
+ if (forceFullRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+ }
+ else {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+}
+
+// from the current details context, return a pointer on the details at the given page
+static const char *getDetailsPageAt(uint8_t detailsPage)
+{
+ uint8_t page = 0;
+ const char *currentChar = detailsContext.value;
+ while (page < detailsPage) {
+ uint16_t nbLines = nbgl_getTextNbLinesInWidth(
+ SMALL_REGULAR_FONT, currentChar, SCREEN_WIDTH - 2 * BORDER_MARGIN, false);
+ if (nbLines > NB_MAX_LINES_IN_DETAILS) {
+ uint16_t len;
+ nbgl_getTextMaxLenInNbLines(SMALL_REGULAR_FONT,
+ currentChar,
+ SCREEN_WIDTH - 2 * BORDER_MARGIN,
+ NB_MAX_LINES_IN_DETAILS,
+ &len,
+ false);
+ len -= 3;
+ currentChar = currentChar + len;
+ }
+ page++;
+ }
+ return currentChar;
+}
+
+// function used to display the current page in details review mode
+static void displayDetailsPage(uint8_t detailsPage, bool forceFullRefresh)
+{
+ static nbgl_layoutTagValue_t currentPair;
+ nbgl_pageNavigationInfo_t info = {.activePage = detailsPage,
+ .nbPages = detailsContext.nbPages,
+ .navType = NAV_WITH_BUTTONS,
+ .navWithButtons.navToken = NAV_TOKEN,
+ .navWithButtons.quitButton = true,
+ .progressIndicator = true,
+ .tuneId = TUNE_TAP_CASUAL};
+ nbgl_pageContent_t content = {.type = TAG_VALUE_LIST,
+ .tagValueList.nbPairs = 1,
+ .tagValueList.pairs = ¤tPair,
+ .tagValueList.smallCaseForValue = true,
+ .tagValueList.wrapping = detailsContext.wrapping};
+
+ if (modalPageContext != NULL) {
+ nbgl_pageRelease(modalPageContext);
+ }
+ currentPair.item = detailsContext.tag;
+ // if move backward or first page
+ if (detailsPage <= detailsContext.currentPage) {
+ // recompute current start from beginning
+ currentPair.value = getDetailsPageAt(detailsPage);
+ forceFullRefresh = true;
+ }
+ // else move forward
+ else {
+ currentPair.value = detailsContext.nextPageStart;
+ }
+ detailsContext.currentPage = detailsPage;
+ uint16_t nbLines = nbgl_getTextNbLinesInWidth(
+ SMALL_REGULAR_FONT, currentPair.value, SCREEN_WIDTH - 2 * BORDER_MARGIN, false);
+
+ if (nbLines > NB_MAX_LINES_IN_DETAILS) {
+ uint16_t len;
+ nbgl_getTextMaxLenInNbLines(SMALL_REGULAR_FONT,
+ currentPair.value,
+ SCREEN_WIDTH - 2 * BORDER_MARGIN,
+ NB_MAX_LINES_IN_DETAILS,
+ &len,
+ false);
+ len -= 3;
+ // memorize next position to save processing
+ detailsContext.nextPageStart = currentPair.value + len;
+ // use special feature to keep only NB_MAX_LINES_IN_DETAILS lines and replace the last 3
+ // chars by "..."
+ content.tagValueList.nbMaxLinesForValue = NB_MAX_LINES_IN_DETAILS;
+ }
+ else {
+ detailsContext.nextPageStart = NULL;
+ content.tagValueList.nbMaxLinesForValue = 0;
+ }
+ modalPageContext = nbgl_pageDrawGenericContentExt(&pageModalCallback, &info, &content, true);
+
+ if (forceFullRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+ }
+ else {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+}
+
+#ifdef NBGL_QRCODE
+// called when quit button is touched on Address verification page
+static void addressLayoutTouchCallbackQR(int token, uint8_t index)
+{
+ UNUSED(token);
+ UNUSED(index);
+
+ // dismiss modal
+ nbgl_layoutRelease(addressConfirmationContext.modalLayout);
+ nbgl_screenRedraw();
+ nbgl_refresh();
+}
+#endif // NBGL_QRCODE
+
+// called when navigation is touched on Address verification page
+static void displayAddressPage(uint8_t page, bool forceFullRefresh)
+{
+ nbgl_pageContent_t content;
+ nbgl_layoutTagValue_t tagValuePair
+ = {.item = "Address", .value = addressConfirmationContext.address};
+
+ content.type = TAG_VALUE_CONFIRM;
+ content.title = NULL;
+ content.isTouchableTitle = false;
+ if (page == 0) {
+#ifdef NBGL_QRCODE
+ content.tagValueConfirm.detailsButtonIcon = &C_QRcode32px;
+ content.tagValueConfirm.detailsButtonText = "Show as QR";
+ content.tagValueConfirm.detailsButtonToken = BUTTON_TOKEN;
+#else // NBGL_QRCODE
+ content.tagValueConfirm.detailsButtonText = NULL;
+ content.tagValueConfirm.detailsButtonIcon = NULL;
+#endif // NBGL_QRCODE
+ content.tagValueConfirm.tuneId = TUNE_TAP_CASUAL;
+ content.tagValueConfirm.tagValueList.nbPairs = 1;
+ content.tagValueConfirm.tagValueList.pairs = &tagValuePair;
+ content.tagValueConfirm.tagValueList.smallCaseForValue = false;
+ content.tagValueConfirm.tagValueList.nbMaxLinesForValue = 0;
+ content.tagValueConfirm.tagValueList.wrapping = false;
+ // if it's an extended address verif, it takes 2 pages, so display a "Tap to continue", and
+ // no confirmation button
+ if (navInfo.nbPages > 1) {
+ navInfo.navWithTap.nextPageText = "Tap to continue";
+ content.tagValueConfirm.confirmationText = NULL;
+ }
+ else {
+ // otherwise no tap to continue but a confirmation button
+ content.tagValueConfirm.confirmationText = "Confirm";
+ content.tagValueConfirm.confirmationToken = CONFIRM_TOKEN;
+ }
+ }
+ else if (page == 1) {
+ // the second page is dedicated to the extended tag/value pairs
+ content.type = TAG_VALUE_CONFIRM;
+ content.tagValueConfirm.confirmationText = "Confirm";
+ content.tagValueConfirm.confirmationToken = CONFIRM_TOKEN;
+ content.tagValueConfirm.detailsButtonText = NULL;
+ content.tagValueConfirm.detailsButtonIcon = NULL;
+ content.tagValueConfirm.tuneId = TUNE_TAP_CASUAL;
+ content.tagValueConfirm.tagValueList.nbPairs
+ = addressConfirmationContext.tagValueList->nbPairs;
+ content.tagValueConfirm.tagValueList.pairs = addressConfirmationContext.tagValueList->pairs;
+ content.tagValueConfirm.tagValueList.smallCaseForValue
+ = addressConfirmationContext.tagValueList->smallCaseForValue;
+ content.tagValueConfirm.tagValueList.nbMaxLinesForValue
+ = addressConfirmationContext.tagValueList->nbMaxLinesForValue;
+ content.tagValueConfirm.tagValueList.wrapping
+ = addressConfirmationContext.tagValueList->wrapping;
+
+ // no next page
+ navInfo.navWithTap.nextPageText = NULL;
+ }
+ // fill navigation structure
+ navInfo.activePage = page;
+
+ nbgl_pageDrawGenericContent(&pageCallback, &navInfo, &content);
+
+ if (forceFullRefresh) {
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+ }
+ else {
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+ }
+}
+
+// called when skip button is touched in footer, during forward only review
+static void displaySkipWarning(void)
+{
+ nbgl_pageConfirmationDescription_t info = {
+ .cancelText = "Go back to review",
+ .centeredInfo.text1 = "Skip message review?",
+ .centeredInfo.text2
+ = "Skip only if you trust the\nsource. If you skip, you won't\nbe able to review it again.",
+ .centeredInfo.text3 = NULL,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.icon = &C_warning64px,
+ .centeredInfo.offsetY = -64,
+ .confirmationText = "Yes, skip",
+ .confirmationToken = SKIP_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL,
+ .modal = true};
+ modalPageContext = nbgl_pageDrawConfirmation(&pageModalCallback, &info);
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+}
+
+///////////// STATIC REVIEW UTILITIES /////////////
+
+// sets the number of pairs fitting in the given page, with tooLongToFit param
+static void setNbPairs(uint8_t page, uint8_t nbPairs, bool tooLongToFit)
+{
+ nbPairsPerPage[page / 4] &= ~(3 << ((page % 4) * 2));
+ nbPairsPerPage[page / 4] |= ((nbPairs - 1) << ((page % 4) * 2));
+ if (tooLongToFit) {
+ tooLongToFitPerPage[page / 8] |= 1 << (page % 8);
+ }
+ else {
+ tooLongToFitPerPage[page / 8] &= ~(1 << (page % 8));
+ }
+}
+
+// returns the number of pairs fitting in the given page, setting tooLongToFit at the appropriate
+// value
+static uint8_t getNbPairs(uint8_t page, bool *tooLongToFit)
+{
+ uint8_t nbPairs = (nbPairsPerPage[page / 4] >> ((page % 4) * 2)) & 3;
+ *tooLongToFit = (tooLongToFitPerPage[page / 8] & (1 << (page % 8))) ? true : false;
+ return nbPairs + 1;
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief computes the number of tag/values pairs displayable in a page, with the given list of
+ * tag/value pairs
+ *
+ * @param nbPairs number of tag/value pairs to use in \b tagValueList
+ * @param tagValueList list of tag/value pairs
+ * @param startIndex first index to consider in \b tagValueList
+ * @param tooLongToFit (output) set to true if even a single tag/value pair doesn't fit in a page
+ * @return the number of tag/value pairs fitting in a page
+ */
+uint8_t nbgl_useCaseGetNbTagValuesInPage(uint8_t nbPairs,
+ const nbgl_layoutTagValueList_t *tagValueList,
+ uint8_t startIndex,
+ bool *tooLongToFit)
+{
+ uint8_t nbPairsInPage = 0;
+ uint16_t currentHeight = 12; // upper margin
+
+ *tooLongToFit = false;
+ while (nbPairsInPage < nbPairs) {
+ const nbgl_layoutTagValue_t *pair;
+ nbgl_font_id_e value_font;
+
+ // margin between pairs
+ if (nbPairsInPage > 0) {
+ currentHeight += 12;
+ }
+ // fetch tag/value pair strings.
+ if (tagValueList->pairs != NULL) {
+ pair = &tagValueList->pairs[startIndex + nbPairsInPage];
+ }
+ else {
+ pair = tagValueList->callback(startIndex + nbPairsInPage);
+ }
+
+ if (pair->force_page_start && nbPairsInPage > 0) {
+ // This pair must be at the top of a page
+ break;
+ }
+
+ // tag height
+ currentHeight += nbgl_getTextHeightInWidth(SMALL_REGULAR_FONT,
+ pair->item,
+ SCREEN_WIDTH - 2 * BORDER_MARGIN,
+ tagValueList->wrapping);
+ // space between tag and value
+ currentHeight += 4;
+ // set value font
+ if (tagValueList->smallCaseForValue) {
+ value_font = SMALL_REGULAR_FONT;
+ }
+ else {
+ value_font = LARGE_MEDIUM_FONT;
+ }
+ // value height
+ currentHeight += nbgl_getTextHeightInWidth(
+ value_font, pair->value, SCREEN_WIDTH - 2 * BORDER_MARGIN, tagValueList->wrapping);
+ if (currentHeight >= TAG_VALUE_AREA_HEIGHT) {
+ break;
+ }
+ nbPairsInPage++;
+ }
+ if ((nbPairsInPage == 0) && (currentHeight >= TAG_VALUE_AREA_HEIGHT)) {
+ *tooLongToFit = true;
+ nbPairsInPage = 1;
+ }
+ return nbPairsInPage;
+}
+
+/**
+ * @brief computes the number of pages necessary to display the given list of tag/value pairs
+ *
+ * @param tagValueList list of tag/value pairs
+ * @return the number of pages necessary to display the given list of tag/value pairs
+ */
+uint8_t nbgl_useCaseGetNbPagesForTagValueList(const nbgl_layoutTagValueList_t *tagValueList)
+{
+ uint8_t nbPages = 0;
+ uint8_t nbPairs = tagValueList->nbPairs;
+ uint8_t nbPairsInPage;
+ uint8_t i = 0;
+ bool tooLongToFit;
+
+ while (i < tagValueList->nbPairs) {
+ // upper margin
+ nbPairsInPage = nbgl_useCaseGetNbTagValuesInPage(nbPairs, tagValueList, i, &tooLongToFit);
+ i += nbPairsInPage;
+ setNbPairs(nbPages, nbPairsInPage, tooLongToFit);
+ nbPairs -= nbPairsInPage;
+ nbPages++;
+ }
+ return nbPages;
+}
+
+/**
+ * @brief draws the home page of an app (page on which we land when launching it from dashboard)
+ *
+ * @param appName app name
+ * @param appIcon app icon
+ * @param tagline text under app name (if NULL, it will be "This app enables signing transactions on
+ * the network.")
+ * @param withSettings if true, use a "settings" (wheel) icon in bottom button, otherwise a "info"
+ * (i)
+ * @param topRightCallback callback called when top-right button is touched
+ * @param quitCallback callback called when quit button is touched
+ */
+void nbgl_useCaseHome(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ bool withSettings,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback)
+{
+ nbgl_useCaseHomeExt(
+ appName, appIcon, tagline, withSettings, NULL, NULL, topRightCallback, quitCallback);
+}
+
+/**
+ * @brief draws the extended version of home page of an app (page on which we land when launching it
+ * from dashboard)
+ * @note it enables to use an action button (black)
+ *
+ * @param appName app name
+ * @param appIcon app icon
+ * @param tagline text under app name (if NULL, it will be "This app enables signing transactions on
+ * the network.")
+ * @param withSettings if true, use a "settings" (wheel) icon in bottom button, otherwise a "info"
+ * (i)
+ * @param actionButtonText if not NULL, text used for an action button (in black, on top of "Quit
+ * App" button)
+ * @param actionCallback callback called when action button is touched (if actionButtonText is not
+ * NULL)
+ * @param topRightCallback callback called when top-right button is touched
+ * @param quitCallback callback called when quit button is touched
+ */
+void nbgl_useCaseHomeExt(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ bool withSettings,
+ const char *actionButtonText,
+ nbgl_callback_t actionCallback,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback)
+{
+ reset_callbacks();
+
+ nbgl_pageInfoDescription_t info = {.centeredInfo.icon = appIcon,
+ .centeredInfo.text1 = appName,
+ .centeredInfo.text3 = NULL,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.offsetY = -16,
+ .footerText = NULL,
+ .bottomButtonStyle = QUIT_APP_TEXT,
+ .tapActionText = NULL,
+ .topRightStyle = withSettings ? SETTINGS_ICON : INFO_ICON,
+ .topRightToken = CONTINUE_TOKEN,
+ .actionButtonText = actionButtonText,
+ .tuneId = TUNE_TAP_CASUAL};
+ if (actionButtonText != NULL) {
+ // trick to use ACTION_BUTTON_TOKEN for action and quit, with index used to distinguish
+ info.bottomButtonsToken = ACTION_BUTTON_TOKEN;
+ onAction = actionCallback;
+ }
+ else {
+ info.bottomButtonsToken = QUIT_TOKEN;
+ onAction = actionCallback;
+ }
+ if (tagline == NULL) {
+ if (strlen(appName) > MAX_APP_NAME_FOR_SDK_TAGLINE) {
+ snprintf(appDescription,
+ APP_DESCRIPTION_MAX_LEN,
+ "This app enables signing\ntransactions on its network.");
+ }
+ else {
+ snprintf(appDescription,
+ APP_DESCRIPTION_MAX_LEN,
+ "%s %s\n%s",
+ TAGLINE_PART1,
+ appName,
+ TAGLINE_PART2);
+ }
+
+ // If there is more than 3 lines, it means the appName was split, so we put it on the next
+ // line
+ if (nbgl_getTextNbLinesInWidth(
+ SMALL_REGULAR_FONT, appDescription, SCREEN_WIDTH - 2 * BORDER_MARGIN, false)
+ > 3) {
+ snprintf(appDescription,
+ APP_DESCRIPTION_MAX_LEN,
+ "%s\n%s %s",
+ TAGLINE_PART1,
+ appName,
+ TAGLINE_PART2);
+ }
+ info.centeredInfo.text2 = appDescription;
+ }
+ else {
+ info.centeredInfo.text2 = tagline;
+ }
+
+ onContinue = topRightCallback;
+ onQuit = quitCallback;
+ if (actionButtonText != NULL) {
+ info.centeredInfo.offsetY -= 40;
+ }
+ pageContext = nbgl_pageDrawInfo(&pageCallback, NULL, &info);
+ nbgl_refreshSpecial(FULL_COLOR_CLEAN_REFRESH);
+}
+
+/**
+ * @brief draws the home page of a plug-in app (page on which we land when launching it from
+ * dashboard)
+ *
+ * @param plugInName plug-in app name
+ * @param appName master app name (app used by plug-in)
+ * @param appIcon master app icon
+ * @param tagline text under plug-in name (if NULL, it will be "This app confirms actions
+ * for\n.")
+ * @param subTagline text under master app icon (if NULL, it will be "This app relies
+ * on\n")
+ * @param withSettings if true, use a "settings" (wheel) icon in bottom button, otherwise a "info"
+ * (i)
+ * @param topRightCallback callback called when top-right button is touched
+ * @param quitCallback callback called when quit button is touched
+ */
+void nbgl_useCasePlugInHome(const char *plugInName,
+ const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *tagline,
+ const char *subTagline,
+ bool withSettings,
+ nbgl_callback_t topRightCallback,
+ nbgl_callback_t quitCallback)
+{
+ reset_callbacks();
+
+ nbgl_pageInfoDescription_t info = {.centeredInfo.icon = appIcon,
+ .centeredInfo.text1 = plugInName,
+ .centeredInfo.style = PLUGIN_INFO,
+ .centeredInfo.offsetY = -16,
+ .footerText = NULL,
+ .bottomButtonStyle = QUIT_APP_TEXT,
+ .tapActionText = NULL,
+ .topRightStyle = withSettings ? SETTINGS_ICON : INFO_ICON,
+ .topRightToken = CONTINUE_TOKEN,
+ .actionButtonText = NULL,
+ .tuneId = TUNE_TAP_CASUAL};
+ info.bottomButtonsToken = QUIT_TOKEN;
+ onAction = NULL;
+ if (tagline == NULL) {
+ snprintf(appDescription,
+ APP_DESCRIPTION_MAX_LEN,
+ "This app confirms actions for\n%s.",
+ plugInName);
+ info.centeredInfo.text2 = appDescription;
+ }
+ else {
+ info.centeredInfo.text2 = tagline;
+ }
+ if (subTagline == NULL) {
+ snprintf(plugInDescription, APP_DESCRIPTION_MAX_LEN, "This app relies on\n%s", appName);
+ info.centeredInfo.text3 = plugInDescription;
+ }
+ else {
+ info.centeredInfo.text3 = subTagline;
+ }
+
+ onContinue = topRightCallback;
+ onQuit = quitCallback;
+ pageContext = nbgl_pageDrawInfo(&pageCallback, NULL, &info);
+ nbgl_refresh();
+}
+
+/**
+ * @brief Draws the settings pages of an app with as many pages as given
+ * For each page, the given navCallback will be called to get the content. Only 'type' and
+ * union has to be set in this content
+ *
+ * @param title string to set in touchable (or not) title
+ * @param initPage page on which to start [0->(nbPages-1)]
+ * @param nbPages number of pages
+ * @param touchable if true, the title is used to quit and quitCallback is called
+ * @param quitCallback callback called when quit button (or title) is pressed
+ * @param navCallback callback called when navigation arrows are pressed
+ * @param controlsCallback callback called when any controls in the settings (radios, switches) is
+ * called (the tokens must be >= @ref FIRST_USER_TOKEN)
+ */
+void nbgl_useCaseSettings(const char *title,
+ uint8_t initPage,
+ uint8_t nbPages,
+ bool touchable,
+ nbgl_callback_t quitCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_layoutTouchCallback_t controlsCallback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+
+ // memorize context
+ onQuit = quitCallback;
+ onNav = navCallback;
+ onControls = controlsCallback;
+ settingsTitle = title;
+ touchableTitle = touchable;
+
+ // fill navigation structure
+ navInfo.activePage = initPage;
+ navInfo.navType = NAV_WITH_BUTTONS;
+ navInfo.navWithButtons.navToken = NAV_TOKEN;
+ if (!touchableTitle) {
+ navInfo.navWithButtons.quitButton = true;
+ navInfo.quitToken = QUIT_TOKEN;
+ }
+ else {
+ navInfo.navWithButtons.quitButton = false;
+ }
+ navInfo.nbPages = nbPages;
+ navInfo.progressIndicator = false;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displaySettingsPage(navInfo.activePage, true);
+}
+
+/**
+ * @brief Draws a transient (1s) status page, either of success or failure, with the given message
+ *
+ * @param message string to set in middle of page (Upper case for success)
+ * @param isSuccess if true, message is drawn in a Ledger style (with corners)
+ * @param quitCallback callback called when quit timer times out
+ */
+void nbgl_useCaseStatus(const char *message, bool isSuccess, nbgl_callback_t quitCallback)
+{
+ reset_callbacks();
+
+ nbgl_screenTickerConfiguration_t ticker = {
+ .tickerCallback = &tickerCallback,
+ .tickerIntervale = 0, // not periodic
+ .tickerValue = 3000 // 3 seconds
+ };
+ onQuit = quitCallback;
+ if (isSuccess) {
+#ifdef HAVE_PIEZO_SOUND
+ io_seproxyhal_play_tune(TUNE_LEDGER_MOMENT);
+#endif // HAVE_PIEZO_SOUND
+
+ pageContext = nbgl_pageDrawLedgerInfo(&pageCallback, &ticker, message, QUIT_TOKEN);
+ }
+ else {
+ nbgl_pageInfoDescription_t info = {.bottomButtonStyle = NO_BUTTON_STYLE,
+ .footerText = NULL,
+ .centeredInfo.icon = &C_round_cross_64px,
+ .centeredInfo.offsetY = 0,
+ .centeredInfo.onTop = false,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.text1 = message,
+ .centeredInfo.text2 = NULL,
+ .centeredInfo.text3 = NULL,
+ .tapActionText = "",
+ .tapActionToken = QUIT_TOKEN,
+ .topRightStyle = NO_BUTTON_STYLE,
+ .actionButtonText = NULL,
+ .tuneId = TUNE_TAP_CASUAL};
+ pageContext = nbgl_pageDrawInfo(&pageCallback, &ticker, &info);
+ }
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+}
+
+/**
+ * @brief Draws a generic choice page, described in a centered info (with configurable icon), thanks
+ * to a button and a footer at the bottom of the page. The given callback is called with true as
+ * argument if the button is touched, false if footer is touched
+ *
+ * @param icon icon to set in center of page
+ * @param message string to set in center of page (32px)
+ * @param subMessage string to set under message (24px) (can be NULL)
+ * @param confirmText string to set in button, to confirm (cannot be NULL)
+ * @param cancelText string to set in footer, to reject (cannot be NULL)
+ * @param callback callback called when button or footer is touched
+ */
+void nbgl_useCaseChoice(const nbgl_icon_details_t *icon,
+ const char *message,
+ const char *subMessage,
+ const char *confirmText,
+ const char *cancelText,
+ nbgl_choiceCallback_t callback)
+{
+ reset_callbacks();
+
+ nbgl_pageConfirmationDescription_t info = {.cancelText = cancelText,
+ .centeredInfo.text1 = message,
+ .centeredInfo.text2 = subMessage,
+ .centeredInfo.text3 = NULL,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.icon = icon,
+ .centeredInfo.offsetY = -40,
+ .confirmationText = confirmText,
+ .confirmationToken = CHOICE_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL,
+ .modal = false};
+ // check params
+ if ((confirmText == NULL) || (cancelText == NULL)) {
+ return;
+ }
+ onChoice = callback;
+ pageContext = nbgl_pageDrawConfirmation(&pageCallback, &info);
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+}
+
+/**
+ * @brief Draws a page to confirm or not an action, described in a centered info (with info icon),
+ * thanks to a button and a footer at the bottom of the page. The given callback is called if the
+ * button is touched. If the footer is touched, the page is only "dismissed"
+ * @note This page is displayed as a modal (so the content of the previous page will be visible when
+ * dismissed).
+ *
+ * @param message string to set in center of page (32px)
+ * @param subMessage string to set under message (24px) (can be NULL)
+ * @param confirmText string to set in button, to confirm
+ * @param cancelText string to set in footer, to reject
+ * @param callback callback called when confirmation button is touched
+ */
+void nbgl_useCaseConfirm(const char *message,
+ const char *subMessage,
+ const char *confirmText,
+ const char *cancelText,
+ nbgl_callback_t callback)
+{
+ // Don't reset callback or nav context as this is just a modal.
+
+ nbgl_pageConfirmationDescription_t info = {.cancelText = cancelText,
+ .centeredInfo.text1 = message,
+ .centeredInfo.text2 = subMessage,
+ .centeredInfo.text3 = NULL,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.icon = &C_round_warning_64px,
+ .centeredInfo.offsetY = -40,
+ .confirmationText = confirmText,
+ .confirmationToken = CHOICE_TOKEN,
+ .tuneId = TUNE_TAP_CASUAL,
+ .modal = true};
+ onModalConfirm = callback;
+ modalPageContext = nbgl_pageDrawConfirmation(&pageModalCallback, &info);
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+}
+
+/**
+ * @brief Draws a review start page, with a centered message, a "tap to continue" container and a
+ * "reject" footer
+ *
+ * @param icon icon to use in centered info
+ * @param reviewTitle string to set in middle of page (in 32px font)
+ * @param reviewSubTitle string to set under reviewTitle (in 24px font) (can be NULL)
+ * @param rejectText string to set in footer, to reject review
+ * @param continueCallback callback called when main panel is touched
+ * @param rejectCallback callback called when footer is touched
+ */
+void nbgl_useCaseReviewStart(const nbgl_icon_details_t *icon,
+ const char *reviewTitle,
+ const char *reviewSubTitle,
+ const char *rejectText,
+ nbgl_callback_t continueCallback,
+ nbgl_callback_t rejectCallback)
+{
+ reset_callbacks();
+
+ nbgl_pageInfoDescription_t info = {.centeredInfo.icon = icon,
+ .centeredInfo.text1 = reviewTitle,
+ .centeredInfo.text2 = reviewSubTitle,
+ .centeredInfo.text3 = NULL,
+ .centeredInfo.style = LARGE_CASE_INFO,
+ .centeredInfo.offsetY = 0,
+ .footerText = rejectText,
+ .footerToken = QUIT_TOKEN,
+ .tapActionText = "Tap to continue",
+ .tapActionToken = CONTINUE_TOKEN,
+ .topRightStyle = NO_BUTTON_STYLE,
+ .actionButtonText = NULL,
+ .tuneId = TUNE_TAP_CASUAL};
+ onQuit = rejectCallback;
+ onContinue = continueCallback;
+
+#ifdef HAVE_PIEZO_SOUND
+ // Play notification sound
+ io_seproxyhal_play_tune(TUNE_LOOK_AT_ME);
+#endif // HAVE_PIEZO_SOUND
+
+ pageContext = nbgl_pageDrawInfo(&pageCallback, NULL, &info);
+ nbgl_refresh();
+}
+/**
+ * @brief Draws a flow of pages of a review. A back key is available on top-left of the screen,
+ * except in first page It is possible to go to next page thanks to "tap to continue". For each
+ * page, the given navCallback will be called to get the content. Only 'type' and union has to be
+ * set in this content
+ *
+ * @param initPage page on which to start [0->(nbPages-1)]
+ * @param nbPages number of pages. If 0, no progress indicator is used
+ * @param rejectText text to use in footer
+ * @param navCallback callback called when navigation (back or "tap to continue") is touched
+ * @param buttonCallback callback called when a potential button (details) in the content is touched
+ * @param choiceCallback callback called when either long_press or footer is called (param is true
+ * for long press)
+ */
+void nbgl_useCaseRegularReview(uint8_t initPage,
+ uint8_t nbPages,
+ const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+
+ // memorize context
+ onChoice = choiceCallback;
+ onNav = navCallback;
+ onControls = buttonCallback;
+ forwardNavOnly = false;
+
+ // fill navigation structure
+ navInfo.nbPages = nbPages;
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.quitToken = REJECT_TOKEN;
+ navInfo.navWithTap.nextPageToken = NEXT_TOKEN;
+ navInfo.navWithTap.quitText = rejectText;
+ navInfo.navWithTap.backToken = BACK_TOKEN;
+ navInfo.navWithTap.skipText = NULL;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displayReviewPage(initPage, true);
+}
+
+/**
+ * @brief Draws a flow of pages of a review, without back key.
+ * It is possible to go to next page thanks to "tap to continue".
+ * For each page, the given navCallback will be called to get the content. Only 'type' and
+ * union has to be set in this content.
+ * Note that this is not a standard use case, it should only be used on very specific
+ * situations.
+ *
+ * @param rejectText text to use in footer
+ * @param buttonCallback callback called when a potential button (details or long press) in the
+ * content is touched
+ * @param navCallback callback called when navigation "tap to continue" is touched, to get the
+ * content of next page
+ * @param choiceCallback callback called when either long_press or footer is called (param is true
+ * for long press)
+ */
+void nbgl_useCaseForwardOnlyReview(const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+
+ // memorize context
+ onChoice = choiceCallback;
+ onNav = navCallback;
+ onControls = buttonCallback;
+ forwardNavOnly = true;
+
+ // fill navigation structure
+ navInfo.nbPages = 0;
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.quitToken = QUIT_TOKEN;
+ navInfo.navWithTap.nextPageToken = NEXT_TOKEN;
+ navInfo.navWithTap.quitText = rejectText;
+ navInfo.navWithTap.backToken = BACK_TOKEN;
+ navInfo.navWithTap.skipText = "Skip >>";
+ navInfo.navWithTap.skipToken = SKIP_TOKEN;
+ navInfo.navWithTap.backButton = false;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displayReviewPage(0, false);
+}
+
+/**
+ * @brief Draws a flow of pages of a review, without back key.
+ * It is possible to go to next page thanks to "tap to continue".
+ * For each page, the given navCallback will be called to get the content. Only 'type' and
+ * union has to be set in this content.
+ * Note that this is not a standard use case, it should only be used on very specific
+ * situations.
+ *
+ * @param rejectText text to use in footer
+ * @param buttonCallback callback called when a potential button (details or long press) in the
+ * content is touched
+ * @param navCallback callback called when navigation "tap to continue" is touched, to get the
+ * content of next page
+ * @param choiceCallback callback called when either long_press or footer is called (param is true
+ * for long press)
+ */
+void nbgl_useCaseForwardOnlyReviewNoSkip(const char *rejectText,
+ nbgl_layoutTouchCallback_t buttonCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_choiceCallback_t choiceCallback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+
+ // memorize context
+ onChoice = choiceCallback;
+ onNav = navCallback;
+ onControls = buttonCallback;
+ forwardNavOnly = true;
+
+ // fill navigation structure
+ navInfo.nbPages = 0;
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.quitToken = REJECT_TOKEN;
+ navInfo.navWithTap.nextPageToken = NEXT_TOKEN;
+ navInfo.navWithTap.quitText = rejectText;
+ navInfo.navWithTap.backToken = BACK_TOKEN;
+ navInfo.navWithTap.backButton = false;
+ navInfo.navWithTap.skipText = NULL;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displayReviewPage(0, false);
+}
+
+/**
+ * @brief Draws a flow of pages of a review. A back key is available on top-left of the screen,
+ * except in first page It is possible to go to next page thanks to "tap to continue".
+ * @note All tag/value pairs are provided in the API and the number of pages is automatically
+ * computed, the last page being a long press one
+ *
+ * @param tagValueList list of tag/value pairs
+ * @param infoLongPress information to build the last page
+ * @param rejectText text to use in footer
+ * @param callback callback called when transaction is accepted (param is true) or rejected (param
+ * is false)
+ */
+void nbgl_useCaseStaticReview(const nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_pageInfoLongPress_t *infoLongPress,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+ memset(&staticReviewContext, 0, sizeof(staticReviewContext));
+
+ // memorize context
+ onChoice = callback;
+ onNav = NULL;
+ forwardNavOnly = false;
+
+ staticReviewContext.withLongPress = true;
+ memcpy(&staticReviewContext.tagValueList, tagValueList, sizeof(nbgl_layoutTagValueList_t));
+ memcpy(&staticReviewContext.infoLongPress, infoLongPress, sizeof(nbgl_pageInfoLongPress_t));
+ staticReviewContext.currentPairIndex = 0;
+ staticReviewContext.nbPairsInCurrentPage = 0;
+
+ // compute number of pages & fill navigation structure
+ navInfo.nbPages = nbgl_useCaseGetNbPagesForTagValueList(tagValueList) + 1;
+ navInfo.activePage = 0;
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.quitToken = REJECT_TOKEN;
+ navInfo.navWithTap.nextPageToken = NEXT_TOKEN;
+ navInfo.navWithTap.quitText = rejectText;
+ navInfo.navWithTap.backToken = BACK_TOKEN;
+ navInfo.navWithTap.skipText = NULL;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displayStaticReviewPage(0, true);
+}
+
+/**
+ * @brief Similar to @ref nbgl_useCaseStaticReview() but with a simple button/footer pair instead of
+ * a long press button/footer pair.
+ * @note All tag/value pairs are provided in the API and the number of pages is automatically
+ * computed, the last page being a long press one
+ *
+ * @param tagValueList list of tag/value pairs
+ * @param infoLongPress information to build the last page (even if not a real long press, the info
+ * is the same)
+ * @param rejectText text to use in footer
+ * @param callback callback called when transaction is accepted (param is true) or rejected (param
+ * is false)
+ */
+void nbgl_useCaseStaticReviewLight(const nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_pageInfoLongPress_t *infoLongPress,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+ memset(&staticReviewContext, 0, sizeof(staticReviewContext));
+
+ // memorize context
+ onChoice = callback;
+ onNav = NULL;
+ forwardNavOnly = false;
+
+ staticReviewContext.withLongPress = false;
+ memcpy(&staticReviewContext.tagValueList, tagValueList, sizeof(nbgl_layoutTagValueList_t));
+ memcpy(&staticReviewContext.infoLongPress, infoLongPress, sizeof(nbgl_pageInfoLongPress_t));
+ staticReviewContext.currentPairIndex = 0;
+ staticReviewContext.nbPairsInCurrentPage = 0;
+
+ // compute number of pages & fill navigation structure
+ navInfo.nbPages = nbgl_useCaseGetNbPagesForTagValueList(tagValueList) + 1;
+ navInfo.activePage = 0;
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.quitToken = REJECT_TOKEN;
+ navInfo.navWithTap.nextPageToken = NEXT_TOKEN;
+ navInfo.navWithTap.quitText = rejectText;
+ navInfo.navWithTap.backToken = BACK_TOKEN;
+ navInfo.navWithTap.skipText = NULL;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+
+ displayStaticReviewPage(0, true);
+}
+
+/**
+ * @brief Draws a flow of pages to view details on a given tag/value pair that doesn't fit in a
+ * single page
+ *
+ * @param tag tag name (in gray)
+ * @param value full value string, that will be split in multiple pages
+ * @param wrapping if set to true, value text is wrapped on ' ' characters
+ */
+void nbgl_useCaseViewDetails(const char *tag, const char *value, bool wrapping)
+{
+ memset(&detailsContext, 0, sizeof(detailsContext));
+
+ uint16_t nbLines = nbgl_getTextNbLinesInWidth(
+ SMALL_REGULAR_FONT, value, SCREEN_WIDTH - 2 * BORDER_MARGIN, wrapping);
+
+ // initialize context
+ detailsContext.tag = tag;
+ detailsContext.value = value;
+ detailsContext.nbPages = (nbLines + NB_MAX_LINES_IN_DETAILS - 1) / NB_MAX_LINES_IN_DETAILS;
+ detailsContext.currentPage = 0;
+ detailsContext.wrapping = wrapping;
+ // add some spare for room lost with "..." substitution
+ if (detailsContext.nbPages > 1) {
+ uint16_t nbLostChars = (detailsContext.nbPages - 1) * 3;
+ uint16_t nbLostLines
+ = (nbLostChars + ((SCREEN_WIDTH - 2 * BORDER_MARGIN) / 16) - 1)
+ / ((SCREEN_WIDTH - 2 * BORDER_MARGIN) / 16); // 16 for average char width
+ uint8_t nbLinesInLastPage
+ = nbLines - ((detailsContext.nbPages - 1) * NB_MAX_LINES_IN_DETAILS);
+
+ detailsContext.nbPages += nbLostLines / NB_MAX_LINES_IN_DETAILS;
+ if ((nbLinesInLastPage + (nbLostLines % NB_MAX_LINES_IN_DETAILS))
+ > NB_MAX_LINES_IN_DETAILS) {
+ detailsContext.nbPages++;
+ }
+ }
+
+ displayDetailsPage(0, true);
+}
+
+/**
+ * @brief draws an address confirmation page. This page contains the given address in a tag/value
+ * layout, with a button to open a modal to see address as a QR Code, and at the bottom a button to
+ * confirm and a footer to cancel
+ *
+ * @param address address to confirm (NULL terminated string)
+ * @param callback callback called when button or footer is touched (if true, button, if false
+ * footer)
+ */
+void nbgl_useCaseAddressConfirmation(const char *address, nbgl_choiceCallback_t callback)
+{
+ nbgl_useCaseAddressConfirmationExt(address, callback, NULL);
+}
+
+/**
+ * @brief draws an extended address verification page. This page contains the given address in a
+ * tag/value layout, with a button to open a modal to see address as a QR Code. A "tap to continue"
+ * enables to open a second review page to display the other given tag/value pairs, with a button to
+ * confirm and a footer to cancel
+ *
+ * @param address address to confirm (NULL terminated string)
+ * @param callback callback called when button or footer is touched (if true, button, if false
+ * footer)
+ * @param tagValueList list of tag/value pairs (must fit in a single page, and be persistent because
+ * no copy)
+ */
+void nbgl_useCaseAddressConfirmationExt(const char *address,
+ nbgl_choiceCallback_t callback,
+ const nbgl_layoutTagValueList_t *tagValueList)
+{
+ reset_callbacks();
+ memset(&navInfo, 0, sizeof(navInfo));
+ memset(&addressConfirmationContext, 0, sizeof(addressConfirmationContext));
+
+ // save context
+ onChoice = callback;
+ addressConfirmationContext.address = address;
+ addressConfirmationContext.tagValueList = tagValueList;
+
+ // fill navigation structure, common to all pages
+ navInfo.navType = NAV_WITH_TAP;
+ navInfo.nbPages = (tagValueList == NULL) ? 0 : 2;
+ navInfo.progressIndicator = true;
+ navInfo.tuneId = TUNE_TAP_CASUAL;
+ navInfo.navWithTap.backButton = (tagValueList != NULL);
+ navInfo.navWithTap.quitText = "Cancel";
+ navInfo.navWithTap.nextPageToken = ADDR_NEXT_TOKEN;
+ navInfo.navWithTap.nextPageText = NULL;
+ navInfo.navWithTap.backToken = ADDR_BACK_TOKEN;
+ navInfo.navWithTap.skipText = NULL;
+ navInfo.quitToken = REJECT_TOKEN;
+
+ displayAddressPage(0, true);
+}
+
+/**
+ * @brief draw a spinner page with the given parameters. The spinner will "turn" automatically every
+ * 800 ms
+ *
+ * @param text text to use under spinner
+ */
+void nbgl_useCaseSpinner(const char *text)
+{
+ pageContext = nbgl_pageDrawSpinner(NULL, (const char *) text);
+ nbgl_refreshSpecial(FULL_COLOR_PARTIAL_REFRESH);
+}
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_USE_CASE
diff --git a/sdk_lib_nbgl/src/nbgl_use_case_nanos.c b/sdk_lib_nbgl/src/nbgl_use_case_nanos.c
new file mode 100644
index 00000000..7740308f
--- /dev/null
+++ b/sdk_lib_nbgl/src/nbgl_use_case_nanos.c
@@ -0,0 +1,509 @@
+/**
+ * @file nbgl_use_case_nanos.c
+ * @brief Implementation of typical pages (or sets of pages) for Applications, for Nanos (X, SP)
+ */
+
+#ifdef NBGL_USE_CASE
+#ifndef HAVE_SE_TOUCH
+/*********************
+ * INCLUDES
+ *********************/
+#include
+#include
+#include "nbgl_debug.h"
+#include "nbgl_use_case.h"
+#include "glyphs.h"
+#include "os_pic.h"
+#include "os_helpers.h"
+#include "ux.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct ReviewContext_s {
+ nbgl_navCallback_t onNav;
+ nbgl_choiceCallback_t onChoice;
+ nbgl_layoutTagValueList_t tagValueList;
+ const nbgl_icon_details_t *icon;
+ const char *reviewTitle;
+ const char *address; // for address confirmation review
+ const char *acceptText;
+ const char *rejectText;
+ bool forwardNavOnly;
+} ReviewContext_t;
+
+typedef struct HomeContext_s {
+ const char *appName;
+ const nbgl_icon_details_t *appIcon;
+ const char *appVersion;
+ const char *tagline;
+ nbgl_callback_t aboutCallback;
+ nbgl_callback_t quitCallback;
+} HomeContext_t;
+
+typedef struct SettingsContext_s {
+ nbgl_navCallback_t onNav;
+ nbgl_callback_t quitCallback;
+ nbgl_actionCallback_t actionCallback;
+} SettingsContext_t;
+
+typedef enum {
+ REVIEW_USE_CASE,
+ HOME_USE_CASE,
+ SETTINGS_USE_CASE
+} ContextType_t;
+
+typedef struct UseCaseContext_s {
+ ContextType_t type;
+ uint8_t nbPages;
+ int8_t currentPage;
+ nbgl_step_t stepCtx;
+ nbgl_stepDesc_t step;
+ union {
+ ReviewContext_t review;
+ HomeContext_t home;
+ SettingsContext_t settings;
+ };
+} UseCaseContext_t;
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+// char buffers to build some strings
+static char appDescription[APP_DESCRIPTION_MAX_LEN];
+
+static UseCaseContext_t context;
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void buttonCallback(nbgl_step_t stepCtx, nbgl_buttonEvent_t event);
+static void displayReviewPage(nbgl_stepPosition_t pos);
+static void displayHomePage(nbgl_stepPosition_t pos);
+
+static void onAccept(void)
+{
+ if (context.review.onChoice) {
+ context.review.onChoice(true);
+ }
+}
+
+static void onReject(void)
+{
+ if (context.review.onChoice) {
+ context.review.onChoice(false);
+ }
+}
+
+static void onSettingsAction(void)
+{
+ if (context.settings.actionCallback) {
+ context.settings.actionCallback(context.currentPage);
+ }
+}
+
+static void drawStep(nbgl_stepPosition_t pos,
+ const nbgl_icon_details_t *icon,
+ const char *txt,
+ const char *subTxt)
+{
+ if (context.nbPages > 1) {
+ pos |= NEITHER_FIRST_NOR_LAST_STEP;
+ }
+ else {
+ pos |= GET_POS_OF_STEP(context.currentPage, context.nbPages);
+ }
+
+ if (icon == NULL) {
+ context.stepCtx
+ = nbgl_stepDrawText(pos, buttonCallback, NULL, txt, subTxt, BOLD_TEXT1_INFO, false);
+ }
+ else {
+ nbgl_layoutCenteredInfo_t info;
+ info.icon = icon;
+ info.text1 = txt;
+ info.text2 = subTxt;
+ info.onTop = false;
+ info.style = BOLD_TEXT1_INFO;
+ context.stepCtx = nbgl_stepDrawCenteredInfo(pos, buttonCallback, NULL, &info, false);
+ }
+}
+
+static void buttonCallback(nbgl_step_t stepCtx, nbgl_buttonEvent_t event)
+{
+ nbgl_stepPosition_t pos;
+
+ UNUSED(stepCtx);
+ // create text_area for main text
+ if (event == BUTTON_LEFT_PRESSED) {
+ if (context.currentPage > 0) {
+ context.currentPage--;
+ }
+ else {
+ context.currentPage = (context.nbPages - 1);
+ }
+ pos = BACKWARD_DIRECTION;
+ }
+ else if (event == BUTTON_RIGHT_PRESSED) {
+ if (context.currentPage < (int) (context.nbPages - 1)) {
+ context.currentPage++;
+ }
+ else {
+ context.currentPage = 0;
+ }
+ pos = FORWARD_DIRECTION;
+ }
+ else {
+ if ((event == BUTTON_BOTH_PRESSED) && (context.step.callback != NULL)) {
+ context.step.callback();
+ }
+ return;
+ }
+ if ((context.type == REVIEW_USE_CASE) || (context.type == SETTINGS_USE_CASE)) {
+ displayReviewPage(pos);
+ }
+ else {
+ displayHomePage(pos);
+ }
+}
+
+// function used to display the current page in review
+static void displayReviewPage(nbgl_stepPosition_t pos)
+{
+ memset(&context.step, 0, sizeof(context.step));
+
+ if (context.type == REVIEW_USE_CASE) {
+ if (context.review.onNav != NULL) {
+ // try to get content for this page/step
+ if (context.review.onNav(context.currentPage, &context.step) == false) {
+ return;
+ }
+ }
+ else {
+ if (context.currentPage == 0) { // title page
+ context.step.icon = context.review.icon;
+ context.step.text = context.review.reviewTitle;
+ }
+ else if (context.currentPage == (context.nbPages - 2)) { // accept page
+ context.step.icon = &C_icon_validate_14;
+ context.step.text = context.review.acceptText;
+ context.step.callback = onAccept;
+ }
+ else if (context.currentPage == (context.nbPages - 1)) { // reject page
+ context.step.icon = &C_icon_crossmark;
+ context.step.text = context.review.rejectText;
+ context.step.callback = onReject;
+ }
+ else if ((context.review.address != NULL)
+ && (context.currentPage == 1)) { // address confirmation and 2nd page
+ context.step.text = "Address";
+ context.step.subText = context.review.address;
+ }
+ else {
+ uint8_t pairIndex = (context.review.address != NULL) ? (context.currentPage - 2)
+ : (context.currentPage - 1);
+ context.step.text = context.review.tagValueList.pairs[pairIndex].item;
+ context.step.subText = context.review.tagValueList.pairs[pairIndex].value;
+ }
+ }
+ }
+ else if (context.type == SETTINGS_USE_CASE) {
+ if (context.currentPage < (context.nbPages - 1)) {
+ // try to get content for this page/step
+ if ((context.settings.onNav == NULL)
+ || (context.settings.onNav(context.currentPage, &context.step) == false)) {
+ return;
+ }
+ context.step.callback = onSettingsAction;
+ }
+ else { // last page is for quit
+ context.step.icon = &C_icon_back_x;
+ context.step.text = "Back";
+ context.step.callback = context.settings.quitCallback;
+ }
+ }
+
+ const char *txt = NULL;
+ if (context.step.text != NULL) {
+ txt = context.step.text;
+ }
+ if (context.step.init != NULL) {
+ context.step.init();
+ }
+ drawStep(pos, context.step.icon, txt, context.step.subText);
+ nbgl_refresh();
+}
+
+// function used to display the current page in home
+static void displayHomePage(nbgl_stepPosition_t pos)
+{
+ memset(&context.step, 0, sizeof(context.step));
+
+ switch (context.currentPage) {
+ case 0:
+ context.step.icon = context.home.appIcon;
+ context.step.text = context.home.tagline;
+ break;
+ case 1:
+ context.step.text = "Version";
+ context.step.subText = context.home.appVersion;
+ break;
+ case 2:
+ context.step.icon = &C_icon_certificate;
+ context.step.text = "About";
+ context.step.callback = context.home.aboutCallback;
+ break;
+ case 3:
+ context.step.icon = &C_icon_dashboard_x;
+ context.step.text = "Quit";
+ context.step.callback = context.home.quitCallback;
+ break;
+ default:
+ break;
+ }
+
+ const char *txt = NULL;
+ if (context.step.text != NULL) {
+ txt = context.step.text;
+ }
+ if (context.step.init != NULL) {
+ context.step.init();
+ }
+ drawStep(pos, context.step.icon, txt, context.step.subText);
+ nbgl_refresh();
+}
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+/**
+ * @brief draws the home page of an app (page on which we land when launching it from dashboard)
+ *
+ * @param appName app name
+ * @param appIcon app icon
+ * @param appVersion app version
+ * @param tagline text under app name (if NULL, it will be "\nisready")
+ * @param aboutCallback callback called when the "about" step is selected (double key)
+ * @param quitCallback callback called when the "quit" step is selected (double key)
+ */
+void nbgl_useCaseHome(const char *appName,
+ const nbgl_icon_details_t *appIcon,
+ const char *appVersion,
+ const char *tagline,
+ nbgl_callback_t aboutCallback,
+ nbgl_callback_t quitCallback)
+{
+ memset(&context, 0, sizeof(UseCaseContext_t));
+ context.type = HOME_USE_CASE;
+ context.home.aboutCallback = aboutCallback;
+ context.home.quitCallback = quitCallback;
+
+ if (tagline == NULL) {
+ snprintf(appDescription, APP_DESCRIPTION_MAX_LEN, "%s\nis ready", appName);
+ context.home.tagline = appDescription;
+ }
+ else {
+ context.home.tagline = tagline;
+ }
+
+ context.home.appName = appName;
+ context.home.appIcon = appIcon;
+ context.home.appVersion = appVersion;
+
+ context.nbPages = 4;
+ context.currentPage = 0;
+
+ displayHomePage(FORWARD_DIRECTION);
+}
+
+/**
+ * @brief Draws the settings pages of an app with as many pages as given
+ * For each page, the given navCallback will be called to get the content. Only 'type' and
+ * union has to be set in this content
+ *
+ * @param initPage page on which to start [0->(nbPages-1)]
+ * @param nbPages number of pages
+ * @param quitCallback callback called when "quit" step is selected (double button)
+ * @param navCallback callback called when pages are navigated with buttons
+ * @param actionCallback callback called when one of the navigations page is selected (double
+ * button)
+ */
+void nbgl_useCaseSettings(uint8_t initPage,
+ uint8_t nbPages,
+ nbgl_callback_t quitCallback,
+ nbgl_navCallback_t navCallback,
+ nbgl_actionCallback_t actionCallback)
+{
+ memset(&context, 0, sizeof(UseCaseContext_t));
+ // memorize context
+ context.type = SETTINGS_USE_CASE;
+ context.settings.onNav = navCallback;
+ context.settings.quitCallback = quitCallback;
+ context.settings.actionCallback = actionCallback;
+
+ context.nbPages = nbPages + 1;
+ context.currentPage = initPage;
+ displayReviewPage(FORWARD_DIRECTION);
+}
+
+/**
+ * @brief Draws a flow of pages of a review. Navigation is available for all pages
+ * For each page, the given navCallback will be called to get the content.
+ * When navigating before the first page of after the last page, the page number will be -1
+ *
+ * @param initPage page on which to start [0->(nbPages-1)]
+ * @param nbPages number of pages.
+ * @param navCallback callback called when navigation is touched
+ */
+void nbgl_useCaseRegularReview(uint8_t initPage, uint8_t nbPages, nbgl_navCallback_t navCallback)
+{
+ memset(&context, 0, sizeof(UseCaseContext_t));
+ context.type = REVIEW_USE_CASE;
+ // memorize context
+ context.review.onNav = navCallback;
+ context.review.forwardNavOnly = false;
+
+ context.currentPage = initPage;
+ context.nbPages = nbPages;
+
+ displayReviewPage(FORWARD_DIRECTION);
+}
+
+/**
+ * @brief Draws a flow of pages of a review, without back key.
+ * It is possible to go to next page thanks to "tap to continue".
+ * For each page, the given navCallback will be called to get the content. Only 'type' and
+ * union has to be set in this content
+ *
+ * @param navCallback callback called when navigation "tap to continue" is touched, to get the
+ * content of next page
+ */
+void nbgl_useCaseForwardOnlyReview(nbgl_navCallback_t navCallback)
+{
+ // memorize context
+ context.type = REVIEW_USE_CASE;
+ context.review.onNav = navCallback;
+ context.review.forwardNavOnly = true;
+}
+
+/**
+ * @brief Draws a flow of pages of a review.
+ * @note All tag/value pairs are provided in the API and the number of pages is automatically
+ * computed, the last page being a long press one
+ *
+ * @param tagValueList list of tag/value pairs
+ * @param icon icon to use in first page
+ * @param reviewTitle text to use in title page of the transaction
+ * @param acceptText text to use in validation page
+ * @param rejectText text to use in rejection page
+ * @param callback callback called when transaction is accepted (param is true) or rejected (param
+ * is false)
+ */
+void nbgl_useCaseStaticReview(nbgl_layoutTagValueList_t *tagValueList,
+ const nbgl_icon_details_t *icon,
+ const char *reviewTitle,
+ const char *acceptText,
+ const char *rejectText,
+ nbgl_choiceCallback_t callback)
+{
+ // memorize context
+ memset(&context, 0, sizeof(UseCaseContext_t));
+ context.review.forwardNavOnly = false;
+ context.type = REVIEW_USE_CASE;
+
+ memcpy(&context.review.tagValueList, tagValueList, sizeof(nbgl_layoutTagValueList_t));
+
+ context.review.reviewTitle = reviewTitle;
+ context.review.icon = icon;
+ context.review.acceptText = acceptText;
+ context.review.rejectText = rejectText;
+ context.review.onChoice = callback;
+
+ context.currentPage = 0;
+ // + 3 because 1 page for title and 2 pages at the end for accept/reject
+ context.nbPages = tagValueList->nbPairs + 3;
+
+ displayReviewPage(FORWARD_DIRECTION);
+}
+
+/**
+ * @brief Draws an address confirmation use case. This page contains the given address in a
+ * tag/value layout
+ *
+ * @param icon icon to be used on first page of address review
+ * @param title text to be used on first page of address review (NULL terminated string)
+ * @param address address to confirm (NULL terminated string)
+ * @param callback callback called when either confirm or reject page is double pressed
+ */
+void nbgl_useCaseAddressConfirmation(const nbgl_icon_details_t *icon,
+ const char *title,
+ const char *address,
+ nbgl_choiceCallback_t callback)
+{
+ nbgl_useCaseAddressConfirmationExt(icon, title, address, callback, NULL);
+}
+
+/**
+ * @brief draws an extended address verification page. This page contains the given address in a
+ * tag/value layout.
+ *
+ * @param icon icon to be used on first page of address review
+ * @param title text to be used on first page of address review (NULL terminated string)
+ * @param address address to confirm (NULL terminated string)
+ * @param callback callback called when either confirm or reject page is double pressed
+ * @param tagValueList list of tag/value pairs (must be persistent because no copy)
+ */
+void nbgl_useCaseAddressConfirmationExt(const nbgl_icon_details_t *icon,
+ const char *title,
+ const char *address,
+ nbgl_choiceCallback_t callback,
+ const nbgl_layoutTagValueList_t *tagValueList)
+{
+ // memorize context
+ memset(&context, 0, sizeof(UseCaseContext_t));
+ context.review.forwardNavOnly = false;
+ context.type = REVIEW_USE_CASE;
+
+ if (tagValueList) {
+ memcpy(&context.review.tagValueList, tagValueList, sizeof(nbgl_layoutTagValueList_t));
+ }
+
+ context.review.address = address;
+ context.review.reviewTitle = title;
+ context.review.icon = icon;
+ context.review.acceptText = "Approve";
+ context.review.rejectText = "Reject";
+ context.review.onChoice = callback;
+
+ context.currentPage = 0;
+ // + 4 because 1 page for title, 1 for address and 2 pages at the end for approve/reject
+ context.nbPages = 4;
+ if (tagValueList) {
+ context.nbPages += tagValueList->nbPairs;
+ }
+
+ displayReviewPage(FORWARD_DIRECTION);
+}
+
+/**
+ * @brief draw a spinner page with the given parameters. The spinner will "turn" automatically every
+ * 800 ms
+ *
+ * @param text text to use under spinner
+ */
+void nbgl_useCaseSpinner(const char *text)
+{
+ // pageContext = nbgl_pageDrawSpinner(NULL, (const char*)text);
+ UNUSED(text);
+ nbgl_refresh();
+}
+
+#endif // HAVE_SE_TOUCH
+#endif // NBGL_USE_CASE
diff --git a/sdk_lib_nbgl/tools/bmp2display.py b/sdk_lib_nbgl/tools/bmp2display.py
new file mode 100644
index 00000000..9e188553
--- /dev/null
+++ b/sdk_lib_nbgl/tools/bmp2display.py
@@ -0,0 +1,217 @@
+#!/usr/bin/env python3
+# coding: utf-8
+"""
+Converts input bmp file in 24 bits format to Stax bitmap, as buffer in stdout
+"""
+# -----------------------------------------------------------------------------
+import argparse
+import gzip
+
+def get4BPPval(buffer,i):
+ pixel_val = buffer[i]+(buffer[i+1]<<8)+(buffer[i+2]<<16)
+
+ if (pixel_val > 0xF0F0F0):
+ return 0xF
+ elif (pixel_val > 0xE0E0E0):
+ return 0xE
+ elif (pixel_val > 0xD0D0D0):
+ return 0xD
+ elif (pixel_val > 0xC0C0C0):
+ return 0xC
+ elif (pixel_val > 0xB0B0B0):
+ return 0xB
+ elif (pixel_val > 0xA0A0A0):
+ return 0xA
+ elif (pixel_val > 0x909090):
+ return 0x9
+ elif (pixel_val > 0x808080):
+ return 0x8
+ elif (pixel_val > 0x707070):
+ return 0x7
+ elif (pixel_val > 0x606060):
+ return 0x6
+ elif (pixel_val > 0x505050):
+ return 0x5
+ elif (pixel_val > 0x404040):
+ return 0x4
+ elif (pixel_val > 0x303030):
+ return 0x3
+ elif (pixel_val > 0x202020):
+ return 0x2
+ elif (pixel_val > 0x101010):
+ return 0x1
+ else:
+ return 0
+
+def get2BPPval(color_index):
+ pixel_val = color_index[0]<<16+color_index[1]<<8+color_index[0]
+ if (pixel_val == 0xFFFFFF):
+ return 3
+ elif (pixel_val > 0x808080):
+ return 2
+ elif (pixel_val > 0x404080):
+ return 1
+ else:
+ return 0
+
+def get1BPPval(color_index):
+ pixel_val = color_index[0]<<16+color_index[1]<<8+color_index[0]
+ if (pixel_val > 0xF0F0F0):
+ return 0
+ else:
+ return 1
+
+def parse_bmp_file(bmp_file_name: str, bpp: int):
+ pixels_buffer = []
+ with open(bmp_file_name, 'rb') as f:
+ buffer = f.read()
+ offset = buffer[0xA] + (buffer[0xB]<<8) + (buffer[0xC]<<16) + (buffer[0xD]<<24)
+ width = buffer[0x12] + (buffer[0x13]<<8)
+ height = buffer[0x16] + (buffer[0x17]<<8)
+ bmp_bpp = buffer[0x1C] + (buffer[0x1D]<<8)
+ row_size = int(((int(bmp_bpp)*int(width)+31)/32))<<2
+
+ #BMP header is bytes long in 24BPP mode
+ #lines are given from bottom to top, from left to right
+ nb_bytes = 0
+ cur_byte = 0
+ pixel_idx = 0
+ line = ' '
+ for x in range(width):
+ for y in range (height-1,-1,-1):
+ i = int(offset+(y*row_size+x*bmp_bpp/8))
+ if (bpp == 1):
+ bpp_format = 0
+ if (buffer[i] != 0xFF):
+ cur_byte |= (1<<(7-pixel_idx))
+ elif (bpp == 2):
+ bpp_format = 1
+ pixel_val = buffer[i]+(buffer[i+1]<<8)+(buffer[i+2]<<16)
+ if (pixel_val == 0xFFFFFF):
+ cur_byte |= (0x3<<(6-pixel_idx))
+
+ elif (pixel_val > 0):
+ cur_byte |= (0x2<<(6-pixel_idx))
+ elif (bpp == 4):
+ bpp_format = 2
+ cur_byte |= get4BPPval(buffer, i)<<(4-pixel_idx)
+
+ pixel_idx+=bpp
+ # the byte is fully filled, let's save its content
+ if (pixel_idx%8 == 0):
+ pixels_buffer.append(cur_byte)
+ nb_bytes+=1
+ cur_byte = 0
+ pixel_idx = 0
+
+ return (bytes(pixels_buffer), width, height)
+
+def apply_compression(pixels: bytearray) -> bytes:
+ output_buffer = []
+ # cut into chunks of 2048 bytes max of uncompressed data (because decompression needs the full buffer)
+ full_uncompressed_size = len(pixels)
+ i = 0
+ while full_uncompressed_size>0:
+ chunk_size = min(2048,full_uncompressed_size)
+ tmp = bytes(pixels_buffer[i:i+chunk_size])
+ #print("len = %d"%len(tmp))
+ #print("0x%X"%tmp[chunk_size-1])
+ compressed_buffer = gzip.compress(tmp)
+ output_buffer += [len(compressed_buffer)&0xFF, (len(compressed_buffer)>>8)&0xFF]
+ output_buffer += compressed_buffer
+ full_uncompressed_size -= chunk_size
+ i+=chunk_size
+
+ return bytearray(output_buffer)
+
+def format_image(img: bytearray, width: int, height: int, compression: bool) -> bytes:
+ BPP_FORMATS = {
+ 1: 0,
+ 2: 1,
+ 4: 2
+ }
+
+ result = [width&0xFF, width>>8, height&0xFF, height>>8,
+ (BPP_FORMATS[args.bpp]<<4) | compression, len(img)&0xFF, (len(img)>>8)&0xFF,
+ (len(img)>>16)&0xFF]
+ result.extend(output_buffer)
+ return bytearray(result)
+
+
+# -----------------------------------------------------------------------------
+# Program entry point:
+# -----------------------------------------------------------------------------
+if __name__ == "__main__":
+ # -------------------------------------------------------------------------
+ # Parse arguments:
+ parser = argparse.ArgumentParser(
+ description="Converts input bmp file in 24 bits format to Stax bitmap, as buffer in stdout")
+
+ parser.add_argument(
+ "-i", "--input",
+ dest="input", type=str,
+ required=True,
+ help="bmp file")
+
+ parser.add_argument(
+ "-b", "--bpp",
+ dest="bpp", type=int,
+ required=True,
+ help="number of bit per pixel (1, 2 or 4)")
+
+ parser.add_argument(
+ '--compress',
+ action='store_true',
+ default=False,
+ help="compress data")
+
+ parser.add_argument(
+ '--file',
+ action='store_true',
+ default=False,
+ help="store in Ledger image format")
+
+ parser.add_argument(
+ '--outfile',
+ dest='outfile', type=str,
+ required=False,
+ help='Optional outfile name'
+ )
+
+ parser.add_argument(
+ '--check-size',
+ dest='check_size', type=str,
+ required=False,
+ help='Check size of the input bmp (example: 480x512)'
+ )
+
+ args = parser.parse_args()
+
+ pixels_buffer, width, height = parse_bmp_file(args.input, args.bpp)
+
+ # Check size
+ if args.check_size:
+ xref, yref = args.check_size.split('x')
+ assert ((int(xref), int(yref)) == (width, height)), \
+ f" Input file does not match required size {args.check_size}"
+
+ # Apply compression
+ if args.compress:
+ output_buffer = apply_compression(bytes(pixels_buffer))
+ else:
+ output_buffer = pixels_buffer
+
+ # Apply file formatting
+ if args.file:
+ result = format_image(output_buffer, width, height, args.compress)
+ else:
+ result = output_buffer
+
+ if args.outfile is None:
+ # Print result
+ print(result.hex())
+ else:
+ # Write to output file
+ with open(args.outfile, 'wb') as out_file:
+ print(f'Write {out_file.name}')
+ out_file.write(bytes(result))
diff --git a/sdk_lib_nbgl/tools/generate_ledgerimg.sh b/sdk_lib_nbgl/tools/generate_ledgerimg.sh
new file mode 100755
index 00000000..644ee398
--- /dev/null
+++ b/sdk_lib_nbgl/tools/generate_ledgerimg.sh
@@ -0,0 +1,30 @@
+# Generate a ledgerimg from any input image file
+#
+# Example:
+# ```
+# sh tools/generate_ledgerimg.sh ~/Downloads/cryptopunk.png
+# Write /home/abonnaudet/Downloads/cryptopunk.bmp
+# Write /home/abonnaudet/Downloads/cryptopunk.ledgerimg
+# ```
+
+## Configs
+
+# Front screen dimension
+FRONT_SCREEN_WIDTH=400
+FRONT_SCREEN_HEIGHT=672
+
+# Path to bmp2display python script
+BMP2DISPLAY_PY=$BOLOS_NG/public_sdk/lib_nbgl/tools/bmp2display.py
+
+# Input file is the first argument
+FILE_INPUT=$1
+
+## Generate a 24 bits BMP file
+FRONT_SCREEN_DIM=$FRONT_SCREEN_WIDTH"x"$FRONT_SCREEN_HEIGHT
+FILE_OUTPUT_BMP=${FILE_INPUT%.*}.bmp
+convert $FILE_INPUT -resize $FRONT_SCREEN_DIM -background white -compose Copy -gravity center -type truecolor -extent $FRONT_SCREEN_DIM $FILE_OUTPUT_BMP
+echo "Write" $FILE_OUTPUT_BMP
+
+## Convert BMP file into ledgerimg
+FILE_OUTPUT_LEDGERIMG=${FILE_INPUT%.*}.ledgerimg
+python3 $BMP2DISPLAY_PY --file --compress --input $FILE_OUTPUT_BMP --bpp 4 --outfile $FILE_OUTPUT_LEDGERIMG
diff --git a/sdk_lib_nbgl/tools/icon2glyph.py b/sdk_lib_nbgl/tools/icon2glyph.py
new file mode 100755
index 00000000..98175952
--- /dev/null
+++ b/sdk_lib_nbgl/tools/icon2glyph.py
@@ -0,0 +1,370 @@
+#!/usr/bin/env python3
+
+"""
+Converts the given icons, in bmp or gif format, to Stax compatible glyphs, as C arrays
+"""
+
+import argparse
+import math
+import os
+import binascii
+import sys
+import traceback
+import gzip
+
+from enum import IntEnum
+from PIL import Image as img, ImageOps
+from PIL.Image import Image
+from typing import Tuple, Optional
+
+from nbgl_rle import Rle1bpp, Rle4bpp
+
+
+class NbglFileCompression(IntEnum):
+ NoCompression = 0
+ Gzlib = 1,
+ Rle = 2
+
+
+def is_power2(n):
+ return n != 0 and ((n & (n - 1)) == 0)
+
+
+def open_image(file_path) -> Optional[Tuple[Image, int]]:
+ """
+ Open and prepare image for processing.
+ Returns None if image has too many colors or does not exist.
+ else returns tuple: Image, bpp
+ """
+ # Check existente
+ if not os.path.exists(file_path):
+ sys.stderr.write("Error: {} does not exist!".format(file_path) + "\n")
+
+ # Load Image in mode L
+ im = img.open(file_path)
+ im.load()
+ im = im.convert('L')
+
+ # Do not open image with more than 16 colors
+ num_colors = len(im.getcolors())
+ if num_colors > 16:
+ sys.stderr.write(
+ "Error: input file {} has too many colors".format(file_path) + "\n")
+ return None
+
+ # Compute bits_per_pixel
+ # Round number of colors to a power of 2
+ if not is_power2(num_colors):
+ num_colors = int(pow(2, math.ceil(math.log(num_colors, 2))))
+
+ bits_per_pixel = int(math.log(num_colors, 2))
+ if bits_per_pixel == 3:
+ bits_per_pixel = 4
+
+ if bits_per_pixel == 0:
+ bits_per_pixel = 1
+
+ # Invert if bpp is 1
+ if bits_per_pixel == 1:
+ im = ImageOps.invert(im)
+
+ return im, bits_per_pixel
+
+
+def image_to_packed_buffer(img, bpp: int, reverse_1bpp):
+ """
+ Rotate and pack bitmap data of the character.
+ """
+ width, height = img.size
+
+ current_byte = 0
+ current_bit = 0
+ image_data = []
+ nb_colors = pow(2, bpp)
+ base_threshold = int(256 / nb_colors)
+ half_threshold = int(base_threshold / 2)
+
+ # col first
+ for col in reversed(range(width)):
+ for row in range(height):
+ # Return an index in the indexed colors list
+ # top to bottom
+ # Perform implicit rotation here (0,0) is left top in NBGL,
+ # and generally left bottom for various canvas
+ color_index = img.getpixel((col, row))
+ color_index = int((color_index + half_threshold) / base_threshold)
+
+ if color_index >= nb_colors:
+ color_index = nb_colors - 1
+
+ if bpp == 1 and reverse_1bpp:
+ color_index = (color_index+1)&0x1
+
+ # le encoded
+ current_byte += color_index << ((8-bpp)-current_bit)
+ current_bit += bpp
+
+ if current_bit >= 8:
+ image_data.append(current_byte & 0xFF)
+ current_bit = 0
+ current_byte = 0
+
+ # Handle last byte if any
+ if current_bit > 0:
+ image_data.append(current_byte & 0xFF)
+
+ return bytes(image_data)
+
+
+# Compressions functions
+
+
+def rle_compress(im: Image, bpp, reverse) -> Optional[bytes]:
+ """
+ Run RLE compression on input image
+ """
+ if bpp == 1:
+ return Rle1bpp.rle_1bpp(im, reverse)[1]
+ elif bpp == 2:
+ # No compression supports BPP2
+ return None
+ elif bpp == 4:
+ return Rle4bpp.rle_4bpp(im)[1]
+
+
+def gzlib_compress(im: Image, bpp: int, reverse) -> bytes:
+ """
+ Run gzlib compression on input image
+ """
+ pixels_buffer = image_to_packed_buffer(im, bpp, reverse)
+ output_buffer = []
+ # cut into chunks of 2048 bytes max of uncompressed data (because decompression needs the full buffer)
+ full_uncompressed_size = len(pixels_buffer)
+ i = 0
+ while full_uncompressed_size > 0:
+ chunk_size = min(2048, full_uncompressed_size)
+ tmp = bytes(pixels_buffer[i:i+chunk_size])
+ compressed_buffer = gzip.compress(tmp, mtime=0)
+ output_buffer += [len(compressed_buffer) & 0xFF,
+ (len(compressed_buffer) >> 8) & 0xFF]
+ output_buffer += compressed_buffer
+ full_uncompressed_size -= chunk_size
+ i += chunk_size
+
+ return bytearray(output_buffer)
+
+
+NBGL_IMAGE_FILE_HEADER_SIZE = 8
+
+
+def compress(im: Image, bpp, reverse) -> Tuple[NbglFileCompression, bytes]:
+ """
+ Compute multiple compression methods on the input image,
+ and return a tuple containing:
+ - The best compression method achieved
+ - The associated compressed bytes
+ """
+ # GZlib is not supported on Nanos
+ if not reverse:
+ compressed_bufs = {
+ NbglFileCompression.NoCompression: image_to_packed_buffer(im, bpp, reverse),
+ NbglFileCompression.Gzlib: gzlib_compress(im, bpp, reverse),
+ NbglFileCompression.Rle: rle_compress(im, bpp, reverse)
+ }
+ else:
+ compressed_bufs = {
+ NbglFileCompression.NoCompression: image_to_packed_buffer(im, bpp, reverse),
+ NbglFileCompression.Rle: rle_compress(im, bpp, reverse)
+ }
+
+ min_len = len(compressed_bufs[NbglFileCompression.NoCompression])
+ min_comp = NbglFileCompression.NoCompression
+
+ for compression, buffer in compressed_bufs.items():
+ if buffer is None:
+ continue
+
+ final_length = len(buffer)
+ if compression != NbglFileCompression.NoCompression:
+ final_length += NBGL_IMAGE_FILE_HEADER_SIZE
+
+ if min_len > final_length:
+ min_len = final_length
+ min_comp = compression
+
+ return min_comp, compressed_bufs[min_comp]
+
+
+def convert_to_image_file(image_data: bytes, width: int, height: int,
+ bpp: int, compression: NbglFileCompression) -> bytes:
+ """
+ Returns an image file version of the input image data and parameters
+ """
+ BPP_FORMATS = {
+ 1: 0,
+ 2: 1,
+ 4: 2
+ }
+
+ result = [width & 0xFF, width >> 8,
+ height & 0xFF, height >> 8,
+ (BPP_FORMATS[bpp] << 4) | compression,
+ len(image_data) & 0xFF, (len(image_data) >> 8) & 0xFF, (len(image_data) >> 16) & 0xFF]
+ result.extend(image_data)
+ return bytes(bytearray(result))
+
+
+def compute_app_icon_data(im: Image, bpp, reverse) -> Tuple[bool, bytes]:
+ """
+ Process image as app icon:
+ - App icon are always image file
+ - Compression is not limited to 64x64
+ """
+ compression, image_data = compress(im, bpp, reverse)
+ is_file = True
+ width, height = im.size
+ image_data = convert_to_image_file(
+ image_data, width, height, bpp, compression)
+ return is_file, image_data
+
+
+def compute_regular_icon_data(no_comp: bool, im: Image, bpp, reverse) -> Tuple[bool, bytes]:
+ """
+ Process image as regular icon:
+ - Regular icon are image file only if compressed
+ - Compression is limited to images bigger than 64x64
+ """
+ width, height = im.size
+
+ if not no_comp:
+ compression, image_data = compress(im, bpp, reverse)
+ if compression != NbglFileCompression.NoCompression:
+ is_file = True
+ image_data = convert_to_image_file(
+ image_data, width, height, bpp, compression)
+ else:
+ is_file = False
+ else:
+ is_file = False
+ image_data = image_to_packed_buffer(im, bpp, reverse)
+ return is_file, image_data
+
+# glyphs.c/.h chunk files generators
+
+
+def print_glyphfile_top(add_include: bool):
+ if add_include:
+ print("#include \"glyphs.h\"")
+ print(
+ """\
+#ifdef HAVE_NBGL
+#include \"nbgl_types.h\"
+#else
+#include
+#endif
+""")
+
+
+def print_glyphcfile_data(image_name, bpp, image_data):
+ print("uint8_t const C_{0}_bitmap[] = {{".format(image_name))
+ for i in range(0, len(image_data), 16):
+ print(" " + ", ".join("0x{0:02x}".format(c)
+ for c in image_data[i:i+16]) + ",")
+ print("};")
+ print("""#ifdef HAVE_NBGL
+const nbgl_icon_details_t C_{0} = {{ GLYPH_{0}_WIDTH, GLYPH_{0}_HEIGHT, NBGL_BPP_{1}, GLYPH_{0}_ISFILE, C_{0}_bitmap }};
+#endif // HAVE_NBGL
+""".format(image_name, bpp))
+
+
+def print_glyphcheader_data(image_name, bpp, width, height, is_file, image_data):
+ if is_file:
+ is_file = 'true'
+ else:
+ is_file = 'false'
+
+ print("""#ifndef GLYPH_{0}_BPP
+ #define GLYPH_{0}_WIDTH {1}
+ #define GLYPH_{0}_HEIGHT {2}
+ #define GLYPH_{0}_ISFILE {3}
+ #define GLYPH_{0}_BPP {4}""".format(image_name, width, height, is_file, bpp))
+ print(" extern uint8_t const C_{0}_bitmap[{1:d}];".format(
+ image_name, len(image_data)))
+ print(""" #ifdef HAVE_NBGL
+ extern const nbgl_icon_details_t C_{0};
+ #endif // HAVE_NBGL
+#endif // GLYPH_{0}_BPP
+""".format(image_name))
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description='Generate source code for NBGL icons.')
+ parser.add_argument('image_file', help="""
+ Icons to process.
+ Images that will be transformed through rotation or symmetry
+ must be suffixed by '_nocomp' (example: image_nocomp.png)
+ """, nargs='+')
+ parser.add_argument('--hexbitmaponly', action='store_true')
+ parser.add_argument('--glyphcheader', action='store_true')
+ parser.add_argument('--glyphcfile', action='store_true')
+ parser.add_argument('--reverse', help="Reverse B&W for 1BPP icons", action='store_true')
+ args = parser.parse_args()
+
+ # Print C header
+ if args.glyphcfile or args.glyphcheader:
+ print_glyphfile_top(args.glyphcfile)
+
+ processed_image_names = []
+ for file in args.image_file:
+ try:
+ # Get image name
+ image_name = os.path.splitext(os.path.basename(file))[0]
+
+ # if image name has already been done, then don't do it twice
+ if image_name in processed_image_names:
+ continue
+ processed_image_names.append(image_name)
+
+ # Open image in luminance format
+ opened = open_image(file)
+ if opened is not None:
+ im, bpp = opened
+ else:
+ continue
+
+ if args.hexbitmaponly:
+ # Prepare and print app icon data
+ _, image_data = compute_app_icon_data(im, bpp, args.reverse)
+ print(binascii.hexlify(image_data).decode('utf-8'))
+ else:
+ # Prepare and print regular icon data
+ width, height = im.size
+
+ # Forbid compression if the image name ends with nocomp.
+ if image_name.endswith('_nocomp'):
+ no_comp = True
+ image_name = image_name[:-7] # Remove nocomp suffix
+ else:
+ no_comp = False
+
+ is_file, image_data = compute_regular_icon_data(no_comp, im, bpp, args.reverse)
+
+ if args.glyphcfile:
+ print_glyphcfile_data(image_name, bpp, image_data)
+
+ if args.glyphcheader:
+ print_glyphcheader_data(
+ image_name, bpp, width, height, is_file, image_data)
+
+ except Exception as e:
+ sys.stderr.write(
+ "Exception while processing {}: {}\n".format(file, e))
+ try:
+ traceback.print_tb()
+ except:
+ pass
+
+
+if __name__ == "__main__":
+ main()
diff --git a/sdk_lib_nbgl/tools/nbgl_rle.py b/sdk_lib_nbgl/tools/nbgl_rle.py
new file mode 100644
index 00000000..86d8dd96
--- /dev/null
+++ b/sdk_lib_nbgl/tools/nbgl_rle.py
@@ -0,0 +1,337 @@
+from typing import List, Tuple
+
+NB_MIN_PACKED_PIXELS = 3
+NB_MAX_PACKED_PIXELS = 6
+class Rle4bpp():
+
+ @staticmethod
+ def image_to_pixels(img, bpp: int) -> List[Tuple]:
+ """
+ Rotate and pack bitmap data of the character.
+ """
+ width, height = img.size
+
+ color_indexes = []
+ nb_colors = pow(2, bpp)
+ base_threshold = int(256 / nb_colors)
+ half_threshold = int(base_threshold / 2)
+
+ # col first
+ for col in reversed(range(width)):
+ for row in range(height):
+ # Return an index in the indexed colors list
+ # top to bottom
+ # Perform implicit rotation here (0,0) is left top in NBGL,
+ # and generally left bottom for various canvas
+ color_index = img.getpixel((col, row))
+ color_index = int((color_index + half_threshold) / base_threshold)
+
+ if color_index >= nb_colors:
+ color_index = nb_colors - 1
+
+ color_indexes.append(color_index)
+
+ return color_indexes
+
+
+ @staticmethod
+ def pixels_to_occurrences(pixels: List[int]) -> List[Tuple]:
+ occurrences = []
+ for pixel in pixels:
+ if len(occurrences) == 0:
+ occurrences.append((pixel, 1))
+ else:
+ color, cnt = occurrences[-1]
+ if pixel == color:
+ occurrences[-1] = (pixel, cnt+1)
+ else:
+ occurrences.append((pixel, 1))
+ return occurrences
+
+ # Fetch next single pixels that can be packed
+ @classmethod
+ def fetch_next_single_pixels(cls, occurrences: List[Tuple[int, int]]) -> List[int]:
+ result = []
+ for occurrence in occurrences:
+ color, cnt = occurrence
+ if cnt >= 2:
+ break
+ else:
+ result.append(color)
+
+ # Ensure pixels can be packed by groups
+ nb_pixels = len(result)
+ if (nb_pixels % NB_MAX_PACKED_PIXELS < NB_MIN_PACKED_PIXELS):
+ return result[0:(nb_pixels - nb_pixels%NB_MIN_PACKED_PIXELS)]
+ return result
+
+ # Generate bytes from a list of single pixels
+ def generate_packed_single_pixels_bytes(packed_occurences: List[int]) -> bytes:
+ assert len(packed_occurences) >= 3
+ assert len(packed_occurences) <= 6
+ header = (0b10 << 2) | (len(packed_occurences) - 3)
+ nibbles = [header]
+ for occurrence in packed_occurences:
+ nibbles.append(occurrence)
+
+ result = []
+ for i, nibble in enumerate(nibbles):
+ if (i % 2) == 0:
+ result.append(nibble << 4)
+ else:
+ result[-1] += nibble
+ return bytes(result)
+
+ @classmethod
+ def handle_packed_pixels(cls, packed_occurences: List[int]) -> bytes:
+ assert len(packed_occurences) >= 3
+ result = bytes()
+ for i in range(0, len(packed_occurences), NB_MAX_PACKED_PIXELS):
+ result += cls.generate_packed_single_pixels_bytes(packed_occurences[i:i+NB_MAX_PACKED_PIXELS])
+ return result
+
+ @staticmethod
+ def handle_white_occurrence(occurrence: Tuple[int, int]) -> bytes:
+ _, cnt = occurrence
+ unit_cnt_max = 64
+ result = []
+
+ for i in range(0, cnt, unit_cnt_max):
+ diff_cnt = cnt - i
+ if diff_cnt > unit_cnt_max:
+ i_cnt = unit_cnt_max
+ else:
+ i_cnt = diff_cnt
+
+ result.append((0b11 << 6) | (i_cnt-1))
+ return bytes(result)
+
+ @staticmethod
+ def handle_non_white_occurrence(occurrence: Tuple[int, int]) -> bytes:
+ color, cnt = occurrence
+ unit_cnt_max = 8
+ result = []
+
+ for i in range(0, cnt, unit_cnt_max):
+ diff_cnt = cnt - i
+ if diff_cnt > unit_cnt_max:
+ i_cnt = unit_cnt_max
+ else:
+ i_cnt = diff_cnt
+
+ result.append((0 << 7) | (i_cnt-1) << 4 | color)
+
+ return bytes(result)
+
+ @classmethod
+ def occurrences_to_rle(cls, occurrences: Tuple[int, int], bpp: int) -> bytes:
+ result = bytes()
+ WHITE_COLOR = pow(2, bpp) - 1
+ i = 0
+ while i < len(occurrences):
+ # Check if next occurrences are packable in single occurrences
+ single_pixels = cls.fetch_next_single_pixels(occurrences[i:])
+ if len(single_pixels) > 0:
+ # Pack single occurrences
+ result += cls.handle_packed_pixels(single_pixels)
+ i += len(single_pixels)
+ else:
+ # Encode next occurrence
+ occurrence = occurrences[i]
+ color, _ = occurrence
+ if color == WHITE_COLOR:
+ result += cls.handle_white_occurrence(occurrence)
+ else:
+ result += cls.handle_non_white_occurrence(occurrence)
+ i += 1
+ return result
+
+ @classmethod
+ def rle_4bpp(cls, img) -> Tuple[int, bytes]:
+ bpp = 4
+ pixels = cls.image_to_pixels(img, bpp)
+ occurrences = cls.pixels_to_occurrences(pixels)
+ return 1, cls.occurrences_to_rle(occurrences, bpp)
+
+# -----------------------------------------------------------------------------
+class Rle1bpp():
+ """
+ Class handling custom RLE encoding, optimized for 1PP.
+ The generated bytes will contain alternances counts ZZZZOOOO with
+ - ZZZZ: number of consecutives 0, from 0 to 15
+ - OOOO: number of consecutives 1, from 0 to 15
+ """
+ # -------------------------------------------------------------------------
+ @staticmethod
+ def image_to_pixels(img, reverse):
+ """
+ Rotate and pack bitmap data of the character.
+ return an array of pixels values.
+ """
+ width, height = img.size
+
+ pixels = []
+ # Intensity level value to be considered a white pixel
+ white_threshold = 128
+ if reverse:
+ white_pixel = 0
+ black_pixel = 1
+ else:
+ white_pixel = 1
+ black_pixel = 0
+
+ # col first
+ for col in reversed(range(width)):
+ for row in range(height):
+ # Return an index in the indexed colors list (0 or 1, here)
+ # top to bottom
+ # Perform implicit rotation here (0,0) is left top in NBGL,
+ # and generally left bottom for various canvas
+ if img.getpixel((col, row)) >= white_threshold:
+ pixels.append(white_pixel)
+ else:
+ pixels.append(black_pixel)
+
+ return pixels
+
+ # -------------------------------------------------------------------------
+ @staticmethod
+ def encode_pass1(data):
+ """
+ Encode array of values using 'normal' RLE.
+ Return an array of tuples containing (repeat, val)
+ """
+ output = []
+ previous_value = -1
+ count = 0
+ for value in data:
+ # Same value than before?
+ if value == previous_value:
+ count += 1
+ else:
+ # Store previous result
+ if count:
+ pair = (count, previous_value)
+ output.append(pair)
+ # Start a new count
+ previous_value = value
+ count = 1
+
+ # Store previous result
+ if count:
+ pair = (count, previous_value)
+ output.append(pair)
+
+ return output
+
+ # -------------------------------------------------------------------------
+ @staticmethod
+ def encode_pass2(pairs):
+ """
+ Encode alternance counts between pixels (nb of 0, then nb of 1, etc)
+ The generated packed values will contain ZZZZOOOO ZZZZOOOO with
+ - ZZZZ: number of consecutives 0, from 0 to 15
+ - OOOO: number of consecutives 1, from 0 to 15
+ """
+ max_count = 15
+ # First step: store alternances, and split if count > 15
+ next_pixel = 0
+ alternances = []
+ for repeat, value in pairs:
+ # Store a count of 0 pixel if next pixel is not the one expected
+ if value != next_pixel:
+ alternances.append(0)
+ next_pixel ^= 1
+
+ while repeat > max_count:
+ # Store 15 pixels of value next_pixel
+ alternances.append(max_count)
+ repeat -= max_count
+ # Store 0 pixel of alternate value
+ alternances.append(0)
+
+ if repeat:
+ alternances.append(repeat)
+ next_pixel ^= 1
+
+ # Now read all those values and store them into quartets
+ output = bytes()
+ index = 0
+
+ while index < len(alternances):
+ zeros = alternances[index]
+ index += 1
+ if index < len(alternances):
+ ones = alternances[index]
+ index += 1
+ else:
+ ones = 0
+
+ byte = (zeros << 4) | ones
+ output += bytes([byte])
+
+ return output
+
+ # -------------------------------------------------------------------------
+ @staticmethod
+ def remove_duplicates(pairs):
+ """
+ Check if there are some duplicated pairs (same values) and merge them.
+ """
+ index = len(pairs) - 1
+ while index >= 1:
+ repeat1, value1 = pairs[index-1]
+ repeat2, value2 = pairs[index]
+ # Do we have identical consecutives values?
+ if value1 == value2:
+ repeat1 += repeat2
+ # Merge them and remove last entry
+ pairs[index-1] = (repeat1, value1)
+ pairs.pop(index)
+ index -= 1
+
+ return pairs
+
+ # -------------------------------------------------------------------------
+ @classmethod
+ def decode_pass2(cls, data):
+ """
+ Decode packed bytes into array of tuples containing (repeat, value).
+ The provided packed values will contain ZZZZOOOO ZZZZOOOO with
+ - ZZZZ: number of consecutives 0, from 0 to 15
+ - OOOO: number of consecutives 1, from 0 to 15
+ """
+ pairs = []
+ for byte in data:
+ ones = byte & 0x0F
+ byte >>= 4
+ zeros = byte & 0x0F
+ if zeros:
+ pairs.append((zeros, 0))
+ if ones:
+ pairs.append((ones, 1))
+
+ # There was a limitation on repeat count => remove duplicates
+ pairs = cls.remove_duplicates(pairs)
+
+ return pairs
+
+ # -------------------------------------------------------------------------
+ @classmethod
+ def rle_1bpp(cls, img, reverse) -> Tuple[int, bytes]:
+ """
+ Input: image to compress
+ - convert the picture to an array of pixels
+ - convert the array of pixels to tuples of (repeat, value)
+ - encode using custom RLE
+ Output: array of compressed bytes
+ """
+ pixels = cls.image_to_pixels(img, reverse)
+ pairs = cls.encode_pass1(pixels)
+ encoded_data = cls.encode_pass2(pairs)
+
+ # Check if encoding/decoding is fine
+ pairs2 = cls.decode_pass2(encoded_data)
+ assert pairs == pairs2
+
+ return 1, encoded_data
diff --git a/sdk_lib_nbgl/tools/zlibcompress.py b/sdk_lib_nbgl/tools/zlibcompress.py
new file mode 100644
index 00000000..936f79a4
--- /dev/null
+++ b/sdk_lib_nbgl/tools/zlibcompress.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+# coding: utf-8
+"""
+Just a simple script to compress a given file in gzip format
+"""
+# -----------------------------------------------------------------------------
+import argparse
+import sys
+import gzip
+
+# -----------------------------------------------------------------------------
+# Program entry point:
+# -----------------------------------------------------------------------------
+if __name__ == "__main__":
+ # -------------------------------------------------------------------------
+ # Parse arguments:
+ parser = argparse.ArgumentParser(
+ description="Compress the given file in zlib")
+
+ parser.add_argument(
+ "-i", "--input",
+ dest="input", type=str,
+ help="file to compress")
+
+ parser.add_argument(
+ "-o", "--output",
+ dest="output", type=str,
+ help="Output file")
+ args = parser.parse_args()
+
+ with open(args.input, 'rb') as f:
+ s = f.read()
+ z = gzip.compress(s)
+ with open(args.output, 'wb') as f:
+ f.write(z)