Skip to content

Conversation

@NiLuJe
Copy link
Member

@NiLuJe NiLuJe commented Aug 16, 2024

  • FocusManager: Fix focus_flags check in moveFocusTo (0 is truthy in Lua, can't do AND checks like in C ;).)
  • FileManager+FileChooser: Pass our custom title bar directly to FileChooser (which also means we can now use FC's FocusManager layout directly).
  • FileChooser/Menu: Get rid of the weird outer_title_bar hack, and simply take a custom_title_bar pointer to an actual TitleBar instance instead.
  • FileManager/Menu/ListMenu/CoverMenu: Fix content height computations in _recalculateDimen (all the non-FM cases were including an old and now unused padding value, self.header_padding, leading to more blank space at the bottom than necessary, and, worse, leading to different item heights between FM views, possibly leading to unnecessary thumbnail scaling !)
  • ButtonDialog: Proper focus management when the ButtonTable is wrapped in a ScrollableContainer.
  • ConfigDialog: Implement a stupid workaround for a weird FocusManager issue when going back from [⋮] buttons.
  • ConfigDialog: Don't move the visual focus in update (i.e., we use NOT_FOCUS now that it works as intended).
  • DictQuickLookup: Ensures the Menu key bind does the exact same thing as the hamburger icon.
  • DictQuickLookup: Ensure we refocus after having mangled the FocusManager layout (prevents an old focus highlight from lingering on the wrong button).
  • FileChooser: Stop flagging it as no_title, because it is never without a title. (This behavior was a remnant of the previous FM-specific title bar hacks, which are no longer a thing).
  • FileChooser: Stop calling mergeTitleBarIntoLayout twice in updateItems. We already call Menu's, which handles it. (Prevents the title bar from being added twice to the FocusManager layout).
  • FocusManager: Relax the Unfocus checks in moveFocusTo to ensure we always unfocus something (if unfocusing was requested), even if we have to blast the whole widget tree to do so. This ensures callers that mangle self.layout can expect things to work after calling it regardless of how borked the current focus is.
  • FocusManager: Allow passing focus_flags to refocusWidget, so that it can be forwarded to the internal moveFocusTo call.
  • FocusManager: The above also allows us to enforce a default that ensures we do not send a Focus event on Touch devices, even if they have the hasDPad devcap. This essentially restores the previous/current behavior of not showing the visual feedback from such focus "events" sent programmatically, given the focus_flags check fix at the root of this PR ;).
  • InputDialog: Fix numerous issues relating to double/ghost instances of both InputText and VirtualKeyboard, ensuring we only ever have a single InputText & VK instance live.
  • InputDialog: Make sure every way we have of hiding the VK play nice together, especially when the toggleKeyboard button (shown w/ add_nav_bar) is at play. And doubly so when we're fullscreen, as hiding the VK implies resizing the widget.
  • InputText: Make sure we're flagged as in-focus when tapping inside the text field.
  • InputText: Make sure we don't attempt to show an already-visible VK in the custom hasDPad onFocus handler.
  • Menu: Get rid of an old and no longer used (nor meaningful) hack in onFocus about the initial/programmatically-sent Focus event.
  • Menu: Get rid of the unused header_padding field mentioned earlier in the FM/FC fixes.
  • Menu: Use FOCUS_ONLY_ON_NT in the explicit moveFocusTo call in updatePageInfo, so as to keep the current behavior of not showing the visual feedback of this focus on Touch devices.
  • Menu: Make sure all the moveFocusTo calls are gated behind the hasDPad devcap (previously, that was only the case for updatePageInfo, but not mergeTitleBarIntoLayout (which is called by updateItems).
  • MultiInputDialog: Actively get rid of the InputText & VK instances from the base class's constructor that we do not use.
  • MultiInputDialog: Ensure the FocusManager layout is slightly less broken (password fields can still be a bit weird, though).
  • TextViewer: Get rid of the unfocus -> layout mangling -> refocus hack now that refocusWidget handles this case sanely.
  • VirtualKeyboard: Notify our parent InputDialog when we get closed, so it can act accordingly (e.g., resize itself when fullscreen).
  • ScrollableContainer: Implement the necessary machinery for focus handling inside ButtonDialog (specifically, when scrolling via PgUp/PgDwn).
  • TextEditor: Given the above fixes, the plugin is no longer disabled on non-touch devices.
  • ReaderBookMark: Make sure we request a full refresh when closing the "Edit note" dialog, as CRe highlights may extend past its dimensions, and if it's closed separately from VK, the refresh would have been limited to its own dimensions, leaving a neat InputDialog-sized hole in the highlights ;).

c.f., #12359 (comment)


This change is Reviewable

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 16, 2024

As mentioned in #12359, this means that, on hasDPad devices, the initial focus is now always visible (except in TouchMenu & ConfigDialog, where the active tab visual makes it obvious enough that we skip it).

EDIT: In the PR's final state, this only applies to non-Touch hasDPad devices.

Screenshot_20240816_053820
Screenshot_20240816_053838

So, err, RFC, I guess?

It certainly looks funky on the emu, but it actually makes groking what the hell is happening with FocusManager much much much clearer, so I suspect it's a net win for actual UX on NT devices?

@NiLuJe NiLuJe force-pushed the focusmanager-and-fix branch from f6e79a5 to 80d5f95 Compare August 16, 2024 03:42
@Frenzie
Copy link
Member

Frenzie commented Aug 16, 2024

You can always gate it behind not isTouchDevice.

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 16, 2024

So this appear to be working fine as far as I can see, except for a couple of cases (so far). Number 1 is History (same for collections) where the X in the top right corner will remain inverted (even though is not in focus) until you cycle through it, in which case it goes back to normal. see #9041. this might disappear as an issue from kindle with #12328 but I am not running that nightly yet, in any case other hasDPad that are not kindle would still be affected.

More deceiving though is the dictionary one where the wrong element is highlighted, as you see in the pics below, one would thing Add to vocab builder is in focus but if you press press on it, menu pops up. see #11803 and (I can't find a follow up to this one that fixed something or other)

edit: in my test of Arrange items in status bar the first item is not selected as in your screenshot, weird...

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 16, 2024

@Commodore64user: Thanks, fixed both of those ;).

As for SortWidget, that requires #12359, too ;).

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 16, 2024

As for SortWidget, that requires #12359, too ;).

I see.

thanks!

that hamburger menu could go the way of the dodo too, menu button opens it now so not really necessary on kindle.

+ if not (Device:hasSymKey() or Device:hasScreenKB()) then
      table.insert(self.button_table.layout, 1, { self.dict_title.left_button });
+ end

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 16, 2024

that hamburger menu could go the way of the dodo too, menu button opens it now so not really necessary on kindle.

That would require more care because it affects the index at which the next insert needs to be. And the actual menu key on keyboards isn't bound to it anyway, so, eeeh, too much device-specific crap, pass.

@Commodore64user
Copy link
Contributor

that hamburger menu could go the way of the dodo too, menu button opens it now so not really necessary on kindle.

That would require more care because it affects the index at which the next insert needs to be. And the actual menu key on keyboards isn't bound to it anyway, so, eeeh, too much device-specific crap, pass.

Roger that.

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 16, 2024

and if

Also, Menu's default linesize is line.medium, which is generally so damn
tiny (1px) the switch from dark gray to black is barely perceptible.

is a thought spoken out loud, I agree, maybe it should be line.thick too (at the very least)

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 16, 2024

is a thought spoken out loud, I agree, maybe it should be line.thick too (at the very least)

The issue is that, unlike in TouchMenu, in Menu, it serves as the item separator, too; And the current thickness works quite well for that.

48289d9 attempts to swap it just for the focused item.

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 16, 2024

okay, so in classic mode, the unfocus does not clear the first position correctly

and it might be wise to use a similar trick for detailed list as well where the focus is also thin af.

edit: and for some reason the loop (classic mode) now includes the header items (home and plus menu) twice. just press down a lot and you'll see

@Commodore64user
Copy link
Contributor

sorry if I am pushing my luck now but, here is another one, twofold really

first the obvious huge gap at the bottom, for reference this does not happen on kindle voyage (when one uses the page turn buttons to scroll down the list) and second the focus does not move along with the scroll, that is to say, if there are 30 results you still need to press the button many many times to even see where the focus is, for reference in that pic focus is still in the very first result in the list.

@NiLuJe NiLuJe marked this pull request as draft August 17, 2024 18:11
@Commodore64user
Copy link
Contributor

And the actual menu key on keyboards isn't bound to it anyway

Just re-read this and just wanted to say, yes it is.

self.key_events.LeftButtonTap = { { "Menu" } }

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 17, 2024

Just re-read this and just wanted to say, yes it is.

Oh, it's because we bind F1 to Menu on SDL, and Menu actually gets bound to ContextMenu (which gets coopted by FocusManager for... Hold?)

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 17, 2024

For clarity, I mean KEY_MENU here, e.g., the thing right next to RCtrl ;).

@Frenzie
Copy link
Member

Frenzie commented Aug 17, 2024

which gets coopted by FocusManager for... Hold

Yes, I don't think this should be surprising. ;-) It results in a very intuitive user experience. At the moment we're missing Shift+F10 support for keyboards without KEY_MENU though.

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 17, 2024

for some reason the loop (classic mode) now includes the header items (home and plus menu) twice. just press down a lot and you'll see

That applies to master, too, FWIW.

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 18, 2024

for some reason the loop (classic mode) now includes the header items (home and plus menu) twice. just press down a lot and you'll see

That applies to master, too, FWIW.

And what a doozy that turned out to be.. -_-".

We had two different TitleBar in there, because Menu insisted on creating one, but FileManager wanted to display its own, so there was an hilariously broken mix of hacks to display one and not the other (maybe, mostly), but both ended up seeping through to FocusManager...

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 18, 2024

And what a doozy that turned out to be.. -_-".

We had two different TitleBar in there, because Menu insisted on creating one, but FileManager wanted to display its own, so there was an hilariously broken mix of hacks to display one and not the other (maybe, mostly), but both ended up seepign through to FocusManager...

MVP goes to the default titlebar having a close button, because I noticed that there was a ghost widget in the cycle (conveniently at 1,1), and introspection revealed icon = "close" which made me go: WTF?! But also helped tremendously with identifying the issue.

table.insert(self.layout, menu_item_layout_start_row, row)
menu_item_layout_start_row = menu_item_layout_start_row + 1
end
-- Menu uses the right key to trigger the context menu: we can't use it to move focus in horizontal directions.
Copy link
Contributor

@Commodore64user Commodore64user Aug 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For reference, this is no longer the case, unless you have hasFewKeys, all other devices have full dPad navigation functionality. But then again, kindle skips adding these to focus manager, so this mainly is for not kindle targets.

Copy link
Member Author

@NiLuJe NiLuJe Aug 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took that to mean that Menu (the class) binds Menu (the key), so it cannot uses FocusManager's own Menu bind.

Which is true (on SDL, because FocusManager actually binds ContextMenu, which we discussed a few hours ago.. somewhere ;p).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, it's talking about the Right key, lol.

I clearly need more sleep.

@Commodore64user
Copy link
Contributor

because I noticed that there was a ghost widget in the cycle

this sounds remarkably similar to what happens with multiinputtext. There is a random ghost ether-like step in the cycle as seen here #9093 (comment)

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 18, 2024

sorry if I am pushing my luck now but, here is another one, twofold really

first the obvious huge gap at the bottom, for reference this does not happen on kindle voyage (when one uses the page turn buttons to scroll down the list) and second the focus does not move along with the scroll, that is to say, if there are 30 results you still need to press the button many many times to even see where the focus is, for reference in that pic focus is still in the very first result in the list.

That... wasn't pretty ;).

I'm woefully unfamiliar with those widgets, so if @poire-z has any better ideas on how to handle ButtonDialog's ScrollableContainer given that the only thing that's a FocusManager is the ButtonTable, feel free to look at my horrible hack in d550610 ;).

@poire-z
Copy link
Contributor

poire-z commented Aug 18, 2024

here is another one, twofold really

first the obvious huge gap at the bottom, for reference this does not happen on kindle voyage (when one uses the page turn buttons to scroll down the list)

That huge gap is actually a "feature":
On this screenshot, I think we got 30 results, but the height allows for showing only 18 results "per page". So, we show 18 results on the first page. When the user scrolls down, we show the "remaining" resuults, so only 12, and we start on the 19th result at top, so 6 "holes" at the bottom.
If we were not, and we would anchor the last result at the bottom, we would show 18 results and no blank gap, but the user would have to find out where to start reading results again and skip the 6 he has already glanced at.
We thought about OCD users: they can just scroll down once more, and the whole thing will be anchored at the bottom.
The "solution" would be to guess (might not be possible) the height this ButtonTable will be, and adjust the number of results so it's a multiple of the nb of slots. I have the feeling I added something like that or the other way around, requesting 30 results because then, we can show 5 or 10 or 15 results per page, without blank - and forcing the button table to be exactly the height of 5 or 10 or 15 results. (May be this wasn't ensure on the tall dict lookup?)

I'm woefully unfamiliar with those widgets, so if @poire-z has any better ideas on how to handle ButtonDialog's ScrollableContainer given that the only thing that's a FocusManager is the ButtonTable, feel free to look at my horrible hack in d550610 ;).

Well, I have become unfamiliar with them :)
(And I'd like to keep my sanity and stop following @Commodore64user esoteric adventures in our obscure parts of the code. I'm glad you can be focused enough to dig (into) FocusManager :))

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 18, 2024

But @poire-z why then the kindle voyage doesn't have those massive gaps as well when using the page turn button to scroll. There, it seems to accurately adjust the height just fine...

Btw that is not OCD, unacceptable is what it is ;)

@poire-z
Copy link
Contributor

poire-z commented Aug 18, 2024

Dunno, that might be for you to investigate why you end up with 18, while this should ensure we end up with 15, 10 or 6 :/:

button_dialog = ButtonDialog:new{
width = max_width,
shrink_unneeded_width = true,
buttons = buttons,
-- We requested 30 results, so we will probably be scrolling.
-- If we do, ensure we use these values (they will all make full pages
-- if we get 30 results), depending on what the screen height allows.
rows_per_page = { 15, 10, 6 },

local step_scroll_grid = self.buttontable:getStepScrollGrid()
local row_height = step_scroll_grid[1].bottom + 1 - step_scroll_grid[1].top
local fit_rows = math.floor(max_height / row_height)
if self.rows_per_page then
if type(self.rows_per_page) == "number" then
if fit_rows > self.rows_per_page then
fit_rows = self.rows_per_page
end
else
for _, nb in ipairs(self.rows_per_page) do
if fit_rows >= nb then
fit_rows = nb
break
end
end
end
end
-- (Comment the next line to test ScrollableContainer behaviour when things do not fit)
max_height = row_height * fit_rows

@Commodore64user
Copy link
Contributor

Commodore64user commented Aug 18, 2024

How fun, you can get it in the opposite end as well. to replicate: double press PgFwd and PgBack. Voyage on the right

wiki search logs (if of any help)
08/18/24-11:35:47 DEBUG key event => code: 49 (N), value: 0, time: 1723977347.095384 
08/18/24-11:35:47 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:35:48 DEBUG key event => code: 194 (Press), value: 1, time: 1723977348.002545 
08/18/24-11:35:48 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:35:48 DEBUG key event => code: 194 (Press), value: 0, time: 1723977348.120844 
08/18/24-11:35:48 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:35:48 DEBUG close widget: table: 0x44705e98 
08/18/24-11:35:48 DEBUG setDirty via a func from widget nil 
08/18/24-11:35:48 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:35:48 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:35:48 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:35:48 DEBUG UIManager:preventStandby, counter increased to 1 
08/18/24-11:35:48 DEBUG Calling https://translate.googleapis.com/translate_a/single?sl=auto&tl=en&client=gtx&dt=t&dt=at&dt=md&otf=1&oe=UTF-8&hl=en&ssel=0&tsel=0&ie=UTF-8&q=lewis%20hamilton 
08/18/24-11:35:48 DEBUG translator json: {
{
  {
    "lewis hamilton",
    "lewis hamilton",
    [5] = 5,
    n = 5
  } --[[table: 0x4ce59850]]
} --[[table: 0x41329f80]],
nil,
"en",
nil,
nil,
nil,
0.95046306000000003,
{} --[[table: 0x411ca160]],
{
  {
    "en"
  } --[[table: 0x4c800ed8]],
  nil,
  {
    0.95046306000000003
  } --[[table: 0x44098a18]],
  {
    "en"
  } --[[table: 0x42d14960]]
} --[[table: 0x4c966728]]
} --[[table: 0x4162bfe8]] 
08/18/24-11:35:48 DEBUG detected language: en 
08/18/24-11:35:48 DEBUG lookup word: lewis hamilton nil nil 
08/18/24-11:35:48 DEBUG stripped word: lewis hamilton 
08/18/24-11:35:48 DEBUG ImageWidget: _render'ing resources/icons/mdlight/notice-info.svg 40 40 
08/18/24-11:35:48 DEBUG ImageWidget: initial offsets 0 0 
08/18/24-11:35:48 DEBUG show widget: table: 0x4c567220 
08/18/24-11:35:48 DEBUG setDirty nil from widget table: 0x4c567220 w/ NO region; dithering: nil 
08/18/24-11:35:48 DEBUG setDirty via a func from widget table: 0x4c567220 
08/18/24-11:35:49 DEBUG painting widget: table: 0x44644168 
08/18/24-11:35:49 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:35:49 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:35:49 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:35:49 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:35:49 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:35:49 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:35:49 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:35:49 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:35:49 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:35:49 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:35:49 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:35:49 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:35:49 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:35:49 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:35:49 DEBUG painting widget: table: 0x4c567220 
08/18/24-11:35:49 DEBUG blitFrom 75 380 0 0 40 40 
08/18/24-11:35:49 DEBUG _refresh: Enqueued ui update for region 58 320 484 159 dithering: true 
08/18/24-11:35:49 DEBUG _refresh: Enqueued ui update for region 58 320 484 159 dithering: true 
08/18/24-11:35:49 DEBUG triggering refresh {
mode = "ui",
region = "484x159+58+320"
} --[[table: 0x4149b370]] 
08/18/24-11:35:49 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:49 DEBUG process not yet done, will check again soon 
08/18/24-11:35:49 DEBUG UIManager:_standbyTransition -> PreventStandby 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:50 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:50 DEBUG process not yet done, will check again soon 
08/18/24-11:35:51 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:51 DEBUG process not yet done, will check again soon 
08/18/24-11:35:51 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:51 DEBUG process not yet done, will check again soon 
08/18/24-11:35:51 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:51 DEBUG process not yet done, will check again soon 
08/18/24-11:35:51 DEBUG subprocess_done: true  stuff_to_read: true 
08/18/24-11:35:52 DEBUG wiki result json: {
continue = {
  continue = "||info|pageimages",
  excontinue = 20
} --[[table: 0x44214f40]],
limits = {
  extracts = 20
} --[[table: 0x42c90068]],
query = {
  pages = {
    ["675561"] = {
      contentmodel = "wikitext",
      extract = "Sir Lewis Carl Davidson Hamilton   (born 7 January 1985) is a British racing driver competing in Formula One, driving for Mercedes. Hamilton has won a joint-record seven Formula One World Drivers' Championship titles (tied with Michael Schumacher), and holds the records for most wins (105), pole positions (104), and podium finishes (201), among others.\nBorn and raised in Stevenage, Hertfordshire, Hamilton joined the McLaren Young Driver Programme in 1998. This led to a Formula One drive with McLaren from 2007 to 2012, making him the first black driver to race in the series. In his debut season, Hamilton set numerous records as he finished runner-up to Kimi Räikkönen by one point. The following season, he won his maiden title in dramatic fashion—making a crucial overtake on the last lap of the last race of the season—to become the then-youngest ever Formula One World Champion. After six years with McLaren, Hamilton signed with Mercedes in 2013.\nChanges to the regulations for 2014 mandating the use of turbo-hybrid engines saw the start of a highly successful period for Hamilton, during which he won six further drivers' titles. Consecutive titles came in 2014 and 2015 during an intense rivalry with teammate Nico Rosberg. Following Rosberg's retirement in 2016, Ferrari's Sebastian Vettel became Hamilton's closest rival in two championship battles, in which he twice overturned mid-season point deficits to claim consecutive titles again in 2017 and 2018. His third and fourth consecutive titles followed in 2019 and 2020 to equal Schumacher's record of seven drivers' titles. Hamilton surpassed 100 race wins and pole positions in 2021. He will join Ferrari for the 2025 season.\nHamilton has been credited with furthering Formula One's global following by appealing to a broader audience outside the sport, in part due to his high-profile lifestyle, environmental and social activism, and exploits in music and fashion. He has also become a prominent advocate in support of activism to combat racism and push for increased diversity in motorsport. Hamilton was listed in the 2020 issue of Time as one of the 100 most influential people globally, and was knighted in the 2021 New Year Honours.",
      index = 1,
      lastrevid = 1240861932,
      length = 360346,
      ns = 0,
      pageid = 675561,
      pageimage = "Lewis_Hamilton_2022_São_Paulo_Grand_Prix_(52498120773)_(cropped).jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 67,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg/50px-Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg",
        width = 50
      } --[[table: 0x42c81d30]],
      title = "Lewis Hamilton",
      touched = "2024-08-18T04:23:53Z"
    } --[[table: 0x42c81d08]],
    ["1628331"] = {
      contentmodel = "wikitext",
      index = 27,
      lastrevid = 1240546856,
      length = 176911,
      ns = 0,
      pageid = 1628331,
      pageimage = "Nico_Rosberg_2016.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Nico_Rosberg_2016.jpg/50px-Nico_Rosberg_2016.jpg",
        width = 50
      } --[[table: 0x440c31e0]],
      title = "Nico Rosberg",
      touched = "2024-08-18T04:27:29Z"
    } --[[table: 0x4406d200]],
    ["1712137"] = {
      contentmodel = "wikitext",
      extract = "James Hamilton Lewis (May 18, 1863 – April 9, 1939) was an American attorney and politician.  Sometimes referred to as J. Ham Lewis or Ham Lewis, he represented Washington in the United States House of Representatives, and Illinois in the United States Senate.  He was the first to hold the title of Whip in the United States Senate.\nBorn in Danville, Virginia and raised in Augusta, Georgia, Lewis attended several colleges, studied law, and attained admission to the bar in 1882.  He moved to Washington Territory in 1885, where he became active in politics as a Democrat; he served in the territorial legislature, worked with the federal commission that helped establish the U.S.-Canada boundary, and ran unsuccessfully for governor.  He served in the United States House of Representatives from 1897 to 1899.\nAfter service in the Spanish–American War, Lewis relocated to Chicago, Illinois. After serving as the city's corporation counsel, and running unsuccessfully for governor, Lewis won election to the United States Senate in 1912, and served one term (1913-1919).  He was chosen to serve as Majority Whip, and was the first person to hold this position.  He ran unsuccessfully for reelection in 1918, and for governor in 1920. In 1930, he was again elected to the U.S. Senate, and served from 1931 until his death.  He died in Washington, D.C., and was interred first in Arlington, Virginia, and later at Fort Lincoln Cemetery in Brentwood, Maryland.",
      index = 6,
      lastrevid = 1235906712,
      length = 21470,
      ns = 0,
      pageid = 1712137,
      pageimage = "J._Hamilton_Lewis_(Illinois_Blue_Book_Portrait_1931-1932).png",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 69,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png/50px-J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png",
        width = 50
      } --[[table: 0x40694aa0]],
      title = "J. Hamilton Lewis",
      touched = "2024-08-18T04:27:43Z"
    } --[[table: 0x40694a78]],
    ["2295713"] = {
      contentmodel = "wikitext",
      extract = "Anthony or Antony Hamilton may refer to:\n\nAnthony Hamilton (died 1719), Irish classical author, of aristocratic Scottish ancestry, who lived in France where he was known as Antoine Hamilton\nAnthony Hamilton (Archdeacon of Colchester) (1739–1812), English priest who served as both Archdeacon of London and Archdeacon of Colchester\nAnthony Hamilton-Smith, 3rd Baron Colwyn (1942–2024), English peer, legislator and dental surgeon\nAnthony Hamilton (born 1943), American musician and poet, of The Watts Prophets\nAntony Hamilton (1952–1995), Australian actor, model and dancer\nAnthony Hamilton (born 1956), Grenada-born British racing-car manager, father and former manager of Lewis Hamilton\nAnthony Hamilton (athlete) (born 1969), British Paralympic athlete\nAnthony Hamilton (musician) (born 1971), American R&B/soul singer-songwriter and record producer\nAnthony Hamilton (snooker player) (born 1971), English snooker player\nAnthony Hamilton (fighter) (born 1980), American mixed martial artist\nAnthony Hamilton (soccer) (born 1985), American soccer player\nAnthony Hamilton (archdeacon of Taunton) (1778–1851)",
      index = 22,
      lastrevid = 1239575461,
      length = 1314,
      ns = 0,
      pageid = 2295713,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Anthony Hamilton",
      touched = "2024-08-10T04:44:16Z"
    } --[[table: 0x44218638]],
    ["3351795"] = {
      contentmodel = "wikitext",
      extract = "The 2008 FIA Formula One World Championship was the 62nd season of Formula One motor racing, recognised by the Fédération Internationale de l'Automobile (FIA) – the governing body of motorsport – as the highest class of competition for open-wheel racing cars. The championship was contested over eighteen races commencing in Australia on 16 March and ending in Brazil on 2 November. The 2008 season saw the debut of the Singapore Grand Prix, which was held at the Marina Bay Street Circuit, in Marina Bay, Singapore and was the first Formula One race held at night. The European Grand Prix moved to a new venue at the Valencia Street Circuit, in Valencia, Spain.\nLewis Hamilton won the Drivers' title by a point – by overtaking Toyota's Timo Glock on the final corner of the final lap of the final Grand Prix of the season to claim the required 5th-place finish to win the championship – from Brazilian Felipe Massa, who had finished the race in first place; his team and family already celebrating the championship when the final overtake occurred. Massa's teammate, the reigning World Champion Kimi Räikkönen, was ranked third, with two wins. Scuderia Ferrari Marlboro won the Constructors' title. In winning the Drivers' title, Hamilton became the youngest driver ever to win the title (a record since surpassed by Sebastian Vettel winning the 2010 Drivers' title) and the first black driver to do so. He was also the first British champion since Damon Hill in 1996.\nEleven teams competed in the championship, although Super Aguri withdrew on 6 May from the 2008 Formula One season due to financial troubles, completing four races. New technical rules for 2008 included the banning of traction control after it was re-introduced in 2001, at the Spanish Grand Prix. Fernando Alonso won the first race held in Singapore; however, only after teammate Nelson Piquet Jr. deliberately crashed to cause a Safety Car period which helped Alonso's strategy. When Piquet admitted this to the press in 2009 Renault team-principal Briatore resigned. Some journalists dubbed this \"Crashgate\".\nThis was the last season for the Honda team before they pulled out of F1 later in December due to the financial difficulties. Honda returned as an engine supplier between 2015 and 2021. Ross Brawn then bought the team, and renamed it to Brawn GP in February 2009 using the Mercedes-Benz engines. This was also the last Formula One season to race with grooved tyres, used since 1998, before slick tyres returned to Formula One in 2009. 2008 was the last season to feature 2001 runner up David Coulthard who retired after 14 years and 246 race starts.\nIt was the first time in the history of Formula One that all teams used the same two drivers throughout the season. As of 2024, this season marks the last World Drivers' Championship for McLaren, although Hamilton later won six more drivers' championships with Mercedes. The 2008 season also marks Scuderia Ferrari's last World Constructors' Championship win as of the 2023 championship.",
      index = 28,
      lastrevid = 1239292034,
      length = 103528,
      ns = 0,
      pageid = 3351795,
      pageimage = "LewisHamiltonPortrait.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 60,
        source = "https://upload.wikimedia.org/wikipedia/en/thumb/5/54/LewisHamiltonPortrait.jpg/50px-LewisHamiltonPortrait.jpg",
        width = 50
      } --[[table: 0x441048d0]],
      title = "2008 Formula One World Championship",
      touched = "2024-08-18T04:31:27Z"
    } --[[table: 0x441048a8]],
    ["3437295"] = {
      contentmodel = "wikitext",
      index = 23,
      lastrevid = 1240495084,
      length = 85456,
      ns = 0,
      pageid = 3437295,
      pageimage = "Schumacher_china_2012_crop.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 70,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Schumacher_china_2012_crop.jpg/50px-Schumacher_china_2012_crop.jpg",
        width = 50
      } --[[table: 0x440b8ab0]],
      title = "List of Formula One World Drivers' Champions",
      touched = "2024-08-18T04:31:37Z"
    } --[[table: 0x44235888]],
    ["6437759"] = {
      contentmodel = "wikitext",
      index = 7,
      lastrevid = 1235422233,
      length = 226661,
      ns = 0,
      pageid = 6437759,
      pageimage = "Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg/50px-Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg",
        width = 50
      } --[[table: 0x40725328]],
      title = "Sebastian Vettel",
      touched = "2024-08-18T04:36:20Z"
    } --[[table: 0x41196358]],
    ["9305401"] = {
      contentmodel = "wikitext",
      index = 30,
      lastrevid = 1219690290,
      length = 57009,
      ns = 0,
      pageid = 9305401,
      pageimage = "Marina_Bay_circuit_2023.svg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 33,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Marina_Bay_circuit_2023.svg/50px-Marina_Bay_circuit_2023.svg.png",
        width = 50
      } --[[table: 0x415d6ab0]],
      title = "Singapore Grand Prix",
      touched = "2024-08-18T04:39:44Z"
    } --[[table: 0x40725350]],
    ["13599687"] = {
      contentmodel = "wikitext",
      index = 12,
      lastrevid = 1240549317,
      length = 288453,
      ns = 0,
      pageid = 13599687,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "List of Formula One driver records",
      touched = "2024-08-18T04:44:13Z"
    } --[[table: 0x440b8ad8]],
    ["16839388"] = {
      contentmodel = "wikitext",
      extract = "Cars 2 is a 2011 American animated spy comedy film produced by Pixar Animation Studios for Walt Disney Pictures. It is the sequel to Cars (2006), the second film in the Cars franchise, and the 12th animated film from the studio. The film was directed by John Lasseter (in his final outing as director of a Pixar film to date), co-directed by Brad Lewis, produced by Denise Ream, and written by Ben Queen, Lasseter, Lewis, and Dan Fogelman. In the film's ensemble voice cast, Owen Wilson, Larry the Cable Guy, Tony Shalhoub, Guido Quaroni, Bonnie Hunt, and John Ratzenberger reprise their roles from the first film. George Carlin, who previously voiced Fillmore, died in 2008, and his role was passed to Lloyd Sherr. They are joined by newcomers Michael Caine, Emily Mortimer, John Turturro, Eddie Izzard, and Thomas Kretschmann. In the film, Lightning McQueen and Mater agree to compete in the World Grand Prix, an international racing event showcasing a new alternative fuel called Allinol, but Mater inadvertently becomes involved in a dangerous espionage mission that puts both his and McQueen's life in jeopardy.\nCars 2 was first announced in April 2008 with a tentative 2012 release date, making Cars the second Pixar film to spawn a sequel after Toy Story (1995), as well as becoming a franchise. Lasseter was confirmed to be returning as director, while Lewis was designated as co-director in June 2010. The film's story was conceived by Lasseter while he was traveling around the world promoting the first film. Michael Giacchino composed the film's score, with artists such as Weezer, Robbie Williams, Brad Paisley and Bénabar contributing tracks for the film. This was the final Pixar film animated with their old software system, Marionette, before being officially replaced with Presto in 2012. With an estimated budget of $200 million, Cars 2 is one of the most expensive films ever made.\nCars 2 premiered at the El Capitan Theatre in Los Angeles on June 18, 2011, and was released in the United States on June 24, in Disney Digital 3D and IMAX 3D as well as traditional two-dimensional and IMAX formats. Despite receiving mixed reviews from critics, Cars 2 continued Pixar's streak of box office success, grossing over $559 million worldwide, becoming the tenth-highest-grossing film of 2011 and the highest-grossing film of the Cars trilogy. The film was nominated for Best Animated Feature Film at the 69th Golden Globe Awards, but lost to The Adventures of Tintin. A sequel, Cars 3, was released on June 16, 2017.",
      index = 10,
      lastrevid = 1240523185,
      length = 87660,
      ns = 0,
      pageid = 16839388,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Cars 2",
      touched = "2024-08-18T04:47:51Z"
    } --[[table: 0x441786f8]],
    ["18614880"] = {
      contentmodel = "wikitext",
      extract = "Hamilton may refer to:\n\nAlexander Hamilton (1755/1757–1804), first U.S. Secretary of the Treasury and one of the Founding Fathers of the United States\nHamilton (musical), a 2015 Broadway musical by Lin-Manuel Miranda\nHamilton (album), album based on the musical\nThe Hamilton Mixtape, album of music from the musical performed by various artists\nHamilton (2020 film), a live film recording of the musical, featuring the original cast\nHamilton may also refer to:\n\n",
      index = 24,
      lastrevid = 1235074338,
      length = 7779,
      ns = 0,
      pageid = 18614880,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Hamilton",
      touched = "2024-08-15T22:50:55Z"
    } --[[table: 0x442474d8]],
    ["19846772"] = {
      contentmodel = "wikitext",
      index = 20,
      lastrevid = 1240811003,
      length = 175473,
      ns = 0,
      pageid = 19846772,
      pageimage = "Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 82,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg/50px-Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg",
        width = 50
      } --[[table: 0x42c90040]],
      title = "Valtteri Bottas",
      touched = "2024-08-18T04:51:21Z"
    } --[[table: 0x415d6ad8]],
    ["25098794"] = {
      contentmodel = "wikitext",
      index = 19,
      lastrevid = 1240861291,
      length = 92783,
      ns = 0,
      pageid = 25098794,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Mercedes-Benz in Formula One",
      touched = "2024-08-18T04:57:04Z"
    } --[[table: 0x4406d1d8]],
    ["35945784"] = {
      contentmodel = "wikitext",
      index = 4,
      lastrevid = 1237180319,
      length = 22554,
      ns = 0,
      pageid = 35945784,
      pageimage = "GP3R_RX_2017-103_(35809220293)_(cropped).jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 68,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg/50px-GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg",
        width = 50
      } --[[table: 0x41196330]],
      title = "Nicolas Hamilton",
      touched = "2024-08-18T05:08:28Z"
    } --[[table: 0x440c3208]],
    ["39263987"] = {
      contentmodel = "wikitext",
      extract = "The 2015 FIA Formula One World Championship was a motor racing championship for Formula One cars. It was the 66th Formula One World Championship recognised by the sport's governing body, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Twenty-two drivers representing 10 teams contested 19 Grands Prix, starting in Australia on 15 March and ending in Abu Dhabi on 29 November as they competed for the World Drivers' and World Constructors' championships.\nLewis Hamilton was the defending Drivers' Champion after securing his second title at the 2014 Abu Dhabi Grand Prix. His team, Mercedes, began the season as the defending Constructors' Champion, having clinched its first championship title at the 2014 Russian Grand Prix.\nThe calendar featured two significant changes from the 2014 season. The first was the return of the Mexican Grand Prix, held for the first time since 1992. The other change was the cancellation of the German Grand Prix after a venue could not be agreed upon, leaving the nation without a World Championship event for the first time in fifty-five years.\nHamilton secured his third Drivers' Championship with three races left in the season. The runner-up was his teammate Nico Rosberg, 59 points behind, with Ferrari's Sebastian Vettel third, another 44 points adrift. Mercedes AMG Petronas F1 Team clinched the 2015 Constructors' Championship at the Russian Grand Prix, ahead of Ferrari and Williams, and ended the season with a record 703 points. Hamilton also won the FIA Pole Trophy with a total of 11 pole positions in the season and the DHL Fastest Lap Award. Ferrari won the inaugural DHL Fastest Pit Stop Award.",
      index = 13,
      lastrevid = 1237985125,
      length = 169209,
      ns = 0,
      pageid = 39263987,
      pageimage = "Lewis_Hamilton_2014_China.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 60,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Lewis_Hamilton_2014_China.jpg/50px-Lewis_Hamilton_2014_China.jpg",
        width = 50
      } --[[table: 0x41667290]],
      title = "2015 Formula One World Championship",
      touched = "2024-08-18T05:13:27Z"
    } --[[table: 0x41667268]],
    ["41500527"] = {
      contentmodel = "wikitext",
      extract = "Lewis Hamilton (born 1985) is a British Formula One racing driver.\nLewis or Louis Hamilton may also refer to:",
      index = 2,
      lastrevid = 1187513860,
      length = 850,
      ns = 0,
      pageid = 41500527,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Lewis Hamilton (disambiguation)",
      touched = "2024-07-14T09:06:28Z"
    } --[[table: 0x44235860]],
    ["41758713"] = {
      contentmodel = "wikitext",
      index = 9,
      lastrevid = 1240861812,
      length = 263941,
      ns = 0,
      pageid = 41758713,
      pageimage = "Max_Verstappen_2017_Malaysia_3_(cropped).jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 71,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg/50px-Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg",
        width = 50
      } --[[table: 0x42d72760]],
      title = "Max Verstappen",
      touched = "2024-08-18T05:16:27Z"
    } --[[table: 0x42d72738]],
    ["43414063"] = {
      contentmodel = "wikitext",
      extract = "The 2016 FIA Formula One World Championship was the 70th season of the Fédération Internationale de l'Automobile (FIA)'s Formula One motor racing. It featured the 67th Formula One World Championship, a motor racing championship for Formula One cars which is recognised by the sport's governing body, the FIA, as the highest class of competition for open-wheel racing cars. Teams and drivers took part in twenty-one Grands Prix—making for the longest season in the sport's history to that point—starting in Australia on 20 March and finishing in Abu Dhabi on 27 November as they competed for the World Drivers' and World Constructors' championships.\n\nThe 2016 season saw the grid expand to twenty-two cars with the addition of the Haas F1 Team entry. Renault returned to the sport as a constructor after a four-year absence following their takeover of Lotus prior to the start of the season. The calendar similarly expanded, with the return of the German Grand Prix. The European Grand Prix was also revived, with the event visiting a new circuit in Azerbaijan's capital city, Baku.\nNico Rosberg won his only World Drivers' Championship title in the final race of the season. With nine wins and seven other podiums, Rosberg beat teammate and defending World Champion Lewis Hamilton by five points, ending Hamilton's 2 year dominance. In doing so, Rosberg followed the success of his father in 1982 - becoming the second son of a champion to become champion himself, a feat previously achieved by Damon Hill in 1996 and the third title winner for Mercedes. Rosberg announced his retirement from the sport shortly after winning the title.\nIn the World Constructors' Championship, Mercedes successfully defended their title for the second consecutive year, beating Red Bull Racing by 297 points. Ferrari finished third overall, a further seventy points behind.\nAs of 2023, this is the last championship for a German driver. This was the last season to be held during Bernie Ecclestone's tenure as Chief Executive of the Formula One Group. Ecclestone would be removed from his role on 23 January 2017 after nearly 40 years in the job following Liberty Media's purchase of the sport from CVC Capital Partners. It was the final full season for 2009 World Champion Jenson Button, who would only make one more Grand Prix appearance at the 2017 Monaco Grand Prix.",
      index = 8,
      lastrevid = 1232045554,
      length = 179948,
      ns = 0,
      pageid = 43414063,
      pageimage = "Nico_Rosberg_2016_Malaysia_1.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Nico_Rosberg_2016_Malaysia_1.jpg/50px-Nico_Rosberg_2016_Malaysia_1.jpg",
        width = 50
      } --[[table: 0x41618c08]],
      title = "2016 Formula One World Championship",
      touched = "2024-08-18T05:18:16Z"
    } --[[table: 0x41618be0]],
    ["44641054"] = {
      contentmodel = "wikitext",
      extract = "George William Russell (; born 15 February 1998) is a British racing driver currently competing in Formula One for Mercedes. He previously raced for Williams Racing from 2019 to 2021. \nAfter winning several karting championships including the CIK-FIA European Karting Championship in 2012, he repeated his success by becoming the 2018 Formula 2 champion and the 2017 GP3 Series champion, driving for ART in both campaigns to become one of only three drivers to win both championships in his respective rookie seasons. Following his Formula 2 championship win, Russell signed for Williams in 2019, making his debut at the 2019 Australian Grand Prix. He stood in for Lewis Hamilton at Mercedes at the 2020 Sakhir Grand Prix, but was denied a Grand Prix win due to strategic errors. In 2022, Russell departed Williams to race for the Mercedes team alongside Lewis Hamilton, having been a member of the Mercedes Junior Driver Programme since 2017. Russell achieved his first Formula One victory at the 2022 São Paulo Grand Prix. \nAs of the 2024 Belgian Grand Prix, Russell has achieved two victories, three pole positions, eight fastest laps and thirteen podium finishes in his career. Russell is contracted to drive for Mercedes until the conclusion of the 2025 season.",
      index = 26,
      lastrevid = 1240861921,
      length = 136387,
      ns = 0,
      pageid = 44641054,
      pageimage = "George_Russell,_British_GP_2022_(52381430692)_(cropped).jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 71,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg/50px-George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg",
        width = 50
      } --[[table: 0x442474b0]],
      title = "George Russell (racing driver)",
      touched = "2024-08-18T05:19:40Z"
    } --[[table: 0x442060d8]],
    ["52639993"] = {
      contentmodel = "wikitext",
      extract = "The 2018 FIA Formula One World Championship was the motor racing championship for Formula One cars and the 69th running of the Formula One World Championship. Formula One is recognised by the governing body of international motorsport, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Drivers and teams competed in twenty-one Grands Prix for the World Drivers' and World Constructors' championship titles.\nFor the second consecutive year, the season featured a title battle between Mercedes and Ferrari. The 2018 season saw two four-time World Champions, Lewis Hamilton and Sebastian Vettel, as the main Championship challengers. It was the first time in Formula One history, two quadruple world champions would be competing for a fifth title and the season was billed as the Fight for Five by journalists and fans. The championship lead ebbed and flowed between the two title contenders, the points lead swapping hands five times throughout the year. At the halfway point after the British Grand Prix, Vettel led the title battle by eight points. Hamilton clinched his fifth World Drivers' Championship title at the 2018 Mexican Grand Prix, with the team securing its fifth consecutive World Constructors' Championship title at the following race. Ferrari driver Sebastian Vettel finished runner-up, 88 points behind Hamilton, with his teammate Kimi Räikkönen finishing third. In the Constructors' Championship, Mercedes finished 84 points ahead of Ferrari, with Red Bull Racing-TAG Heuer in third, 152 points behind Ferrari.\nIn 2018, the championship saw the introduction of a new cockpit protection device, known as the \"halo\". The introduction of the halo was the first stage of a planned rollout that would see the device adopted in all FIA-sanctioned open wheel series by 2020.",
      index = 17,
      lastrevid = 1232048923,
      length = 153809,
      ns = 0,
      pageid = 52639993,
      pageimage = "Lewis_Hamilton_2017_Malaysia.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2017_Malaysia.jpg/50px-Lewis_Hamilton_2017_Malaysia.jpg",
        width = 50
      } --[[table: 0x4291ab30]],
      title = "2018 Formula One World Championship",
      touched = "2024-08-18T05:28:28Z"
    } --[[table: 0x4291ab08]],
    ["55246669"] = {
      contentmodel = "wikitext",
      extract = "The 2019 FIA Formula One World Championship was the motor racing championship for Formula One cars which marked the 70th running of the Formula One World Championship. It is recognised by the governing body of international motorsport, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Starting in March and ending in December, the championship was contested over twenty-one Grands Prix. Drivers competed for the title of World Drivers' Champion, and teams for the title of World Constructors' Champion. The 2019 championship also saw the running of the 1000th World Championship race, the 2019 Chinese Grand Prix.\nLewis Hamilton successfully defended the World Drivers' Championship for the second year running, winning his sixth championship title at the United States Grand Prix. Mercedes successfully defended the World Constructors' Championship, securing the title for the sixth consecutive year at the Japanese Grand Prix to tie Ferrari's record from 1999 to 2004.\n\n",
      index = 14,
      lastrevid = 1233272509,
      length = 151155,
      ns = 0,
      pageid = 55246669,
      pageimage = "Lewis_Hamilton_2016_Malaysia_2.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/50px-Lewis_Hamilton_2016_Malaysia_2.jpg",
        width = 50
      } --[[table: 0x441d4980]],
      title = "2019 Formula One World Championship",
      touched = "2024-08-18T05:31:19Z"
    } --[[table: 0x441d4958]],
    ["57313789"] = {
      contentmodel = "wikitext",
      extract = "Carl Lewis Hamilton (February 23, 1888 – May 27, 1946) was an American businessman. He is most notable for his work as a senior executive of the Weyerhaeuser wood products company and a named partner of the Booz Allen Hamilton management and information technology consulting firm.",
      index = 21,
      lastrevid = 1155437582,
      length = 6779,
      ns = 0,
      pageid = 57313789,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "Carl L. Hamilton",
      touched = "2024-08-18T05:33:30Z"
    } --[[table: 0x44218660]],
    ["57373873"] = {
      contentmodel = "wikitext",
      extract = "The 2021 FIA Formula One World Championship was a motor racing championship for Formula One cars which was the 72nd running of the Formula One World Championship. It is recognised by the Fédération Internationale de l'Automobile (FIA), the governing body of international motorsport, as the highest class of competition for open-wheel racing cars. The championship was contested over twenty-two Grands Prix, and held around the world. Drivers and teams competed for the titles of Formula One World Champion Driver and Formula One World Champion Constructor, respectively.\n\nMax Verstappen of Red Bull Racing-Honda won the Drivers' Championship for the first time in his career, having claimed 10 race wins across the season. Verstappen became the first-ever driver from the Netherlands, the first Honda-powered driver since Ayrton Senna in 1991, the first Red Bull driver since Sebastian Vettel in 2013 and the first non-Mercedes driver in the turbo-hybrid era to win the World Championship. This season saw the return of Aston Martin since 1960 after Lawrence Stroll invested into the British marque.\nHonda became the second engine supplier in the turbo-hybrid era to power a championship-winning car, after Mercedes. Four-time defending and seven-time champion Lewis Hamilton of Mercedes finished runner-up. Mercedes retained the Constructors' Championship for the eighth consecutive season.\nThe season featured a close year-long battle for the title between Verstappen and Hamilton, with BBC Sport's Andrew Benson describing it as \"one of the most intense, hard-fought battles in sporting history\". The two drivers exchanged the championship lead multiple times during the season, and the title contenders were involved in major collisions at the British, Hungarian and Italian Grands Prix. Both drivers entered the season-ending Abu Dhabi Grand Prix tied on points, which ended with a controversial finish, as it was deemed that race control did not handle a late safety car period fully according to the regulations. Verstappen overtook Hamilton in a late restart, after which Mercedes initially protested the results, and later decided not to appeal after their protest was denied. A review of the incident led to key structural changes to race control, including the removal of Michael Masi from his role as race director and the implementation of a virtual race control room, which assists the race director.\nThis was the first season since 2008 where the champion driver was not from the team that took the constructors' title. The season was also the final season in the sport for 2007 World Champion Kimi Räikkönen.",
      index = 11,
      lastrevid = 1236199509,
      length = 267376,
      ns = 0,
      pageid = 57373873,
      pageimage = "Max_Verstappen_2017_Malaysia_3.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Max_Verstappen_2017_Malaysia_3.jpg/50px-Max_Verstappen_2017_Malaysia_3.jpg",
        width = 50
      } --[[table: 0x44252978]],
      title = "2021 Formula One World Championship",
      touched = "2024-08-18T05:33:33Z"
    } --[[table: 0x44252950]],
    ["59360274"] = {
      contentmodel = "wikitext",
      extract = "The Hamilton–Rosberg rivalry (also known as The Silver War) was a Formula One rivalry between British racing driver Lewis Hamilton and German racing driver Nico Rosberg. The rivalry was most prevalent during their four years as team-mates at Mercedes from 2013 to 2016, a period in which the two drivers dominated the sport. The pair's relationship became strained and, at times, led to volatile confrontations on and off the track, with the duo being threatened with suspension at the height of their rivalry. It has been compared to the Prost–Senna rivalry.\nAs teammates, Hamilton and Rosberg won 54 of 78 races over four seasons. Hamilton had 32 victories, 55 podium finishes and qualified ahead of Rosberg 42 times.  Rosberg had 22 victories, 50 podium finishes and qualified ahead of Hamilton 36 times. During this period, Hamilton won the Formula One World Championship title twice, and Rosberg won the title once.\n\n",
      index = 5,
      lastrevid = 1240754299,
      length = 68768,
      ns = 0,
      pageid = 59360274,
      pageimage = "Lewis_Hamilton_2016_Malaysia_2.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/50px-Lewis_Hamilton_2016_Malaysia_2.jpg",
        width = 50
      } --[[table: 0x4422cad8]],
      title = "Hamilton–Rosberg rivalry",
      touched = "2024-08-18T00:34:08Z"
    } --[[table: 0x4422cab0]],
    ["67277421"] = {
      contentmodel = "wikitext",
      index = 3,
      lastrevid = 1239964638,
      length = 219102,
      ns = 0,
      pageid = 67277421,
      pageimage = "Lewis_Hamilton_2016_Malaysia_2.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 75,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/50px-Lewis_Hamilton_2016_Malaysia_2.jpg",
        width = 50
      } --[[table: 0x44110d90]],
      title = "List of career achievements by Lewis Hamilton",
      touched = "2024-08-18T00:44:55Z"
    } --[[table: 0x44110d68]],
    ["67624373"] = {
      contentmodel = "wikitext",
      extract = "Angela Cullen (born 5 August 1974) is a New Zealand physiotherapist and former field hockey player. From 2015 to March 2023, she worked for Hintsa Performance and Mercedes-AMG Petronas F1 Team. She is best known for being the physiotherapist to seven-time Formula One world champion Lewis Hamilton.",
      index = 16,
      lastrevid = 1225074949,
      length = 9019,
      ns = 0,
      pageid = 67624373,
      pageimage = "Angela_Cullen_in_February_2020_(sq_cropped).jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 50,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg/50px-Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg",
        width = 50
      } --[[table: 0x4423e338]],
      title = "Angela Cullen",
      touched = "2024-08-18T05:45:57Z"
    } --[[table: 0x4423e310]],
    ["69428499"] = {
      contentmodel = "wikitext",
      extract = "David Lewis Hamilton (born September 29, 1997) is an American professional baseball shortstop and second baseman for the Boston Red Sox of Major League Baseball (MLB). He made his MLB debut in 2023.",
      index = 18,
      lastrevid = 1240800093,
      length = 11589,
      ns = 0,
      pageid = 69428499,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "David Hamilton (baseball)",
      touched = "2024-08-18T05:47:52Z"
    } --[[table: 0x44178720]],
    ["69428680"] = {
      contentmodel = "wikitext",
      extract = "F1 is an upcoming American sports action drama film directed by Joseph Kosinski and written by Ehren Kruger featuring the automobile racing championship, created in collaboration with the FIA, its governing body. The film stars Brad Pitt, Damson Idris, Kerry Condon, Tobias Menzies, Javier Bardem and Sarah Niles.\nF1 is scheduled to be theatrically released by Warner Bros. Pictures on June 25, 2025, internationally, and in the United States on June 27, 2025.",
      index = 15,
      lastrevid = 1240498859,
      length = 19748,
      ns = 0,
      pageid = 69428680,
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      title = "F1 (film)",
      touched = "2024-08-18T05:47:52Z"
    } --[[table: 0x442060b0]],
    ["72504121"] = {
      contentmodel = "wikitext",
      extract = "The 2024 FIA Formula One World Championship is an ongoing motor racing championship for Formula One cars and is the 75th running of the Formula One World Championship. It is recognised by the Fédération Internationale de l'Automobile (FIA), the governing body of international motorsport, as the highest class of competition for open-wheel racing cars. The championship is contested over a record twenty-four Grands Prix held around the world. It began in March and will end in December.\nDrivers and teams compete for the titles of World Drivers' Champion and World Constructors' Champion, respectively. Max Verstappen is the defending Drivers' Champion, while his team, Red Bull Racing-Honda RBPT, are the defending Constructors' Champions.",
      index = 25,
      lastrevid = 1240567920,
      length = 90145,
      ns = 0,
      pageid = 72504121,
      pageimage = "Max_Verstappen_2024_Chinese_GP.jpg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 33,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Max_Verstappen_2024_Chinese_GP.jpg/50px-Max_Verstappen_2024_Chinese_GP.jpg",
        width = 50
      } --[[table: 0x44229460]],
      title = "2024 Formula One World Championship",
      touched = "2024-08-18T05:50:35Z"
    } --[[table: 0x44229438]],
    ["75456203"] = {
      contentmodel = "wikitext",
      extract = "The 2024 Belgian Grand Prix (officially known as the Formula 1 Rolex Belgian Grand Prix 2024) was a Formula One motor race that took place on 28 July 2024 at the Circuit de Spa-Francorchamps in Stavelot, Belgium. It was the fourteenth round of the 2024 Formula One World Championship. \nMax Verstappen set the fastest time in qualifying, but was relegated to eleventh following a grid penalty, with Charles Leclerc inheriting pole position in his place. George Russell of Mercedes crossed the finish line first, but was disqualified after the race because his car failed to meet the minimum weight requirement. The race was won by Russell's teammate Lewis Hamilton, his second victory of the season ahead of Oscar Piastri of McLaren and Charles Leclerc of Ferrari.\n\n",
      index = 29,
      lastrevid = 1240107947,
      length = 25865,
      ns = 0,
      pageid = 75456203,
      pageimage = "Spa-Francorchamps_of_Belgium.svg",
      pagelanguage = "en",
      pagelanguagedir = "ltr",
      pagelanguagehtmlcode = "en",
      thumbnail = {
        height = 31,
        source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Spa-Francorchamps_of_Belgium.svg/50px-Spa-Francorchamps_of_Belgium.svg.png",
        width = 50
      } --[[table: 0x44234420]],
      title = "2024 Belgian Grand Prix",
      touched = "2024-08-18T05:54:00Z"
    } --[[table: 0x442343f8]]
  } --[[table: 0x411c2ab8]]
} --[[table: 0x411c2a90]]
} --[[table: 0x44214f18]] 
08/18/24-11:35:52 DEBUG showing quick lookup window 1 : lewis hamilton {
{
  definition = "Sir Lewis Carl Davidson Hamilton   (born 7 January 1985) is a British racing driver competing in Formula One, driving for Mercedes. Hamilton has won a joint-record seven Formula One World Drivers' Championship titles (tied with Michael Schumacher), and holds the records for most wins (105), pole positions (104), and podium finishes (201), among others.\nBorn and raised in Stevenage, Hertfordshire, Hamilton joined the McLaren Young Driver Programme in 1998. This led to a Formula One drive with McLaren from 2007 to 2012, making him the first black driver to race in the series. In his debut season, Hamilton set numerous records as he finished runner-up to Kimi Räikkönen by one point. The following season, he won his maiden title in dramatic fashion—making a crucial overtake on the last lap of the last race of the season—to become the then-youngest ever Formula One World Champion. After six years with McLaren, Hamilton signed with Mercedes in 2013.\nChanges to the regulations for 2014 mandating the use of turbo-hybrid engines saw the start of a highly successful period for Hamilton, during which he won six further drivers' titles. Consecutive titles came in 2014 and 2015 during an intense rivalry with teammate Nico Rosberg. Following Rosberg's retirement in 2016, Ferrari's Sebastian Vettel became Hamilton's closest rival in two championship battles, in which he twice overturned mid-season point deficits to claim consecutive titles again in 2017 and 2018. His third and fourth consecutive titles followed in 2019 and 2020 to equal Schumacher's record of seven drivers' titles. Hamilton surpassed 100 race wins and pole positions in 2021. He will join Ferrari for the 2025 season.\nHamilton has been credited with furthering Formula One's global following by appealing to a broader audience outside the sport, in part due to his high-profile lifestyle, environmental and social activism, and exploits in music and fashion. He has also become a prominent advocate in support of activism to combat racism and push for increased diversity in motorsport. Hamilton was listed in the 2020 issue of Time as one of the 100 most influential people globally, and was knighted in the 2021 New Year Honours.\n(full article : 352 kB, = 163 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 134,
      hi_height = 1072,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg/800px-Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4417b188]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg/100px-Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg",
      title = "Lewis Hamilton 2022 São Paulo Grand Prix (52498120773) (cropped).jpg",
      width = 100
    } --[[table: 0x441d4d48]]
  } --[[table: 0x440ff078]],
  lang = "en",
  rtl_lang = false,
  word = "Lewis Hamilton"
} --[[table: 0x414a4a98]],
{
  definition = "Lewis Hamilton (born 1985) is a British Formula One racing driver.\nLewis or Louis Hamilton may also refer to:\n(full article : 1 kB, = 8 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x4c95da48]],
  lang = "en",
  rtl_lang = false,
  word = "Lewis Hamilton (disambiguation)"
} --[[table: 0x440e52d0]],
{
  definition = "No introduction.\n(full article : 214 kB, = 12889 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/800px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x415cece8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/100px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      title = "Lewis Hamilton 2016 Malaysia 2.jpg",
      width = 100
    } --[[table: 0x4b008610]]
  } --[[table: 0x4b0085a0]],
  lang = "en",
  rtl_lang = false,
  word = "List of career achievements by Lewis Hamilton"
} --[[table: 0x441babf0]],
{
  definition = "No introduction.\n(full article : 23 kB, = 1327 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 136,
      hi_height = 1088,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg/800px-GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x441d0dd8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg/100px-GP3R_RX_2017-103_%2835809220293%29_%28cropped%29.jpg",
      title = "GP3R RX 2017-103 (35809220293) (cropped).jpg",
      width = 100
    } --[[table: 0x42d6e860]]
  } --[[table: 0x4c47f798]],
  lang = "en",
  rtl_lang = false,
  word = "Nicolas Hamilton"
} --[[table: 0x441ea1c0]],
{
  definition = "The Hamilton–Rosberg rivalry (also known as The Silver War) was a Formula One rivalry between British racing driver Lewis Hamilton and German racing driver Nico Rosberg. The rivalry was most prevalent during their four years as team-mates at Mercedes from 2013 to 2016, a period in which the two drivers dominated the sport. The pair's relationship became strained and, at times, led to volatile confrontations on and off the track, with the duo being threatened with suspension at the height of their rivalry. It has been compared to the Prost–Senna rivalry.\nAs teammates, Hamilton and Rosberg won 54 of 78 races over four seasons. Hamilton had 32 victories, 55 podium finishes and qualified ahead of Rosberg 42 times.  Rosberg had 22 victories, 50 podium finishes and qualified ahead of Hamilton 36 times. During this period, Hamilton won the Formula One World Championship title twice, and Rosberg won the title once.\n\n\n(full article : 68 kB, = 75 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/800px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44219220]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/100px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      title = "Lewis Hamilton 2016 Malaysia 2.jpg",
      width = 100
    } --[[table: 0x441fb330]]
  } --[[table: 0x44218910]],
  lang = "en",
  rtl_lang = false,
  word = "Hamilton–Rosberg rivalry"
} --[[table: 0x40677d28]],
{
  definition = "James Hamilton Lewis (May 18, 1863 – April 9, 1939) was an American attorney and politician.  Sometimes referred to as J. Ham Lewis or Ham Lewis, he represented Washington in the United States House of Representatives, and Illinois in the United States Senate.  He was the first to hold the title of Whip in the United States Senate.\nBorn in Danville, Virginia and raised in Augusta, Georgia, Lewis attended several colleges, studied law, and attained admission to the bar in 1882.  He moved to Washington Territory in 1885, where he became active in politics as a Democrat; he served in the territorial legislature, worked with the federal commission that helped establish the U.S.-Canada boundary, and ran unsuccessfully for governor.  He served in the United States House of Representatives from 1897 to 1899.\nAfter service in the Spanish–American War, Lewis relocated to Chicago, Illinois. After serving as the city's corporation counsel, and running unsuccessfully for governor, Lewis won election to the United States Senate in 1912, and served one term (1913-1919).  He was chosen to serve as Majority Whip, and was the first person to hold this position.  He ran unsuccessfully for reelection in 1918, and for governor in 1920. In 1930, he was again elected to the U.S. Senate, and served from 1931 until his death.  He died in Washington, D.C., and was interred first in Arlington, Virginia, and later at Fort Lincoln Cemetery in Brentwood, Maryland.\n(full article : 21 kB, = 15 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 138,
      hi_height = 1104,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png/800px-J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x42c9c578]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png/100px-J._Hamilton_Lewis_%28Illinois_Blue_Book_Portrait_1931-1932%29.png",
      title = "J. Hamilton Lewis (Illinois Blue Book Portrait 1931-1932).png",
      width = 100
    } --[[table: 0x4c913c48]]
  } --[[table: 0x42c9c508]],
  lang = "en",
  rtl_lang = false,
  word = "J. Hamilton Lewis"
} --[[table: 0x441d7760]],
{
  definition = "No introduction.\n(full article : 222 kB, = 13333 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg/800px-Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x441b27e8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg/100px-Sebastian_Vettel_-_2022236172324_2022-08-24_Champions_for_Charity_-_Sven_-_1D_X_MK_II_-_0418_-_B70I2428.jpg",
      title = "Sebastian Vettel - 2022236172324 2022-08-24 Champions for Charity - Sven - 1D X MK II - 0418 - B70I2428.jpg",
      width = 100
    } --[[table: 0x44211c48]]
  } --[[table: 0x4412de80]],
  lang = "en",
  rtl_lang = false,
  word = "Sebastian Vettel"
} --[[table: 0x42909618]],
{
  definition = "The 2016 FIA Formula One World Championship was the 70th season of the Fédération Internationale de l'Automobile (FIA)'s Formula One motor racing. It featured the 67th Formula One World Championship, a motor racing championship for Formula One cars which is recognised by the sport's governing body, the FIA, as the highest class of competition for open-wheel racing cars. Teams and drivers took part in twenty-one Grands Prix—making for the longest season in the sport's history to that point—starting in Australia on 20 March and finishing in Abu Dhabi on 27 November as they competed for the World Drivers' and World Constructors' championships.\n\nThe 2016 season saw the grid expand to twenty-two cars with the addition of the Haas F1 Team entry. Renault returned to the sport as a constructor after a four-year absence following their takeover of Lotus prior to the start of the season. The calendar similarly expanded, with the return of the German Grand Prix. The European Grand Prix was also revived, with the event visiting a new circuit in Azerbaijan's capital city, Baku.\nNico Rosberg won his only World Drivers' Championship title in the final race of the season. With nine wins and seven other podiums, Rosberg beat teammate and defending World Champion Lewis Hamilton by five points, ending Hamilton's 2 year dominance. In doing so, Rosberg followed the success of his father in 1982 - becoming the second son of a champion to become champion himself, a feat previously achieved by Damon Hill in 1996 and the third title winner for Mercedes. Rosberg announced his retirement from the sport shortly after winning the title.\nIn the World Constructors' Championship, Mercedes successfully defended their title for the second consecutive year, beating Red Bull Racing by 297 points. Ferrari finished third overall, a further seventy points behind.\nAs of 2023, this is the last championship for a German driver. This was the last season to be held during Bernie Ecclestone's tenure as Chief Executive of the Formula One Group. Ecclestone would be removed from his role on 23 January 2017 after nearly 40 years in the job following Liberty Media's purchase of the sport from CVC Capital Partners. It was the final full season for 2009 World Champion Jenson Button, who would only make one more Grand Prix appearance at the 2017 Monaco Grand Prix.\n(full article : 176 kB, = 77 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Nico_Rosberg_2016_Malaysia_1.jpg/800px-Nico_Rosberg_2016_Malaysia_1.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44217a70]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Nico_Rosberg_2016_Malaysia_1.jpg/100px-Nico_Rosberg_2016_Malaysia_1.jpg",
      title = "Nico Rosberg 2016 Malaysia 1.jpg",
      width = 100
    } --[[table: 0x41620398]]
  } --[[table: 0x442176b0]],
  lang = "en",
  rtl_lang = false,
  word = "2016 Formula One World Championship"
} --[[table: 0x44112d98]],
{
  definition = "No introduction.\n(full article : 258 kB, = 15526 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 142,
      hi_height = 1136,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg/800px-Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x415bd190]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg/100px-Max_Verstappen_2017_Malaysia_3_%28cropped%29.jpg",
      title = "Max Verstappen 2017 Malaysia 3 (cropped).jpg",
      width = 100
    } --[[table: 0x41670690]]
  } --[[table: 0x441fb378]],
  lang = "en",
  rtl_lang = false,
  word = "Max Verstappen"
} --[[table: 0x4412f508]],
{
  definition = "Cars 2 is a 2011 American animated spy comedy film produced by Pixar Animation Studios for Walt Disney Pictures. It is the sequel to Cars (2006), the second film in the Cars franchise, and the 12th animated film from the studio. The film was directed by John Lasseter (in his final outing as director of a Pixar film to date), co-directed by Brad Lewis, produced by Denise Ream, and written by Ben Queen, Lasseter, Lewis, and Dan Fogelman. In the film's ensemble voice cast, Owen Wilson, Larry the Cable Guy, Tony Shalhoub, Guido Quaroni, Bonnie Hunt, and John Ratzenberger reprise their roles from the first film. George Carlin, who previously voiced Fillmore, died in 2008, and his role was passed to Lloyd Sherr. They are joined by newcomers Michael Caine, Emily Mortimer, John Turturro, Eddie Izzard, and Thomas Kretschmann. In the film, Lightning McQueen and Mater agree to compete in the World Grand Prix, an international racing event showcasing a new alternative fuel called Allinol, but Mater inadvertently becomes involved in a dangerous espionage mission that puts both his and McQueen's life in jeopardy.\nCars 2 was first announced in April 2008 with a tentative 2012 release date, making Cars the second Pixar film to spawn a sequel after Toy Story (1995), as well as becoming a franchise. Lasseter was confirmed to be returning as director, while Lewis was designated as co-director in June 2010. The film's story was conceived by Lasseter while he was traveling around the world promoting the first film. Michael Giacchino composed the film's score, with artists such as Weezer, Robbie Williams, Brad Paisley and Bénabar contributing tracks for the film. This was the final Pixar film animated with their old software system, Marionette, before being officially replaced with Presto in 2012. With an estimated budget of $200 million, Cars 2 is one of the most expensive films ever made.\nCars 2 premiered at the El Capitan Theatre in Los Angeles on June 18, 2011, and was released in the United States on June 24, in Disney Digital 3D and IMAX 3D as well as traditional two-dimensional and IMAX formats. Despite receiving mixed reviews from critics, Cars 2 continued Pixar's streak of box office success, grossing over $559 million worldwide, becoming the tenth-highest-grossing film of 2011 and the highest-grossing film of the Cars trilogy. The film was nominated for Best Animated Feature Film at the 69th Golden Globe Awards, but lost to The Adventures of Tintin. A sequel, Cars 3, was released on June 16, 2017.\n(full article : 86 kB, = 35 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x44217b40]],
  lang = "en",
  rtl_lang = false,
  word = "Cars 2"
} --[[table: 0x441ab1e0]],
{
  definition = "The 2021 FIA Formula One World Championship was a motor racing championship for Formula One cars which was the 72nd running of the Formula One World Championship. It is recognised by the Fédération Internationale de l'Automobile (FIA), the governing body of international motorsport, as the highest class of competition for open-wheel racing cars. The championship was contested over twenty-two Grands Prix, and held around the world. Drivers and teams competed for the titles of Formula One World Champion Driver and Formula One World Champion Constructor, respectively.\n\nMax Verstappen of Red Bull Racing-Honda won the Drivers' Championship for the first time in his career, having claimed 10 race wins across the season. Verstappen became the first-ever driver from the Netherlands, the first Honda-powered driver since Ayrton Senna in 1991, the first Red Bull driver since Sebastian Vettel in 2013 and the first non-Mercedes driver in the turbo-hybrid era to win the World Championship. This season saw the return of Aston Martin since 1960 after Lawrence Stroll invested into the British marque.\nHonda became the second engine supplier in the turbo-hybrid era to power a championship-winning car, after Mercedes. Four-time defending and seven-time champion Lewis Hamilton of Mercedes finished runner-up. Mercedes retained the Constructors' Championship for the eighth consecutive season.\nThe season featured a close year-long battle for the title between Verstappen and Hamilton, with BBC Sport's Andrew Benson describing it as \"one of the most intense, hard-fought battles in sporting history\". The two drivers exchanged the championship lead multiple times during the season, and the title contenders were involved in major collisions at the British, Hungarian and Italian Grands Prix. Both drivers entered the season-ending Abu Dhabi Grand Prix tied on points, which ended with a controversial finish, as it was deemed that race control did not handle a late safety car period fully according to the regulations. Verstappen overtook Hamilton in a late restart, after which Mercedes initially protested the results, and later decided not to appeal after their protest was denied. A review of the incident led to key structural changes to race control, including the removal of Michael Masi from his role as race director and the implementation of a virtual race control room, which assists the race director.\nThis was the first season since 2008 where the champion driver was not from the team that took the constructors' title. The season was also the final season in the sport for 2007 World Champion Kimi Räikkönen.\n(full article : 262 kB, = 102 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Max_Verstappen_2017_Malaysia_3.jpg/800px-Max_Verstappen_2017_Malaysia_3.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x440d2fc0]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/7/75/Max_Verstappen_2017_Malaysia_3.jpg/100px-Max_Verstappen_2017_Malaysia_3.jpg",
      title = "Max Verstappen 2017 Malaysia 3.jpg",
      width = 100
    } --[[table: 0x415c9a58]]
  } --[[table: 0x4c9af178]],
  lang = "en",
  rtl_lang = false,
  word = "2021 Formula One World Championship"
} --[[table: 0x41581810]],
{
  definition = "No introduction.\n(full article : 282 kB, = 16968 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x44218760]],
  lang = "en",
  rtl_lang = false,
  word = "List of Formula One driver records"
} --[[table: 0x44227978]],
{
  definition = "The 2015 FIA Formula One World Championship was a motor racing championship for Formula One cars. It was the 66th Formula One World Championship recognised by the sport's governing body, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Twenty-two drivers representing 10 teams contested 19 Grands Prix, starting in Australia on 15 March and ending in Abu Dhabi on 29 November as they competed for the World Drivers' and World Constructors' championships.\nLewis Hamilton was the defending Drivers' Champion after securing his second title at the 2014 Abu Dhabi Grand Prix. His team, Mercedes, began the season as the defending Constructors' Champion, having clinched its first championship title at the 2014 Russian Grand Prix.\nThe calendar featured two significant changes from the 2014 season. The first was the return of the Mexican Grand Prix, held for the first time since 1992. The other change was the cancellation of the German Grand Prix after a venue could not be agreed upon, leaving the nation without a World Championship event for the first time in fifty-five years.\nHamilton secured his third Drivers' Championship with three races left in the season. The runner-up was his teammate Nico Rosberg, 59 points behind, with Ferrari's Sebastian Vettel third, another 44 points adrift. Mercedes AMG Petronas F1 Team clinched the 2015 Constructors' Championship at the Russian Grand Prix, ahead of Ferrari and Williams, and ended the season with a record 703 points. Hamilton also won the FIA Pole Trophy with a total of 11 pole positions in the season and the DHL Fastest Lap Award. Ferrari won the inaugural DHL Fastest Pit Stop Award.\n(full article : 166 kB, = 99 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 120,
      hi_height = 960,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Lewis_Hamilton_2014_China.jpg/800px-Lewis_Hamilton_2014_China.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4163b4b8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Lewis_Hamilton_2014_China.jpg/100px-Lewis_Hamilton_2014_China.jpg",
      title = "Lewis Hamilton 2014 China.jpg",
      width = 100
    } --[[table: 0x42d092d8]]
  } --[[table: 0x415ced48]],
  lang = "en",
  rtl_lang = false,
  word = "2015 Formula One World Championship"
} --[[table: 0x440e0bb0]],
{
  definition = "The 2019 FIA Formula One World Championship was the motor racing championship for Formula One cars which marked the 70th running of the Formula One World Championship. It is recognised by the governing body of international motorsport, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Starting in March and ending in December, the championship was contested over twenty-one Grands Prix. Drivers competed for the title of World Drivers' Champion, and teams for the title of World Constructors' Champion. The 2019 championship also saw the running of the 1000th World Championship race, the 2019 Chinese Grand Prix.\nLewis Hamilton successfully defended the World Drivers' Championship for the second year running, winning his sixth championship title at the United States Grand Prix. Mercedes successfully defended the World Constructors' Championship, securing the title for the sixth consecutive year at the Japanese Grand Prix to tie Ferrari's record from 1999 to 2004.\n\n\n(full article : 148 kB, = 145 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/800px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4413d560]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2016_Malaysia_2.jpg/100px-Lewis_Hamilton_2016_Malaysia_2.jpg",
      title = "Lewis Hamilton 2016 Malaysia 2.jpg",
      width = 100
    } --[[table: 0x4413d538]]
  } --[[table: 0x441d0e38]],
  lang = "en",
  rtl_lang = false,
  word = "2019 Formula One World Championship"
} --[[table: 0x44153b60]],
{
  definition = "F1 is an upcoming American sports action drama film directed by Joseph Kosinski and written by Ehren Kruger featuring the automobile racing championship, created in collaboration with the FIA, its governing body. The film stars Brad Pitt, Damson Idris, Kerry Condon, Tobias Menzies, Javier Bardem and Sarah Niles.\nF1 is scheduled to be theatrically released by Warner Bros. Pictures on June 25, 2025, internationally, and in the United States on June 27, 2025.\n(full article : 20 kB, = 43 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x4c9ec060]],
  lang = "en",
  rtl_lang = false,
  word = "F1 (film)"
} --[[table: 0x44160048]],
{
  definition = "Angela Cullen (born 5 August 1974) is a New Zealand physiotherapist and former field hockey player. From 2015 to March 2023, she worked for Hintsa Performance and Mercedes-AMG Petronas F1 Team. She is best known for being the physiotherapist to seven-time Formula One world champion Lewis Hamilton.\n(full article : 9 kB, = 31 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 100,
      hi_height = 800,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg/800px-Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44266cd8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg/100px-Angela_Cullen_in_February_2020_%28sq_cropped%29.jpg",
      title = "Angela Cullen in February 2020 (sq cropped).jpg",
      width = 100
    } --[[table: 0x4c9d8188]]
  } --[[table: 0x44266c38]],
  lang = "en",
  rtl_lang = false,
  word = "Angela Cullen"
} --[[table: 0x4418a4b0]],
{
  definition = "The 2018 FIA Formula One World Championship was the motor racing championship for Formula One cars and the 69th running of the Formula One World Championship. Formula One is recognised by the governing body of international motorsport, the Fédération Internationale de l'Automobile (FIA), as the highest class of competition for open-wheel racing cars. Drivers and teams competed in twenty-one Grands Prix for the World Drivers' and World Constructors' championship titles.\nFor the second consecutive year, the season featured a title battle between Mercedes and Ferrari. The 2018 season saw two four-time World Champions, Lewis Hamilton and Sebastian Vettel, as the main Championship challengers. It was the first time in Formula One history, two quadruple world champions would be competing for a fifth title and the season was billed as the Fight for Five by journalists and fans. The championship lead ebbed and flowed between the two title contenders, the points lead swapping hands five times throughout the year. At the halfway point after the British Grand Prix, Vettel led the title battle by eight points. Hamilton clinched his fifth World Drivers' Championship title at the 2018 Mexican Grand Prix, with the team securing its fifth consecutive World Constructors' Championship title at the following race. Ferrari driver Sebastian Vettel finished runner-up, 88 points behind Hamilton, with his teammate Kimi Räikkönen finishing third. In the Constructors' Championship, Mercedes finished 84 points ahead of Ferrari, with Red Bull Racing-TAG Heuer in third, 152 points behind Ferrari.\nIn 2018, the championship saw the introduction of a new cockpit protection device, known as the \"halo\". The introduction of the halo was the first stage of a planned rollout that would see the device adopted in all FIA-sanctioned open wheel series by 2020.\n(full article : 151 kB, = 83 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2017_Malaysia.jpg/800px-Lewis_Hamilton_2017_Malaysia.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x40665ca0]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Lewis_Hamilton_2017_Malaysia.jpg/100px-Lewis_Hamilton_2017_Malaysia.jpg",
      title = "Lewis Hamilton 2017 Malaysia.jpg",
      width = 100
    } --[[table: 0x414621c0]]
  } --[[table: 0x440e46c8]],
  lang = "en",
  rtl_lang = false,
  word = "2018 Formula One World Championship"
} --[[table: 0x441a2630]],
{
  definition = "David Lewis Hamilton (born September 29, 1997) is an American professional baseball shortstop and second baseman for the Boston Red Sox of Major League Baseball (MLB). He made his MLB debut in 2023.\n(full article : 12 kB, = 59 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x4c47f748]],
  lang = "en",
  rtl_lang = false,
  word = "David Hamilton (baseball)"
} --[[table: 0x44179918]],
{
  definition = "No introduction.\n(full article : 91 kB, = 5458 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x413d5448]],
  lang = "en",
  rtl_lang = false,
  word = "Mercedes-Benz in Formula One"
} --[[table: 0x441cf6f0]],
{
  definition = "No introduction.\n(full article : 172 kB, = 10322 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 164,
      hi_height = 1312,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg/800px-Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44211fc8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg/100px-Valtteri_Bottas_at_the_2022_Austrian_Grand_Prix.jpg",
      title = "Valtteri Bottas at the 2022 Austrian Grand Prix.jpg",
      width = 100
    } --[[table: 0x44218030]]
  } --[[table: 0x413d5518]],
  lang = "en",
  rtl_lang = false,
  word = "Valtteri Bottas"
} --[[table: 0x4420b7f8]],
{
  definition = "Carl Lewis Hamilton (February 23, 1888 – May 27, 1946) was an American businessman. He is most notable for his work as a senior executive of the Weyerhaeuser wood products company and a named partner of the Booz Allen Hamilton management and information technology consulting firm.\n(full article : 7 kB, = 24 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x413d54c8]],
  lang = "en",
  rtl_lang = false,
  word = "Carl L. Hamilton"
} --[[table: 0x4424ff50]],
{
  definition = "Anthony or Antony Hamilton may refer to:\n\nAnthony Hamilton (died 1719), Irish classical author, of aristocratic Scottish ancestry, who lived in France where he was known as Antoine Hamilton\nAnthony Hamilton (Archdeacon of Colchester) (1739–1812), English priest who served as both Archdeacon of London and Archdeacon of Colchester\nAnthony Hamilton-Smith, 3rd Baron Colwyn (1942–2024), English peer, legislator and dental surgeon\nAnthony Hamilton (born 1943), American musician and poet, of The Watts Prophets\nAntony Hamilton (1952–1995), Australian actor, model and dancer\nAnthony Hamilton (born 1956), Grenada-born British racing-car manager, father and former manager of Lewis Hamilton\nAnthony Hamilton (athlete) (born 1969), British Paralympic athlete\nAnthony Hamilton (musician) (born 1971), American R&B/soul singer-songwriter and record producer\nAnthony Hamilton (snooker player) (born 1971), English snooker player\nAnthony Hamilton (fighter) (born 1980), American mixed martial artist\nAnthony Hamilton (soccer) (born 1985), American soccer player\nAnthony Hamilton (archdeacon of Taunton) (1778–1851)\n(full article : 2 kB, = 2 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x4291a820]],
  lang = "en",
  rtl_lang = false,
  word = "Anthony Hamilton"
} --[[table: 0x41213af0]],
{
  definition = "No introduction.\n(full article : 84 kB, = 5027 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 140,
      hi_height = 1120,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Schumacher_china_2012_crop.jpg/800px-Schumacher_china_2012_crop.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x441f7718]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c0/Schumacher_china_2012_crop.jpg/100px-Schumacher_china_2012_crop.jpg",
      title = "Schumacher china 2012 crop.jpg",
      width = 100
    } --[[table: 0x4157b730]]
  } --[[table: 0x4c95d9d8]],
  lang = "en",
  rtl_lang = false,
  word = "List of Formula One World Drivers' Champions"
} --[[table: 0x44120848]],
{
  definition = "Hamilton may refer to:\n\nAlexander Hamilton (1755/1757–1804), first U.S. Secretary of the Treasury and one of the Founding Fathers of the United States\nHamilton (musical), a 2015 Broadway musical by Lin-Manuel Miranda\nHamilton (album), album based on the musical\nThe Hamilton Mixtape, album of music from the musical performed by various artists\nHamilton (2020 film), a live film recording of the musical, featuring the original cast\nHamilton may also refer to:\n\n\n(full article : 8 kB, = 17 x this intro length)",
  dict = "Wikipedia EN",
  images = {} --[[table: 0x4412de30]],
  lang = "en",
  rtl_lang = false,
  word = "Hamilton"
} --[[table: 0x4412b0e8]],
{
  definition = "The 2024 FIA Formula One World Championship is an ongoing motor racing championship for Formula One cars and is the 75th running of the Formula One World Championship. It is recognised by the Fédération Internationale de l'Automobile (FIA), the governing body of international motorsport, as the highest class of competition for open-wheel racing cars. The championship is contested over a record twenty-four Grands Prix held around the world. It began in March and will end in December.\nDrivers and teams compete for the titles of World Drivers' Champion and World Constructors' Champion, respectively. Max Verstappen is the defending Drivers' Champion, while his team, Red Bull Racing-Honda RBPT, are the defending Constructors' Champions.\n(full article : 89 kB, = 122 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 66,
      hi_height = 528,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Max_Verstappen_2024_Chinese_GP.jpg/800px-Max_Verstappen_2024_Chinese_GP.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x442185e8]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2e/Max_Verstappen_2024_Chinese_GP.jpg/100px-Max_Verstappen_2024_Chinese_GP.jpg",
      title = "Max Verstappen 2024 Chinese GP.jpg",
      width = 100
    } --[[table: 0x44218118]]
  } --[[table: 0x442187b0]],
  lang = "en",
  rtl_lang = false,
  word = "2024 Formula One World Championship"
} --[[table: 0x441c09f8]],
{
  definition = "George William Russell (; born 15 February 1998) is a British racing driver currently competing in Formula One for Mercedes. He previously raced for Williams Racing from 2019 to 2021. \nAfter winning several karting championships including the CIK-FIA European Karting Championship in 2012, he repeated his success by becoming the 2018 Formula 2 champion and the 2017 GP3 Series champion, driving for ART in both campaigns to become one of only three drivers to win both championships in his respective rookie seasons. Following his Formula 2 championship win, Russell signed for Williams in 2019, making his debut at the 2019 Australian Grand Prix. He stood in for Lewis Hamilton at Mercedes at the 2020 Sakhir Grand Prix, but was denied a Grand Prix win due to strategic errors. In 2022, Russell departed Williams to race for the Mercedes team alongside Lewis Hamilton, having been a member of the Mercedes Junior Driver Programme since 2017. Russell achieved his first Formula One victory at the 2022 São Paulo Grand Prix. \nAs of the 2024 Belgian Grand Prix, Russell has achieved two victories, three pole positions, eight fastest laps and thirteen podium finishes in his career. Russell is contracted to drive for Mercedes until the conclusion of the 2025 season.\n(full article : 134 kB, = 108 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 142,
      hi_height = 1136,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg/800px-George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44217870]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg/100px-George_Russell%2C_British_GP_2022_%2852381430692%29_%28cropped%29.jpg",
      title = "George Russell, British GP 2022 (52381430692) (cropped).jpg",
      width = 100
    } --[[table: 0x44217848]]
  } --[[table: 0x44218ca0]],
  lang = "en",
  rtl_lang = false,
  word = "George Russell (racing driver)"
} --[[table: 0x40663dd8]],
{
  definition = "No introduction.\n(full article : 173 kB, = 10407 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 150,
      hi_height = 1200,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Nico_Rosberg_2016.jpg/800px-Nico_Rosberg_2016.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x44217ae0]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Nico_Rosberg_2016.jpg/100px-Nico_Rosberg_2016.jpg",
      title = "Nico Rosberg 2016.jpg",
      width = 100
    } --[[table: 0x44217ab8]]
  } --[[table: 0x41470490]],
  lang = "en",
  rtl_lang = false,
  word = "Nico Rosberg"
} --[[table: 0x406b1028]],
{
  definition = "The 2008 FIA Formula One World Championship was the 62nd season of Formula One motor racing, recognised by the Fédération Internationale de l'Automobile (FIA) – the governing body of motorsport – as the highest class of competition for open-wheel racing cars. The championship was contested over eighteen races commencing in Australia on 16 March and ending in Brazil on 2 November. The 2008 season saw the debut of the Singapore Grand Prix, which was held at the Marina Bay Street Circuit, in Marina Bay, Singapore and was the first Formula One race held at night. The European Grand Prix moved to a new venue at the Valencia Street Circuit, in Valencia, Spain.\nLewis Hamilton won the Drivers' title by a point – by overtaking Toyota's Timo Glock on the final corner of the final lap of the final Grand Prix of the season to claim the required 5th-place finish to win the championship – from Brazilian Felipe Massa, who had finished the race in first place; his team and family already celebrating the championship when the final overtake occurred. Massa's teammate, the reigning World Champion Kimi Räikkönen, was ranked third, with two wins. Scuderia Ferrari Marlboro won the Constructors' title. In winning the Drivers' title, Hamilton became the youngest driver ever to win the title (a record since surpassed by Sebastian Vettel winning the 2010 Drivers' title) and the first black driver to do so. He was also the first British champion since Damon Hill in 1996.\nEleven teams competed in the championship, although Super Aguri withdrew on 6 May from the 2008 Formula One season due to financial troubles, completing four races. New technical rules for 2008 included the banning of traction control after it was re-introduced in 2001, at the Spanish Grand Prix. Fernando Alonso won the first race held in Singapore; however, only after teammate Nelson Piquet Jr. deliberately crashed to cause a Safety Car period which helped Alonso's strategy. When Piquet admitted this to the press in 2009 Renault team-principal Briatore resigned. Some journalists dubbed this \"Crashgate\".\nThis was the last season for the Honda team before they pulled out of F1 later in December due to the financial difficulties. Honda returned as an engine supplier between 2015 and 2021. Ross Brawn then bought the team, and renamed it to Brawn GP in February 2009 using the Mercedes-Benz engines. This was also the last Formula One season to race with grooved tyres, used since 1998, before slick tyres returned to Formula One in 2009. 2008 was the last season to feature 2001 runner up David Coulthard who retired after 14 years and 246 race starts.\nIt was the first time in the history of Formula One that all teams used the same two drivers throughout the season. As of 2024, this season marks the last World Drivers' Championship for McLaren, although Hamilton later won six more drivers' championships with Mercedes. The 2008 season also marks Scuderia Ferrari's last World Constructors' Championship win as of the 2023 championship.\n(full article : 102 kB, = 35 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 120,
      hi_height = 960,
      hi_source = "https://upload.wikimedia.org/wikipedia/en/thumb/5/54/LewisHamiltonPortrait.jpg/800px-LewisHamiltonPortrait.jpg",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4c4f8e90]],
      source = "https://upload.wikimedia.org/wikipedia/en/thumb/5/54/LewisHamiltonPortrait.jpg/100px-LewisHamiltonPortrait.jpg",
      title = "LewisHamiltonPortrait.jpg",
      width = 100
    } --[[table: 0x4ae0ad58]]
  } --[[table: 0x4c8a9448]],
  lang = "en",
  rtl_lang = false,
  word = "2008 Formula One World Championship"
} --[[table: 0x414c2c20]],
{
  definition = "The 2024 Belgian Grand Prix (officially known as the Formula 1 Rolex Belgian Grand Prix 2024) was a Formula One motor race that took place on 28 July 2024 at the Circuit de Spa-Francorchamps in Stavelot, Belgium. It was the fourteenth round of the 2024 Formula One World Championship. \nMax Verstappen set the fastest time in qualifying, but was relegated to eleventh following a grid penalty, with Charles Leclerc inheriting pole position in his place. George Russell of Mercedes crossed the finish line first, but was disqualified after the race because his car failed to meet the minimum weight requirement. The race was won by Russell's teammate Lewis Hamilton, his second victory of the season ahead of Oscar Piastri of McLaren and Charles Leclerc of Ferrari.\n\n\n(full article : 26 kB, = 34 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 62,
      hi_height = 496,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Spa-Francorchamps_of_Belgium.svg/800px-Spa-Francorchamps_of_Belgium.svg.png",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4156d320]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Spa-Francorchamps_of_Belgium.svg/100px-Spa-Francorchamps_of_Belgium.svg.png",
      title = "Spa-Francorchamps of Belgium.svg",
      width = 100
    } --[[table: 0x44217170]]
  } --[[table: 0x44217100]],
  lang = "en",
  rtl_lang = false,
  word = "2024 Belgian Grand Prix"
} --[[table: 0x414d9258]],
{
  definition = "No introduction.\n(full article : 56 kB, = 3354 x this intro length)",
  dict = "Wikipedia EN",
  images = {
    {
      height = 66,
      hi_height = 528,
      hi_source = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Marina_Bay_circuit_2023.svg/800px-Marina_Bay_circuit_2023.svg.png",
      hi_width = 800,
      load_bb_func = function() --[[..skipped..]] end --[[function: 0x4416d478]],
      source = "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Marina_Bay_circuit_2023.svg/100px-Marina_Bay_circuit_2023.svg.png",
      title = "Marina Bay circuit 2023.svg",
      width = 100
    } --[[table: 0x411de200]]
  } --[[table: 0x4291a870]],
  lang = "en",
  rtl_lang = false,
  word = "Singapore Grand Prix"
} --[[table: 0x414aa778]]
} --[[table: 0x4ae1b698]] 
08/18/24-11:35:52 DEBUG ImageWidget: _render'ing resources/icons/mdlight/appbar.menu.svg 24 24 
08/18/24-11:35:52 DEBUG ImageWidget: initial offsets 0 0 
08/18/24-11:35:52 DEBUG ImageWidget: _render'ing resources/icons/mdlight/close.svg 24 24 
08/18/24-11:35:52 DEBUG ImageWidget: initial offsets 0 0 
08/18/24-11:35:52 DEBUG ImageWidget: _render'ing resources/icons/mdlight/edit.svg 32 32 
08/18/24-11:35:52 DEBUG ImageWidget: initial offsets 0 0 
08/18/24-11:35:52 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:35:52 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:35:52 DEBUG setDirty fast from widget table: 0x41349af0 w/ NO region; dithering: nil 
08/18/24-11:35:52 DEBUG setDirty via a func from widget table: 0x41349af0 
08/18/24-11:35:52 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:35:52 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:35:52 DEBUG setDirty fast from widget table: 0x41349af0 w/ NO region; dithering: nil 
08/18/24-11:35:52 DEBUG close widget: table: 0x4c567220 
08/18/24-11:35:52 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:35:52 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:35:52 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:35:52 DEBUG show widget: table: 0x41349af0 
08/18/24-11:35:52 DEBUG setDirty nil from widget table: 0x41349af0 w/ NO region; dithering: nil 
08/18/24-11:35:52 DEBUG setDirty via a func from widget table: 0x41349af0 
08/18/24-11:35:52 DEBUG UIManager:allowStandby, counter decreased to 0 
08/18/24-11:35:52 DEBUG painting widget: table: 0x44644168 
08/18/24-11:35:52 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:35:52 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:35:52 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:35:52 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:35:52 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:35:52 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:35:52 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:35:52 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:35:52 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:35:53 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:35:53 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:35:53 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:35:53 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:35:53 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:35:53 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:35:53 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:35:53 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:35:53 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:35:53 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:35:53 DEBUG painting widget: table: 0x41349af0 
08/18/24-11:35:53 DEBUG blitFrom 18 17 0 0 24 24 
08/18/24-11:35:53 DEBUG blitFrom 558 17 0 0 24 24 
08/18/24-11:35:53 DEBUG blitFrom 551 62 0 0 32 32 
08/18/24-11:35:53 DEBUG update_mode: Update refresh mode fast to ui 
08/18/24-11:35:53 DEBUG update_dither: Update dither hint false to true 
08/18/24-11:35:53 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: true 
08/18/24-11:35:53 DEBUG update_mode: Update refresh mode ui to flashui 
08/18/24-11:35:53 DEBUG _refresh: Enqueued flashui update for region 0 0 600 800 dithering: true 
08/18/24-11:35:53 DEBUG triggering refresh {
mode = "flashui",
region = "600x800+0+0"
} --[[table: 0x440e6f40]] 
08/18/24-11:35:53 DEBUG UIManager:preventStandby, counter increased to 1 
08/18/24-11:35:53 DEBUG fetching https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg/100px-Lewis_Hamilton_2022_S%C3%A3o_Paulo_Grand_Prix_%2852498120773%29_%28cropped%29.jpg 
08/18/24-11:35:53 DEBUG show widget: table: 0x4cde9468 
08/18/24-11:35:53 DEBUG setDirty nil from widget table: 0x4cde9468 w/ NO region; dithering: nil 
08/18/24-11:35:54 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:54 DEBUG process not yet done, will check again soon 
08/18/24-11:35:54 DEBUG subprocess_done: false  stuff_to_read: false 
08/18/24-11:35:54 DEBUG process not yet done, will check again soon 
08/18/24-11:35:54 DEBUG subprocess_done: true  stuff_to_read: true 
08/18/24-11:35:54 DEBUG close widget: table: 0x4cde9468 
08/18/24-11:35:54 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:35:54 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:35:54 DEBUG  fetched 6910 
08/18/24-11:35:54 DEBUG renderImageData: using MuPDF 
08/18/24-11:35:54 DEBUG Mupdf.renderImage true cdata<struct BlitBufferRGB24>: 0x44148040 
08/18/24-11:35:54 DEBUG setDirty via a func from widget table: 0x41349af0 
08/18/24-11:35:54 DEBUG UIManager:allowStandby, counter decreased to 0 
08/18/24-11:35:54 DEBUG painting widget: table: 0x41349af0 
08/18/24-11:35:54 DEBUG blitFrom 18 17 0 0 24 24 
08/18/24-11:35:54 DEBUG blitFrom 558 17 0 0 24 24 
08/18/24-11:35:54 DEBUG blitFrom 551 62 0 0 32 32 
08/18/24-11:35:54 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:35:54 DEBUG _refresh: Enqueued ui update for region 465 127 100 134 dithering: true 
08/18/24-11:35:54 DEBUG triggering refresh {
mode = "ui",
region = "100x134+465+127"
} --[[table: 0x413efd88]] 
08/18/24-11:35:54 DEBUG UIManager:_standbyTransition -> AllowStandby 
08/18/24-11:35:58 DEBUG key event => code: 139 (Menu), value: 1, time: 1723977358.575377 
08/18/24-11:35:58 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:35:59 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:35:59 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:35:59 DEBUG setDirty fast from widget table: 0x41659b48 w/ NO region; dithering: nil 
08/18/24-11:35:59 DEBUG show widget: table: 0x41659b48 
08/18/24-11:35:59 DEBUG setDirty nil from widget table: 0x41659b48 w/ NO region; dithering: nil 
08/18/24-11:35:59 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:35:59 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:35:59 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:35:59 DEBUG Found font: NotoSansCJKsc-Regular.otf in ./fonts/noto/NotoSansCJKsc-Regular.otf 
08/18/24-11:36:00 DEBUG update_mode: Update refresh mode fast to ui 
08/18/24-11:36:00 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:36:00 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:36:00 DEBUG triggering refresh {
mode = "ui",
region = "600x800+0+0"
} --[[table: 0x4c934a50]] 
08/18/24-11:36:00 DEBUG key event => code: 139 (Menu), value: 0, time: 1723977358.745372 
08/18/24-11:36:00 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:12 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977372.315391 
08/18/24-11:36:12 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:12 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:12 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:13 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:13 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c570050]] 
08/18/24-11:36:13 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977372.475367 
08/18/24-11:36:13 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:18 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977378.305393 
08/18/24-11:36:18 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:18 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:18 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:19 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:19 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c831ef8]] 
08/18/24-11:36:19 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977378.495369 
08/18/24-11:36:19 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:31 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977391.925387 
08/18/24-11:36:31 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:31 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:31 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:32 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:32 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4146de68]] 
08/18/24-11:36:32 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977392.085355 
08/18/24-11:36:32 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:33 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977393.435334 
08/18/24-11:36:33 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:33 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:33 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:34 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:34 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c638a28]] 
08/18/24-11:36:34 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977393.645351 
08/18/24-11:36:34 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:37 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977397.045384 
08/18/24-11:36:37 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:37 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:37 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:37 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:37 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c8b9ac8]] 
08/18/24-11:36:37 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977397.205331 
08/18/24-11:36:37 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:40 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977400.425394 
08/18/24-11:36:40 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:40 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:40 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:41 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:41 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4af4d6e8]] 
08/18/24-11:36:41 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977400.615381 
08/18/24-11:36:41 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:58 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977418.245390 
08/18/24-11:36:58 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:36:58 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:36:58 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:36:58 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:36:58 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c917430]] 
08/18/24-11:36:59 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977418.385330 
08/18/24-11:36:59 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:00 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977420.755373 
08/18/24-11:37:00 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:00 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:00 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:01 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:01 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c5a8e58]] 
08/18/24-11:37:01 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977420.895365 
08/18/24-11:37:01 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:02 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977422.315386 
08/18/24-11:37:02 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:02 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:02 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:03 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:03 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x41183010]] 
08/18/24-11:37:03 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977422.465367 
08/18/24-11:37:03 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:03 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977423.615392 
08/18/24-11:37:03 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:03 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:03 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:04 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:04 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x440ea8c0]] 
08/18/24-11:37:04 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977423.775330 
08/18/24-11:37:04 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:05 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977425.405344 
08/18/24-11:37:05 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:05 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:05 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:06 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:06 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c9096f0]] 
08/18/24-11:37:06 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977425.555332 
08/18/24-11:37:06 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:08 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977428.175384 
08/18/24-11:37:08 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:08 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:08 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:08 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:08 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4427a6b0]] 
08/18/24-11:37:08 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977428.305344 
08/18/24-11:37:08 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:10 DEBUG key event => code: 191 (RPgFwd), value: 1, time: 1723977430.655372 
08/18/24-11:37:10 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:10 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:10 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:11 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:11 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c8cf6a0]] 
08/18/24-11:37:11 DEBUG key event => code: 191 (RPgFwd), value: 0, time: 1723977430.815350 
08/18/24-11:37:11 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:13 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977433.885376 
08/18/24-11:37:13 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:13 DEBUG setDirty via a func from widget table: 0x41659b48 
08/18/24-11:37:13 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:14 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:14 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4cd28718]] 
08/18/24-11:37:14 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977434.035357 
08/18/24-11:37:14 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:20 DEBUG key event => code: 56 (Alt), value: 1, time: 1723977440.795371 
08/18/24-11:37:20 DEBUG key event => code: 42 (Shift), value: 1, time: 1723977440.795687 
08/18/24-11:37:21 DEBUG key event => code: 34 (G), value: 1, time: 1723977441.475634 
08/18/24-11:37:21 DEBUG key event => code: 35 (H), value: 1, time: 1723977441.476065 
08/18/24-11:37:21 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:22 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:37:22 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:37:22 DEBUG setDirty fast from widget table: 0x4cd57908 w/ NO region; dithering: nil 
08/18/24-11:37:22 DEBUG show widget: table: 0x4cd57908 
08/18/24-11:37:22 DEBUG setDirty nil from widget table: 0x4cd57908 w/ NO region; dithering: nil 
08/18/24-11:37:22 DEBUG setDirty via a func from widget table: 0x4cd57908 
08/18/24-11:37:22 DEBUG setDirty full on no specific widget: found a dithered widget, infecting the refresh queue 
08/18/24-11:37:22 DEBUG update_mode: Update refresh mode fast to full 
08/18/24-11:37:22 DEBUG update_dither: Update dither hint false to true 
08/18/24-11:37:22 DEBUG _refresh: Enqueued full update for region 0 0 600 800 dithering: true 
08/18/24-11:37:22 DEBUG setDirty full from widget nil w/ NO region; dithering: true 
08/18/24-11:37:22 DEBUG painting widget: table: 0x4cd57908 
08/18/24-11:37:23 DEBUG _refresh: Enqueued full update for region 0 0 600 800 dithering: true 
08/18/24-11:37:23 DEBUG update_dither: Update dither hint false to true 
08/18/24-11:37:23 DEBUG triggering refresh {
mode = "full",
region = "600x800+0+0"
} --[[table: 0x4c5a51f0]] 
08/18/24-11:37:23 DEBUG key event => code: 34 (G), value: 0, time: 1723977441.645352 
08/18/24-11:37:23 DEBUG key event => code: 35 (H), value: 0, time: 1723977441.645368 
08/18/24-11:37:23 DEBUG key event => code: 56 (Alt), value: 0, time: 1723977442.095331 
08/18/24-11:37:23 DEBUG key event => code: 42 (Shift), value: 0, time: 1723977442.145321 
08/18/24-11:37:23 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:27 DEBUG key event => code: 158 (Back), value: 1, time: 1723977447.505387 
08/18/24-11:37:27 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:27 DEBUG close widget: table: 0x4cd57908 
08/18/24-11:37:27 DEBUG setDirty via a func from widget nil 
08/18/24-11:37:27 DEBUG Lower widget table: 0x41349af0 was dithered, honoring the dithering hint 
08/18/24-11:37:27 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:37:27 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:37:27 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:37:27 DEBUG setDirty nil from widget table: 0x41349af0 w/ NO region; dithering: true 
08/18/24-11:37:27 DEBUG setDirty nil from widget table: 0x41659b48 w/ NO region; dithering: nil 
08/18/24-11:37:27 DEBUG painting widget: table: 0x44644168 
08/18/24-11:37:27 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:37:27 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:37:27 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:37:27 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:37:27 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:37:28 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:37:28 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:37:28 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:37:28 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:37:28 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:37:28 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:37:28 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:37:28 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:37:28 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:37:28 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:37:28 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:37:28 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:37:28 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:37:28 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:28 DEBUG painting widget: table: 0x41349af0 
08/18/24-11:37:28 DEBUG blitFrom 18 17 0 0 24 24 
08/18/24-11:37:28 DEBUG blitFrom 558 17 0 0 24 24 
08/18/24-11:37:28 DEBUG blitFrom 551 62 0 0 32 32 
08/18/24-11:37:28 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:28 DEBUG painting widget: table: 0x41659b48 
08/18/24-11:37:29 DEBUG _refresh: Enqueued flashui update for region 30 264 540 271 dithering: true 
08/18/24-11:37:29 DEBUG triggering refresh {
mode = "flashui",
region = "540x271+30+264"
} --[[table: 0x4c9404d0]] 
08/18/24-11:37:29 DEBUG key event => code: 158 (Back), value: 0, time: 1723977447.665359 
08/18/24-11:37:29 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:38 DEBUG key event => code: 139 (Menu), value: 1, time: 1723977458.855383 
08/18/24-11:37:38 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:38 DEBUG close widget: table: 0x41659b48 
08/18/24-11:37:38 DEBUG setDirty via a func from widget nil 
08/18/24-11:37:38 DEBUG Lower widget table: 0x41349af0 was dithered, honoring the dithering hint 
08/18/24-11:37:38 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:37:38 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:37:38 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:37:38 DEBUG setDirty nil from widget table: 0x41349af0 w/ NO region; dithering: true 
08/18/24-11:37:38 DEBUG painting widget: table: 0x44644168 
08/18/24-11:37:39 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:37:39 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:37:39 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:37:39 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:37:39 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:37:39 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:37:39 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:37:39 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:37:39 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:37:39 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:37:39 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:37:39 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:37:39 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:37:39 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:39 DEBUG painting widget: table: 0x41349af0 
08/18/24-11:37:39 DEBUG blitFrom 18 17 0 0 24 24 
08/18/24-11:37:39 DEBUG blitFrom 558 17 0 0 24 24 
08/18/24-11:37:39 DEBUG blitFrom 551 62 0 0 32 32 
08/18/24-11:37:39 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:39 DEBUG _refresh: Enqueued flashui update for region 18 32 460 768 dithering: true 
08/18/24-11:37:39 DEBUG triggering refresh {
mode = "flashui",
region = "460x768+18+32"
} --[[table: 0x4163bc98]] 
08/18/24-11:37:39 DEBUG key event => code: 139 (Menu), value: 0, time: 1723977459.025330 
08/18/24-11:37:39 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:41 DEBUG key event => code: 139 (Menu), value: 1, time: 1723977461.185369 
08/18/24-11:37:41 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:41 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:37:41 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:37:41 DEBUG setDirty fast from widget table: 0x4cdaf848 w/ NO region; dithering: nil 
08/18/24-11:37:41 DEBUG show widget: table: 0x4cdaf848 
08/18/24-11:37:41 DEBUG setDirty nil from widget table: 0x4cdaf848 w/ NO region; dithering: nil 
08/18/24-11:37:41 DEBUG setDirty via a func from widget table: 0x4cdaf848 
08/18/24-11:37:41 DEBUG painting widget: table: 0x4cdaf848 
08/18/24-11:37:41 DEBUG setDirty via a func from widget table: 0x4cdaf848 
08/18/24-11:37:42 DEBUG update_mode: Update refresh mode fast to ui 
08/18/24-11:37:42 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:37:42 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:37:42 DEBUG triggering refresh {
mode = "ui",
region = "600x800+0+0"
} --[[table: 0x4ce44ff8]] 
08/18/24-11:37:42 DEBUG key event => code: 139 (Menu), value: 0, time: 1723977461.365368 
08/18/24-11:37:42 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:43 DEBUG key event => code: 104 (LPgFwd), value: 1, time: 1723977463.325345 
08/18/24-11:37:43 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:43 DEBUG setDirty via a func from widget table: 0x4cdaf848 
08/18/24-11:37:43 DEBUG painting widget: table: 0x4cdaf848 
08/18/24-11:37:44 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:44 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4ce77dd0]] 
08/18/24-11:37:44 DEBUG key event => code: 104 (LPgFwd), value: 0, time: 1723977463.525333 
08/18/24-11:37:44 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:44 DEBUG key event => code: 104 (LPgFwd), value: 1, time: 1723977464.745336 
08/18/24-11:37:44 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:44 DEBUG setDirty via a func from widget table: 0x4cdaf848 
08/18/24-11:37:44 DEBUG painting widget: table: 0x4cdaf848 
08/18/24-11:37:45 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:45 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c021988]] 
08/18/24-11:37:45 DEBUG key event => code: 104 (LPgFwd), value: 0, time: 1723977464.915356 
08/18/24-11:37:45 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:48 DEBUG key event => code: 109 (RPgBack), value: 1, time: 1723977468.365388 
08/18/24-11:37:48 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:48 DEBUG setDirty via a func from widget table: 0x4cdaf848 
08/18/24-11:37:48 DEBUG painting widget: table: 0x4cdaf848 
08/18/24-11:37:49 DEBUG _refresh: Enqueued ui update for region 22 38 452 756 dithering: false 
08/18/24-11:37:49 DEBUG triggering refresh {
mode = "ui",
region = "452x756+22+38"
} --[[table: 0x4c5fc530]] 
08/18/24-11:37:49 DEBUG key event => code: 109 (RPgBack), value: 0, time: 1723977468.615357 
08/18/24-11:37:49 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:56 DEBUG key event => code: 139 (Menu), value: 1, time: 1723977476.465368 
08/18/24-11:37:56 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:37:56 DEBUG close widget: table: 0x4cdaf848 
08/18/24-11:37:56 DEBUG setDirty via a func from widget nil 
08/18/24-11:37:56 DEBUG Lower widget table: 0x41349af0 was dithered, honoring the dithering hint 
08/18/24-11:37:56 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:37:56 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:37:56 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:37:56 DEBUG setDirty nil from widget table: 0x41349af0 w/ NO region; dithering: true 
08/18/24-11:37:56 DEBUG painting widget: table: 0x44644168 
08/18/24-11:37:56 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:37:56 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:37:56 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:37:56 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:37:56 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:37:56 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:37:56 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:37:56 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:37:56 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:37:56 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:37:56 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:37:56 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:37:56 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:37:56 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:56 DEBUG painting widget: table: 0x41349af0 
08/18/24-11:37:57 DEBUG blitFrom 18 17 0 0 24 24 
08/18/24-11:37:57 DEBUG blitFrom 558 17 0 0 24 24 
08/18/24-11:37:57 DEBUG blitFrom 551 62 0 0 32 32 
08/18/24-11:37:57 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:37:57 DEBUG _refresh: Enqueued flashui update for region 18 32 460 768 dithering: true 
08/18/24-11:37:57 DEBUG triggering refresh {
mode = "flashui",
region = "460x768+18+32"
} --[[table: 0x4c634ee0]] 
08/18/24-11:37:57 DEBUG key event => code: 139 (Menu), value: 0, time: 1723977476.665331 
08/18/24-11:37:57 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:06 DEBUG key event => code: 158 (Back), value: 1, time: 1723977486.025370 
08/18/24-11:38:06 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:06 DEBUG close widget: table: 0x41349af0 
08/18/24-11:38:06 DEBUG freeing lookup results images blitbuffers 
08/18/24-11:38:06 DEBUG setDirty via a func from widget nil 
08/18/24-11:38:06 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:38:06 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:38:06 DEBUG setDirty nil from widget table: 0x44644168 w/ NO region; dithering: true 
08/18/24-11:38:06 DEBUG painting widget: table: 0x44644168 
08/18/24-11:38:06 DEBUG blitFrom 5 5 0 0 40 40 
08/18/24-11:38:06 DEBUG blitFrom 555 5 0 0 40 40 
08/18/24-11:38:06 DEBUG blitFrom 11 89 0 0 135 208 
08/18/24-11:38:06 DEBUG blitFrom 130 281 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 158 89 0 0 135 208 
08/18/24-11:38:06 DEBUG blitFrom 277 281 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 305 90 0 0 134 207 
08/18/24-11:38:06 DEBUG blitFrom 423 281 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 452 95 0 0 135 196 
08/18/24-11:38:06 DEBUG blitFrom 571 275 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 11 311 0 0 134 210 
08/18/24-11:38:06 DEBUG blitFrom 129 505 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 158 312 0 0 135 209 
08/18/24-11:38:06 DEBUG blitFrom 277 505 0 0 17 17 
08/18/24-11:38:06 DEBUG blitFrom 97 758 0 0 40 40 
08/18/24-11:38:06 DEBUG blitFrom 173 758 0 0 40 40 
08/18/24-11:38:06 DEBUG blitFrom 387 758 0 0 40 40 
08/18/24-11:38:06 DEBUG blitFrom 463 758 0 0 40 40 
08/18/24-11:38:06 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-11:38:06 DEBUG _refresh: Enqueued flashui update for region 0 0 600 800 dithering: true 
08/18/24-11:38:06 DEBUG triggering refresh {
mode = "flashui",
region = "600x800+0+0"
} --[[table: 0x4c95c258]] 
08/18/24-11:38:06 DEBUG key event => code: 158 (Back), value: 0, time: 1723977486.135332 
08/18/24-11:38:06 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:07 DEBUG key event => code: 158 (Back), value: 1, time: 1723977487.635389 
08/18/24-11:38:07 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:07 DEBUG ImageWidget: _render'ing resources/icons/mdlight/notice-question.svg 40 40 
08/18/24-11:38:07 DEBUG renderSVG resources/icons/mdlight/notice-question.svg 0.83333333333333 48 48 > 40 40 0 0 
08/18/24-11:38:07 DEBUG cache image|resources/icons/mdlight/notice-question.svg|40|40true 
08/18/24-11:38:07 DEBUG ImageWidget: initial offsets 0 0 
08/18/24-11:38:07 DEBUG FocusManager: Move focus position to: 1 , 1 
08/18/24-11:38:07 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:38:07 DEBUG setDirty fast from widget table: 0x4c574a10 w/ NO region; dithering: nil 
08/18/24-11:38:07 DEBUG show widget: table: 0x4c574a10 
08/18/24-11:38:07 DEBUG setDirty nil from widget table: 0x4c574a10 w/ NO region; dithering: nil 
08/18/24-11:38:07 DEBUG setDirty via a func from widget table: 0x4c574a10 
08/18/24-11:38:07 DEBUG painting widget: table: 0x4c574a10 
08/18/24-11:38:07 DEBUG blitFrom 75 355 0 0 40 40 
08/18/24-11:38:07 DEBUG update_mode: Update refresh mode fast to ui 
08/18/24-11:38:07 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:38:07 DEBUG triggering refresh {
mode = "ui",
region = "600x800+0+0"
} --[[table: 0x4e7b28b8]] 
08/18/24-11:38:07 DEBUG key event => code: 158 (Back), value: 0, time: 1723977487.795346 
08/18/24-11:38:07 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:08 DEBUG key event => code: 106 (Right), value: 1, time: 1723977488.475665 
08/18/24-11:38:08 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:08 DEBUG FocusManager cursor position is: 2 , 1 
08/18/24-11:38:08 DEBUG _refresh: Enqueued fast update for region 0 0 600 800 dithering: false 
08/18/24-11:38:08 DEBUG setDirty fast from widget table: 0x4c574a10 w/ NO region; dithering: nil 
08/18/24-11:38:08 DEBUG painting widget: table: 0x4c574a10 
08/18/24-11:38:08 DEBUG blitFrom 75 355 0 0 40 40 
08/18/24-11:38:08 DEBUG triggering refresh {
mode = "fast",
region = "600x800+0+0"
} --[[table: 0x4c028a20]] 
08/18/24-11:38:08 DEBUG key event => code: 106 (Right), value: 0, time: 1723977488.618861 
08/18/24-11:38:08 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:09 DEBUG key event => code: 194 (Press), value: 1, time: 1723977489.228055 
08/18/24-11:38:09 DEBUG AutoSuspend: onInputEvent 
08/18/24-11:38:09 DEBUG FocusManager: Send tap to 412 , 428 
08/18/24-11:38:09 DEBUG Explicit widgetRepaint: table: 0x4c648280 @ 300 408 
08/18/24-11:38:09 DEBUG _refresh: Enqueued fast update for region 300 408 224 40 dithering: false 
08/18/24-11:38:09 DEBUG setDirty fast from widget nil w/ region 300 408 224 40 dithering: nil 
08/18/24-11:38:09 DEBUG triggering refresh {
mode = "fast",
region = "224x40+300+408"
} --[[table: 0x42cba0c8]] 
08/18/24-11:38:09 DEBUG Explicit widgetRepaint: table: 0x4c648280 @ 300 408 
08/18/24-11:38:09 DEBUG _refresh: Enqueued fast update for region 300 408 224 40 dithering: false 
08/18/24-11:38:09 DEBUG setDirty fast from widget nil w/ region 300 408 224 40 dithering: nil 
08/18/24-11:38:09 DEBUG close widget: table: 0x44649340 
08/18/24-11:38:09 DEBUG CoverMenu:onCloseWidget: terminating jobs if needed 
08/18/24-11:38:09 DEBUG terminating 0 subprocesses 
08/18/24-11:38:09 DEBUG update_mode: Update refresh mode fast to ui 
08/18/24-11:38:09 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:38:09 DEBUG setDirty ui from widget nil w/ NO region; dithering: nil 
08/18/24-11:38:09 DEBUG Lower widget table: 0x44644168 was dithered, honoring the dithering hint 
08/18/24-11:38:09 DEBUG Lower widget table: 0x44644168 covers the full screen 
08/18/24-11:38:09 DEBUG close filemanager 
08/18/24-11:38:09 DEBUG close widget: table: 0x44644168 
08/18/24-11:38:09 DEBUG AutoSuspend: onCloseWidget 
08/18/24-11:38:09 DEBUG AutoSuspend: unschedule suspend/shutdown timer 
08/18/24-11:38:09 DEBUG AutoSuspend: unschedule t1 timeout timer 
08/18/24-11:38:09 DEBUG Tearing down FileManager table: 0x44644168 
08/18/24-11:38:09 DEBUG setDirty nil from widget table: 0x4c574a10 w/ NO region; dithering: nil 
08/18/24-11:38:09 DEBUG close widget: table: 0x4c574a10 
08/18/24-11:38:09 DEBUG setDirty via a func from widget nil 
08/18/24-11:38:09 DEBUG _refresh: Enqueued ui update for region 0 0 600 800 dithering: false 
08/18/24-11:38:09 DEBUG triggering refresh {
mode = "ui",
region = "600x800+0+0"
} --[[table: 0x4cee67b0]] 
08/18/24-11:38:10 INFO  UIManager: No dialogs left to show 
08/18/24-11:38:10 INFO  Tearing down UIManager with exit code: 0 
[ko-input] Closed input device with fd: 6 @ idx: 2 (matched by idx)
[ko-input] Closed input device with fd: 5 @ idx: 1 (matched by idx)
[ko-input] Closed input device with fd: 4 @ idx: 0 (matched by idx)
lipc-wait-event exited normally with status: 0


wiki seems to crash, (but not crash, close KOReader more like) when one closes the widget and locks the device shortly after

08/18/24-13:00:04 DEBUG _repaint: it was dithered, infecting the refresh queue 
08/18/24-13:00:04 DEBUG _refresh: Enqueued flashui update for region 0 0 600 800 dithering: true 
08/18/24-13:00:04 DEBUG triggering refresh {
  mode = "flashui",
  region = "600x800+0+0"
} --[[table: 0x4292e2f8]] 
08/18/24-13:00:04 DEBUG key event => code: 158 (Back), value: 0, time: 1723982401.858726 
08/18/24-13:00:04 DEBUG AutoSuspend: onInputEvent 
08/18/24-13:00:09 DEBUG key event => code: 10000 (IntoSS), value: 2, time: 0.000000 
08/18/24-13:00:09 DEBUG AutoSuspend: onInputEvent 
08/18/24-13:00:09 DEBUG Kindle:intoScreenSaver via BUTTON_SUSPEND 
08/18/24-13:00:10 DEBUG DocSettings: data is read from /mnt/us/ePubs/Flaubert's Parrot - Julian Barnes.sdr/metadata.epub.lua 
Segmentation fault
lipc-wait-event exited normally with status: 0

after restarting the device, I keep getting that segmentation fault

08/18/24-13:17:37 DEBUG Kindle:intoScreenSaver via BUTTON_SUSPEND 
08/18/24-13:17:37 DEBUG DocSettings: data is read from /mnt/us/ePubs/Flaubert's Parrot - Julian Barnes.sdr/metadata.epub.lua 
Segmentation fault
lipc-wait-event exited normally with status: 0

edit: great now is not just limited to locking the device

08/18/24-14:55:01 DEBUG key event => code: 56 (Alt), value: 1, time: 1723989301.602943 
08/18/24-14:55:01 DEBUG key event => code: 31 (S), value: 1, time: 1723989301.603235 
08/18/24-14:55:01 DEBUG AutoSuspend: onInputEvent 
08/18/24-14:55:01 DEBUG key event => code: 31 (S), value: 0, time: 1723989301.732942 
08/18/24-14:55:01 DEBUG AutoSuspend: onInputEvent 
08/18/24-14:55:01 DEBUG key event => code: 56 (Alt), value: 0, time: 1723989301.892933 
08/18/24-14:55:06 DEBUG key event => code: 56 (Alt), value: 1, time: 1723989306.542943 
08/18/24-14:55:06 DEBUG key event => code: 31 (S), value: 1, time: 1723989306.543254 
08/18/24-14:55:06 DEBUG AutoSuspend: onInputEvent 
Segmentation fault
lipc-wait-event exited normally with status: 0

@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 18, 2024

Dunno, that might be for you to investigate

AFAICT, it may or may not have to do with passing true as the last argument to _scrollBy.

One the other hand, it may also have to do with something else, because I now do that for single-step focus moves and the pageturn buttons, and the single-step will re-snap and scroll-up instead of filling the bottom with blanks :D.
(So the only difference in that one requests a scroll by the full height of the scrollwidget, vs. an "y offset to the top of the next button" value).

In any case, I just realized that this broke navigating other stuff like SpinWidgets (with arrow keys but not tabs, lulz) for some reason, so, back to drawing board ^^.

NiLuJe added 12 commits August 24, 2024 21:59
I'm wary of just changing the internal moveFocusTo default,
as there are a few callers that *do* use it to respond to key events.

So, let's just go with this for now.
approach

It... horribly breaks, first, because on Esc, you lose focus, so key
events aren't handled anymore; and, second if you then re-focus by
clicking, you... still don't get key events handled for some reason? :D.
…tinput"

This reverts commit 2ccf760.

InputText loses focus when the hide the VK, so while we now *get* key
events, we don't know where to send them, so we don't send them anywhere
;).
the input field.

That worked in MultiInputDialogs thanks to its onSwitchFocus, but not InputDialog.
@NiLuJe NiLuJe force-pushed the focusmanager-and-fix branch from 8e4b072 to 6b6fb60 Compare August 24, 2024 20:00
Copy link
Member Author

@NiLuJe NiLuJe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed all commit messages.
Reviewable status: all files reviewed, 7 unresolved discussions (waiting on @Commodore64user and @poire-z)

Copy link
Contributor

@Commodore64user Commodore64user left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Besides my personal dislike for the scrolling widget (but that is a different matter altogether), this seems to work as intended. Nice work @NiLuJe

@poire-z
Copy link
Contributor

poire-z commented Aug 25, 2024

Just mentionning a refresh/repaint issue (related to InputDialog, and using Esc, so not totally unrelated to this PR :)), that @NiLuJe will probably have a easier time than me figuring it out :
select some long test on the page, then Add note:
image

If you hit Cancel, all is fine, you get back to Reader with a nice page.
If you hit Esc (twice, first one closes VK, second one closes InputDialog):
image
(A diagonal swipe cleans it, so it's not the cre native highlight drawing missing clearing, it's an issue of missing the full screen refresh on close.)

(It's enough to just pass a mode, mode being set with a nil region means
fs)

The CRe highlight will likely extend past its boundaries, and we can't
always rely on being closed in confunction with our VK (which would
merge the two regions into a probably large enough one).
@NiLuJe
Copy link
Member Author

NiLuJe commented Aug 25, 2024

It's because when both the VK and InputDialog are dismissed at once, the two refresh regions get neatly coalesced into a full-screen refresh (as they both touch each other, the VK touches the bottom edge, and the ID touches the top edge) ;).

Assuming there's the possibility for the dialog and VK to not actually touch each other and the top edge of the screen, there could be a similar result with the Cancel button.

TL;DR: Easy fix, just request a full region on close in the cancel callback, InputDialog already goes looking for it on Back ;).

(129ff72)

Copy link
Member Author

@NiLuJe NiLuJe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed 1 of 1 files at r26, 2 of 2 files at r27, all commit messages.
Reviewable status: all files reviewed, 7 unresolved discussions (waiting on @Commodore64user and @poire-z)

@NiLuJe NiLuJe merged commit 9cd3051 into koreader:master Aug 25, 2024
NiLuJe added a commit to NiLuJe/koreader that referenced this pull request Sep 2, 2024
The drive-by fix for the original issue noticed late in koreader#12361 turned
out to be a bit heavy-handed ;).

Fix koreader#12444
Regression since koreader#12361
NiLuJe added a commit that referenced this pull request Sep 2, 2024
The drive-by fix for the original issue noticed late in #12361 turned out to be a bit heavy-handed ;).

Fix #12444
Regression since #12361
wbstx added a commit to wbstx/koreader that referenced this pull request Nov 29, 2024
KOReader 2024.11 "Slang"

![koreader-2024-11-slangie](https://github.com/user-attachments/assets/cb9e68bf-aa0f-47c7-a093-46fbf8bb19c3)

Some of you on Android may have had dictionary issues. That should be fixed now.

Connecting to Wi-Fi should be more reliable on platforms where we manage it ourselves, most notably Kobo (koreader/lj-wpaclient#11).

Color is now supported when reflowing (koreader#12085).

This month's logo was contributed by @Sonnenfee

We'd like to thank all contributors for their efforts. Some highlights since the previous release include:

* Certain network features will now work in Flatpak (<flathub/rocks.koreader.KOReader#52>) @kii-chan-reloaded
* 'Use left and right keys for page turning' option added (koreader#12174) @Commodore64user
* Text editor: enhancement (koreader#12176) @hius07
  (1) Speed up adding/deleting chars (by avoiding a call of expensive splitToChars), noticeable on big files.
  (2) Indicate select mode: wider cursor.
* Annotations: more fixes (koreader#12181) @hius07
  (1) Allows annotations with equal datetime fields.
  (2) Allows page bookmarks with equal page numbers.
* kopt: color support (koreader#12085) @benoit-pierre
* bump base (updated build system) & fix macOS CI (koreader#12187) @benoit-pierre
* AltStatusBar/Footer: add the read timer value (koreader#12002) @zwim
* bump translations (koreader#12193) @pazos
* CRE call cache: don't wrap setViewMode (koreader#12194) @poire-z
* bump crengine: various fixes and optimizations (koreader#12200) @poire-z
* Add author option for alt status bar (koreader/crengine#575) (koreader#12197) @trash-pandy
* Page turns: invert vertical tap zones (koreader#12195) @hius07
* Annotations: pageno honors reference pages and hidden flows (koreader#12214) @hius07
* ToggleSwitch: fix long-press (koreader#12215) @hius07
* SDL: Return true in NetworkMgr:isConnected on !hasWifiToggle platforms (koreader#12217) @NiLuJe
* Kobo: Refactor various aspects of the Kaleido/MTK support (koreader#12221) @NiLuJe
* ReaderAnnotation: fix doesMatch func (koreader#12231) @hius07
* bump base (koreader#12241) @benoit-pierre
* NetworkMgr: Attempt to handle wpa_supplicant rescans better (koreader#12236) @NiLuJe
* miscellaneous build system changes (koreader#12242) @benoit-pierre
* make: handle old build data directory (koreader#12259) @benoit-pierre
* ReaderFooter: improve (koreader#12243) @hius07
* Annotations: fix exporting (koreader#12261) @hius07
* make: install missing `cr3.css`… (koreader#12262) @benoit-pierre
* [fix] NetworkMgr: apply HTTP proxy setting on startup (koreader#12260) @Frenzie
* Kobo: Track frontlight state more accurately on suspend/resume (koreader#12256) @NiLuJe
* Make W-Fi scan more reliable (koreader#12265, koreader/lj-wpaclient#11) @NiLuJe
* ReaderAnnotation: fix doesMatch func 2 (koreader#12270) @hius07
* make: fix android update sdcv (koreader#12275) @benoit-pierre
* [plugin] Reader footer: check if header resp. footer are available (koreader#12264) @zwim
* ReadHistory: On remove, trust the index from FileManagerHistory if possible (koreader#12253) @NiLuJe
* ReaderUI: add `seamless` argument to switchDocument (koreader#12290) @ziz57
* Fix early unhighlight after Add to vocab builder (koreader#12288) @poire-z
* [CoverBrowser.MosaicMenu] Increase the thickness of the mosaic’s focus underline (koreader#12189) @Commodore64user
* doc: update building documentation (koreader#12295) @benoit-pierre
* NetworkMgr: fix debug trace (koreader#12297) @benoit-pierre
* Panel zoom: Properly handle `renderPage()` not rendering the whole page (koreader#12296) @fbriere
* PowerD: Keep track of frontlight state change by interactive callers for suspend/resume purposes (koreader#12283) @NiLuJe
* InputDialog and MultiInputDialog: improve enter and edit callback handling, and implement addWidget (koreader#12289) @ziz57
* ReaderSearch: "All text" improve (koreader#12287) @hius07
* Show/Hide Virtual keyboard and more keyboard shortcuts (koreader#12162) @Commodore64user
* bump base; mostly thirdparty bumps (koreader#12311) @benoit-pierre
* Document: Do not cache panel-zoom tiles to disk and fix their caching and rendering (koreader#12303) @NiLuJe
* Disable the legacy ReaderRotation module (koreader#12309) @NiLuJe
* bump luajit (koreader#12317) @benoit-pierre
* [AutoWarmth] Delay front light actions after resume (koreader#12315) @zwim
* Allow numbers in measure text: fixes a crash in table of contents when debugging on (koreader#12310) @zwim
* ReaderFooter: Add page-turn item (koreader#12249) @Commodore64user
* luajit launcher: out of tree build + don't rebuild luajit (koreader#12285) @benoit-pierre
* BookInfo: rating, review (koreader#12313) @hius07
* fix missing android APK asset (koreader#12333) @benoit-pierre
* ImageWidget: Don't attempt to pan if we haven't rendered the bb yet (koreader#12331) @NiLuJe
* OTM: Unbreak koreader#11999  (koreader#12337) @NiLuJe
* Kobo: Refactor suspend in order to be able to catch input events sent during the 2s window of ntx madness (koreader#12330) @NiLuJe
* [Menu] Remove title bar buttons from layout on hasSymKey or hasScreenKB (koreader#12328) @Commodore64user
* [doc] Build: update Android instructions to openjdk-17-jdk (koreader#12345) @Frenzie
* Support 'Ctrl' shortcuts on hasKeyboard (koreader#12347) @Commodore64user
* Annotations: fix page numbers (koreader#12324) @hius07
* Bug Fix: DPad conflict on Kindle Keyboard (koreader#12341) @Commodore64user
* Nit: Make some cache keys prettier (koreader#12354) @NiLuJe
* Dispatcher: minor wording fixes (koreader#12356) @hius07
* kodev rework (koreader#12338) @benoit-pierre
* czmq & libzmq: update to 4.2.1 & 4.3.5 respectively (koreader#12350) @benoit-pierre
* [TextViewer] Add hamburger menu to FocusManager and Menu key (koreader#12365) @Commodore64user
* ci: fix test / coverage (koreader#12367) @benoit-pierre
* A couple of tiny fixes (koreader#12359) @NiLuJe
* android: tweak update rule (koreader#12370) @benoit-pierre
* doc: update Android build instructions (koreader#12368) @benoit-pierre
* Display menu preview of italic-only fonts (koreader#12351) @charrarr
* ReaderStatus, Book status widget: cleanup (koreader#12343) @hius07
* ci/macos: fix homebrew packages install (koreader#12382) @benoit-pierre
* Fix terminal broken cursor and backspace (koreader#12375) @zwim
* Screensaver: add option to rotate to fit screen (koreader#12366) @charrarr
* Minor keyboard corrections (koreader#12372) @Commodore64user
* Touch menu: always go up to correct parent page (koreader#12378) @hius07
* Collections: fix context menu (koreader#12383) @hius07
* PDF: no "Contrast set to" notification on opening (koreader#12391) @hius07
* Closing Bookmark details dialog with X should also refresh list entry (koreader#12390) @fbriere
* Add numerical key_codes to event_map on kindle 3 (koreader#12358) @Commodore64user
* FocusManager: Fix focus_flags check in moveFocusTo, and deal with the fallout (koreader#12361) @NiLuJe
* Various notification, text editor and footnote popup minor fixes (koreader#12406) @poire-z
* Bug: Account for local reading order direction adjustments. (koreader#12388) @Commodore64user
* android: add custom `adb logcat` formatter (koreader#12385) @benoit-pierre
* kodev: improve `kodev prompt` (koreader#12408) @benoit-pierre
* kodev: fix `./kodev run android…` (koreader#12407) @benoit-pierre
* Readerfont: Current font on top in menu; New fonts from current session on top in font test doc (koreader#12410) @jonnyl2
* Fix a couple of potentially spurious footer refreshes (koreader#12422) @NiLuJe
* FileManager: Handle the FlushSettings event (koreader#12425) @NiLuJe
* PageBrowser: fix drawing of thicker thumbnail frame on tap (koreader#12432) @poire-z
* FileManagerSetDefaults: Handle strings that we default to nil (koreader#12433) @NiLuJe
* Input: Ignore ABS_X, ABS_Y & ABS_PRESSURE for snow_protocol (koreader#12427) @NiLuJe
* Add color highlight menu (koreader#11044) @smasher816
* Exporter: choose highlight styles to be exported (koreader#12431) @hius07
* ReaderView: Don't crash on pre-koreader#11044 highlights without a color field (koreader#12438) @NiLuJe
* Terminal fixes (koreader#12369) @ziz57
* Dispatcher/DeviceListener: Temporarily turn on Accelerometer/GSensor for 5 sec (koreader#12419) @jonnyl2
* fix bug preventing export to joplin; (koreader#12446) @bitterlox
* bump base: blitbuffer, android build, crengine (koreader#12451) @poire-z
* InputText: Unbreak onTapTextBox on an already in-focus field (koreader#12449) @NiLuJe
* Update el_popup.lua (koreader#12463) @ichnilatis-gr
* [Dispatcher] add [missing] conditions to dispatcher items (koreader#12453) @Commodore64user
* ReaderView: Fix a couple of edge-cases in onReaderFooterVisibilityChange (koreader#12466) @NiLuJe
* misc: Move cleanupSelectedText to util (koreader#12477) @NiLuJe
* ReaderHighlight: Fix an old typo in the OCR help string (koreader#12479) @NiLuJe
* Highlights popup dialog: add "Color" and "Details" buttons (koreader#12461) @hius07
* ButtonDialogTitle: remove (koreader#12394) @hius07
* [Dispatcher] new events for selecting links (koreader#12474) @Commodore64user
* Doc: Update quickstartguide on kindle non touch (koreader#12426) @Commodore64user
* [NT] Call GotoViewRel for page up/down on useDPadAsActionKeys devices (koreader#12495) @cccslater
* bump base (koreader#12503) @benoit-pierre
* Defaults: Deprecate DKOPTREADER_CONFIG_DOC_LANGS_TEXT (koreader#12504) @NiLuJe
* ReaderAnnotation: skip old highlights with invalid xpointers (koreader#12494) @hius07
* Cloud Sync: handles potentially incompatible backup and incoming dbs (koreader#12470) @weijiuqiao
* VocabBuilder.koplugin: Better handling word context (koreader#12469) @weijiuqiao
* Write highlights into PDF: revisited (koreader#12509) @hius07
* SyncService: Only require online connectivity when using Dropbox (koreader#12520) @NiLuJe
* Chore: Don't cache static data tables (ui/elements, ui/data, kb layouts & co) (koreader#12519) @NiLuJe
* Fix page gap inconsistencies between doc open & config change (koreader#12507) @NiLuJe
* Kindle: Restore hall effect sensor state on startup (koreader#12521) @NiLuJe
* VocabBuilder.koplugin: save dict headword as entry (koreader#12530) @weijiuqiao
* Add PocketBook Verse Pro Color (PB634K3) (koreader#12476) @ElimGarak1
* Onyx Boox Go 10.3 support (koreader#12533) @hugleo
* Statistics: fix null terminated strings, add toggle stats (koreader#12547) @hius07
* input: drop use of `ffi/input` (koreader#12486) @benoit-pierre
* ci/circle: fix tests parallelism (koreader#12551) @benoit-pierre
* input: fix kobo init (koreader#12553) @benoit-pierre
* [ReaderFooter] update status bar in real time when inverting page turning (koreader#12424) @Commodore64user
* input: fix pocketbook init (koreader#12555) @benoit-pierre
* use new `ffi.loadlib` helper (koreader#12545) @benoit-pierre
* input: fix loading of `fbink_input` library (koreader#12560) @benoit-pierre
* Fix typos in quickstart (koreader#12566) @cheywood
* File search: improve (koreader#12549) @hius07
* [DictQuickLookup] shortcuts for editing searches (koreader#12539) @Commodore64user
* Profiles: auto-execute on events (koreader#12564) @hius07
* Exporter: export to book folder, register to Dispatcher (koreader#12569) @hius07
* sdl: use our compiled version for the AppImage (koreader#12575) @benoit-pierre
* Add kobov4 & kobov5 targets (koreader#12568) @NiLuJe
* android: switch to monolibtic mode (koreader#12576) @benoit-pierre
* android: fix apkanalyzer location (koreader#12563) @benoit-pierre
* Disabled rotation map for Android devices where "hw media keys follow gravity" (koreader#12557) @jkl16
* Quickstart guide kindle illustrations (koreader#12577) @Commodore64user
* [plugin] Exporter: fix typo (koreader#12592) @Frenzie
* Dispatcher: values' range consistent with bottom menu (koreader#12580) @hius07
* metadata translations for fdroid/flathub (koreader#12581) @pazos
* ProgressWidget: fix misalignment (koreader#12526) @wbstx
* Add wifi support to Cervantes Touch Light devices (koreader#12148) @jsanpe
* ReaderTypeset: fix margins info (koreader#12609) @hius07
* DocSettingsTweak: apply to books with status (koreader#12606) @hius07
* Menu widget: rotation handler (koreader#12573) @hius07
* Profiles: add "on rotation" auto-execute event (koreader#12612) @hius07
* ReaderHighlight: adjustable "Edit highlight" dialog position (koreader#12599) @hius07
* KOSync/Kobo: Explicitly kill Wi-Fi on suspend (koreader#12616) @NiLuJe
* Kobo: Minor simplification after koreader#12616 (koreader#12629) @NiLuJe
* bump luajit-launcher (koreader#12630) @benoit-pierre
* Terminal: Minor cleanups (koreader#12631) @NiLuJe
* Menu widget: draw focus on focused item (koreader#12583) @hius07
* Cloud storage: fix sorting non-English filenames (koreader#12644) @hius07
* Text editor: show current line number (koreader#12632) @hius07
* InputText: fix Terminal plugin input (koreader#12652) @hius07
* ReaderFont test: Error correction -- new fonts were not rendering in own font (koreader#12646) @jonnyl2
* ReaderHighlight: fix color for extended highlight in pdf (koreader#12654) @hius07
* Kindle Scribe: fix elseif for orientation code (koreader#12663) @mergen3107
* Menu: Fix fallout from koreader#12583 on hasDPad devices (koreader#12657) @NiLuJe
* Misc: Some more FocusManager fallout (koreader#12667) @NiLuJe
* plugin messages (koreader#12636) @pazos
* And deprecation to autofrontlight (koreader#12619) @pazos
* Add deprecation for unmaintained targets (koreader#12620) @pazos
* Profiles: more auto-exec triggers (koreader#12651) @hius07
* PatchManagement: prettify menu (koreader#12668) @hius07
* Fix KOReader spelling in the code (koreader#12670) @mergen3107
* Update Building.md - meson install from backports (koreader#12680) @mergen3107
* OTA: Make the final ConfirmBox undismissable (koreader#12676) @NiLuJe
* Text editor: rotate (koreader#12658) @hius07
* Profiles: more auto-exec triggers 2 (koreader#12691) @hius07
* Add authentication request and cookies management for news (koreader#12496) @bateast
* calibre: always use custom fast parser (koreader#12714, koreader#12715) @pazos
* Add Nextcloud Notes to exporter plugin (koreader#12301) @kotnik
* [plugin] Wallabag: remove empty file when download fails (koreader#12723) @fenuks
* [plugin] Wallabag: separate option to delete ‘on hold’ articles (koreader#12722) @fenuks
* kopt: fix OCR segmentation mode (koreader#12726) @benoit-pierre
* bump base (koreader#12727) @benoit-pierre
   Most notably dropbear: update to 2024.85 (koreader/koreader-base#1964)
* bump android-luajit-launcher (koreader#12734) @pazos
* ci/circle: manually cap build jobs (koreader#12751) @benoit-pierre
* Adjust Minimum Font Size in Terminal Emulator (koreader#12752) @pphszx
* ReaderHighlight: Highlight menu, change 'Delete' to Trash can icon (koreader#12758) @jonnyl2

* @trash-pandy made their first contribution in koreader#12197
* @fbriere made their first contribution in koreader#12296
* @charrarr made their first contribution in koreader#12351
* @smasher816 made their first contribution in koreader#11044
* @bitterlox made their first contribution in koreader#12446
* @cccslater made their first contribution in koreader#12495
* @cheywood made their first contribution in koreader#12566
* @jkl16 made their first contribution in koreader#12557
* @wbstx made their first contribution in koreader#12526
* @jsanpe made their first contribution in koreader#12148
* @fenuks made their first contribution in koreader#12723
* @pphszx made their first contribution in koreader#12752

**Full Changelog**: koreader/koreader@v2024.07...v2024.11 — [closed milestone issues](https://github.com/koreader/koreader/milestone/74?closed=1)

---

**Installation instructions**: [Android](https://github.com/koreader/koreader/wiki/Installation-on-Android-devices) • [Cervantes](https://github.com/koreader/koreader/wiki/Installation-on-BQ-devices) • [ChromeOS](https://github.com/koreader/koreader/wiki/Installation-on-Chromebook-devices) • [Kindle](https://github.com/koreader/koreader/wiki/Installation-on-Kindle-devices) • [Kobo](https://github.com/koreader/koreader/wiki/Installation-on-Kobo-devices) • [PocketBook](https://github.com/koreader/koreader/wiki/Installation-on-PocketBook-devices) • [ReMarkable](https://github.com/koreader/koreader/wiki/Installation-on-ReMarkable) • [Desktop Linux](https://github.com/koreader/koreader/wiki/Installation-on-desktop-linux) • [MacOS](https://github.com/koreader/koreader/wiki/Installation-on-MacOS)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants