├── .gitignore
├── LICENSE
├── .github
└── workflows
│ └── build.yml
├── package.json
├── fetchfw.go
├── kobofirmware.html
├── kfw.css
├── kfw.js
└── kfw.db.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016-2023 Patrick G
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 | on:
3 | push:
4 | workflow_dispatch:
5 |
6 | permissions:
7 | contents: read
8 | pages: write
9 | id-token: write
10 |
11 | concurrency:
12 | group: pages
13 | cancel-in-progress: false
14 |
15 | jobs:
16 | build:
17 | runs-on: ubuntu-latest
18 | environment:
19 | name: github-pages
20 | url: '${{steps.deploy.outputs.page_url}}'
21 | steps:
22 | - name: Checkout
23 | uses: actions/checkout@v4
24 | - name: Setup Pages
25 | uses: actions/configure-pages@v5
26 | - name: Setup Node
27 | uses: actions/setup-node@v3
28 | with:
29 | node-version: 18
30 | cache: npm
31 | - name: Install dependencies
32 | run: npm install --include=dev
33 | - name: Build
34 | run: |
35 | set -e
36 | npm run browserify
37 | sed -i 's/kfw\.js/kfw.dist.js/g' kobofirmware.html
38 | mkdir _site
39 | mv kfw.css kfw.db.js kfw.dist.js kfw.dist.js.map kobofirmware.html _site
40 | - name: Upload
41 | uses: actions/upload-pages-artifact@v3
42 | - name: Deploy
43 | id: deploy
44 | uses: actions/deploy-pages@v4
45 | if: github.ref == 'refs/heads/gh-pages'
46 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "kobostuff",
3 | "devDependencies": {
4 | "@babel/cli": "^7.21.0",
5 | "@babel/core": "^7.21.4",
6 | "@babel/preset-env": "^7.21.4",
7 | "babelify": "^10.0.0",
8 | "browserify": "^17.0.0",
9 | "core-js": "^2.6.12",
10 | "terser": "^5.17.1"
11 | },
12 | "dependencies": {
13 | "@sentry/browser": "^7.49.0"
14 | },
15 | "scripts": {
16 | "browserify": "browserify -d kfw.js -t babelify | terser -o kfw.dist.js --source-map=content=inline,url=kfw.dist.js.map"
17 | },
18 | "babel": {
19 | "sourceMaps": "inline",
20 | "presets": [
21 | [
22 | "@babel/preset-env",
23 | {
24 | "useBuiltIns": "usage",
25 | "corejs": 2,
26 | "exclude": [
27 | "es6.regexp.match",
28 | "es6.regexp.replace",
29 | "es6.regexp.split"
30 | ]
31 | }
32 | ]
33 | ]
34 | },
35 | "browserslist": [
36 | "ie 11",
37 | "edge >= 17",
38 | "firefox >= 24",
39 | "chrome >= 30",
40 | "safari >= 7",
41 | "opera >= 17",
42 | "ios >= 7.1",
43 | "android >= 4.4.4"
44 | ]
45 | }
46 |
--------------------------------------------------------------------------------
/fetchfw.go:
--------------------------------------------------------------------------------
1 | //go:build ignore
2 |
3 | package main
4 |
5 | import (
6 | "bytes"
7 | "crypto/md5"
8 | "encoding/hex"
9 | "errors"
10 | "fmt"
11 | "io"
12 | "io/fs"
13 | "maps"
14 | "net/http"
15 | "net/url"
16 | "os"
17 | "path/filepath"
18 | "slices"
19 | "strings"
20 | "time"
21 | )
22 |
23 | func main() {
24 | if len(os.Args) <= 1 {
25 | os.Exit(2)
26 | }
27 | for _, u := range os.Args[1:] {
28 | if err := download(u); err != nil {
29 | if !errors.Is(err, os.ErrExist) {
30 | fmt.Fprintf(os.Stderr, "error: %s: %v\n", u, err)
31 | os.Exit(1)
32 | }
33 | fmt.Fprintf(os.Stderr, "warning: %s: %v\n", u, err)
34 | }
35 | }
36 | if _, err := times("firmwares"); err != nil {
37 | fmt.Fprintf(os.Stderr, "error: update times: %v\n", err)
38 | os.Exit(1)
39 | }
40 | }
41 |
42 | func download(u string) error {
43 | url, err := url.Parse(u)
44 | if err != nil {
45 | return err
46 | }
47 | if url.Scheme == "" || url.Host == "" || url.ForceQuery || url.RawQuery != "" || url.RawFragment != "" || url.Opaque != "" {
48 | return fmt.Errorf("bad url format")
49 | }
50 |
51 | var name string
52 | if i := strings.Index(url.Path, "/firmwares/"); i == -1 {
53 | return fmt.Errorf("extract path: does not contain /firmwares/")
54 | } else if x, err := filepath.Localize(url.Path[i+1:]); err != nil {
55 | return fmt.Errorf("localize path: %w", err)
56 | } else {
57 | name = x
58 | }
59 | dir := filepath.Dir(name)
60 |
61 | if _, err := os.Stat(name); err != nil && !errors.Is(err, fs.ErrNotExist) {
62 | return err
63 | } else if err == nil {
64 | return os.ErrExist
65 | }
66 |
67 | resp, err := http.Get(u)
68 | if err != nil {
69 | return err
70 | }
71 | defer resp.Body.Close()
72 |
73 | if resp.StatusCode != http.StatusOK {
74 | return fmt.Errorf("response status %d", resp.StatusCode)
75 | }
76 |
77 | var headers bytes.Buffer
78 | if _, err := fmt.Fprintf(&headers, "%s\r\n", u); err != nil {
79 | return err
80 | }
81 | if _, err := fmt.Fprintf(&headers, "HTTP/%d.%d %03d\r\n", resp.ProtoMajor, resp.ProtoMinor, resp.StatusCode); err != nil {
82 | return err
83 | }
84 | for _, key := range slices.Sorted(maps.Keys(resp.Header)) {
85 | for _, value := range resp.Header[key] {
86 | if _, err := fmt.Fprintf(&headers, "%s: %s\r\n", strings.ToLower(key), value); err != nil {
87 | return err
88 | }
89 | }
90 | }
91 | if _, err := fmt.Fprintf(&headers, "\r\n"); err != nil {
92 | return err
93 | }
94 |
95 | mod, err := time.Parse(http.TimeFormat, resp.Header.Get("Last-Modified"))
96 | if err != nil {
97 | return fmt.Errorf("parse modified time: %w", err)
98 | }
99 |
100 | if err := os.MkdirAll(dir, 0755); err != nil {
101 | return err
102 | }
103 |
104 | f, err := os.CreateTemp(dir, ".tmp")
105 | if err != nil {
106 | return err
107 | }
108 | defer func() {
109 | if f != nil {
110 | f.Close()
111 | if err := os.Remove(f.Name()); err != nil {
112 | fmt.Fprintf(os.Stderr, "warning: failed to remove %q: %v\n", f.Name(), err)
113 | }
114 | }
115 | }()
116 |
117 | sum := md5.New()
118 | if _, err := io.Copy(f, io.TeeReader(resp.Body, sum)); err != nil {
119 | return err
120 | }
121 | md5 := sum.Sum(nil)
122 |
123 | if err := f.Close(); err != nil {
124 | return err
125 | }
126 | if err := os.Chtimes(f.Name(), time.Time{}, mod); err != nil {
127 | return err
128 | }
129 | if err := os.Chmod(f.Name(), 0644); err != nil {
130 | return err
131 | }
132 | if err := os.Rename(f.Name(), name); err != nil {
133 | return err
134 | }
135 | f = nil
136 |
137 | if err := appendFile("headers.txt", headers.Bytes(), 0644); err != nil {
138 | return err
139 | }
140 | if err := appendFile("MD5SUMS", []byte(hex.EncodeToString(md5)+" ./"+name+"\n"), 0644); err != nil {
141 | return err
142 | }
143 |
144 | fmt.Printf("downloaded: %x %s\n", md5, name)
145 | return nil
146 | }
147 |
148 | func appendFile(name string, data []byte, perm os.FileMode) error {
149 | f, err := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, perm)
150 | if err != nil {
151 | return err
152 | }
153 | defer f.Close()
154 |
155 | if _, err := f.Write(data); err != nil {
156 | return err
157 | }
158 | return f.Close()
159 | }
160 |
161 | func times(name string) (time.Time, error) {
162 | fi, err := os.Stat(name)
163 | if err != nil {
164 | return time.Time{}, err
165 | }
166 | if !fi.IsDir() {
167 | return fi.ModTime(), nil
168 | }
169 |
170 | es, err := os.ReadDir(name)
171 | if err != nil {
172 | return time.Time{}, err
173 | }
174 | if len(es) == 0 {
175 | fmt.Printf("times: ignoring empty directory %q\n", name)
176 | return time.Time{}, nil
177 | }
178 |
179 | var newest time.Time
180 | for _, e := range es {
181 | t, err := times(filepath.Join(name, e.Name()))
182 | if err != nil {
183 | return time.Time{}, err
184 | }
185 | if t.After(newest) {
186 | newest = t
187 | }
188 | }
189 | if !newest.IsZero() && !fi.ModTime().Equal(newest) {
190 | fmt.Printf("times: changing %q from %s to %s\n", name, fi.ModTime(), newest)
191 | if err := os.Chtimes(name, time.Time{}, newest); err != nil {
192 | return newest, err
193 | }
194 | }
195 | return newest, nil
196 | }
197 |
--------------------------------------------------------------------------------
/kobofirmware.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | Kobo Firmware Downloads
11 |
12 |
13 |
34 |
35 |
36 |
37 |
38 |
39 | ^
40 |
41 |
42 |
43 |
44 | KoboStuff
45 |
46 |
52 |
53 |
54 |
55 |
Kobo Firmware Downloads
56 |
57 | Kobo Firmware Downloads gets the latest official firmware
58 | download links from the Kobo API. It also provides links to
59 | older firmware versions and shows the latest version
60 | available to each affiliate.
61 |
62 |
63 | After you download the firmware for your device, extract the
64 | zip file into the .kobo folder on your Kobo
65 | eReader.
66 |
67 |
68 | Note for Aura H2O Edition 2 and Aura Edition 2: Kobo
69 | has
70 | actually released two versions of these devices. If the
71 | 7th digit of your serial number is a 2 you have the second
72 | version, otherwise you have the first version.
73 |
74 |
75 | Note for Clara BW: These links are currently only for
76 | devices with the model number N365. Do not use them with
77 | ones starting with P365. If you are unsure, do not use the
78 | links.
79 |
80 |
81 | Firmware release notifications: You can receive
82 | instant notifications for new firmware releases by joining
83 | the Telegram channel
84 | @KoboFirmware .
85 |
86 |
87 |
95 |
96 |
97 |
98 |
99 | Latest Versions
100 | Version Matrix
101 | Affiliates
102 | Versions
103 |
104 |
105 |
106 |
107 |
108 | Latest Versions
109 | The latest versions for each device.
110 |
116 |
117 | Missing firmware versions or devices? Have a feature request?
118 | Report an issue .
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
129 |
130 |
131 |
132 | Version Matrix
133 | Version availability by device.
134 |
140 |
141 |
142 |
143 | Affiliates
144 | The latest versions for individual affiliates.
145 |
151 |
152 |
153 |
154 | Versions
155 | All previous versions by hardware revision.
156 | Show
157 |
163 |
164 |
165 |
166 |
171 |
172 |
173 | An unexpected error has occured. Please reload the page or try a different browser. If the problem still persists,
174 | report an issue .
175 |
176 |
177 |
189 |
190 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
--------------------------------------------------------------------------------
/kfw.css:
--------------------------------------------------------------------------------
1 | * {
2 | box-sizing: border-box;
3 | }
4 | html, body {
5 | margin: 0;
6 | padding: 0;
7 | }
8 | html {
9 | font-size: 16px;
10 | }
11 | body {
12 | font-family: 'PT Serif', Georgia, serif;
13 | font-size: 1rem;
14 | line-height: 1.4;
15 | overflow-x: hidden;
16 | }
17 | header#main-header {
18 | background: #fafafa;
19 | border-bottom: 1px solid #ccc;
20 | }
21 | header#main-header > section {
22 | display: block;
23 | flex: 0 0 auto;
24 | padding: .75rem;
25 | }
26 | header#main-header > section p {
27 | margin: 1em 0;
28 | line-height: 1.5;
29 | }
30 | header#main-header .red {
31 | color: #d30000;
32 | }
33 | header#main-header > section h1 {
34 | font-size: 2em;
35 | margin: 0 0 .5rem 0;
36 | font-weight: normal;
37 | }
38 | header > section#main-header-1 {
39 | display: flex;
40 | flex-direction: row;
41 | align-items: flex-start;
42 | justify-content: flex-start;
43 | }
44 | header > section#main-header-1 > div {
45 | flex: 1;
46 | }
47 | header > section#main-header-1 > aside.ad {
48 | flex: 0 0 305px;
49 | width: 305px;
50 | max-height: 268px;
51 | height: 268px;
52 | }
53 | nav#main-nav {
54 | display: flex;
55 | flex-direction: row;
56 | align-items: center;
57 | justify-content: space-between;
58 | font-size: 14px;
59 | }
60 | nav#main-nav > div {
61 | flex: 0 0 auto;
62 | text-align: center;
63 | }
64 | nav#main-nav > div > a,
65 | nav#main-nav > div > span {
66 | display: inline-block;
67 | vertical-align: bottom;
68 | margin: .75rem;
69 | color: #333;
70 | text-decoration: none;
71 | border-bottom: 2px solid transparent;
72 | }
73 | nav#main-nav > div > a:link,
74 | nav#main-nav > div > a:visited {
75 | border-bottom-color: #aaa;
76 | outline: 0;
77 | }
78 | nav#main-nav > div > a:link:hover,
79 | nav#main-nav > div > a:visited:hover,
80 | nav#main-nav > div > a:link:active,
81 | nav#main-nav > div > a:link:focus,
82 | nav#main-nav > div > a:visited:active,
83 | nav#main-nav > div > a:visited:focus {
84 | color: #000;
85 | }
86 | nav#main-nav > div > a:link:hover,
87 | nav#main-nav > div > a:visited:hover {
88 | border-bottom-color: #000;
89 | }
90 | nav#jump {
91 | display: block;
92 | text-align: center;
93 | background: #eee;
94 | border-bottom: 1px solid #ccc;
95 | position: sticky;
96 | top: 0;
97 | z-index: 1000;
98 | }
99 | nav#jump a {
100 | display: inline-block;
101 | vertical-align: middle;
102 | padding: .25em 1em;
103 | }
104 | main#main-content {
105 | margin: 0 auto;
106 | max-width: 960px;
107 | }
108 | main#main-content > section {
109 | display: block;
110 | margin: .75rem;
111 | }
112 | main#main-content > section > h2 {
113 | font-weight: bold;
114 | font-size: 1.5rem;
115 | margin: 0;
116 | }
117 | main#main-content > section > h2 + p {
118 | margin: 0 0 1rem 0;
119 | }
120 | main#main-content > aside.ad {
121 | min-height: 90px;
122 | }
123 | footer#main-footer {
124 | display: block;
125 | border-top: 1px solid #ccc;
126 | background: #f4f4f4;
127 | color: #333;
128 | text-align: center;
129 | padding: .75rem;
130 | }
131 | a#jump-to-top {
132 | display: block;
133 | position: fixed;
134 | bottom: 0;
135 | left: 0;
136 | font-size: 1.5rem;
137 | font-weight: bold;
138 | width: 2rem;
139 | text-align: center;
140 | z-index: 999;
141 | }
142 | a#jump-to-top:hover {
143 | text-decoration: none;
144 | padding-bottom: .15em;
145 | }
146 | aside#error {
147 | display: block;
148 | position: fixed;
149 | bottom: 0;
150 | left: 0;
151 | right: 0;
152 | background: rgba(241, 191, 191, 0.95);
153 | border-top: 1px solid rgba(136, 32, 32, 0.4);
154 | z-index: 1001;
155 | font-size: .8rem;
156 | padding: .25rem;
157 | }
158 | aside#error.hidden {
159 | display: none;
160 | }
161 |
162 | aside.ad {
163 | display: block;
164 | background: #f5f5f5;
165 | margin: .75em;
166 | border: 1px solid #d6d6d6;
167 | }
168 | aside.ad::before {
169 | display: block;
170 | content: 'Advertisement';
171 | line-height: 1;
172 | font-size: 9px;
173 | height: 9px;
174 | overflow: hidden;
175 | color: #666666;
176 | padding: 2px 2px;
177 | background: #ededed;
178 | }
179 |
180 | a:link,
181 | a:visited {
182 | color: #005bc4;
183 | text-decoration: none;
184 | }
185 | a:link:hover {
186 | text-decoration: underline;
187 | }
188 |
189 | .kfw {
190 | display: block;
191 | border: 1px solid #666;
192 | font-size: .85rem;
193 | background: #f4f4f4;
194 | }
195 | .kfw table {
196 | display: table;
197 | border-collapse: collapse;
198 | width: 100%;
199 | }
200 | .kfw table tr {
201 | display: table-row;
202 | background: #fff;
203 | }
204 | .kfw table th,
205 | .kfw table td {
206 | display: table-cell;
207 | padding: .5rem .75rem;
208 | }
209 | .kfw table th {
210 | text-align: left;
211 | background: #d3d3d3;
212 | font-weight: bold;
213 | white-space: nowrap;
214 | }
215 | .kfw table td {
216 | text-align: left;
217 | }
218 | .kfw table tbody tr:nth-child(odd) {
219 | background: #f4f4f4;
220 | }
221 |
222 | .kfw#kfw-latest {
223 | overflow-x: auto;
224 | }
225 | .kfw#kfw-latest table td.kfw-latest__version.cached::after {
226 | display: block;
227 | content: '(cached)';
228 | font-size: 10px;
229 | float: right;
230 | }
231 | .kfw#kfw-latest table td.kfw-latest__links a,
232 | .kfw#kfw-latest table td.kfw-latest__links button {
233 | display: inline-block;
234 | vertical-align: baseline;
235 | margin: .2em;
236 | line-height: 1;
237 | background: #e9f3fa;
238 | border: 1px solid rgba(0, 0, 0, 0.1);
239 | color: #000;
240 | padding: .2em;
241 | text-decoration: none;
242 | outline: 0;
243 | white-space: nowrap;
244 | font-size: inherit;
245 | font-family: inherit;
246 | font-weight: inherit;
247 | cursor: pointer;
248 | user-select: none;
249 | }
250 | .kfw#kfw-latest table td.kfw-latest__links a:link:hover,
251 | .kfw#kfw-latest table td.kfw-latest__links a:visited:hover,
252 | .kfw#kfw-latest table td.kfw-latest__links button:hover {
253 | background: #cddee9;
254 | }
255 | .kfw#kfw-latest table td.kfw-latest__links a:link:focus,
256 | .kfw#kfw-latest table td.kfw-latest__links a:link:active,
257 | .kfw#kfw-latest table td.kfw-latest__links a:visited:focus,
258 | .kfw#kfw-latest table td.kfw-latest__links a:visited:active,
259 | .kfw#kfw-latest table td.kfw-latest__links button:active {
260 | border-color: rgba(0, 0, 0, 0.4);
261 | }
262 | .kfw#kfw-latest table td.kfw-latest__links a.primary,
263 | .kfw#kfw-latest table td.kfw-latest__links button.primary {
264 | background: #e9faf0;
265 | }
266 | .kfw#kfw-latest table td.kfw-latest__links a.primary:link:hover,
267 | .kfw#kfw-latest table td.kfw-latest__links a.primary:visited:hover,
268 | .kfw#kfw-latest table td.kfw-latest__links button.primary:link:hover,
269 | .kfw#kfw-latest table td.kfw-latest__links button.primary:visited:hover {
270 | background: #c9ebd7;
271 | }
272 |
273 | .kfw#kfw-matrix {
274 | overflow-x: auto;
275 | font-size: .75rem;
276 | }
277 | .kfw#kfw-matrix table th,
278 | .kfw#kfw-matrix table td {
279 | padding: .25rem;
280 | border: 1px solid #cccccc;
281 | }
282 | .kfw#kfw-matrix thead tr th {
283 | border-top: none;
284 | }
285 | .kfw#kfw-matrix tbody tr:last-child td {
286 | border-bottom: none;
287 | }
288 | .kfw#kfw-matrix th:first-child,
289 | .kfw#kfw-matrix td:first-child {
290 | border-left: none;
291 | }
292 | .kfw#kfw-matrix th:last-child,
293 | .kfw#kfw-matrix td:last-child {
294 | border-right: none;
295 | }
296 | .kfw#kfw-matrix table th.kfw-matrix__device,
297 | .kfw#kfw-matrix table td.kfw-matrix__device {
298 | min-width: 12rem;
299 | }
300 | .kfw#kfw-matrix table tr td.kfw-matrix__device {
301 | background: #f4f4f4;
302 | }
303 | .kfw#kfw-matrix table tr:nth-child(odd) td.kfw-matrix__device {
304 | background: #e9e9e9;
305 | }
306 | .kfw#kfw-matrix table th.kfw-matrix__version,
307 | .kfw#kfw-matrix table td.kfw-matrix__version {
308 | text-align: center;
309 | }
310 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--yes {
311 | background: rgba(185, 233, 185, 0.4);
312 | }
313 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--no {
314 | background: rgba(230, 187, 187, 0.4);
315 | }
316 |
317 | .kfw#kfw-affiliates {
318 | overflow-x: auto;
319 | font-size: .75rem;
320 | }
321 | .kfw#kfw-affiliates table th,
322 | .kfw#kfw-affiliates table td {
323 | border: 1px solid #a1a1a1;
324 | padding: .25rem;
325 | }
326 | .kfw#kfw-affiliates thead tr th {
327 | border-top: none;
328 | }
329 | .kfw#kfw-affiliates tbody tr:last-child td {
330 | border-bottom: none;
331 | }
332 | .kfw#kfw-affiliates th:first-child,
333 | .kfw#kfw-affiliates td:first-child {
334 | border-left: none;
335 | }
336 | .kfw#kfw-affiliates th:last-child,
337 | .kfw#kfw-affiliates td:last-child {
338 | border-right: none;
339 | }
340 | .kfw#kfw-affiliates th.kfw-affiliates__affiliate,
341 | .kfw#kfw-affiliates td.kfw-affiliates__affiliate {
342 | text-align: center;
343 | }
344 | .kfw#kfw-affiliates table tr td.kfw-affiliates__device {
345 | background: #f4f4f4;
346 | }
347 | .kfw#kfw-affiliates table tr:nth-child(odd) td.kfw-affiliates__device {
348 | background: #e9e9e9;
349 | }
350 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--latest {
351 | background: rgba(185, 233, 185, 0.4);
352 | }
353 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--outdated {
354 | background: rgba(230, 187, 187, 0.4);
355 | }
356 |
357 | .kfw#kfw-versions {
358 | overflow-x: auto;
359 | font-size: .875rem;
360 | }
361 | .kfw#kfw-versions table th,
362 | .kfw#kfw-versions table td {
363 | padding: .25rem;
364 | }
365 | .kfw#kfw-versions th.kfw-versions__date,
366 | .kfw#kfw-versions td.kfw-versions__date {
367 | text-align: center;
368 | min-width: 10rem;
369 | }
370 | .kfw#kfw-versions th.kfw-versions__version,
371 | .kfw#kfw-versions td.kfw-versions__version {
372 | text-align: center;
373 | }
374 | .kfw#kfw-versions th.kfw-versions__hardware,
375 | .kfw#kfw-versions td.kfw-versions__hardware {
376 | text-align: center;
377 | }
378 | .kfw#kfw-versions th.kfw-versions__notes,
379 | .kfw#kfw-versions td.kfw-versions__notes {
380 | min-width: 32rem;
381 | }
382 | .kfw#kfw-versions td.kfw-versions__hardware a:link,
383 | .kfw#kfw-versions td.kfw-versions__hardware a:visited {
384 | text-decoration: none;
385 | }
386 |
387 | .modal-wrapper {
388 | display: block;
389 | z-index: 1000000;
390 | background: rgba(0, 0, 0, 0.4);
391 | position: fixed;
392 | top: 0;
393 | left: 0;
394 | right: 0;
395 | bottom: 0;
396 | }
397 | .modal-wrapper .modal {
398 | display: block;
399 | text-align: left;
400 | background: #fff;
401 | color: #000;
402 | width: 500px;
403 | height: 60%;
404 | max-height: 60%;
405 | max-width: 100%;
406 | font-size: 0.85em;
407 | position: absolute;
408 | top: 0;
409 | left: 0;
410 | right: 0;
411 | bottom: 20%;
412 | margin: auto;
413 | box-shadow: 0 22px 70px 4px rgba(0, 0, 0, 0.26);
414 | border: 1px solid #333;
415 | }
416 | .modal-wrapper .modal.thin {
417 | height: 200px;
418 | }
419 | .modal-wrapper .modal .titlebar {
420 | display: block;
421 | padding: 6px 8px;
422 | border-bottom: 1px solid #333;
423 | background-color: #e8e6e8;
424 | width: 100%;
425 | }
426 | .modal-wrapper .modal .titlebar .title {
427 | color: #222;
428 | }
429 | .modal-wrapper .modal .titlebar .close {
430 | float: right;
431 | color: #005bc4;
432 | text-decoration: none;
433 | font: inherit;
434 | border: none;
435 | background: transparent;
436 | outline: 0;
437 | cursor: pointer;
438 | user-select: none;
439 | }
440 | .modal-wrapper .modal .titlebar .close:hover {
441 | text-decoration: underline;
442 | }
443 | .modal-wrapper .modal .body {
444 | display: block;
445 | overflow-y: auto;
446 | overflow-x: hidden;
447 | padding: 6px 8px;
448 | height: 100%;
449 | }
450 | .modal-wrapper .modal {
451 | display: flex;
452 | flex-direction: column;
453 | align-items: stretch;
454 | justify-content: flex-start;
455 | }
456 | .modal-wrapper .modal .titlebar {
457 | flex: 0 0 auto;
458 | }
459 | .modal-wrapper .modal .body {
460 | flex: 1;
461 | line-height: 1.5;
462 | }
463 |
464 | @media screen and (max-width: 540px) {
465 | .kfw#kfw-latest table .kfw-latest__hardware {
466 | display: none;
467 | }
468 | }
469 | @media screen and (max-width: 650px) {
470 | header#main-header > section h1 {
471 | text-align: center;
472 | }
473 | header > section#main-header-1 {
474 | flex-direction: column;
475 | align-items: center;
476 | justify-content: flex-start;
477 | }
478 | header > section#main-header-1 > aside.ad {
479 | flex: 0 0 150px;
480 | width: 100%;
481 | max-width: 100%;
482 | height: 163px;
483 | }
484 | nav#main-nav {
485 | flex-direction: column;
486 | justify-content: space-around;
487 | }
488 | }
489 | @media screen and (prefers-color-scheme: dark) {
490 | html, body {
491 | background: #0c0600;
492 | }
493 | header#main-header {
494 | background: #111;
495 | color: #fff;
496 | border-bottom-color: #333;
497 | }
498 | nav#main-nav > div > a,
499 | nav#main-nav > div > span {
500 | color: #ccc;
501 | }
502 | nav#main-nav > div > a:link,
503 | nav#main-nav > div > a:visited {
504 | border-bottom-color: #666;
505 | }
506 | nav#main-nav > div > a:link:hover,
507 | nav#main-nav > div > a:visited:hover,
508 | nav#main-nav > div > a:link:active,
509 | nav#main-nav > div > a:link:focus,
510 | nav#main-nav > div > a:visited:active,
511 | nav#main-nav > div > a:visited:focus {
512 | color: #fff;
513 | }
514 | nav#main-nav > div > a:link:hover,
515 | nav#main-nav > div > a:visited:hover {
516 | border-bottom-color: #fff;
517 | }
518 | nav#jump {
519 | background: #2a2a2a;
520 | border-bottom: 1px solid #444;
521 | }
522 | main#main-content {
523 | background: #0c0600;
524 | color: #e4ded9;
525 | }
526 | footer#main-footer {
527 | border-top-color: #333;
528 | background: #000;
529 | color: #ccc;
530 | }
531 | a:link,
532 | a:visited {
533 | color: #5fa2ee;
534 | }
535 | aside.ad {
536 | background: #222;
537 | border-color: #444;
538 | }
539 | aside.ad::before {
540 | color: #eee;
541 | background: #2c2c2c;
542 | }
543 | .kfw {
544 | border-color: #444;
545 | background: #222;
546 | }
547 | .kfw table tr {
548 | background: #0a0a0a;
549 | }
550 | .kfw table th {
551 | background: #212121;
552 | }
553 | .kfw table tbody tr:nth-child(odd) {
554 | background: #171717;
555 | }
556 | .kfw#kfw-latest table td.kfw-latest__links a,
557 | .kfw#kfw-latest table td.kfw-latest__links button {
558 | background: #244963;
559 | border: 1px solid rgba(0, 0, 0, 0.1);
560 | color: #eee;
561 | padding: .2em;
562 | text-decoration: none;
563 | outline: 0;
564 | white-space: nowrap;
565 | }
566 | .kfw#kfw-latest table td.kfw-latest__links a:link:hover,
567 | .kfw#kfw-latest table td.kfw-latest__links a:visited:hover,
568 | .kfw#kfw-latest table td.kfw-latest__links button:hover {
569 | background: #325c7a;
570 | }
571 | .kfw#kfw-latest table td.kfw-latest__links a:link:focus,
572 | .kfw#kfw-latest table td.kfw-latest__links a:link:active,
573 | .kfw#kfw-latest table td.kfw-latest__links a:visited:focus,
574 | .kfw#kfw-latest table td.kfw-latest__links a:visited:active,
575 | .kfw#kfw-latest table td.kfw-latest__links button:active {
576 | border-color: rgba(0, 0, 0, 0.4);
577 | }
578 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download {
579 | background: #285039;
580 | }
581 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download:link:hover,
582 | .kfw#kfw-latest table td.kfw-latest__links a.kfw-latest__links__download:visited:hover {
583 | background: #3f6d53;
584 | }
585 | .kfw#kfw-matrix table th,
586 | .kfw#kfw-matrix table td {
587 | border-color: #444;
588 | }
589 | .kfw#kfw-matrix table tr td.kfw-matrix__device {
590 | background: #0c0c0c;
591 | }
592 | .kfw#kfw-matrix table tr:nth-child(odd) td.kfw-matrix__device {
593 | background: #131313;
594 | }
595 | .kfw#kfw-matrix table th.kfw-matrix__version,
596 | .kfw#kfw-matrix table td.kfw-matrix__version {
597 | text-align: center;
598 | }
599 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--yes {
600 | background: rgba(42, 71, 42, 0.4);
601 | }
602 | .kfw#kfw-matrix table td.kfw-matrix__version.kfw-matrix__version--no {
603 | background: rgba(49, 34, 34, 0.4);
604 | }
605 | .kfw#kfw-affiliates table th,
606 | .kfw#kfw-affiliates table td {
607 | border-color: #444;
608 | }
609 | .kfw#kfw-affiliates table tr td.kfw-affiliates__device {
610 | background: #0c0c0c;
611 | }
612 | .kfw#kfw-affiliates table tr:nth-child(odd) td.kfw-affiliates__device {
613 | background: #131313;
614 | }
615 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--latest {
616 | background: rgba(42, 71, 42, 0.4);
617 | }
618 | .kfw#kfw-affiliates table td.kfw-affiliates__affiliate.kfw-affiliates__affiliate--outdated {
619 | background: rgba(49, 34, 34, 0.4);
620 | }
621 | }
--------------------------------------------------------------------------------
/kfw.js:
--------------------------------------------------------------------------------
1 | import * as Sentry from "@sentry/browser"
2 |
3 | class KFWProxy {
4 | constructor(base = "https://kfw.api.pgaskin.net") {
5 | this.base = base
6 | }
7 |
8 | async latestVersion(id, affiliate = "kobo") {
9 | let version = "0.0"
10 | if (id == "00000000-0000-0000-0000-000000000381")
11 | version = "4.7.10364" // required to receive the next update
12 | if (id == "00000000-0000-0000-0000-000000000387")
13 | version = "4.28.17826" // required to receive the next update (17826 -> 17925)
14 | if (id == "00000000-0000-0000-0000-000000000388")
15 | version = "4.30.18838" // required to receive the next update (18838 -> 19086)
16 | if (id == "00000000-0000-0000-0000-000000000390")
17 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418)
18 | if (id == "00000000-0000-0000-0000-000000000391")
19 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418)
20 | if (id == "00000000-0000-0000-0000-000000000393")
21 | version = "4.42.23296" // required to receive the next update (4.42.23296 -> 4.43.23418)
22 | return await this.UpgradeCheck(id, affiliate, version)
23 | }
24 |
25 | async UpgradeCheck(id, affiliate = "kobo", version = "0.0", serial = "N0") {
26 | return await this.KoboAPI(`1.0/UpgradeCheck/Device/${id}/${affiliate}/${version}/${serial}`, true, KFWProxy.transformUpgrade)
27 | }
28 |
29 | static transformUpgrade(obj) {
30 | obj.UpgradeVersion = KFWProxy.#transformUpgradeVersion(obj.UpgradeURL)
31 | obj.UpgradeDate = KFWProxy.#transformUpgradeDate(obj.UpgradeURL, obj.UpgradeVersion)
32 | if (false) // debug
33 | if (Math.random() > .5)
34 | obj.UpgradeVersion = "1.2.3"
35 | return obj
36 | }
37 |
38 | static #transformUpgradeVersion(url) {
39 | // fallback
40 | if (!url)
41 | return "0.0"
42 |
43 | // overrides
44 | url = url.split("?")[0]
45 | if (url.endsWith("/kobo7/April2018/kobo-update-4.8.zip")) return "4.8.10956"
46 | if (url.endsWith("/kobo7/May2018/kobo-update-4.8.zip")) return "4.8.11090"
47 | if (url.endsWith("/kobo4/May2018/kobo-update-4.9.11311.zip")) return "4.9.11314"
48 | if (url.endsWith("/kobo5/May2018/kobo-update-4.9.11311.zip")) return "4.9.11314"
49 | if (url.endsWith("/kobo6/Aug2018/kobo-update-4.10.zip")) return "4.10.11591"
50 | if (url.endsWith("/kobo7/Aug2018/kobo-update-4.10.zip")) return "4.10.11591"
51 |
52 | // filename
53 | const m = url.match(/\/kobo-update-([0-9.]+(?:-s)?)(?:-TF[0-9]+|-TouchFW-[0-9]+)?\.zip/)
54 | if (!m || m.length != 2)
55 | throw new Error(`Failed to extract version from "${url}"`)
56 | return m[1]
57 | }
58 |
59 | static #transformUpgradeDate(url, version) {
60 | // fallback
61 | if (!url || !version || version == "0.0")
62 | return "Unknown"
63 |
64 | // overrides
65 | switch (version) {
66 | case "3.4.1": return "May 2014"
67 | case "4.6.9960": return "October 2017"
68 | case "4.6.10075": return "November 2017"
69 | case "4.9.11311": return "June 2018"
70 | case "4.9.11314": return "June 2018"
71 | case "4.28.17623": return "June 2021" // it was indeed built in May as it is in the URL, but we don't want to confuse people
72 | }
73 |
74 | // date folder
75 | const m = url.match(/\/firmwares\/kobo[0-9]+\/(.+?)\//)
76 | if (!m || m.length != 2)
77 | throw new Error(`Failed to extract date from "${url}" and "${version}"`)
78 |
79 | // month expansion
80 | let [month, year] = m[1].replace(/([0-9]+)/, " $1").split(" ")
81 | switch ((month = month.charAt(0).toUpperCase() + month.slice(1))) {
82 | case "Jan": month = "January"; break
83 | case "Feb": month = "February"; break
84 | case "Mar": month = "March"; break
85 | case "Apr": month = "April"; break
86 | case "Jun": month = "June"; break
87 | case "Jul": month = "July"; break
88 | case "Aug": month = "August"; break
89 | case "Sep": month = "September"; break
90 | case "Sept": month = "September"; break
91 | case "Oct": month = "October"; break
92 | case "Nov": month = "November"; break
93 | case "Dec": month = "December"; break
94 | case "Rakuten-": month = "Unknown"; break
95 | }
96 | return [month, year].join(" ").trim()
97 | }
98 |
99 | // -1[ab]
100 | static versionCompare(a, b) {
101 | // fallback
102 | if (!a) return -1;
103 | if (!b) return 1;
104 |
105 | // April 2019 -s version suffix.
106 | if (a.endsWith("-s") && b == a.substring(0, a.length - 2)) return 1
107 | if (b.endsWith("-s") && a == b.substring(0, b.length - 2)) return -1
108 |
109 | // version parts
110 | const as = a.split(".").map(x => parseInt(x, 10))
111 | const bs = b.split(".").map(x => parseInt(x, 10))
112 |
113 | // if 4.38/4.39+ branching, sort by only the build number
114 | if (as.length == 3 && bs.length == 3 && as[0] == 4 && bs[0] == 4 && as[1] >= 38 && bs[1] >= 38) {
115 | if (as[2] < bs[2]) return -1
116 | if (as[2] > bs[2]) return 1
117 | if (as[2] == bs[2] && as[1] == bs[1]) return 1
118 | // fall back to normal compare if not entirely equal
119 | }
120 |
121 | // normal version compare
122 | for (let i = 0; i < Math.max(as.length, bs.length); i++) {
123 | if (as[i] == null) return bs[i] == 0 ? 0 : -1
124 | if (bs[i] == null) return as[i] == 0 ? 0 : 1
125 | if (as[i] < bs[i]) return -1
126 | if (as[i] > bs[i]) return 1
127 | }
128 | return 0
129 | }
130 |
131 | async ReleaseNotes(n = 1) {
132 | if (typeof n === "string") {
133 | const m = n.match(/\/1\.0\/ReleaseNotes\/([0-9]+)/)
134 | if (!m || m.length != 2)
135 | throw new Error(`Failed to extract release note number from "${n}"`)
136 | n = m[1]
137 | }
138 | return await this.KoboAPI(`1.0/ReleaseNotes/${n}`, false, KFWProxy.transformNotes)
139 | }
140 |
141 | static transformNotes(html) {
142 | const css = `p{margin:0}`
143 | try {
144 | const doc = new DOMParser().parseFromString(html, "text/html")
145 | doc.head.appendChild(doc.createElement("style")).textContent = css
146 | return doc.documentElement.innerHTML
147 | } catch (ex) {
148 | // this happens on the Kobo Web Browser for some reason
149 | console.warn(`tranform notes failed ${ex}, falling back to innerHTML method`)
150 | const doc = document.createElement("div")
151 | doc.innerHTML = html
152 | return ` ${doc.innerHTML}`
153 | }
154 | }
155 |
156 | async KoboAPI(path, json = false, transform = null) {
157 | return await this.#request(`${this.base}/api.kobobooks.com/${path}`, json, transform)
158 | }
159 |
160 | // request batching
161 |
162 | #pending = null
163 | #PendingRequest = class {
164 | constructor(url, json = false, transform = null) {
165 | this.url = url
166 | this.transform = transform
167 | this.json = json
168 | this.promise = new Promise((a, b) => {
169 | this.resolve = a
170 | this.reject = b
171 | })
172 | }
173 | }
174 |
175 | batch() {
176 | if (!this.#pending)
177 | this.#pending = []
178 | }
179 |
180 | endBatch() {
181 | if (this.#pending) {
182 | this.#doBatch(...this.#pending)
183 | this.#pending = null
184 | }
185 | }
186 |
187 | async #request(url, json = false, transform = null) {
188 | const req = new this.#PendingRequest(url, json, transform)
189 | if (this.#pending && url.startsWith(`${this.base}/api.kobobooks.com/`)) {
190 | this.#pending.push(req)
191 | } else {
192 | this.#do(req)
193 | }
194 | return req.promise
195 | }
196 |
197 | async #do(req) {
198 | const xhr = new XMLHttpRequest()
199 | xhr.addEventListener("load", ev => this.#doResponse(req, xhr.responseText, xhr.status, xhr.statusText, xhr.getResponseHeader("X-KFWProxy-Request-Id")))
200 | xhr.addEventListener("error", ev => req.reject(new Error(`Request to "${req.url}" failed`)))
201 | xhr.addEventListener("abort", ev => req.reject(new Error(`Request to "${req.url}" aborted`)))
202 | xhr.open("GET", req.url)
203 | xhr.send()
204 | return await req.promise
205 | }
206 |
207 | async #doBatch(...req) {
208 | if (req.length == 0) {
209 | return
210 | }
211 | const xhr = new XMLHttpRequest()
212 | xhr.addEventListener("load", ev => {
213 | const requestID = xhr.getResponseHeader("X-KFWProxy-Request-Id")
214 | try {
215 | if (xhr.status != 200)
216 | throw `${xhr.status} ${xhr.statusText}`
217 | const rsp = JSON.parse(xhr.responseText)
218 | if (!Array.isArray(rsp))
219 | throw `response not an array`
220 | if (rsp.length != req.length)
221 | throw `found ${rsp.length} responses, but expected ${req.length}`
222 | for (let i = 0; i < req.length; i++)
223 | this.#doResponse(req[i], rsp[i].body, rsp[i].status, "", requestID)
224 | } catch (ex) {
225 | for (const r of req)
226 | r.reject(new Error(`Batch request including "${r.url}" failed: ${ex}`))
227 | Sentry.captureException(new Error(`Batch request failed: ${ex}`), {
228 | extra: {requestID},
229 | })
230 | return
231 | }
232 | })
233 | xhr.addEventListener("error", ev => req.forEach(r => r.reject(new Error(`Batch request including "${r.url}" failed`))))
234 | xhr.addEventListener("abort", ev => req.forEach(r => r.reject(new Error(`Batch request including "${r.url}" aborted`))))
235 | xhr.open("GET", `${this.base}/api.kobobooks.com?h=1&x=${req.map(r => encodeURIComponent(r.url.replace(`${this.base}/api.kobobooks.com/`, ""))).join("&x=")}`)
236 | xhr.send()
237 | return await Promise.all(req.map(r => r.promise))
238 | }
239 |
240 | #doResponse(req, body, status, statusText = "", requestID = null) {
241 | if (status != 200) {
242 | req.reject(new Error(`Request to "${req.url}" failed: ${status} ${statusText}`))
243 | Sentry.captureException(new Error(`Request to "${req.url}" failed: ${status} ${statusText}`), {
244 | extra: {requestID},
245 | })
246 | return
247 | }
248 | let obj = body
249 | if (req.json) {
250 | try {
251 | obj = JSON.parse(obj)
252 | } catch (ex) {
253 | req.reject(new Error(`Request to "${req.url}" failed: ${ex}`))
254 | return
255 | }
256 | }
257 | if (req.transform) {
258 | try {
259 | obj = req.transform(obj)
260 | } catch (ex) {
261 | req.reject(new Error(`Request to "${req.url}" failed: transform error: ${ex}`))
262 | return
263 | }
264 | }
265 | req.resolve(obj)
266 | }
267 | }
268 |
269 | class KFWArchive {
270 | #md5sums
271 | constructor(base = "https://kfw.storage.pgaskin.net") {
272 | this.base = base
273 | }
274 | async files() {
275 | return this.#md5sums ||= await new Promise((resolve, reject) => {
276 | const url = this.base + "/MD5SUMS"
277 | const xhr = new XMLHttpRequest()
278 | xhr.addEventListener("load", ev => {
279 | if (xhr.status != 200) reject(new Error(`Request to "${url} failed: response status ${xhr.status}"`))
280 | else resolve(xhr.responseText)
281 | })
282 | xhr.addEventListener("error", ev => reject(new Error(`Request to "${url}" failed`)))
283 | xhr.addEventListener("abort", ev => reject(new Error(`Request to "${url}" aborted`)))
284 | xhr.open("GET", url)
285 | xhr.send()
286 | }).then(txt => txt
287 | .trim()
288 | .split("\n")
289 | .map(x => x.split(/\s+/, 2))
290 | .map(([md5, fn]) => [
291 | md5.toLowerCase(),
292 | fn.replace(/^.\//, "").replace(/^\/?firmwares\//, ""),
293 | ])
294 | .map(([md5, fn]) => ({
295 | md5, fn, url: this.base + "/firmwares/" + fn,
296 | }))
297 | ).catch(ex => {
298 | try { Sentry.captureException(new Error(`Failed to load kfw archive md5sums: ${ex}`)) } catch (ex) {}
299 | throw ex
300 | })
301 | }
302 | async lookup(url) {
303 | const part = url.split("/firmwares/", 2).pop()
304 | const files = await this.files()
305 | return files.filter(x => x.fn == part).pop() || null
306 | }
307 | mirrorLink(url) {
308 | const part = url.split("/firmwares/", 2)[1]
309 | if (part) return base + "/firmwares/" + part
310 | return null
311 | }
312 | }
313 |
314 | // so we can load it deferred directly from the webpage
315 | const KoboFirmwareOldVersionsData = window.KoboFirmwareOldVersionsData = (() => {
316 | let resolve, reject
317 | let promise = new Promise((a, b) => {
318 | resolve = a
319 | reject = b
320 | })
321 | let timeout = window.setTimeout(() => {
322 | if ("KoboFirmwareOldVersionsDataRaw" in window) {
323 | resolve(KoboFirmwareOldVersionsDataRaw)
324 | console.warn("async old versions load failed, but still found the data afterwards...")
325 | return
326 | }
327 | reject(new Error("Failed to load old versions data: Timed out"))
328 | console.error("old versions load failed")
329 | Sentry.captureException(new Error("Failed to load old versions data: Timed out"))
330 | }, 10000)
331 | promise.resolve = data => {
332 | window.clearTimeout(timeout)
333 | resolve(data)
334 | }
335 | return promise
336 | })()
337 |
338 | class KoboFirmwareDB {
339 | #db
340 | constructor(db = KoboFirmwareOldVersionsData) {
341 | this.#db = db // hardware, id, version, date, download
342 | }
343 | #__db
344 | async #_db() {
345 | if (this.#__db)
346 | return this.#__db
347 | this.#__db = (await this.#db)
348 | .sort(([,aid,aversion,,,], [,bid,bversion,,,]) => {
349 | const a = KFWProxy.versionCompare(aversion, bversion)
350 | return a == 0 ? aid.localeCompare(bid) : a
351 | })
352 | return this.#__db
353 | }
354 | async versionsForDevice(id) {
355 | return (await this.#_db())
356 | .filter(([,did,,,,]) => did == id)
357 | .reverse() // #_db sorts it asc, we want it desc
358 | .map(([hardware,,version,date,download]) => ({hardware, version, date, download}))
359 | }
360 | async versionsByDevice() {
361 | let tmp = (await this.#_db())
362 | .reduce((acc, [,id,version,date,,]) => {
363 | (acc[id] = acc[id] || {})[version] = date
364 | return acc
365 | }, {})
366 | for (const id in tmp) {
367 | let earliest
368 | for (const version in tmp[id])
369 | if (!earliest || KFWProxy.versionCompare(earliest, version) == 1)
370 | earliest = version
371 | tmp[id].earliest = earliest
372 | }
373 | return tmp
374 | }
375 | async versions() {
376 | return Object.keys((await this.#_db())
377 | .reduce((acc, [,,version,,,]) => {
378 | acc[version] = null
379 | return acc
380 | }, {}))
381 | .reverse() // #_db sorts it asc, we want it desc
382 | }
383 | async downloadsByVersion() {
384 | let tmp = []
385 | let cur, curv
386 | let devs = {}, devsh = {}
387 | for (const [hardware,id,version,date,download,md5sum] of await this.#_db()) {
388 | if (curv != version) {
389 | if (cur)
390 | tmp.push(cur)
391 | cur = {version, date, for: {}, download: {[hardware]: download}}
392 | curv = version
393 | }
394 | if (hardware in cur.download) {
395 | if (cur.download[hardware] != download)
396 | cur.download[hardware] = "varies" // maybe make this add all by device id if needed later?
397 | } else {
398 | cur.download[hardware] = download
399 | }
400 | cur.for[id] = true
401 | if (!(id in devs)) {
402 | {devs[id] = hardware}
403 | (devsh[hardware] = devsh[hardware] || {})[id] = null
404 | }
405 | }
406 | tmp.push(cur)
407 | for (let i = 0; i < tmp.length; i++) {
408 | tmp[i].notfor = []
409 | for (const hardware in tmp[i].download)
410 | for (const id in devsh[hardware])
411 | if (!(id in tmp[i].for))
412 | tmp[i].notfor.push(id)
413 | tmp[i].for = Object.keys(tmp[i].for)
414 | }
415 | return tmp
416 | }
417 | }
418 |
419 | class KoboFirmware {
420 | #kfw
421 | #db
422 | #affiliates
423 | #tolinoAffiliates
424 | #devices
425 | #archive
426 |
427 | get debug() {
428 | return {
429 | KFWProxy, KoboFirmwareDB, KoboFirmwareOldVersionsData, KoboFirmware,
430 | kfw: this.#kfw,
431 | db: this.#db,
432 | affiliates: this.#affiliates,
433 | tolinoAffiliates: this.#tolinoAffiliates,
434 | devices: this.#devices,
435 | req: this.#req,
436 | archive: this.#archive,
437 | }
438 | }
439 |
440 | constructor(
441 | kfw = new KFWProxy(),
442 | db = new KoboFirmwareDB(),
443 | archive = new KFWArchive(),
444 | affiliates = [
445 | "kobo",
446 | "bestbuyca",
447 | "fnac",
448 | "beta",
449 | "rakutenbooks",
450 | "walmartca",
451 | ],
452 | tolinoAffiliates = [
453 | // TODO
454 | ],
455 | devices = [
456 | ["kobo3", "00000000-0000-0000-0000-000000000310", "Kobo Touch A/B"],
457 | ["kobo4", "00000000-0000-0000-0000-000000000320", "Kobo Touch C"],
458 | ["kobo4", "00000000-0000-0000-0000-000000000340", "Kobo Mini"],
459 | ["kobo4", "00000000-0000-0000-0000-000000000330", "Kobo Glo"],
460 | ["kobo6", "00000000-0000-0000-0000-000000000371", "Kobo Glo HD"],
461 | ["kobo6", "00000000-0000-0000-0000-000000000372", "Kobo Touch 2.0"],
462 | ["kobo5", "00000000-0000-0000-0000-000000000360", "Kobo Aura"],
463 | ["kobo4", "00000000-0000-0000-0000-000000000350", "Kobo Aura HD"],
464 | ["kobo5", "00000000-0000-0000-0000-000000000370", "Kobo Aura H2O"],
465 | ["kobo6", "00000000-0000-0000-0000-000000000374", "Kobo Aura H2O Edition 2 v1"],
466 | ["kobo7", "00000000-0000-0000-0000-000000000378", "Kobo Aura H2O Edition 2 v2"],
467 | ["kobo6", "00000000-0000-0000-0000-000000000373", "Kobo Aura ONE"],
468 | ["kobo6", "00000000-0000-0000-0000-000000000381", "Kobo Aura ONE Limited Edition"],
469 | ["kobo6", "00000000-0000-0000-0000-000000000375", "Kobo Aura Edition 2 v1"],
470 | ["kobo7", "00000000-0000-0000-0000-000000000379", "Kobo Aura Edition 2 v2"],
471 | ["kobo7", "00000000-0000-0000-0000-000000000382", "Kobo Nia"],
472 | ["kobo7", "00000000-0000-0000-0000-000000000376", "Kobo Clara HD"],
473 | ["kobo7", "00000000-0000-0000-0000-000000000380", "Kobo Forma"],
474 | ["kobo7", "00000000-0000-0000-0000-000000000384", "Kobo Libra H2O"],
475 | ["kobo8", "00000000-0000-0000-0000-000000000387", "Kobo Elipsa"],
476 | ["kobo8", "00000000-0000-0000-0000-000000000383", "Kobo Sage"],
477 | ["kobo9", "00000000-0000-0000-0000-000000000388", "Kobo Libra 2"],
478 | ["kobo10", "00000000-0000-0000-0000-000000000386", "Kobo Clara 2E"],
479 | ["kobo11", "00000000-0000-0000-0000-000000000389", "Kobo Elipsa 2E"],
480 | ["kobo13", "00000000-0000-0000-0000-000000000390", "Kobo Libra Colour"], // kobo11 for 4.39.22861 and below
481 | ["kobo12", "00000000-0000-0000-0000-000000000391", "Kobo Clara BW (N365)"],
482 | ["kobo12", "00000000-0000-0000-0000-000000000393", "Kobo Clara Colour"],
483 | // ["kobo11", "00000000-0000-0000-0000-000000000690", "tolino vision colour"],
484 | // ["kobo12", "00000000-0000-0000-0000-000000000691", "tolino shine"],
485 | // ["kobo12", "00000000-0000-0000-0000-000000000693", "tolino shine color"],
486 | ],
487 | ) {
488 | this.#kfw = kfw
489 | this.#db = db
490 | this.#archive = archive
491 | this.#affiliates = affiliates
492 | this.#tolinoAffiliates = tolinoAffiliates
493 | this.#devices = []
494 | for (const device of devices) {
495 | if (!Array.isArray(device) || device.length != 3)
496 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: incorrect length`)
497 |
498 | const [hardware, id, name] = device
499 | if (!hardware || typeof hardware !== "string" || !hardware.startsWith("kobo"))
500 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad hardware`)
501 | if (!id || typeof id !== "string" || id.length != 36) {
502 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad id`) }
503 | if (!name || typeof name !== "string" || name.length == 0)
504 | throw new TypeError(`Invalid device ${JSON.stringify(device)}: bad device`)
505 | this.#devices.push({hardware, id, name})
506 | }
507 | this.#load()
508 | }
509 |
510 | #req // [device][affiliate]Promise
511 | #load() {
512 | this.#req = {}
513 | for (const device of this.#devices) {
514 | this.#kfw.batch()
515 | this.#req[device.id] = {}
516 | for (const affiliate of (device.id.startsWith("00000000-0000-0000-0000-0000000006") ? this.#tolinoAffiliates : this.#affiliates))
517 | this.#req[device.id][affiliate] = this.#kfw.latestVersion(device.id, affiliate) // note that a Promise's result/rejection can be used multiple times
518 | this.#kfw.endBatch()
519 | }
520 | this.#archive.files()
521 | }
522 |
523 | #ctr(link, ...x) {
524 | if (window.goatcounter) {
525 | const fn = () => {
526 | for (const [evt, name] of x) {
527 | const ct = window.goatcounter.url({
528 | event: true,
529 | path: `kfw-${evt}`,
530 | title: `${name}`,
531 | })
532 | if (!ct)
533 | continue
534 | navigator.sendBeacon(ct)
535 | }
536 | }
537 | link.addEventListener("click", fn, false)
538 | link.addEventListener("auxclick", fn, false)
539 | }
540 | }
541 |
542 | async renderLatest(table) {
543 | const ths = document.createDocumentFragment()
544 | KoboFirmware.#el(ths, "th", "Model", ["kfw-latest__model"])
545 | KoboFirmware.#el(ths, "th", "Hardware", ["kfw-latest__hardware"])
546 | KoboFirmware.#el(ths, "th", "Version", ["kfw-latest__version"])
547 | KoboFirmware.#el(ths, "th", "Date", ["kfw-latest__date"])
548 | KoboFirmware.#el(ths, "th", "Links", ["kfw-latest__links"])
549 | table.querySelector("thead tr").appendChild(ths)
550 |
551 | // load the initial data
552 | const trm = {}
553 | const trs = document.createDocumentFragment()
554 | for (const device of this.#devices) {
555 | const tr = KoboFirmware.#el(trs, "tr")
556 | trm[device.id] = {
557 | model: KoboFirmware.#el(tr, "td", device.name, ["kfw-latest__model"], {title: `ID: ${device.id}`}),
558 | hardware: KoboFirmware.#el(tr, "td", device.hardware, ["kfw-latest__hardware"]),
559 | version: KoboFirmware.#el(tr, "td", "Loading", ["kfw-latest__version"]),
560 | date: KoboFirmware.#el(tr, "td", null, ["kfw-latest__date"]),
561 | linksw: KoboFirmware.#el(tr, "td", null, ["kfw-latest__links"]),
562 | }
563 | const linksw1 = KoboFirmware.#el(trm[device.id].linksw, "span", null, [], {style: "display: inline-block; vertical-align: top;"}) // to control wrapping
564 | const linksw2 = KoboFirmware.#el(trm[device.id].linksw, "span", null, [], {style: "display: inline-block; vertical-align: top;"}) // to control wrapping
565 | trm[device.id].links = {
566 | download: KoboFirmware.#el(linksw1, "a", "Download", ["kfw-latest__links__download"], {style: "display: none;", rel: "noopener"}),
567 | notes: KoboFirmware.#el(linksw1, "a", "Notes", ["kfw-latest__links__notes"], {style: "display: none;", rel: "noopener", target: "_blank"}),
568 | affiliates: KoboFirmware.#el(linksw2, "button", "Other Affiliates", ["kfw-latest__links__affiliates"], {style: "display: none;"}),
569 | versions: KoboFirmware.#el(linksw2, "button", "Other Versions", ["kfw-latest__links__versions"], {}),
570 | }
571 | trm[device.id].links.versions.addEventListener("click", ev => {
572 | KoboFirmware.#modal(`Other versions for ${device.name}`, async () => {
573 | const frag = document.createDocumentFragment()
574 | for (const version of await this.#db.versionsForDevice(device.id)) {
575 | const isHardwareException = device.id === "00000000-0000-0000-0000-000000000390" && version.hardware === "kobo11" && ["4.39.22801", "4.39.22861"].includes(version.version);
576 |
577 | if (version.hardware !== device.hardware || !version.download.includes(device.hardware))
578 | if (!isHardwareException)
579 | console.warn("possible hardware mismatch", device, version)
580 | const el = KoboFirmware.#el(frag, "div", `${version.version} - ${version.date} - Download - ${version.hardware}${isHardwareException ? " (yes, this is correct)" : ""}`, [], {}, true)
581 |
582 | // stats
583 | this.#ctr(el.querySelector("a"),
584 | [`dl`, "Firmware"],
585 | [`dl-version-${version.version}`, `Firmware ${version.version}`],
586 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`],
587 | )
588 |
589 | // archive
590 | this.#archive.lookup(version.download).then(dl => {
591 | if (dl) {
592 | const mirror = el.querySelector("span.mirror")
593 | KoboFirmware.#el(mirror, "span", " (")
594 | KoboFirmware.#el(mirror, "a", "mirror", [], {href: dl.url})
595 | KoboFirmware.#el(mirror, "span", ")")
596 |
597 | // stats
598 | this.#ctr(mirror.querySelector("a"),
599 | [`dl`, "Firmware"],
600 | [`dl-archive`, "Firmware"],
601 | [`dl-version-${version.version}`, `Firmware ${version.version}`],
602 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`],
603 | )
604 | }
605 | }).catch(ex => {})
606 | }
607 | return frag
608 | })
609 | ev.preventDefault()
610 | })
611 | }
612 | table.querySelector("tbody").appendChild(trs)
613 |
614 | // load each row async as data becomes available
615 | await Promise.all(this.#devices.map(device => (async device => {
616 | try {
617 | // load the latest update info and the affiliates which have it
618 | let latest, latests = [], anyAvailable = false
619 | for (const affiliate of (device.id.startsWith("00000000-0000-0000-0000-0000000006") ? this.#tolinoAffiliates : this.#affiliates)) {
620 | let info
621 | try {
622 | info = await this.#req[device.id][affiliate]
623 | } catch (ex) {
624 | // retry once more
625 | this.#req[device.id][affiliate] = this.#kfw.latestVersion(device.id, affiliate)
626 | info = await this.#req[device.id][affiliate]
627 | }
628 | switch (KFWProxy.versionCompare(latest?.UpgradeVersion, info.UpgradeVersion)) {
629 | case -1: // !latest || latest < info
630 | latest = info
631 | latests = [affiliate]
632 | break
633 | case 0: // latest == info
634 | latests.push(affiliate)
635 | break
636 | }
637 | anyAvailable ||= !!info?.UpgradeURL
638 | }
639 |
640 | if (!anyAvailable) {
641 | trm[device.id].version.textContent = "?"
642 | trm[device.id].date.textContent = "-"
643 | trm[device.id].links.versions.classList.add("primary")
644 | try { Sentry.captureException(new Error(`No update available for "${device.name}"`)) } catch (ex) {}
645 |
646 | ;(async () => {
647 | const data = await this.#db.versionsForDevice(device.id)
648 | if (data[0]) {
649 | trm[device.id].version.textContent = data[0].version
650 | trm[device.id].date.textContent = data[0].date
651 | trm[device.id].links.download.href = data[0].download
652 | trm[device.id].version.classList.add("cached")
653 | trm[device.id].links.download.classList.add("primary")
654 | trm[device.id].links.download.style.removeProperty("display")
655 | trm[device.id].links.versions.classList.remove("primary")
656 | }
657 | })()
658 | } else {
659 | // table cells
660 | trm[device.id].version.textContent = latest.UpgradeVersion
661 | trm[device.id].date.textContent = latest.UpgradeDate
662 | trm[device.id].version.setAttribute("title", `Affiliates with version: ${latests.join(", ")}`)
663 |
664 | // download
665 | if (latest.UpgradeURL) {
666 | trm[device.id].links.download.href = latest.UpgradeURL
667 | trm[device.id].links.download.classList.add("primary")
668 | trm[device.id].links.download.style.removeProperty("display")
669 | }
670 |
671 | // release notes
672 | trm[device.id].links.notes.href = latest.ReleaseNoteURL || "javascript:void(0);"
673 | trm[device.id].links.notes.addEventListener("click", ev => {
674 | if (navigator.userAgent.includes("MSIE") || navigator.userAgent.includes("Trident/")) {
675 | return // doesn't support srcdoc
676 | }
677 | KoboFirmware.#modal(`Release notes for ${latest.UpgradeVersion}`, async () => {
678 | const content = latest.ReleaseNoteURL ? await this.#kfw.ReleaseNotes(latest.ReleaseNoteURL) : "No release notes available."
679 | const frame = document.createElement("iframe")
680 | frame.srcdoc = content
681 | frame.setAttribute("sandbox", "")
682 | return frame
683 | })
684 | ev.preventDefault()
685 | });
686 | trm[device.id].links.notes.style.removeProperty("display")
687 |
688 | // affiliates
689 | trm[device.id].links.affiliates.addEventListener("click", ev => {
690 | KoboFirmware.#modal(`Versions of other affiliates for ${device.name}`, async () => {
691 | const frag = document.createDocumentFragment()
692 | for (const affiliate in this.#req[device.id]) {
693 | const info = await this.#req[device.id][affiliate]
694 | const a = KoboFirmware.#el(frag, "div", `${affiliate} - ${info.UpgradeVersion}${info.UpgradeURL ? ` - Download ` : ``}`, [], {}, true)
695 |
696 | // stats
697 | this.#ctr(a,
698 | [`dl`, "Firmware"],
699 | [`dl-version-${info.UpgradeVersion}`, `Firmware ${info.UpgradeVersion}`],
700 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`],
701 | )
702 | }
703 | return frag
704 | }, ["thin"])
705 | ev.preventDefault()
706 | });
707 | trm[device.id].links.affiliates.style.removeProperty("display")
708 | }
709 |
710 | // stats
711 | if (latest) {
712 | this.#ctr(trm[device.id].links.download,
713 | [`dl`, "Firmware"],
714 | [`dl-version-${latest.UpgradeVersion}`, `Firmware ${latest.UpgradeVersion}`],
715 | [`dl-device-${device.id.replace(/^[0-]+/, "")}`, `${device.hardware} / ${device.name}`],
716 | )
717 | }
718 | } catch (ex) {
719 | trm[device.id].version.textContent = "Error"
720 | trm[device.id].version.setAttribute("title", `Error: ${ex}`)
721 | Sentry.captureException(new Error(`Table row load failed for "${device.name}" in latest versions table: ${ex}`))
722 | }
723 | })(device)))
724 | }
725 |
726 | async renderMatrix(table) {
727 | // this one is built horizontally
728 | let rows = {}
729 | const tb = table.querySelector("tbody")
730 | rows.header = table.querySelector("thead tr")
731 |
732 | // add a column for the device names
733 | KoboFirmware.#el(rows.header, "th", "Device", ["kfw-matrix__device"])
734 | for (const device of this.#devices) {
735 | rows[device.id] = KoboFirmware.#el(tb, "tr")
736 | KoboFirmware.#el(rows[device.id], "td", device.name, ["kfw-matrix__device"])
737 | }
738 |
739 | // add the version columns all at once (since there are a lot of them)
740 | let cols = {}
741 | const availability = await this.#db.versionsByDevice()
742 | for (const version of await this.#db.versions()) {
743 | KoboFirmware.#el((cols.header = cols.header || document.createDocumentFragment()), "th", version, ["kfw-matrix__version"])
744 | for (const device of this.#devices) {
745 | const date = availability[device.id]?.[version]
746 | let t, c, a
747 | if (date) {
748 | t = "✓"
749 | c = "kfw-matrix__version--yes"
750 | a = {title: date}
751 | } else if (!availability[device.id] || KFWProxy.versionCompare(availability[device.id].earliest, version) == 1) {
752 | // TODO: make this check more efficient by doing it separately going through the versions backwards
753 | t = "-"
754 | c = "kfw-matrix__version--none"
755 | a = {}
756 | } else {
757 | t = "✗"
758 | c = "kfw-matrix__version--no"
759 | a = {}
760 | }
761 | KoboFirmware.#el((cols[device.id] = cols[device.id] || document.createDocumentFragment()), "td", t, ["kfw-matrix__version", c], a)
762 | }
763 | }
764 | for (const row in cols)
765 | rows[row].appendChild(cols[row])
766 |
767 | // add a column for the device names
768 | KoboFirmware.#el(rows.header, "th", "Device", ["kfw-matrix__device"])
769 | for (const device of this.#devices)
770 | KoboFirmware.#el(rows[device.id], "td", device.name, ["kfw-matrix__device"])
771 | }
772 |
773 | async renderAffiliates(table) {
774 | const ths = document.createDocumentFragment()
775 | KoboFirmware.#el(ths, "th", "Device", ["kfw-affiliates__device"])
776 | for (const affiliate of this.#affiliates)
777 | KoboFirmware.#el(ths, "th", affiliate, ["kfw-affiliates__affiliate"])
778 | table.querySelector("thead tr").appendChild(ths)
779 |
780 | // load the initial data
781 | const trm = {}
782 | const trs = document.createDocumentFragment()
783 | for (const device of this.#devices) {
784 | if (device.id.startsWith("00000000-0000-0000-0000-0000000006")) continue; // skip tolino for now
785 | const tr = KoboFirmware.#el(trs, "tr")
786 | trm[device.id] = {}
787 | KoboFirmware.#el(tr, "td", device.name, ["kfw-affiliates__device"])
788 | for (const affiliate of this.#affiliates)
789 | trm[device.id][affiliate] = KoboFirmware.#el(tr, "td", "Loading", ["kfw-affiliates__affiliate"])
790 | }
791 | table.querySelector("tbody").appendChild(trs)
792 |
793 | // load each cell async as data becomes available (we use traditional
794 | // promise chaining here to improve performance by reducing the number
795 | // of pending async functions at once)
796 | return Promise.all(this.#devices.map(device =>
797 | device.id.startsWith("00000000-0000-0000-0000-0000000006") ? Promise.resolve() : // skip tolino for now
798 | Promise.all(this.#affiliates.map(affiliate =>
799 | this.#req[device.id][affiliate]
800 | .then(obj => {
801 | trm[device.id][affiliate].textContent = obj.UpgradeVersion == "0.0"
802 | ? "-"
803 | : obj.UpgradeVersion
804 | return Promise.resolve([affiliate, obj])
805 | }).catch(ex => {
806 | trm[device.id][affiliate].textContent = "Error"
807 | trm[device.id][affiliate].title = `Error: ${ex}`
808 | return Promise.reject(ex)
809 | })
810 | )).then(affiliates => {
811 | let latest
812 | for (const [, info] of affiliates)
813 | if (KFWProxy.versionCompare(latest?.UpgradeVersion, info.UpgradeVersion) == -1)
814 | latest = info
815 | for (const [affiliate, info] of affiliates)
816 | trm[device.id][affiliate].classList.add(
817 | latest.UpgradeVersion == info.UpgradeVersion
818 | ? "kfw-affiliates__affiliate--latest"
819 | : info.UpgradeVersion == "0.0"
820 | ? "kfw-affiliates__affiliate--none"
821 | : "kfw-affiliates__affiliate--outdated")
822 | })
823 | ))
824 | }
825 |
826 | async renderVersions(table) {
827 | let hardware = {}
828 | let name = {}
829 | let idhardware = {}
830 | for (const device of this.#devices) {
831 | hardware[device.hardware] = null
832 | name[device.id] = device.name
833 | idhardware[device.id] = device.hardware
834 | }
835 | hardware = Object.keys(hardware).sort((a, b) => a.localeCompare(b, "en", {numeric: true}))
836 |
837 | const ths = document.createDocumentFragment()
838 | KoboFirmware.#el(ths, "th", "Date", ["kfw-versions__date"])
839 | KoboFirmware.#el(ths, "th", "Version", ["kfw-versions__version"])
840 | for (const hw of hardware)
841 | KoboFirmware.#el(ths, "th", hw, ["kfw-versions__hardware"])
842 | KoboFirmware.#el(ths, "th", "Notes", ["kfw-versions__notes"])
843 | table.querySelector("thead tr").appendChild(ths)
844 |
845 | const rows = document.createDocumentFragment()
846 | for (const version of await this.#db.downloadsByVersion()) {
847 | const row = KoboFirmware.#el(rows, "tr")
848 | KoboFirmware.#el(row, "td", version.date, ["kfw-versions__date"])
849 | KoboFirmware.#el(row, "td", version.version, ["kfw-versions__version"])
850 | for (const hw of hardware) {
851 | const td = KoboFirmware.#el(row, "td", version.download[hw] ? "" : "-", ["kfw-versions__hardware"])
852 | if (version.download[hw]) {
853 | const a = KoboFirmware.#el(td, "a", "Get", [], {rel: "noopener", href: version.download[hw], title: KoboFirmware.#listify(version.for.filter(id => idhardware[id] == hw).map(id => name[id].replace(/Kobo /, "")))})
854 |
855 | // stats
856 | this.#ctr(a,
857 | [`dl`, "Firmware"],
858 | [`dl-version-${version.version}`, `Firmware ${version.version}`],
859 | )
860 | }
861 | }
862 | const x = version.notfor.length
863 | ? version.for.length > version.notfor.length
864 | ? `Not for ${KoboFirmware.#listify(version.notfor.map(id => name[id].replace(/Kobo /, "")))}.`
865 | : `Only for ${KoboFirmware.#listify(version.for.map(id => name[id].replace(/Kobo /, "")))}.`
866 | : ""
867 | KoboFirmware.#el(row, "td", x, ["kfw-versions__notes"])
868 | }
869 | table.querySelector("tbody").appendChild(rows)
870 | }
871 |
872 | static #listify(arr) {
873 | if (!arr || arr.length == 0)
874 | return ""
875 | if (arr.length == 1)
876 | return arr[0].toString()
877 | if (arr.length == 2)
878 | return arr.join(" and ")
879 | return `${arr.slice(0, arr.length-1).join(", ")}, and ${arr[arr.length-1]}`
880 | }
881 |
882 | static #modal(title, fn, classes = []) {
883 | const modal = KoboFirmware.#el(null, "aside", null, ["modal-wrapper"])
884 | const inner = KoboFirmware.#el(modal, "div", null, ["modal", ...classes])
885 | const bar = KoboFirmware.#el(inner, "div", null, ["titlebar"])
886 | const close = KoboFirmware.#el(bar, "button", "Close", ["close"])
887 | const text = KoboFirmware.#el(bar, "div", title, ["title"])
888 | const body = KoboFirmware.#el(inner, "div", "Loading", ["body"])
889 |
890 | const cfn = ev => {
891 | if (ev) {
892 | if (ev.target != close && ev.target != modal && ev.keyCode != 27) {
893 | return // !close && !back && !esc
894 | }
895 | ev.preventDefault()
896 | }
897 | document.body.removeChild(modal)
898 | document.body.removeEventListener("keydown", cfn, true)
899 | }
900 | modal.addEventListener("click", cfn, true)
901 | document.body.addEventListener("keydown", cfn, true)
902 | document.body.appendChild(modal)
903 |
904 | {(async () => {
905 | try {
906 | let res = fn()
907 | if (res instanceof Promise)
908 | res = await res
909 | if (typeof res === "string") {
910 | body.innerHTML = res
911 | } else if (res instanceof HTMLIFrameElement) {
912 | res.classList.add("body")
913 | res.style.border = "none"
914 | res.style.width = "100%"
915 | res.style.height = "100%"
916 | res.style.padding = 0
917 | inner.removeChild(body)
918 | inner.appendChild(res)
919 | } else {
920 | body.innerHTML = ""
921 | body.appendChild(res)
922 | }
923 | } catch (ex) {
924 | body.innerHTML = `Error: Load failed: ${ex}`
925 | console.error("modal load failed", ex)
926 | Sentry.captureException(new Error(`Modal load failed for "${title}": ${ex}`))
927 | }
928 | })()}
929 |
930 | return {title: text, body, close: () => cfn(null)}
931 | }
932 |
933 | static #el(parent, tag, inner = null, classes = [], attrs = {}, raw = false) {
934 | const el = document.createElement(tag)
935 | for (const c of classes)
936 | el.classList.add(c)
937 | for (const a in attrs)
938 | el.setAttribute(a, attrs[a])
939 | if (inner)
940 | el[raw ? "innerHTML" : "textContent"] = inner.toString()
941 | if (parent)
942 | parent.appendChild(el)
943 | return el
944 | }
945 | }
946 |
947 | Sentry.init({
948 | dsn: "https://696a706ba440443eb3e19094ebd72f74@o143001.ingest.sentry.io/1104793",
949 | maxBreadcrumbs: 100,
950 | attachStacktrace: true,
951 | })
952 |
953 | const app = window.app = new KoboFirmware()
954 | app.renderLatest(document.getElementById("kfw-latest"))
955 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-latest`)))
956 | app.renderMatrix(document.getElementById("kfw-matrix"))
957 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-matrix`)))
958 | app.renderAffiliates(document.getElementById("kfw-affiliates"))
959 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-affiliates`)))
960 | app.renderVersions(document.getElementById("kfw-versions"))
961 | .catch(ex => Sentry.captureException(new Error(`Table load failed for #kfw-versions`)))
962 | document.getElementById("error").className = "error hidden";
963 |
--------------------------------------------------------------------------------
/kfw.db.js:
--------------------------------------------------------------------------------
1 | KoboFirmwareOldVersionsData.resolve(window.KoboFirmwareOldVersionsDataRaw = function() {
2 | var dh = "kobo";
3 | var dd = "00000000-0000-0000-0000-000000000";
4 | var dk = "http://download.kobobooks.com/firmwares/"+dh;
5 | var da = "https://cdn.kobo.com/downloads/firmwares/"+dh;
6 | var dn = "https://ereaderfiles.kobo.com/firmwares/"+dh;
7 | dk = da = dn;
8 | return [
9 | [dh+"3",dd+"310","1.9.12","October 2011",dk+"3/kobo3-upgrade-1.9.12.zip","8232d83c2e6ed77b9c26c7ec46d9c454"],
10 | [dh+"3",dd+"310","1.9.16","December 2011",dk+"3/bowfin/kobo3-update-1.9.16.zip","cd3cbb5ab53d9708b7eb11e071084373"],
11 | [dh+"3",dd+"310","1.9.17","March 2012",dk+"3/cod/kobo3-update-1.9.17.zip","2676e6cf3da25c58e17a95ab1c3b4bd3"],
12 | [dh+"3",dd+"310","2.0.0","July 2012",dk+"3/Devario/kobo3-update-2.0.0.zip","b412e390c62ca6b059f0e391a145e748"],
13 | [dh+"3",dd+"310","2.0.2","July 2012",dk+"3/Eel/kobo3-update-2.0.2.zip","0da32123598bca010a091434665e42c4"],
14 | [dh+"3",dd+"310","2.1.1","August 2012",dk+"3/rgreen/kobo3-update-2.1.1.zip","cef7aaf8a0309da8e38573479f058516"],
15 | [dh+"3",dd+"310","2.1.5","October 2012",dk+"3/brodeur/kobo-update-2.1.5.zip","9a826451c1114e88fca23cf55a75b0ef"],
16 | [dh+"4",dd+"320","2.1.5","October 2012",dk+"4/brodeur/kobo-update-2.1.5.zip","66e28ab31af8361e7223bfe48f926001"],
17 | [dh+"4",dd+"340","2.1.5","October 2012",dk+"4/brodeur/kobo-update-2.1.5.zip","66e28ab31af8361e7223bfe48f926001"],
18 | [dh+"3",dd+"310","2.2.0","October 2012",dk+"3/coffey/kobo-update-2.2.0.zip","1213a10058adaa564b4ca433a0ed45ae"],
19 | [dh+"4",dd+"320","2.2.0","October 2012",dk+"4/coffey/kobo-update-2.2.0.zip","69b35487aeffa216cbc3271da9af69b0"],
20 | [dh+"4",dd+"340","2.2.0","October 2012",dk+"4/coffey/kobo-update-2.2.0.zip","69b35487aeffa216cbc3271da9af69b0"],
21 | [dh+"4",dd+"320","2.2.1","November 2012",dk+"4/jordan/kobo-update-2.2.1.zip","8191f04229f3b062d67a9966d3fac23e"],
22 | [dh+"4",dd+"340","2.2.1","November 2012",dk+"4/jordan/kobo-update-2.2.1.zip","8191f04229f3b062d67a9966d3fac23e"],
23 | [dh+"3",dd+"310","2.5.0","April 2013",dk+"3/goleafsgo/kobo-update-2.5.0.zip","e8d8642d5e80ea00d8ab872f26f62e0a"],
24 | [dh+"4",dd+"320","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"],
25 | [dh+"4",dd+"330","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"],
26 | [dh+"4",dd+"340","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"],
27 | [dh+"4",dd+"350","2.5.0","April 2013",dk+"4/goleafsgo/kobo-update-2.5.0.zip","a45b60100965cf4e8a3516d902f79d5e"],
28 | [dh+"3",dd+"310","2.5.1","April 2013",dk+"3/leafs2013/kobo-update-2.5.1.zip","d8e84161eee20fa5763074915b7a0519"],
29 | [dh+"4",dd+"320","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"],
30 | [dh+"4",dd+"330","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"],
31 | [dh+"4",dd+"340","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"],
32 | [dh+"4",dd+"350","2.5.1","April 2013",dk+"4/leafs2013/kobo-update-2.5.1.zip","8df367adac9d93133fe10a35788f3052"],
33 | [dh+"3",dd+"310","2.5.2","May 2013",dk+"3/bleedblue/kobo-update-2.5.2.zip","f0f3399765cb5fff85abf05037b483f7"],
34 | [dh+"4",dd+"320","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"],
35 | [dh+"4",dd+"330","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"],
36 | [dh+"4",dd+"340","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"],
37 | [dh+"4",dd+"350","2.5.2","May 2013",dk+"4/bleedblue/kobo-update-2.5.2.zip","cbca75a21cbf92a5378ef456f3e9ec13"],
38 | [dh+"3",dd+"310","2.6.0","June 2013",dk+"3/rakutenrocks/kobo-update-2.6.0.zip","40fb35acf76394ee2333e196e13d9f54"],
39 | [dh+"4",dd+"320","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"],
40 | [dh+"4",dd+"330","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"],
41 | [dh+"4",dd+"340","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"],
42 | [dh+"4",dd+"350","2.6.0","June 2013",dk+"4/rakutenrocks/kobo-update-2.6.0.zip","7aa4a6fa48daaeb26c2397b46c9e6dbc"],
43 | [dh+"3",dd+"310","2.6.1","June 2013",dk+"3/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"],
44 | [dh+"4",dd+"320","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"],
45 | [dh+"4",dd+"330","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"],
46 | [dh+"4",dd+"340","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"],
47 | [dh+"4",dd+"350","2.6.1","June 2013",dk+"4/koborocks/kobo-update-2.6.1.zip","53b256343d0c77594503736b774c191b"],
48 | [dh+"4",dd+"320","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"],
49 | [dh+"4",dd+"330","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"],
50 | [dh+"4",dd+"340","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"],
51 | [dh+"4",dd+"350","2.6.2","September 2013",dk+"4/koborocks_v2/kobo-update-2.6.2.zip","2f8086d013deb26803ac833877606981"],
52 | [dh+"4",dd+"320","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"],
53 | [dh+"4",dd+"330","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"],
54 | [dh+"4",dd+"340","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"],
55 | [dh+"4",dd+"350","2.8.1","September 2013",dk+"4/kobothunder/kobo-update-2.8.1.zip","9eeedbbec1ea2b546a009ca16615d8d8"],
56 | [dh+"4",dd+"320","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"],
57 | [dh+"4",dd+"330","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"],
58 | [dh+"4",dd+"340","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"],
59 | [dh+"4",dd+"350","2.10.0","October 2013",dk+"4/libertyvillage/kobo-update-2.10.0.zip","638d5fb9461e3975c03688ba7cf067b7"],
60 | [dh+"5",dd+"360","2.10.0","October 2013",dk+"5/libertyvillage/kobo-update-2.10.0.zip","fb7b94c2f18c543da6129547601d0e80"],
61 | [dh+"3",dd+"310","3.0.0","November 2013",dk+"3/babak/kobo-update-3.0.0.zip","e05d86db020963d879fab73e34fb2943"],
62 | [dh+"4",dd+"320","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"],
63 | [dh+"4",dd+"330","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"],
64 | [dh+"4",dd+"340","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"],
65 | [dh+"4",dd+"350","3.0.0","November 2013",dk+"4/babak/kobo-update-3.0.0.zip","4f839ee16cb1286a5b67b214447277fa"],
66 | [dh+"4",dd+"320","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"],
67 | [dh+"4",dd+"330","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"],
68 | [dh+"4",dd+"340","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"],
69 | [dh+"4",dd+"350","3.1.0","December 2013",dk+"4/blackfriday2013/kobo-update-3.1.0.zip","441bd4dd6cea6195137d9d69b332a229"],
70 | [dh+"5",dd+"360","3.1.0","December 2013",dk+"5/blackfriday2013/kobo-update-3.1.0.zip","c6e140c5e4f6b08b958c79d306c9ef2c"],
71 | [dh+"4",dd+"320","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"],
72 | [dh+"4",dd+"330","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"],
73 | [dh+"4",dd+"340","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"],
74 | [dh+"4",dd+"350","3.1.1","December 2013",dk+"4/indigoblitz2013/kobo-update-3.1.1.zip","7794cda33b7eeeb51ade0170387d9046"],
75 | [dh+"5",dd+"360","3.1.1","December 2013",dk+"5/indigoblitz2013/kobo-update-3.1.1.zip","87020fcceccd621d583654ea28b63280"],
76 | [dh+"3",dd+"310","3.2.0","February 2014",dk+"3/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"],
77 | [dh+"4",dd+"320","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"],
78 | [dh+"4",dd+"330","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"],
79 | [dh+"4",dd+"340","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"],
80 | [dh+"4",dd+"350","3.2.0","February 2014",dk+"4/kobocares/kobo-update-3.2.0.zip","4cd4bd83fd57907a503c390f86c6295f"],
81 | [dh+"3",dd+"310","3.3.0","April 2014",dk+"3/easter2014/kobo-update-3.3.0.zip","f3db9b61a1a482c78a9f7cb2ed46d638"],
82 | [dh+"4",dd+"320","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"],
83 | [dh+"4",dd+"330","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"],
84 | [dh+"4",dd+"350","3.3.0","April 2014",dk+"4/easter2014/kobo-update-3.3.0.zip","72913148bc91beb0e3cc66347c55639f"],
85 | [dh+"5",dd+"360","3.3.0","April 2014",dk+"5/easter2014/kobo-update-3.3.0.zip","04d160d4ff0440d6d4f24f6f5d13c6e8"],
86 | [dh+"3",dd+"310","3.3.1","May 2014",dk+"3/pt-br-331/kobo-update-3.3.1.zip","0a195f5c47acd1e7dae9f2b3f6bb56f4"],
87 | [dh+"4",dd+"320","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"],
88 | [dh+"4",dd+"330","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"],
89 | [dh+"4",dd+"350","3.3.1","May 2014",dk+"4/pt-br-331/kobo-update-3.3.1.zip","4ffbd4333e2c741eb43a8dc7da3e70ef"],
90 | [dh+"5",dd+"360","3.3.1","May 2014",dk+"5/pt-br-331/kobo-update-3.3.1.zip","7da43191575b53e8c8416d2a230caedd"],
91 | [dh+"4",dd+"340","3.4.1","May 2014",dk+"4/miniforkids/kobo-update-3.4.1.zip","cd9e37301939c4b9c920674021ae3ca2"],
92 | [dh+"4",dd+"330","3.5.0","July 2014",dk+"4/fifa2014/kobo-update-3.5.0.zip","8baaa137ba89ae94de6a72de3f0ae138"],
93 | [dh+"4",dd+"350","3.5.0","July 2014",dk+"4/fifa2014/kobo-update-3.5.0.zip","8baaa137ba89ae94de6a72de3f0ae138"],
94 | [dh+"5",dd+"360","3.5.0","July 2014",dk+"5/fifa2014/kobo-update-3.5.0.zip","7776f80cb1fa440a070f0998082c6aca"],
95 | [dh+"5",dd+"370","3.7.0","August 2014",dk+"5/dahlialaunch/kobo-update-3.7.0.zip","dd8736a4345690673133fd2a0438684d"],
96 | [dh+"3",dd+"310","3.8.0","August 2014",dk+"3/intimeforlabourday2014/kobo-update-3.8.0.zip","cb02c7cc0a7962b802c4445970f9a28d"],
97 | [dh+"4",dd+"320","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"],
98 | [dh+"4",dd+"330","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"],
99 | [dh+"4",dd+"350","3.8.0","August 2014",dk+"4/intimeforlabourday2014/kobo-update-3.8.0.zip","7defcb3710fd30d74c5b5699340e7b9f"],
100 | [dh+"5",dd+"360","3.8.0","August 2014",dk+"5/intimeforlabourday2014/kobo-update-3.8.0.zip","5c18d0df087412268203ddc6c9391aa2"],
101 | [dh+"5",dd+"370","3.8.0","August 2013",dk+"5/intimeforlabourday2014/kobo-update-3.8.0.zip","5c18d0df087412268203ddc6c9391aa2"],
102 | [dh+"3",dd+"310","3.11.0","October 2014",dk+"3/mapleleafs2014/kobo-update-3.11.0.zip","826164a33a5d8a59ecf2d1b148d1acd0"],
103 | [dh+"4",dd+"320","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"],
104 | [dh+"4",dd+"330","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"],
105 | [dh+"4",dd+"350","3.11.0","October 2014",dk+"4/mapleleafs2014/kobo-update-3.11.0.zip","67d02edff7695a0da9659091e8a2256b"],
106 | [dh+"5",dd+"360","3.11.0","October 2014",dk+"5/mapleleafs2014/kobo-update-3.11.0.zip","aa15ca97076c2f3e785272d4a091c485"],
107 | [dh+"5",dd+"370","3.11.0","October 2014",dk+"5/mapleleafs2014/kobo-update-3.11.0.zip","aa15ca97076c2f3e785272d4a091c485"],
108 | [dh+"4",dd+"320","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"],
109 | [dh+"4",dd+"330","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"],
110 | [dh+"4",dd+"350","3.12.0","December 2014",dk+"4/wethenorth2014/kobo-update-3.12.0.zip","4b46562e2f66d578055627c4f5171640"],
111 | [dh+"5",dd+"360","3.12.0","December 2014",dk+"5/wethenorth2014/kobo-update-3.12.0.zip","49324da871bad3e3f8f5683f4751ce86"],
112 | [dh+"5",dd+"370","3.12.0","December 2014",dk+"5/wethenorth2014/kobo-update-3.12.0.zip","49324da871bad3e3f8f5683f4751ce86"],
113 | [dh+"4",dd+"320","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"],
114 | [dh+"4",dd+"330","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"],
115 | [dh+"4",dd+"350","3.12.1","January 2014",dk+"4/icecold2015/kobo-update-3.12.1.zip","5880b5753eb557995422472af85f2ece"],
116 | [dh+"5",dd+"360","3.12.1","January 2014",dk+"5/icecold2015/kobo-update-3.12.1.zip","6d3fecfc6a0a266d165c041b03171dab"],
117 | [dh+"5",dd+"370","3.12.1","January 2014",dk+"5/icecold2015/kobo-update-3.12.1.zip","6d3fecfc6a0a266d165c041b03171dab"],
118 | [dh+"6",dd+"371","3.14.0","April 2015",dk+"6/glohd-3140/kobo-update-3.14.0.zip","25e8abb3f2b63c9f23a08e5cff30bc5f"],
119 | [dh+"4",dd+"320","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"],
120 | [dh+"4",dd+"330","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"],
121 | [dh+"4",dd+"350","3.15.0","April 2015",dk+"4/april2015/kobo-update-3.15.0.zip","f03e5b2394163162537c3cc25abad9a1"],
122 | [dh+"5",dd+"360","3.15.0","April 2015",dk+"5/april2015/kobo-update-3.15.0.zip","4b09078f0afe73639bfa213991805591"],
123 | [dh+"5",dd+"370","3.15.0","April 2015",dk+"5/april2015/kobo-update-3.15.0.zip","4b09078f0afe73639bfa213991805591"],
124 | [dh+"6",dd+"371","3.15.0","April 2015",dk+"6/april2015/kobo-update-3.15.0.zip","9dfd87065cff6eaa57d11d84cca4af67"],
125 | [dh+"3",dd+"310","3.16.0","June 2015",dk+"3/hello_MR/kobo-update-3.16.0.zip","54f38d0fc8b73eb96e1e0c40ff77a6b9"],
126 | [dh+"4",dd+"320","3.16.0","June 2015",dk+"4/hello_MR/kobo-update-3.16.0.zip","f0fc854051a1b90df94f12ed97f9ca9c"],
127 | [dh+"6",dd+"371","3.16.0","June 2015",dk+"6/hello_MR/kobo-update-3.16.0.zip","db4c0ccf2746a298f66a13f833d863b6"],
128 | [dh+"3",dd+"310","3.17.0","August 2015",dk+"3/august2015/kobo-update-3.17.0.zip","b9eeebe548f3d5f1b50a2afcffa63918"],
129 | [dh+"4",dd+"320","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"],
130 | [dh+"4",dd+"330","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"],
131 | [dh+"4",dd+"340","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"],
132 | [dh+"4",dd+"350","3.17.0","August 2015",dk+"4/august2015/kobo-update-3.17.0.zip","07d129529ed805d4520006c717bf0bf0"],
133 | [dh+"5",dd+"360","3.17.0","August 2015",dk+"5/august2015/kobo-update-3.17.0.zip","4cb8baf9d02bb691a3446eebc6fbe134"],
134 | [dh+"5",dd+"370","3.17.0","August 2015",dk+"5/august2015/kobo-update-3.17.0.zip","4cb8baf9d02bb691a3446eebc6fbe134"],
135 | [dh+"6",dd+"371","3.17.0","August 2015",dk+"6/august2015/kobo-update-3.17.0.zip","9de1b69291ac6718465b6af0064332b6"],
136 | [dh+"3",dd+"310","3.17.3","August 2015",dk+"3/3173/kobo-update-3.17.3.zip","4c7ef9437513e54b6c67a5e7ab707e5c"],
137 | [dh+"4",dd+"320","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"],
138 | [dh+"4",dd+"330","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"],
139 | [dh+"4",dd+"340","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"],
140 | [dh+"4",dd+"350","3.17.3","August 2015",dk+"4/3173/kobo-update-3.17.3.zip","eb556ef3dd79a1774858a1ff43d94eb8"],
141 | [dh+"5",dd+"360","3.17.3","August 2015",dk+"5/3173/kobo-update-3.17.3.zip","798a7f7a1217c6e72706844c2a04e9c7"],
142 | [dh+"5",dd+"370","3.17.3","August 2015",dk+"5/3173/kobo-update-3.17.3.zip","798a7f7a1217c6e72706844c2a04e9c7"],
143 | [dh+"6",dd+"371","3.17.3","August 2015",dk+"6/3173/kobo-update-3.17.3.zip","eba9f7d3c5680b1adc46b6623b3d2317"],
144 | [dh+"3",dd+"310","3.18.0","September 2015",dk+"3/september2015/kobo-update-3.18.0.zip","ffde776605df710a152d3abbde8b6387"],
145 | [dh+"4",dd+"320","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"],
146 | [dh+"4",dd+"330","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"],
147 | [dh+"4",dd+"340","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"],
148 | [dh+"4",dd+"350","3.18.0","September 2015",dk+"4/september2015/kobo-update-3.18.0.zip","50ee011edc3d65d9db44397068740aaf"],
149 | [dh+"5",dd+"360","3.18.0","September 2015",dk+"5/september2015/kobo-update-3.18.0.zip","bf24a8b5e5bd2447c850c97b12452133"],
150 | [dh+"5",dd+"370","3.18.0","September 2015",dk+"5/september2015/kobo-update-3.18.0.zip","bf24a8b5e5bd2447c850c97b12452133"],
151 | [dh+"6",dd+"371","3.18.0","September 2015",dk+"6/september2015/kobo-update-3.18.0.zip","932eb56cab9ffd4c21ff77fb7eb1ca4a"],
152 | [dh+"6",dd+"372","3.18.0","September 2015",dk+"6/september2015/kobo-update-3.18.0.zip","932eb56cab9ffd4c21ff77fb7eb1ca4a"],
153 | [dh+"3",dd+"310","3.19.5613","December 2015",dk+"3/december2015/kobo-update-3.19.5613.zip","e4baae4cae994c786ebe91b00b0a98ca"],
154 | [dh+"4",dd+"320","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"],
155 | [dh+"4",dd+"330","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"],
156 | [dh+"4",dd+"340","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"],
157 | [dh+"4",dd+"350","3.19.5613","December 2015",dk+"4/december2015/kobo-update-3.19.5613.zip","909030121718aa7e44afb1632a9c7062"],
158 | [dh+"5",dd+"360","3.19.5613","December 2015",dk+"5/december2015/kobo-update-3.19.5613.zip","74517df68961aeb57408cf8e693d5f63"],
159 | [dh+"5",dd+"370","3.19.5613","December 2015",dk+"5/december2015/kobo-update-3.19.5613.zip","74517df68961aeb57408cf8e693d5f63"],
160 | [dh+"6",dd+"371","3.19.5613","December 2015",dk+"6/december2015/kobo-update-3.19.5613.zip","555e5d0fc1122ca6ec3775e116833933"],
161 | [dh+"6",dd+"372","3.19.5613","December 2015",dk+"6/december2015/kobo-update-3.19.5613.zip","555e5d0fc1122ca6ec3775e116833933"],
162 | [dh+"3",dd+"310","3.19.5761","December 2015",dk+"3/january2016/kobo-update-3.19.5761.zip","816a23f62c95edd1431bdc800954aef2"],
163 | [dh+"4",dd+"320","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"],
164 | [dh+"4",dd+"330","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"],
165 | [dh+"4",dd+"340","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"],
166 | [dh+"4",dd+"350","3.19.5761","December 2015",dk+"4/january2016/kobo-update-3.19.5761.zip","3102ab0178d0d6a7e56a6a180ce3f740"],
167 | [dh+"5",dd+"360","3.19.5761","December 2015",dk+"5/january2016/kobo-update-3.19.5761.zip","7db74f0026caf1fb10293370ac0d4202"],
168 | [dh+"5",dd+"370","3.19.5761","December 2015",dk+"5/january2016/kobo-update-3.19.5761.zip","7db74f0026caf1fb10293370ac0d4202"],
169 | [dh+"6",dd+"371","3.19.5761","December 2015",dk+"6/january2016/kobo-update-3.19.5761.zip","5a62affb167039bdffac3b4f5f07e777"],
170 | [dh+"6",dd+"372","3.19.5761","December 2015",dk+"6/january2016/kobo-update-3.19.5761.zip","5a62affb167039bdffac3b4f5f07e777"],
171 | [dh+"4",dd+"340","3.19.5761-s","December 2015",dk+"4/january2016/kobo-update-3.19.5761-s.zip","bf51c1e8e1033f9694079489a3436e52"],
172 | [dh+"6",dd+"373","4.0.7523","September 2016",dk+"6/September2016/kobo-update-4.0.7523.zip","b9c6a5ee929283a1c447f654b02f8f80"],
173 | [dh+"6",dd+"375","4.0.7523","September 2016",dk+"6/September2016/kobo-update-4.0.7523.zip","b9c6a5ee929283a1c447f654b02f8f80"],
174 | [dh+"6",dd+"373","4.1.7729","November 2016",dk+"6/October2016/kobo-update-4.1.7729.zip","4db24597799e75909a0f9dab7d626478"],
175 | [dh+"6",dd+"375","4.1.7729","November 2016",dk+"6/October2016/kobo-update-4.1.7729.zip","4db24597799e75909a0f9dab7d626478"],
176 | [dh+"6",dd+"373","4.2.8110","December 2016",dk+"6/December2016/kobo-update-4.2.8110.zip","043a224c6f3d71117441fc1c245d9cef"],
177 | [dh+"6",dd+"375","4.2.8110","December 2016",dk+"6/December2016/kobo-update-4.2.8110.zip","043a224c6f3d71117441fc1c245d9cef"],
178 | [dh+"6",dd+"373","4.2.8283","January 2017",dk+"6/Jan2017/kobo-update-4.2.8283.zip","dca409a3f4d4424a06b565be90e44b1a"],
179 | [dh+"6",dd+"375","4.2.8283","January 2017",dk+"6/Jan2017/kobo-update-4.2.8283.zip","dca409a3f4d4424a06b565be90e44b1a"],
180 | [dh+"3",dd+"310","4.2.8432","February 2017",dk+"3/Jan2017/kobo-update-4.2.8432.zip","5da02de981231bfa3120507087a6d28e"],
181 | [dh+"4",dd+"320","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"],
182 | [dh+"4",dd+"330","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"],
183 | [dh+"4",dd+"350","4.2.8432","February 2017",dk+"4/Jan2017/kobo-update-4.2.8432.zip","caf6d057aab972ab7be12cbf450eacbf"],
184 | [dh+"5",dd+"360","4.2.8432","February 2017",dk+"5/Jan2017/kobo-update-4.2.8432.zip","db520d94347d5b0af45f5216db21ce0d"],
185 | [dh+"5",dd+"370","4.2.8432","February 2017",dk+"5/Jan2017/kobo-update-4.2.8432.zip","db520d94347d5b0af45f5216db21ce0d"],
186 | [dh+"6",dd+"371","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"],
187 | [dh+"6",dd+"372","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"],
188 | [dh+"6",dd+"373","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"],
189 | [dh+"6",dd+"375","4.2.8432","February 2017",dk+"6/Jan2017/kobo-update-4.2.8432.zip","f9371f4550df1effa0ed821c0ecf7a9a"],
190 | [dh+"3",dd+"310","4.3.8842","February 2017",dk+"3/Feb2017/kobo-update-4.3.8842.zip","5f2b1544eb106f6402f9a0a075126509"],
191 | [dh+"4",dd+"320","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"],
192 | [dh+"4",dd+"330","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"],
193 | [dh+"4",dd+"350","4.3.8842","February 2017",dk+"4/Feb2017/kobo-update-4.3.8842.zip","f0bddbd531613ab7fa9509bce3caabea"],
194 | [dh+"5",dd+"360","4.3.8842","February 2017",dk+"5/Feb2017/kobo-update-4.3.8842.zip","1b38e8e237fcb3d1266784b4b22ecf46"],
195 | [dh+"5",dd+"370","4.3.8842","February 2017",dk+"5/Feb2017/kobo-update-4.3.8842.zip","1b38e8e237fcb3d1266784b4b22ecf46"],
196 | [dh+"6",dd+"371","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"],
197 | [dh+"6",dd+"372","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"],
198 | [dh+"6",dd+"373","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"],
199 | [dh+"6",dd+"375","4.3.8842","February 2017",dk+"6/Feb2017/kobo-update-4.3.8842.zip","55d09f6ca7c38452312c1e507204c0b4"],
200 | [dh+"3",dd+"310","4.3.8871","March 2017",dk+"3/Feb2017/kobo-update-4.3.8871.zip","b177ab6201d9cc61f659b031627fc2bc"],
201 | [dh+"4",dd+"320","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"],
202 | [dh+"4",dd+"330","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"],
203 | [dh+"4",dd+"350","4.3.8871","March 2017",dk+"4/Feb2017/kobo-update-4.3.8871.zip","79765350f2011bf5f731e5d24060cd30"],
204 | [dh+"5",dd+"360","4.3.8871","March 2017",dk+"5/Feb2017/kobo-update-4.3.8871.zip","8e57b82d62904d878a0e494009ec92d1"],
205 | [dh+"5",dd+"370","4.3.8871","March 2017",dk+"5/Feb2017/kobo-update-4.3.8871.zip","8e57b82d62904d878a0e494009ec92d1"],
206 | [dh+"6",dd+"371","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"],
207 | [dh+"6",dd+"372","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"],
208 | [dh+"6",dd+"373","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"],
209 | [dh+"6",dd+"375","4.3.8871","March 2017",dk+"6/Feb2017/kobo-update-4.3.8871.zip","3cc6fdb6a00bc55f795fc8cda23c6877"],
210 | [dh+"3",dd+"310","4.3.8929","March 2017",dk+"3/Mar2017/kobo-update-4.3.8929.zip","f77aca39d7146cbb14adcc50a6104839"],
211 | [dh+"4",dd+"320","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"],
212 | [dh+"4",dd+"330","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"],
213 | [dh+"4",dd+"350","4.3.8929","March 2017",dk+"4/Mar2017/kobo-update-4.3.8929.zip","b90374b3dbf4b5b72c26ca3b058d89d7"],
214 | [dh+"5",dd+"360","4.3.8929","March 2017",dk+"5/Mar2017/kobo-update-4.3.8929.zip","6b6f55caae2ebbf374da75194e810f36"],
215 | [dh+"5",dd+"370","4.3.8929","March 2017",dk+"5/Mar2017/kobo-update-4.3.8929.zip","6b6f55caae2ebbf374da75194e810f36"],
216 | [dh+"6",dd+"371","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"],
217 | [dh+"6",dd+"372","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"],
218 | [dh+"6",dd+"373","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"],
219 | [dh+"6",dd+"375","4.3.8929","March 2017",dk+"6/Mar2017/kobo-update-4.3.8929.zip","63ac3e56b84ff6333ec6dfb7a2bce6aa"],
220 | [dh+"3",dd+"310","4.3.8945","March 2017",dk+"3/Mar2017/kobo-update-4.3.8945.zip","b4617f0f021ee7a69f2a236ff5ab060b"],
221 | [dh+"4",dd+"320","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"],
222 | [dh+"4",dd+"330","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"],
223 | [dh+"4",dd+"350","4.3.8945","March 2017",dk+"4/Mar2017/kobo-update-4.3.8945.zip","06d53f2c0fe424a064a4caeedbf96070"],
224 | [dh+"5",dd+"360","4.3.8945","March 2017",dk+"5/Mar2017/kobo-update-4.3.8945.zip","ba3ed04ea1b3ae6626c4be5a4cada14d"],
225 | [dh+"5",dd+"370","4.3.8945","March 2017",dk+"5/Mar2017/kobo-update-4.3.8945.zip","ba3ed04ea1b3ae6626c4be5a4cada14d"],
226 | [dh+"6",dd+"371","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"],
227 | [dh+"6",dd+"372","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"],
228 | [dh+"6",dd+"373","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"],
229 | [dh+"6",dd+"375","4.3.8945","March 2017",dk+"6/Mar2017/kobo-update-4.3.8945.zip","4f3e090165273628c30212373d0707cb"],
230 | [dh+"3",dd+"310","4.3.8966","March 2017",dk+"3/Mar2017/kobo-update-4.3.8966.zip","5c0454ae7d8f520c9fc5dfd0eb10b165"],
231 | [dh+"4",dd+"320","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"],
232 | [dh+"4",dd+"330","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"],
233 | [dh+"4",dd+"350","4.3.8966","March 2017",dk+"4/Mar2017/kobo-update-4.3.8966.zip","47ba5a9ccfb5fb8010685e49120375e5"],
234 | [dh+"5",dd+"360","4.3.8966","March 2017",dk+"5/Mar2017/kobo-update-4.3.8966.zip","6ef08c80a3794df066b1a73cd8ca9c5a"],
235 | [dh+"5",dd+"370","4.3.8966","March 2017",dk+"5/Mar2017/kobo-update-4.3.8966.zip","6ef08c80a3794df066b1a73cd8ca9c5a"],
236 | [dh+"6",dd+"371","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"],
237 | [dh+"6",dd+"372","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"],
238 | [dh+"6",dd+"373","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"],
239 | [dh+"6",dd+"375","4.3.8966","March 2017",dk+"6/Mar2017/kobo-update-4.3.8966.zip","64df27d42273aed05f53bda51004d8cf"],
240 | [dh+"3",dd+"310","4.3.9084","April 2017",dk+"3/rakuten-439084/kobo-update-4.3.9084.zip","d4c36a7e00f4ef8cb1a10d0af2953f7c"],
241 | [dh+"4",dd+"320","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"],
242 | [dh+"4",dd+"330","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"],
243 | [dh+"4",dd+"350","4.3.9084","April 2017",dk+"4/rakuten-439084/kobo-update-4.3.9084.zip","2087f5a4d7fdc4b761bb48e1006d3320"],
244 | [dh+"5",dd+"360","4.3.9084","April 2017",dk+"5/rakuten-439084/kobo-update-4.3.9084.zip","dccaff3dc8ac4350799c13c7f2c8dc20"],
245 | [dh+"5",dd+"370","4.3.9084","April 2017",dk+"5/rakuten-439084/kobo-update-4.3.9084.zip","dccaff3dc8ac4350799c13c7f2c8dc20"],
246 | [dh+"6",dd+"371","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"],
247 | [dh+"6",dd+"372","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"],
248 | [dh+"6",dd+"373","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"],
249 | [dh+"6",dd+"375","4.3.9084","April 2017",dk+"6/rakuten-439084/kobo-update-4.3.9084.zip","5e8e06d8186a800926dc1911f303be77"],
250 | [dh+"6",dd+"373","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"],
251 | [dh+"6",dd+"374","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"],
252 | [dh+"6",dd+"375","4.3.9349","May 2017",dk+"6/May2017/AuraONE_kobo-update-4.4.9349.zip","b0208d75e861176f504df0a1ce2ddbf2"],
253 | [dh+"3",dd+"310","4.4.9298","May 2017",dk+"3/May2017/kobo-update-4.4.9298.zip","6088179f535bd1f14e7b9ef415959ec4"],
254 | [dh+"4",dd+"320","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"],
255 | [dh+"4",dd+"330","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"],
256 | [dh+"4",dd+"350","4.4.9298","May 2017",dk+"4/May2017/kobo-update-4.4.9298.zip","283f595fd4bda3634f396c3cbeb7b100"],
257 | [dh+"5",dd+"360","4.4.9298","May 2017",dk+"5/May2017/kobo-update-4.4.9298.zip","3add0b388aa0c4cfb56b79006830f9ff"],
258 | [dh+"5",dd+"370","4.4.9298","May 2017",dk+"5/May2017/kobo-update-4.4.9298.zip","3add0b388aa0c4cfb56b79006830f9ff"],
259 | [dh+"6",dd+"371","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"],
260 | [dh+"6",dd+"372","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"],
261 | [dh+"6",dd+"373","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"],
262 | [dh+"6",dd+"374","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"],
263 | [dh+"6",dd+"375","4.4.9298","May 2017",dk+"6/May2017/kobo-update-4.4.9298.zip","3770e65d4e5eae176a98b5152c0ddb83"],
264 | [dh+"3",dd+"310","4.5.9587","July 2017",dk+"3/July2017/kobo-update-4.5.9587.zip","5577950bfd6445c2593437f950564f5d"],
265 | [dh+"4",dd+"320","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"],
266 | [dh+"4",dd+"330","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"],
267 | [dh+"4",dd+"350","4.5.9587","July 2017",dk+"4/July2017/kobo-update-4.5.9587.zip","8c18a54d80afa07efe6907dcc9caf7e8"],
268 | [dh+"5",dd+"360","4.5.9587","July 2017",dk+"5/July2017/kobo-update-4.5.9587.zip","6ce687f7727c2a4a7b41adb460f14ba4"],
269 | [dh+"5",dd+"370","4.5.9587","July 2017",dk+"5/July2017/kobo-update-4.5.9587.zip","6ce687f7727c2a4a7b41adb460f14ba4"],
270 | [dh+"6",dd+"371","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"],
271 | [dh+"6",dd+"372","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"],
272 | [dh+"6",dd+"373","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"],
273 | [dh+"6",dd+"374","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"],
274 | [dh+"6",dd+"375","4.5.9587","July 2017",dk+"6/July2017/kobo-update-4.5.9587.zip","880a61e79d1b4a3ad4b18c1a078ee452"],
275 | [dh+"3",dd+"310","4.6.9960","October 2017",dk+"3/July2017/kobo-update-4.6.9960.zip","8d3bf9ad6fc6703ee8d83f17b070a766"],
276 | [dh+"4",dd+"320","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"],
277 | [dh+"4",dd+"330","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"],
278 | [dh+"4",dd+"350","4.6.9960","October 2017",dk+"4/July2017/kobo-update-4.6.9960.zip","269b28a9246d67f48009c698dd4b315e"],
279 | [dh+"5",dd+"360","4.6.9960","October 2017",dk+"5/July2017/kobo-update-4.6.9960.zip","68a43ea625c8adcc11e658c5d8b3a6b7"],
280 | [dh+"5",dd+"370","4.6.9960","October 2017",dk+"5/July2017/kobo-update-4.6.9960.zip","68a43ea625c8adcc11e658c5d8b3a6b7"],
281 | [dh+"6",dd+"371","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"],
282 | [dh+"6",dd+"372","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"],
283 | [dh+"6",dd+"373","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"],
284 | [dh+"6",dd+"374","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"],
285 | [dh+"6",dd+"375","4.6.9960","October 2017",dk+"6/July2017/kobo-update-4.6.9960.zip","3069999d36da6e1ce091c9bbccbcc066"],
286 | [dh+"3",dd+"310","4.6.9995","October 2017",dk+"3/Oct2017/kobo-update-4.6.9995.zip","40575959beaa24104913f251a3146d16"],
287 | [dh+"4",dd+"320","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"],
288 | [dh+"4",dd+"330","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"],
289 | [dh+"4",dd+"350","4.6.9995","October 2017",dk+"4/Oct2017/kobo-update-4.6.9995.zip","e21665a4e346fda4d6d52a100182bbc3"],
290 | [dh+"5",dd+"360","4.6.9995","October 2017",dk+"5/Oct2017/kobo-update-4.6.9995.zip","033d76bccb8daee6fdf8a822d6ddb3ae"],
291 | [dh+"5",dd+"370","4.6.9995","October 2017",dk+"5/Oct2017/kobo-update-4.6.9995.zip","033d76bccb8daee6fdf8a822d6ddb3ae"],
292 | [dh+"6",dd+"371","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"],
293 | [dh+"6",dd+"372","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"],
294 | [dh+"6",dd+"373","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"],
295 | [dh+"6",dd+"375","4.6.9995","October 2017",dk+"6/Oct2017/kobo-update-4.6.9995.zip","79973c50b95b2e4c34d2e5ea600b3b04"],
296 | [dh+"4",dd+"330","4.7.10075","November 2017",dk+"4/rakuten-4.6/kobo-update-4.6.10075.zip","c1aa87bf7ecbaebb065b6d67e54714c8"],
297 | [dh+"4",dd+"350","4.7.10075","November 2017",dk+"4/rakuten-4.6/kobo-update-4.6.10075.zip","c1aa87bf7ecbaebb065b6d67e54714c8"],
298 | [dh+"5",dd+"360","4.7.10075","November 2017",dk+"5/rakuten-4.6/kobo-update-4.6.10075.zip","384bb9392b5abbafc3b9649ae5d73888"],
299 | [dh+"5",dd+"370","4.7.10075","November 2017",dk+"5/rakuten-4.6/kobo-update-4.6.10075.zip","384bb9392b5abbafc3b9649ae5d73888"],
300 | [dh+"6",dd+"371","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"],
301 | [dh+"6",dd+"372","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"],
302 | [dh+"6",dd+"373","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"],
303 | [dh+"6",dd+"374","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"],
304 | [dh+"6",dd+"375","4.7.10075","November 2017",dk+"6/rakuten-4.6/kobo-update-4.6.10075.zip","377dbc2df2c74b5529f9160091561032"],
305 | [dh+"6",dd+"381","4.7.10364","December 2017",dk+"6/Dec2017/kobo-limitededitionupdate-4.7.10364.zip","3f8cad1167722637985241adc45d440f"],
306 | [dh+"4",dd+"330","4.7.10413","December 2017",dk+"4/Dec2017/kobo-update-4.7.10413.zip","20abd3426b91438a5b46394e2a405463"],
307 | [dh+"4",dd+"350","4.7.10413","December 2017",dk+"4/Dec2017/kobo-update-4.7.10413.zip","20abd3426b91438a5b46394e2a405463"],
308 | [dh+"5",dd+"360","4.7.10413","December 2017",dk+"5/Dec2017/kobo-update-4.7.10413.zip","f537ba2e5034cc4571f68db0c69f937e"],
309 | [dh+"5",dd+"370","4.7.10413","December 2017",dk+"5/Dec2017/kobo-update-4.7.10413.zip","f537ba2e5034cc4571f68db0c69f937e"],
310 | [dh+"6",dd+"371","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"],
311 | [dh+"6",dd+"372","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"],
312 | [dh+"6",dd+"373","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"],
313 | [dh+"6",dd+"374","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"],
314 | [dh+"6",dd+"375","4.7.10413","December 2017",dk+"6/Dec2017/kobo-update-4.7.10413.zip","34e66c14b227ea3c5161617b3ecfe238"],
315 | [dh+"3",dd+"310","4.8.10956","April 2018",dk+"3/April2018/kobo-update-4.8.10956.zip","78581f9624287f74651be3de3e345faf"],
316 | [dh+"4",dd+"320","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"],
317 | [dh+"4",dd+"330","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"],
318 | [dh+"4",dd+"350","4.8.10956","April 2018",dk+"4/April2018/kobo-update-4.8.10956.zip","cddb05ef049894ed9fab5d508afdb803"],
319 | [dh+"5",dd+"360","4.8.10956","April 2018",dk+"5/April2018/kobo-update-4.8.10956.zip","afbc2cca371b6415e37bb06a6dfde5f2"],
320 | [dh+"5",dd+"370","4.8.10956","April 2018",dk+"5/April2018/kobo-update-4.8.10956.zip","afbc2cca371b6415e37bb06a6dfde5f2"],
321 | [dh+"6",dd+"371","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
322 | [dh+"6",dd+"372","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
323 | [dh+"6",dd+"373","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
324 | [dh+"6",dd+"374","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
325 | [dh+"6",dd+"375","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
326 | [dh+"7",dd+"378","4.8.10956","April 2018",dk+"7/April2018/kobo-update-4.8.zip","2391f2467ced21805c8ccd4c656e572b"],
327 | [dh+"7",dd+"379","4.8.10956","April 2018",dk+"7/April2018/kobo-update-4.8.zip","2391f2467ced21805c8ccd4c656e572b"],
328 | [dh+"6",dd+"381","4.8.10956","April 2018",dk+"6/April2018/kobo-update-4.8.10956.zip","8edc835048f95be866cf81bd2cc79fd8"],
329 | [dh+"3",dd+"310","4.8.11073","May 2018",dk+"3/May2018/kobo-update-4.8.11073.zip","9bb491fe03b80fa8f87a71290e8158c4"],
330 | [dh+"4",dd+"320","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"],
331 | [dh+"4",dd+"330","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"],
332 | [dh+"4",dd+"350","4.8.11073","May 2018",dk+"4/May2018/kobo-update-4.8.11073.zip","a5237d07abf40df4deaf5b76857dfa1b"],
333 | [dh+"5",dd+"360","4.8.11073","May 2018",dk+"5/May2018/kobo-update-4.8.11073.zip","43202cc20b30be263224fc3bff111df1"],
334 | [dh+"5",dd+"370","4.8.11073","May 2018",dk+"5/May2018/kobo-update-4.8.11073.zip","43202cc20b30be263224fc3bff111df1"],
335 | [dh+"6",dd+"371","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
336 | [dh+"6",dd+"372","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
337 | [dh+"6",dd+"373","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
338 | [dh+"6",dd+"374","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
339 | [dh+"6",dd+"375","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
340 | [dh+"7",dd+"378","4.8.11073","May 2018",dk+"7/May2018/kobo-update-4.8.11073.zip","7ba11e60b0728c35c6bc606351b87ac2"],
341 | [dh+"7",dd+"379","4.8.11073","May 2018",dk+"7/May2018/kobo-update-4.8.11073.zip","7ba11e60b0728c35c6bc606351b87ac2"],
342 | [dh+"6",dd+"381","4.8.11073","May 2018",dk+"6/May2018/kobo-update-4.8.11073.zip","0c356521265a30dc03b1e7f83f50f259"],
343 | [dh+"7",dd+"376","4.8.11090","May 2018",dk+"7/May2018/kobo-update-4.8.zip","9a26a8477f62f7387ce327b1d8bf5e45"],
344 | [dh+"6",dd+"373","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"],
345 | [dh+"6",dd+"374","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"],
346 | [dh+"6",dd+"375","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"],
347 | [dh+"7",dd+"376","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"],
348 | [dh+"7",dd+"378","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"],
349 | [dh+"7",dd+"379","4.9.11311","June 2018",dk+"7/May2018/kobo-update-4.9.11311.zip","67c2345a1cddcb5f6a06ed561e836e51"],
350 | [dh+"6",dd+"381","4.9.11311","June 2018",dk+"6/May2018/kobo-update-4.9.11311.zip","7c82a7756663919d2fbba466330ee7c9"],
351 | [dh+"4",dd+"320","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"],
352 | [dh+"4",dd+"330","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"],
353 | [dh+"4",dd+"350","4.9.11314","June 2018",dk+"4/May2018/kobo-update-4.9.11311.zip","b6617a8fe4a310eb3f303494bbe7402b"],
354 | [dh+"5",dd+"360","4.9.11314","June 2018",dk+"5/May2018/kobo-update-4.9.11311.zip","2b1f7ec52a7cbde986e22f7509aa3583"],
355 | [dh+"5",dd+"370","4.9.11314","June 2018",dk+"5/May2018/kobo-update-4.9.11311.zip","2b1f7ec52a7cbde986e22f7509aa3583"],
356 | [dh+"6",dd+"373","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"],
357 | [dh+"6",dd+"374","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"],
358 | [dh+"6",dd+"375","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"],
359 | [dh+"7",dd+"376","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"],
360 | [dh+"7",dd+"378","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"],
361 | [dh+"7",dd+"379","4.10.11655","August 2018",dk+"7/Aug2018/kobo-update-4.10.11655.zip","30a2dc31cc07579e926af3cc4d2eecf9"],
362 | [dh+"6",dd+"381","4.10.11655","August 2018",dk+"6/Aug2018/kobo-update-4.10.11655.zip","064ecb82219eb25176e95884c8e6c80d"],
363 | [dh+"7",dd+"380","4.11.11911","October 2018",dk+"7/Oct2018/kobo-update-4.11.11911.zip","05b970c838d149e452f1cbc218e3c946"],
364 | [dh+"7",dd+"380","4.11.11976","November 2018",dk+"7/Nov2018/kobo-update-4.11.11976.zip","dbe31e3a9ea7c25a0ca13fedf612401f"],
365 | [dh+"7",dd+"380","4.11.11980","November 2018",dk+"7/Nov2018/kobo-update-4.11.11980.zip","dbe31e3a9ea7c25a0ca13fedf612401f"],
366 | [dh+"7",dd+"380","4.11.11982","November 2018",dk+"7/Nov2018/kobo-update-4.11.11982.zip","473c1c3663ce6b8c626d3039728608a4"],
367 | [dh+"7",dd+"380","4.11.12019","November 2018",da+"7/Nov2018/kobo-update-4.11.12019.zip","dbe31e3a9ea7c25a0ca13fedf612401f"],
368 | [dh+"3",dd+"310","4.12.12111","December 2018",da+"3/Dec2018/kobo-update-4.12.12111.zip","7799734b00a587213ea8cc59a57a6e85"],
369 | [dh+"4",dd+"320","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"],
370 | [dh+"4",dd+"330","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"],
371 | [dh+"4",dd+"350","4.12.12111","December 2018",da+"4/Dec2018/kobo-update-4.12.12111.zip","d574b86b12dcb44a2c424043283f129f"],
372 | [dh+"5",dd+"360","4.12.12111","December 2018",da+"5/Dec2018/kobo-update-4.12.12111.zip","bcdf3cd8c16efc31771c981de4a36ffd"],
373 | [dh+"5",dd+"370","4.12.12111","December 2018",da+"5/Dec2018/kobo-update-4.12.12111.zip","bcdf3cd8c16efc31771c981de4a36ffd"],
374 | [dh+"6",dd+"371","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
375 | [dh+"6",dd+"372","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
376 | [dh+"6",dd+"373","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
377 | [dh+"6",dd+"374","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
378 | [dh+"6",dd+"375","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
379 | [dh+"7",dd+"376","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"],
380 | [dh+"7",dd+"378","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"],
381 | [dh+"7",dd+"379","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"],
382 | [dh+"7",dd+"380","4.12.12111","December 2018",da+"7/Dec2018/kobo-update-4.12.12111.zip","68a1991fa55b1d9fe49cb36bf834ba54"],
383 | [dh+"6",dd+"381","4.12.12111","December 2018",da+"6/Dec2018/kobo-update-4.12.12111.zip","66f6b8d7f33b327d60297d1dd10e7dd2"],
384 | [dh+"3",dd+"310","4.13.12638","April 2019",da+"3/Apr2019/kobo-update-4.13.12638.zip","a11900c3b61a7c51af8bb6684592d244"],
385 | [dh+"4",dd+"320","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"],
386 | [dh+"4",dd+"330","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"],
387 | [dh+"4",dd+"350","4.13.12638","April 2019",da+"4/Apr2019/kobo-update-4.13.12638.zip","450f508b2db71f53fdbd4f51c9210ff7"],
388 | [dh+"5",dd+"360","4.13.12638","April 2019",da+"5/Apr2019/kobo-update-4.13.12638.zip","5380c4e5461c5f93ba20f4da41013ca7"],
389 | [dh+"5",dd+"370","4.13.12638","April 2019",da+"5/Apr2019/kobo-update-4.13.12638.zip","5380c4e5461c5f93ba20f4da41013ca7"],
390 | [dh+"6",dd+"371","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
391 | [dh+"6",dd+"372","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
392 | [dh+"6",dd+"373","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
393 | [dh+"6",dd+"374","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
394 | [dh+"6",dd+"375","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
395 | [dh+"7",dd+"376","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"],
396 | [dh+"7",dd+"378","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"],
397 | [dh+"7",dd+"379","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"],
398 | [dh+"7",dd+"380","4.13.12638","April 2019",da+"7/Apr2019/kobo-update-4.13.12638.zip","5a509e3bd0c4062abb2fee8f29ad5f97"],
399 | [dh+"6",dd+"381","4.13.12638","April 2019",da+"6/Apr2019/kobo-update-4.13.12638.zip","5288b2fc4a9175d81cebaa0728efbb3f"],
400 | [dh+"3",dd+"310","4.13.12638-s","April 2019",da+"3/Apr2019/kobo-update-4.13.12638-s.zip","3ce5e37482ea4166191f101b47996ed2"],
401 | [dh+"4",dd+"320","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"],
402 | [dh+"4",dd+"330","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"],
403 | [dh+"4",dd+"350","4.13.12638-s","April 2019",da+"4/Apr2019/kobo-update-4.13.12638-s.zip","4c59d2ab6452450d49ab8ebd76c8eb6e"],
404 | [dh+"5",dd+"360","4.13.12638-s","April 2019",da+"5/Apr2019/kobo-update-4.13.12638-s.zip","f58f1ffbf01d1526e7f2d8e4cc553307"],
405 | [dh+"5",dd+"370","4.13.12638-s","April 2019",da+"5/Apr2019/kobo-update-4.13.12638-s.zip","f58f1ffbf01d1526e7f2d8e4cc553307"],
406 | [dh+"6",dd+"371","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
407 | [dh+"6",dd+"372","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
408 | [dh+"6",dd+"373","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
409 | [dh+"6",dd+"374","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
410 | [dh+"6",dd+"375","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
411 | [dh+"7",dd+"376","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"],
412 | [dh+"7",dd+"378","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"],
413 | [dh+"7",dd+"379","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"],
414 | [dh+"7",dd+"380","4.13.12638-s","April 2019",da+"7/Apr2019/kobo-update-4.13.12638-s.zip","696efd9c2976e8e50921a42354ba0a99"],
415 | [dh+"6",dd+"381","4.13.12638-s","April 2019",da+"6/Apr2019/kobo-update-4.13.12638-s.zip","0c3c751cb48cedcbf75d3555daf75fcb"],
416 | [dh+"3",dd+"310","4.14.12777","May 2019",da+"3/May2019/kobo-update-4.14.12777.zip","9f019a31e2df4112a47ee7ea57fc1b19"],
417 | [dh+"4",dd+"320","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"],
418 | [dh+"4",dd+"330","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"],
419 | [dh+"4",dd+"350","4.14.12777","May 2019",da+"4/May2019/kobo-update-4.14.12777.zip","a620c3ba63ed8e952864f2e17b8eeafb"],
420 | [dh+"5",dd+"360","4.14.12777","May 2019",da+"5/May2019/kobo-update-4.14.12777.zip","64c99fc690affc8301b760d2092f6b57"],
421 | [dh+"5",dd+"370","4.14.12777","May 2019",da+"5/May2019/kobo-update-4.14.12777.zip","64c99fc690affc8301b760d2092f6b57"],
422 | [dh+"6",dd+"371","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
423 | [dh+"6",dd+"372","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
424 | [dh+"6",dd+"373","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
425 | [dh+"6",dd+"374","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
426 | [dh+"6",dd+"375","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
427 | [dh+"7",dd+"376","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"],
428 | [dh+"7",dd+"378","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"],
429 | [dh+"7",dd+"379","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"],
430 | [dh+"7",dd+"380","4.14.12777","May 2019",da+"7/May2019/kobo-update-4.14.12777.zip","27362a9c74cfc262b0e66bb4d3daebf6"],
431 | [dh+"6",dd+"381","4.14.12777","May 2019",da+"6/May2019/kobo-update-4.14.12777.zip","70de5d8cf3a9dce75398a42b6f937e91"],
432 | [dh+"3",dd+"310","4.15.12920","May 2019",da+"3/May2019/kobo-update-4.15.12920.zip","cad1ffbd8899d03d26e25a2a040ffc8b"],
433 | [dh+"4",dd+"320","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"],
434 | [dh+"4",dd+"330","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"],
435 | [dh+"4",dd+"350","4.15.12920","May 2019",da+"4/May2019/kobo-update-4.15.12920.zip","ef01c6e714be8c5a9fc702e6a9293a13"],
436 | [dh+"5",dd+"360","4.15.12920","May 2019",da+"5/May2019/kobo-update-4.15.12920.zip","3fa7fd20f6a38c2949494ee74ae6c4a5"],
437 | [dh+"5",dd+"370","4.15.12920","May 2019",da+"5/May2019/kobo-update-4.15.12920.zip","3fa7fd20f6a38c2949494ee74ae6c4a5"],
438 | [dh+"6",dd+"371","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
439 | [dh+"6",dd+"372","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
440 | [dh+"6",dd+"373","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
441 | [dh+"6",dd+"374","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
442 | [dh+"6",dd+"375","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
443 | [dh+"7",dd+"376","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"],
444 | [dh+"7",dd+"378","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"],
445 | [dh+"7",dd+"379","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"],
446 | [dh+"7",dd+"380","4.15.12920","May 2019",da+"7/May2019/kobo-update-4.15.12920.zip","32af7c29e2b705285c2fb63a8c8ee652"],
447 | [dh+"6",dd+"381","4.15.12920","May 2019",da+"6/May2019/kobo-update-4.15.12920.zip","085e87dea3628dab09ec1d78fd219e44"],
448 | [dh+"7",dd+"384","4.16.13337","August 2019",da+"7/Aug2019/kobo-update-4.16.13337.zip","bd2de1e06361fe6e6d760c53fa8e4fe8"],
449 | [dh+"3",dd+"310","4.17.13651","September 2019",da+"3/Sept2019/kobo-update-4.17.13651.zip","a01e4af4660e9dfcd63ca9bbef75052c"],
450 | [dh+"4",dd+"320","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"],
451 | [dh+"4",dd+"330","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"],
452 | [dh+"4",dd+"350","4.17.13651","September 2019",da+"4/Sept2019/kobo-update-4.17.13651.zip","862d23149701e379b372ef9ebd86a066"],
453 | [dh+"5",dd+"360","4.17.13651","September 2019",da+"5/Sept2019/kobo-update-4.17.13651.zip","05d0670530f47ae02b7234bec1d8be66"],
454 | [dh+"5",dd+"370","4.17.13651","September 2019",da+"5/Sept2019/kobo-update-4.17.13651.zip","05d0670530f47ae02b7234bec1d8be66"],
455 | [dh+"6",dd+"371","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
456 | [dh+"6",dd+"372","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
457 | [dh+"6",dd+"373","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
458 | [dh+"6",dd+"374","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
459 | [dh+"6",dd+"375","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
460 | [dh+"7",dd+"376","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"],
461 | [dh+"7",dd+"378","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"],
462 | [dh+"7",dd+"379","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"],
463 | [dh+"7",dd+"380","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"],
464 | [dh+"6",dd+"381","4.17.13651","September 2019",da+"6/Sept2019/kobo-update-4.17.13651.zip","4fe0a7e3d53dc5f9e19a531441b7aede"],
465 | [dh+"7",dd+"384","4.17.13651","September 2019",da+"7/Sept2019/kobo-update-4.17.13651.zip","b49654c3ab7df708d702c535fe257abb"],
466 | [dh+"3",dd+"310","4.17.13694","September 2019",da+"3/Sept2019/kobo-update-4.17.13694.zip","26233079c0cb6266c96ded44ccc7e569"],
467 | [dh+"4",dd+"320","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"],
468 | [dh+"4",dd+"330","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"],
469 | [dh+"4",dd+"350","4.17.13694","September 2019",da+"4/Sept2019/kobo-update-4.17.13694.zip","72f4b9dd5191f3158fa3da892e57ab82"],
470 | [dh+"5",dd+"360","4.17.13694","September 2019",da+"5/Sept2019/kobo-update-4.17.13694.zip","492fbafa13ce24a4db48602b413c1814"],
471 | [dh+"5",dd+"370","4.17.13694","September 2019",da+"5/Sept2019/kobo-update-4.17.13694.zip","492fbafa13ce24a4db48602b413c1814"],
472 | [dh+"6",dd+"371","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
473 | [dh+"6",dd+"372","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
474 | [dh+"6",dd+"373","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
475 | [dh+"6",dd+"374","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
476 | [dh+"6",dd+"375","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
477 | [dh+"7",dd+"376","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"],
478 | [dh+"7",dd+"378","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"],
479 | [dh+"7",dd+"379","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"],
480 | [dh+"7",dd+"380","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"],
481 | [dh+"6",dd+"381","4.17.13694","September 2019",da+"6/Sept2019/kobo-update-4.17.13694.zip","d961fdab57c238017956b8dc5f53c6b7"],
482 | [dh+"7",dd+"384","4.17.13694","September 2019",da+"7/Sept2019/kobo-update-4.17.13694.zip","efa93dbca887d32f45aaa7f23a671853"],
483 | [dh+"3",dd+"310","4.18.13737","September 2019",da+"3/Sept2019/kobo-update-4.18.13737.zip","77d5940894b7341cc0ca469bd557ad3b"],
484 | [dh+"4",dd+"320","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"],
485 | [dh+"4",dd+"330","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"],
486 | [dh+"4",dd+"350","4.18.13737","September 2019",da+"4/Sept2019/kobo-update-4.18.13737.zip","baafe5578b9b583e9bede2915cb401a2"],
487 | [dh+"5",dd+"360","4.18.13737","September 2019",da+"5/Sept2019/kobo-update-4.18.13737.zip","b582aec95610098319ecf083456f3252"],
488 | [dh+"5",dd+"370","4.18.13737","September 2019",da+"5/Sept2019/kobo-update-4.18.13737.zip","b582aec95610098319ecf083456f3252"],
489 | [dh+"6",dd+"371","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
490 | [dh+"6",dd+"372","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
491 | [dh+"6",dd+"373","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
492 | [dh+"6",dd+"374","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
493 | [dh+"6",dd+"375","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
494 | [dh+"7",dd+"376","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"],
495 | [dh+"7",dd+"378","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"],
496 | [dh+"7",dd+"379","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"],
497 | [dh+"7",dd+"380","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"],
498 | [dh+"6",dd+"381","4.18.13737","September 2019",da+"6/Sept2019/kobo-update-4.18.13737.zip","3b4130d2794b60b912ba588e7db710cf"],
499 | [dh+"7",dd+"384","4.18.13737","September 2019",da+"7/Sept2019/kobo-update-4.18.13737.zip","b702a0ea7b06d4f8d7db9a456ef0d2ed"],
500 | [dh+"3",dd+"310","4.19.14123","December 2019",da+"3/Dec2019/kobo-update-4.19.14123.zip","fb0a40b1839e667f6b2300d461561711"],
501 | [dh+"4",dd+"320","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"],
502 | [dh+"4",dd+"330","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"],
503 | [dh+"4",dd+"350","4.19.14123","December 2019",da+"4/Dec2019/kobo-update-4.19.14123.zip","f95041740d7aa61fac8a004ed2fc6e73"],
504 | [dh+"5",dd+"360","4.19.14123","December 2019",da+"5/Dec2019/kobo-update-4.19.14123.zip","31404d8a48997bef45ad57655757a5c8"],
505 | [dh+"5",dd+"370","4.19.14123","December 2019",da+"5/Dec2019/kobo-update-4.19.14123.zip","31404d8a48997bef45ad57655757a5c8"],
506 | [dh+"6",dd+"371","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
507 | [dh+"6",dd+"372","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
508 | [dh+"6",dd+"373","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
509 | [dh+"6",dd+"374","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
510 | [dh+"6",dd+"375","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
511 | [dh+"7",dd+"376","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"],
512 | [dh+"7",dd+"378","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"],
513 | [dh+"7",dd+"379","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"],
514 | [dh+"7",dd+"380","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"],
515 | [dh+"6",dd+"381","4.19.14123","December 2019",da+"6/Dec2019/kobo-update-4.19.14123.zip","b94c7657da51ebc491b143610e984872"],
516 | [dh+"7",dd+"384","4.19.14123","December 2019",da+"7/Dec2019/kobo-update-4.19.14123.zip","f10e80617a216c5fe4ec094055e85c32"],
517 | [dh+"3",dd+"310","4.20.14601","February 2020",da+"3/Feb2020/kobo-update-4.20.14601.zip","99d3fbf29e2f59f5e5483c11047b783d"],
518 | [dh+"4",dd+"320","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"],
519 | [dh+"4",dd+"330","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"],
520 | [dh+"4",dd+"350","4.20.14601","February 2020",da+"4/Feb2020/kobo-update-4.20.14601.zip","98cf7bb733f4609e4aa5abf955091573"],
521 | [dh+"5",dd+"360","4.20.14601","February 2020",da+"5/Feb2020/kobo-update-4.20.14601.zip","7754e129a3d007ae4a53d56cb594b39b"],
522 | [dh+"5",dd+"370","4.20.14601","February 2020",da+"5/Feb2020/kobo-update-4.20.14601.zip","7754e129a3d007ae4a53d56cb594b39b"],
523 | [dh+"6",dd+"371","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
524 | [dh+"6",dd+"372","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
525 | [dh+"6",dd+"373","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
526 | [dh+"6",dd+"374","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
527 | [dh+"6",dd+"375","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
528 | [dh+"7",dd+"376","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"],
529 | [dh+"7",dd+"378","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"],
530 | [dh+"7",dd+"379","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"],
531 | [dh+"7",dd+"380","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"],
532 | [dh+"6",dd+"381","4.20.14601","February 2020",da+"6/Feb2020/kobo-update-4.20.14601.zip","e469aaf226cb8be11c908bde8c476ee0"],
533 | [dh+"7",dd+"384","4.20.14601","February 2020",da+"7/Feb2020/kobo-update-4.20.14601.zip","22a2b2901cf5e381d2da4251dcbf1a61"],
534 | [dh+"3",dd+"310","4.20.14617","March 2020",da+"3/Mar2020/kobo-update-4.20.14617.zip","484b729fc27488dc608f36bac7d8cf42"],
535 | [dh+"4",dd+"320","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"],
536 | [dh+"4",dd+"330","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"],
537 | [dh+"4",dd+"350","4.20.14617","March 2020",da+"4/Mar2020/kobo-update-4.20.14617.zip","f8e0da837d1e44206e4e334615c44c13"],
538 | [dh+"5",dd+"360","4.20.14617","March 2020",da+"5/Mar2020/kobo-update-4.20.14617.zip","61567854623e35a3bdeb5a36a5e1f395"],
539 | [dh+"5",dd+"370","4.20.14617","March 2020",da+"5/Mar2020/kobo-update-4.20.14617.zip","61567854623e35a3bdeb5a36a5e1f395"],
540 | [dh+"6",dd+"371","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
541 | [dh+"6",dd+"372","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
542 | [dh+"6",dd+"373","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
543 | [dh+"6",dd+"374","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
544 | [dh+"6",dd+"375","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
545 | [dh+"7",dd+"376","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"],
546 | [dh+"7",dd+"378","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"],
547 | [dh+"7",dd+"379","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"],
548 | [dh+"7",dd+"380","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"],
549 | [dh+"6",dd+"381","4.20.14617","March 2020",da+"6/Mar2020/kobo-update-4.20.14617.zip","bcc1b3098f740056d6eb87aaae8bad99"],
550 | [dh+"7",dd+"384","4.20.14617","March 2020",da+"7/Mar2020/kobo-update-4.20.14617.zip","6020d97fb68b418c550e8b3101319166"],
551 | [dh+"3",dd+"310","4.20.14622","March 2020",da+"3/Mar2020/kobo-update-4.20.14622.zip","4ab3a3b0e8a672e0c367c45ecdb43637"],
552 | [dh+"4",dd+"320","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"],
553 | [dh+"4",dd+"330","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"],
554 | [dh+"4",dd+"350","4.20.14622","March 2020",da+"4/Mar2020/kobo-update-4.20.14622.zip","d586369b70e986a0cb5268a5b33ef889"],
555 | [dh+"5",dd+"360","4.20.14622","March 2020",da+"5/Mar2020/kobo-update-4.20.14622.zip","dd23bb318942a2b8a44cf021502b664e"],
556 | [dh+"5",dd+"370","4.20.14622","March 2020",da+"5/Mar2020/kobo-update-4.20.14622.zip","dd23bb318942a2b8a44cf021502b664e"],
557 | [dh+"6",dd+"371","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
558 | [dh+"6",dd+"372","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
559 | [dh+"6",dd+"373","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
560 | [dh+"6",dd+"374","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
561 | [dh+"6",dd+"375","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
562 | [dh+"7",dd+"376","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"],
563 | [dh+"7",dd+"378","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"],
564 | [dh+"7",dd+"379","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"],
565 | [dh+"7",dd+"380","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"],
566 | [dh+"6",dd+"381","4.20.14622","March 2020",da+"6/Mar2020/kobo-update-4.20.14622.zip","6ac599e8ee0a76e5fde0114e666732f7"],
567 | [dh+"7",dd+"384","4.20.14622","March 2020",da+"7/Mar2020/kobo-update-4.20.14622.zip","69fee3421457a10b5000bbb6ea222922"],
568 | [dh+"3",dd+"310","4.21.15015","May 2020",da+"3/May2020/kobo-update-4.21.15015.zip","960dd60a04bbb418b453d20487707446"],
569 | [dh+"4",dd+"320","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"],
570 | [dh+"4",dd+"330","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"],
571 | [dh+"4",dd+"350","4.21.15015","May 2020",da+"4/May2020/kobo-update-4.21.15015.zip","271e3d7ede08c71ac1aeb07584c0d05b"],
572 | [dh+"5",dd+"360","4.21.15015","May 2020",da+"5/May2020/kobo-update-4.21.15015.zip","842caf754eb51c4b6c2ce2ebe0cb9629"],
573 | [dh+"5",dd+"370","4.21.15015","May 2020",da+"5/May2020/kobo-update-4.21.15015.zip","842caf754eb51c4b6c2ce2ebe0cb9629"],
574 | [dh+"6",dd+"371","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
575 | [dh+"6",dd+"372","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
576 | [dh+"6",dd+"373","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
577 | [dh+"6",dd+"374","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
578 | [dh+"6",dd+"375","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
579 | [dh+"7",dd+"376","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"],
580 | [dh+"7",dd+"378","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"],
581 | [dh+"7",dd+"379","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"],
582 | [dh+"7",dd+"380","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"],
583 | [dh+"6",dd+"381","4.21.15015","May 2020",da+"6/May2020/kobo-update-4.21.15015.zip","29c06cd2ff92f24beac06749496123a1"],
584 | [dh+"7",dd+"384","4.21.15015","May 2020",da+"7/May2020/kobo-update-4.21.15015.zip","0ca49728a48281ab95240005d862c2ca"],
585 | [dh+"3",dd+"310","4.22.15190","June 2020",da+"3/Jun2020/kobo-update-4.22.15190.zip","7c2d43bf48705681ade7f70dc7f0fe8b"],
586 | [dh+"4",dd+"320","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"],
587 | [dh+"4",dd+"330","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"],
588 | [dh+"4",dd+"350","4.22.15190","June 2020",da+"4/Jun2020/kobo-update-4.22.15190.zip","9971b82d9f01592456a27dc1119664b1"],
589 | [dh+"5",dd+"360","4.22.15190","June 2020",da+"5/Jun2020/kobo-update-4.22.15190.zip","b727441eebff8140421e3f2288f12cec"],
590 | [dh+"5",dd+"370","4.22.15190","June 2020",da+"5/Jun2020/kobo-update-4.22.15190.zip","b727441eebff8140421e3f2288f12cec"],
591 | [dh+"6",dd+"371","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
592 | [dh+"6",dd+"372","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
593 | [dh+"6",dd+"373","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
594 | [dh+"6",dd+"374","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
595 | [dh+"6",dd+"375","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
596 | [dh+"7",dd+"376","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"],
597 | [dh+"7",dd+"378","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"],
598 | [dh+"7",dd+"379","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"],
599 | [dh+"7",dd+"380","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"],
600 | [dh+"6",dd+"381","4.22.15190","June 2020",da+"6/Jun2020/kobo-update-4.22.15190.zip","90bb0acbb6dbd5fdc4157bd0c6a4eeed"],
601 | [dh+"7",dd+"384","4.22.15190","June 2020",da+"7/Jun2020/kobo-update-4.22.15190.zip","10ad57343056407f12d8e2babcf94fed"],
602 | [dh+"7",dd+"382","4.22.15268","July 2020",da+"7/Jul2020/kobo-update-4.22.15268.zip","504812ccf4e5a027b0faabd03736a493"],
603 | [dh+"3",dd+"310","4.23.15505","August 2020",da+"3/Aug2020/kobo-update-4.23.15505.zip","b6533b6ff5beba4118b8488cd724f9bf"],
604 | [dh+"4",dd+"320","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"],
605 | [dh+"4",dd+"330","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"],
606 | [dh+"4",dd+"350","4.23.15505","August 2020",da+"4/Aug2020/kobo-update-4.23.15505.zip","4dcbe6043345f088b35035a7fa51fff4"],
607 | [dh+"5",dd+"360","4.23.15505","August 2020",da+"5/Aug2020/kobo-update-4.23.15505.zip","ec2c10da79430ce8856fd49bb957a88d"],
608 | [dh+"5",dd+"370","4.23.15505","August 2020",da+"5/Aug2020/kobo-update-4.23.15505.zip","ec2c10da79430ce8856fd49bb957a88d"],
609 | [dh+"6",dd+"371","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
610 | [dh+"6",dd+"372","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
611 | [dh+"6",dd+"373","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
612 | [dh+"6",dd+"374","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
613 | [dh+"6",dd+"375","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
614 | [dh+"7",dd+"376","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
615 | [dh+"7",dd+"378","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
616 | [dh+"7",dd+"379","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
617 | [dh+"7",dd+"380","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
618 | [dh+"6",dd+"381","4.23.15505","August 2020",da+"6/Aug2020/kobo-update-4.23.15505.zip","152c9f7dac0855029cfc0693c4548c3b"],
619 | [dh+"7",dd+"382","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
620 | [dh+"7",dd+"384","4.23.15505","August 2020",da+"7/Aug2020/kobo-update-4.23.15505.zip","a5fe1e642399dcef38f6861ffbbbf3ab"],
621 | [dh+"3",dd+"310","4.23.15548","August 2020",da+"3/Aug2020/kobo-update-4.23.15548.zip","22a015cc0df127a2963f7267096c62b0"],
622 | [dh+"4",dd+"320","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"],
623 | [dh+"4",dd+"330","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"],
624 | [dh+"4",dd+"350","4.23.15548","August 2020",da+"4/Aug2020/kobo-update-4.23.15548.zip","ec8efb8863e80372314c79aa49b975a3"],
625 | [dh+"5",dd+"360","4.23.15548","August 2020",da+"5/Aug2020/kobo-update-4.23.15548.zip","9c455d7bc2bc6d710f1f1941c9f49be2"],
626 | [dh+"5",dd+"370","4.23.15548","August 2020",da+"5/Aug2020/kobo-update-4.23.15548.zip","9c455d7bc2bc6d710f1f1941c9f49be2"],
627 | [dh+"6",dd+"371","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
628 | [dh+"6",dd+"372","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
629 | [dh+"6",dd+"373","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
630 | [dh+"6",dd+"374","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
631 | [dh+"6",dd+"375","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
632 | [dh+"7",dd+"376","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
633 | [dh+"7",dd+"378","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
634 | [dh+"7",dd+"379","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
635 | [dh+"7",dd+"380","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
636 | [dh+"6",dd+"381","4.23.15548","August 2020",da+"6/Aug2020/kobo-update-4.23.15548.zip","6bf89183385559604ce8817bd1829f61"],
637 | [dh+"7",dd+"382","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
638 | [dh+"7",dd+"384","4.23.15548","August 2020",da+"7/Aug2020/kobo-update-4.23.15548.zip","f4f8611ac0d20ae7084d56067bc9adf6"],
639 | [dh+"3",dd+"310","4.24.15672","September 2020",da+"3/Sep2020/kobo-update-4.24.15672.zip","48afc6b1f2ef41b12c95f7bf7f5c8757"],
640 | [dh+"4",dd+"320","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"],
641 | [dh+"4",dd+"330","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"],
642 | [dh+"4",dd+"350","4.24.15672","September 2020",da+"4/Sep2020/kobo-update-4.24.15672.zip","4d7a6bad3da0bda4e7ff26dbb532d88b"],
643 | [dh+"5",dd+"360","4.24.15672","September 2020",da+"5/Sep2020/kobo-update-4.24.15672.zip","ec7c4dcbc11a11ba0fc71bfb4b703eb2"],
644 | [dh+"5",dd+"370","4.24.15672","September 2020",da+"5/Sep2020/kobo-update-4.24.15672.zip","ec7c4dcbc11a11ba0fc71bfb4b703eb2"],
645 | [dh+"6",dd+"371","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
646 | [dh+"6",dd+"372","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
647 | [dh+"6",dd+"373","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
648 | [dh+"6",dd+"374","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
649 | [dh+"6",dd+"375","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
650 | [dh+"7",dd+"376","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
651 | [dh+"7",dd+"378","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
652 | [dh+"7",dd+"379","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
653 | [dh+"7",dd+"380","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
654 | [dh+"6",dd+"381","4.24.15672","September 2020",da+"6/Sep2020/kobo-update-4.24.15672.zip","d6688d1ad23e07c500efe8f189213cea"],
655 | [dh+"7",dd+"382","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
656 | [dh+"7",dd+"384","4.24.15672","September 2020",da+"7/Sep2020/kobo-update-4.24.15672.zip","030212406c77e0ddff9090b055d87730"],
657 | [dh+"3",dd+"310","4.24.15676","September 2020",da+"3/Sep2020/kobo-update-4.24.15676.zip","c7690efd962f510706d0859ce53511cb"],
658 | [dh+"4",dd+"320","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"],
659 | [dh+"4",dd+"330","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"],
660 | [dh+"4",dd+"350","4.24.15676","September 2020",da+"4/Sep2020/kobo-update-4.24.15676.zip","9c43e6221135e4a5f1bbbea537700bae"],
661 | [dh+"5",dd+"360","4.24.15676","September 2020",da+"5/Sep2020/kobo-update-4.24.15676.zip","ed6c0363f139af08923c0f7a4f761f81"],
662 | [dh+"5",dd+"370","4.24.15676","September 2020",da+"5/Sep2020/kobo-update-4.24.15676.zip","ed6c0363f139af08923c0f7a4f761f81"],
663 | [dh+"6",dd+"371","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
664 | [dh+"6",dd+"372","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
665 | [dh+"6",dd+"373","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
666 | [dh+"6",dd+"374","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
667 | [dh+"6",dd+"375","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
668 | [dh+"7",dd+"376","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
669 | [dh+"7",dd+"378","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
670 | [dh+"7",dd+"379","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
671 | [dh+"7",dd+"380","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
672 | [dh+"6",dd+"381","4.24.15676","September 2020",da+"6/Sep2020/kobo-update-4.24.15676.zip","3a9b0e18ba53c33ec82d5b89c9b084ac"],
673 | [dh+"7",dd+"382","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
674 | [dh+"7",dd+"384","4.24.15676","September 2020",da+"7/Sep2020/kobo-update-4.24.15676.zip","8b4933779f437dbd77f2b1a99ad1f2c8"],
675 | [dh+"3",dd+"310","4.25.15875","November 2020",da+"3/Nov2020/kobo-update-4.25.15875.zip","6eb450621f7470dbc8c6a224bef42450"],
676 | [dh+"4",dd+"320","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"],
677 | [dh+"4",dd+"330","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"],
678 | [dh+"4",dd+"350","4.25.15875","November 2020",da+"4/Nov2020/kobo-update-4.25.15875.zip","4de69103208529f80f72aa95c60c38d1"],
679 | [dh+"5",dd+"360","4.25.15875","November 2020",da+"5/Nov2020/kobo-update-4.25.15875.zip","4ddaff5579d333540228c4706059d654"],
680 | [dh+"5",dd+"370","4.25.15875","November 2020",da+"5/Nov2020/kobo-update-4.25.15875.zip","4ddaff5579d333540228c4706059d654"],
681 | [dh+"6",dd+"371","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
682 | [dh+"6",dd+"372","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
683 | [dh+"6",dd+"373","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
684 | [dh+"6",dd+"374","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
685 | [dh+"6",dd+"375","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
686 | [dh+"7",dd+"376","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
687 | [dh+"7",dd+"378","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
688 | [dh+"7",dd+"379","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
689 | [dh+"7",dd+"380","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
690 | [dh+"6",dd+"381","4.25.15875","November 2020",da+"6/Nov2020/kobo-update-4.25.15875.zip","24fdf31570953b5064d956a1802892e3"],
691 | [dh+"7",dd+"382","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
692 | [dh+"7",dd+"384","4.25.15875","November 2020",da+"7/Nov2020/kobo-update-4.25.15875.zip","7c8ed3b7b4d2387365dfa95bcc883035"],
693 | [dh+"3",dd+"310","4.26.16704","February 2021",da+"3/Feb2021/kobo-update-4.26.16704.zip","06721016b086f18884ab9d37a975f88e"],
694 | [dh+"4",dd+"320","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"],
695 | [dh+"4",dd+"330","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"],
696 | [dh+"4",dd+"350","4.26.16704","February 2021",da+"4/Feb2021/kobo-update-4.26.16704.zip","c5018e0da20c99b0864553b7db55adaf"],
697 | [dh+"5",dd+"360","4.26.16704","February 2021",da+"5/Feb2021/kobo-update-4.26.16704.zip","4e5a543f958d4e84bd2e3f92096b6492"],
698 | [dh+"5",dd+"370","4.26.16704","February 2021",da+"5/Feb2021/kobo-update-4.26.16704.zip","4e5a543f958d4e84bd2e3f92096b6492"],
699 | [dh+"6",dd+"371","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
700 | [dh+"6",dd+"372","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
701 | [dh+"6",dd+"373","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
702 | [dh+"6",dd+"374","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
703 | [dh+"6",dd+"375","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
704 | [dh+"7",dd+"376","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
705 | [dh+"7",dd+"378","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
706 | [dh+"7",dd+"379","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
707 | [dh+"7",dd+"380","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
708 | [dh+"6",dd+"381","4.26.16704","February 2021",da+"6/Feb2021/kobo-update-4.26.16704.zip","49113bfee33f9c604780308255ec3943"],
709 | [dh+"7",dd+"382","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
710 | [dh+"7",dd+"384","4.26.16704","February 2021",da+"7/Feb2021/kobo-update-4.26.16704.zip","286a6aa7bd2a3e7c8ea7464aafb346d9"],
711 | [dh+"8",dd+"387","4.28.17623","June 2021",da+"8/May2021/kobo-update-4.28.17623-TF6412.zip","285ac4377e8aab902ca084eaf3604b3d"],
712 | [dh+"8",dd+"387","4.28.17820","June 2021",da+"8/June2021/kobo-update-4.28.17820-TouchFW-6417.zip","eac3aa52f2afaf17a8083cce33869bc8"],
713 | [dh+"8",dd+"387","4.28.17826","June 2021",da+"8/June2021/kobo-update-4.28.17826-TouchFW-6417.zip","344aa5d2c3e260baeb484bc5c8cce980"],
714 | [dh+"8",dd+"387","4.28.17925","July 2021",da+"8/July2021/kobo-update-4.28.17925.zip","97a926fb1faa74d216c4222998ae354a"],
715 | [dh+"3",dd+"310","4.28.18220","August 2021",da+"3/Aug2021/kobo-update-4.28.18220.zip","1862c9db921397b7bbfd93bec310ce6e"],
716 | [dh+"4",dd+"320","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"],
717 | [dh+"4",dd+"330","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"],
718 | [dh+"4",dd+"350","4.28.18220","August 2021",da+"4/Aug2021/kobo-update-4.28.18220.zip","88b5705e6527ae5e68328506e2bce177"],
719 | [dh+"5",dd+"360","4.28.18220","August 2021",da+"5/Aug2021/kobo-update-4.28.18220.zip","b3a2d6ad2c8d8c27f594ac5b789fde84"],
720 | [dh+"5",dd+"370","4.28.18220","August 2021",da+"5/Aug2021/kobo-update-4.28.18220.zip","b3a2d6ad2c8d8c27f594ac5b789fde84"],
721 | [dh+"6",dd+"371","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
722 | [dh+"6",dd+"372","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
723 | [dh+"6",dd+"373","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
724 | [dh+"6",dd+"374","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
725 | [dh+"6",dd+"375","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
726 | [dh+"7",dd+"376","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
727 | [dh+"7",dd+"378","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
728 | [dh+"7",dd+"379","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
729 | [dh+"7",dd+"380","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
730 | [dh+"6",dd+"381","4.28.18220","August 2021",da+"6/Aug2021/kobo-update-4.28.18220.zip","995a4dabca92568f4d71bef14e5fcf36"],
731 | [dh+"7",dd+"382","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
732 | [dh+"7",dd+"384","4.28.18220","August 2021",da+"7/Aug2021/kobo-update-4.28.18220.zip","e7b00c3570266ad0c76e75e274517d56"],
733 | [dh+"8",dd+"383","4.29.18730","October 2021",da+"8/Oct2021/kobo-update-4.29.18730.zip","4fce1ba8e2a7110285fe4aa1baf17fa8"],
734 | [dh+"9",dd+"388","4.29.18730","October 2021",da+"9/Oct2021/kobo-update-4.29.18730-TF6408.zip","c41874f2bde070c9f03a5141e8cc2d2a"],
735 | [dh+"3",dd+"310","4.30.18838","November 2021",da+"3/Nov2021/kobo-update-4.30.18838.zip","7939b71940b0adc6b1f80072eac1a3c4"],
736 | [dh+"4",dd+"320","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"],
737 | [dh+"4",dd+"330","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"],
738 | [dh+"4",dd+"350","4.30.18838","November 2021",da+"4/Nov2021/kobo-update-4.30.18838.zip","6a0ac670e2fe7b3172f00b2feb809ed6"],
739 | [dh+"5",dd+"360","4.30.18838","November 2021",da+"5/Nov2021/kobo-update-4.30.18838.zip","137afedf74b8d51156fea5db45970c0c"],
740 | [dh+"5",dd+"370","4.30.18838","November 2021",da+"5/Nov2021/kobo-update-4.30.18838.zip","137afedf74b8d51156fea5db45970c0c"],
741 | [dh+"6",dd+"371","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
742 | [dh+"6",dd+"372","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
743 | [dh+"6",dd+"373","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
744 | [dh+"6",dd+"374","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
745 | [dh+"6",dd+"375","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
746 | [dh+"7",dd+"376","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
747 | [dh+"7",dd+"378","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
748 | [dh+"7",dd+"379","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
749 | [dh+"7",dd+"380","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
750 | [dh+"6",dd+"381","4.30.18838","November 2021",da+"6/Nov2021/kobo-update-4.30.18838.zip","c674140cbac1cd2b9d79c06040217b8f"],
751 | [dh+"7",dd+"382","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
752 | [dh+"7",dd+"384","4.30.18838","November 2021",da+"7/Nov2021/kobo-update-4.30.18838.zip","2976f7272e2b5a28466c2c495e89fe63"],
753 | [dh+"8",dd+"387","4.30.18838","November 2021",da+"8/Nov2021/kobo-update-4.30.18838.zip","4a3c664297505034e3b92092663b5674"],
754 | [dh+"8",dd+"383","4.30.18838","November 2021",da+"8/Nov2021/kobo-update-4.30.18838.zip","4a3c664297505034e3b92092663b5674"],
755 | [dh+"9",dd+"388","4.30.18838","November 2021",da+"9/Nov2021/kobo-update-4.30.18838.zip","2baee7c983ca20620e3cf8b0b366734e"],
756 | [dh+"3",dd+"310","4.31.19086","January 2022",da+"3/Jan2022/kobo-update-4.31.19086.zip","f13929745e9c2a679d15b47e2dfbb7da"],
757 | [dh+"4",dd+"320","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"],
758 | [dh+"4",dd+"330","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"],
759 | [dh+"4",dd+"350","4.31.19086","January 2022",da+"4/Jan2022/kobo-update-4.31.19086.zip","ae132533fc8f4879e6dd1e935b78626b"],
760 | [dh+"5",dd+"360","4.31.19086","January 2022",da+"5/Jan2022/kobo-update-4.31.19086.zip","df4a625b2f5aa64ca94eb54b331b957f"],
761 | [dh+"5",dd+"370","4.31.19086","January 2022",da+"5/Jan2022/kobo-update-4.31.19086.zip","df4a625b2f5aa64ca94eb54b331b957f"],
762 | [dh+"6",dd+"371","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
763 | [dh+"6",dd+"372","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
764 | [dh+"6",dd+"373","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
765 | [dh+"6",dd+"374","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
766 | [dh+"6",dd+"375","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
767 | [dh+"7",dd+"376","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
768 | [dh+"7",dd+"378","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
769 | [dh+"7",dd+"379","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
770 | [dh+"7",dd+"380","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
771 | [dh+"6",dd+"381","4.31.19086","January 2022",da+"6/Jan2022/kobo-update-4.31.19086.zip","e1b3f98f20601b8bc9979a373d7469de"],
772 | [dh+"7",dd+"382","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
773 | [dh+"7",dd+"384","4.31.19086","January 2022",da+"7/Jan2022/kobo-update-4.31.19086.zip","09c42f3424ddd5405a500402b98e31ee"],
774 | [dh+"8",dd+"387","4.31.19086","January 2022",da+"8/Jan2022/kobo-update-4.31.19086.zip","83cee24c3c584f0026dd33dc00adc21f"],
775 | [dh+"8",dd+"383","4.31.19086","January 2022",da+"8/Jan2022/kobo-update-4.31.19086.zip","83cee24c3c584f0026dd33dc00adc21f"],
776 | [dh+"9",dd+"388","4.31.19086","January 2022",da+"9/Jan2022/kobo-update-4.31.19086.zip","80ee29698be2a87fb4d37d0abefc703e"],
777 | [dh+"3",dd+"310","4.32.19501","April 2022",da+"3/Apr2022/kobo-update-4.32.19501.zip","9266082b5233fca2be7aee6522e1107a"],
778 | [dh+"4",dd+"320","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"],
779 | [dh+"4",dd+"330","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"],
780 | [dh+"4",dd+"350","4.32.19501","April 2022",da+"4/Apr2022/kobo-update-4.32.19501.zip","a86c4b9b5f1da3a27f0c24da1c0935e3"],
781 | [dh+"5",dd+"360","4.32.19501","April 2022",da+"5/Apr2022/kobo-update-4.32.19501.zip","ff7f93cf1e6638f2308d9a85e9798124"],
782 | [dh+"5",dd+"370","4.32.19501","April 2022",da+"5/Apr2022/kobo-update-4.32.19501.zip","ff7f93cf1e6638f2308d9a85e9798124"],
783 | [dh+"6",dd+"371","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
784 | [dh+"6",dd+"372","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
785 | [dh+"6",dd+"373","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
786 | [dh+"6",dd+"374","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
787 | [dh+"6",dd+"375","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
788 | [dh+"7",dd+"376","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
789 | [dh+"7",dd+"378","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
790 | [dh+"7",dd+"379","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
791 | [dh+"7",dd+"380","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
792 | [dh+"6",dd+"381","4.32.19501","April 2022",da+"6/Apr2022/kobo-update-4.32.19501.zip","6c3aa4851c7def314bc472ab0b3c7958"],
793 | [dh+"7",dd+"382","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
794 | [dh+"7",dd+"384","4.32.19501","April 2022",da+"7/Apr2022/kobo-update-4.32.19501.zip","81b04f5b1b3000aae40a70278bbf647f"],
795 | [dh+"8",dd+"387","4.32.19501","April 2022",da+"8/Apr2022/kobo-update-4.32.19501.zip","bcffe5447cdee07d25516e8ddf29952a"],
796 | [dh+"8",dd+"383","4.32.19501","April 2022",da+"8/Apr2022/kobo-update-4.32.19501.zip","bcffe5447cdee07d25516e8ddf29952a"],
797 | [dh+"9",dd+"388","4.32.19501","April 2022",da+"9/Apr2022/kobo-update-4.32.19501.zip","7fa52602c83c183eabddc51723d9f932"],
798 | [dh+"3",dd+"310","4.33.19608","May 2022",da+"3/May2022/kobo-update-4.33.19608.zip","e999012de836ecda5aad6369b61a9f49"],
799 | [dh+"4",dd+"320","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"],
800 | [dh+"4",dd+"330","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"],
801 | [dh+"4",dd+"350","4.33.19608","May 2022",da+"4/May2022/kobo-update-4.33.19608.zip","4daeff8a186caac164507887807e7984"],
802 | [dh+"5",dd+"360","4.33.19608","May 2022",da+"5/May2022/kobo-update-4.33.19608.zip","ca2196065643d49acf1ce2baf68389d9"],
803 | [dh+"5",dd+"370","4.33.19608","May 2022",da+"5/May2022/kobo-update-4.33.19608.zip","ca2196065643d49acf1ce2baf68389d9"],
804 | [dh+"6",dd+"371","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
805 | [dh+"6",dd+"372","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
806 | [dh+"6",dd+"373","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
807 | [dh+"6",dd+"374","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
808 | [dh+"6",dd+"375","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
809 | [dh+"7",dd+"376","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
810 | [dh+"7",dd+"378","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
811 | [dh+"7",dd+"379","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
812 | [dh+"7",dd+"380","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
813 | [dh+"6",dd+"381","4.33.19608","May 2022",da+"6/May2022/kobo-update-4.33.19608.zip","3e23a38d06351563cac2daf9f9b6e0d7"],
814 | [dh+"7",dd+"382","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
815 | [dh+"7",dd+"384","4.33.19608","May 2022",da+"7/May2022/kobo-update-4.33.19608.zip","d5184777df6dcab5f28fe183b2344272"],
816 | [dh+"8",dd+"387","4.33.19608","May 2022",da+"8/May2022/kobo-update-4.33.19608.zip","33c9c23b9af191eaa0bd4a02d3dc07fe"],
817 | [dh+"8",dd+"383","4.33.19608","May 2022",da+"8/May2022/kobo-update-4.33.19608.zip","33c9c23b9af191eaa0bd4a02d3dc07fe"],
818 | [dh+"9",dd+"388","4.33.19608","May 2022",da+"9/May2022/kobo-update-4.33.19608.zip","0ab6183ae49e9cb84648a1f92213c0e8"],
819 | [dh+"7",dd+"376","4.33.19611","June 2022",da+"7/Jun2022/kobo-update-4.33.19611.zip","0e8d3e7ed27fbaecd5cb62e94b2616a5"],
820 | [dh+"7",dd+"382","4.33.19611","June 2022",da+"7/Jun2022/kobo-update-4.33.19611.zip","0e8d3e7ed27fbaecd5cb62e94b2616a5"],
821 | [dh+"8",dd+"383","4.33.19611","June 2022",da+"8/Jun2022/kobo-update-4.33.19611.zip","ad54d56f91bc5623318768bc12fe8d7d"],
822 | [dh+"9",dd+"388","4.33.19611","June 2022",da+"9/Jun2022/kobo-update-4.33.19611.zip","fcbfcf6ddcb53c6506d3a6812773c2f6"],
823 | [dh+"3",dd+"310","4.33.19759","July 2022",da+"3/Jul2022/kobo-update-4.33.19759.zip","75c35cf52711989fd826f9fdf1d037be"],
824 | [dh+"4",dd+"320","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"],
825 | [dh+"4",dd+"330","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"],
826 | [dh+"4",dd+"350","4.33.19759","July 2022",da+"4/Jul2022/kobo-update-4.33.19759.zip","1acdee7646314d4ad5a71c7ce93b1ee9"],
827 | [dh+"5",dd+"360","4.33.19759","July 2022",da+"5/Jul2022/kobo-update-4.33.19759.zip","efcb2539540662d7b8c253eef5beaf8f"],
828 | [dh+"5",dd+"370","4.33.19759","July 2022",da+"5/Jul2022/kobo-update-4.33.19759.zip","efcb2539540662d7b8c253eef5beaf8f"],
829 | [dh+"6",dd+"371","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
830 | [dh+"6",dd+"372","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
831 | [dh+"6",dd+"373","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
832 | [dh+"6",dd+"374","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
833 | [dh+"6",dd+"375","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
834 | [dh+"7",dd+"376","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
835 | [dh+"7",dd+"378","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
836 | [dh+"7",dd+"379","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
837 | [dh+"7",dd+"380","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
838 | [dh+"6",dd+"381","4.33.19759","July 2022",da+"6/Jul2022/kobo-update-4.33.19759.zip","608386b70b84bba30717192501bf0788"],
839 | [dh+"7",dd+"382","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
840 | [dh+"7",dd+"384","4.33.19759","July 2022",da+"7/Jul2022/kobo-update-4.33.19759.zip","c0b1fd8a9a77ad22a0f2f038ab6c3f17"],
841 | [dh+"8",dd+"387","4.33.19759","July 2022",da+"8/Jul2022/kobo-update-4.33.19759.zip","4b9eee767b199a04ee38ce01249ef077"],
842 | [dh+"8",dd+"383","4.33.19759","July 2022",da+"8/Jul2022/kobo-update-4.33.19759.zip","4b9eee767b199a04ee38ce01249ef077"],
843 | [dh+"9",dd+"388","4.33.19759","July 2022",da+"9/Jul2022/kobo-update-4.33.19759.zip","6f52595794232b814e686839c03a9f7f"],
844 | [dh+"3",dd+"310","4.34.20097","September 2022",da+"3/Sep2022/kobo-update-4.34.20097.zip","9c0454a10675dc4b787eb555efc5c136"],
845 | [dh+"4",dd+"320","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"],
846 | [dh+"4",dd+"330","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"],
847 | [dh+"4",dd+"350","4.34.20097","September 2022",da+"4/Sep2022/kobo-update-4.34.20097.zip","38df35e9b6019dfc7cf3e2f1278bdfa0"],
848 | [dh+"5",dd+"360","4.34.20097","September 2022",da+"5/Sep2022/kobo-update-4.34.20097.zip","f9b9f9d483accbd665227efc40185ca2"],
849 | [dh+"5",dd+"370","4.34.20097","September 2022",da+"5/Sep2022/kobo-update-4.34.20097.zip","f9b9f9d483accbd665227efc40185ca2"],
850 | [dh+"6",dd+"371","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
851 | [dh+"6",dd+"372","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
852 | [dh+"6",dd+"373","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
853 | [dh+"6",dd+"374","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
854 | [dh+"6",dd+"375","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
855 | [dh+"7",dd+"376","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
856 | [dh+"7",dd+"378","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
857 | [dh+"7",dd+"379","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
858 | [dh+"7",dd+"380","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
859 | [dh+"6",dd+"381","4.34.20097","September 2022",da+"6/Sep2022/kobo-update-4.34.20097.zip","d09433c5c387922b3b0f14d42f0223c9"],
860 | [dh+"7",dd+"382","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
861 | [dh+"7",dd+"384","4.34.20097","September 2022",da+"7/Sep2022/kobo-update-4.34.20097.zip","083fb0deabc5b8798c5e39f3b92d4e2f"],
862 | [dh+"8",dd+"387","4.34.20097","September 2022",da+"8/Sep2022/kobo-update-4.34.20097.zip","5b66c42d79f8c45eb416d636aa5d3ce5"],
863 | [dh+"8",dd+"383","4.34.20097","September 2022",da+"8/Sep2022/kobo-update-4.34.20097.zip","5b66c42d79f8c45eb416d636aa5d3ce5"],
864 | [dh+"9",dd+"388","4.34.20097","September 2022",da+"9/Sep2022/kobo-update-4.34.20097.zip","9b2f5a83f8859854dfd467b3bcd4b3c8"],
865 | [dh+"10",dd+"386","4.34.20097","September 2022",da+"10/Sep2022/kobo-update-4.34.20097.zip","68f862e62450bea445da9b03dc50e2a0"],
866 | [dh+"3",dd+"310","4.35.20400","December 2022",da+"3/Dec2022/kobo-update-4.35.20400.zip","23cab980522f32860aa1e3bf2ee4519e"],
867 | [dh+"4",dd+"320","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"],
868 | [dh+"4",dd+"330","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"],
869 | [dh+"4",dd+"350","4.35.20400","December 2022",da+"4/Dec2022/kobo-update-4.35.20400.zip","268f03797a0e9802561ceb2b7d2b53dc"],
870 | [dh+"5",dd+"360","4.35.20400","December 2022",da+"5/Dec2022/kobo-update-4.35.20400.zip","d1538ea29955972872f401b68e568a69"],
871 | [dh+"5",dd+"370","4.35.20400","December 2022",da+"5/Dec2022/kobo-update-4.35.20400.zip","d1538ea29955972872f401b68e568a69"],
872 | [dh+"6",dd+"371","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
873 | [dh+"6",dd+"372","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
874 | [dh+"6",dd+"373","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
875 | [dh+"6",dd+"374","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
876 | [dh+"6",dd+"375","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
877 | [dh+"7",dd+"376","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
878 | [dh+"7",dd+"378","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
879 | [dh+"7",dd+"379","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
880 | [dh+"7",dd+"380","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
881 | [dh+"6",dd+"381","4.35.20400","December 2022",da+"6/Dec2022/kobo-update-4.35.20400.zip","4c076ab63547d7b9dc0ef6961911a431"],
882 | [dh+"7",dd+"382","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
883 | [dh+"7",dd+"384","4.35.20400","December 2022",da+"7/Dec2022/kobo-update-4.35.20400.zip","9455f4584a5988d4362f6fd27b634042"],
884 | [dh+"8",dd+"387","4.35.20400","December 2022",da+"8/Dec2022/kobo-update-4.35.20400.zip","ebbcaf4c9b721c6adee87ae77657b272"],
885 | [dh+"8",dd+"383","4.35.20400","December 2022",da+"8/Dec2022/kobo-update-4.35.20400.zip","ebbcaf4c9b721c6adee87ae77657b272"],
886 | [dh+"9",dd+"388","4.35.20400","December 2022",da+"9/Dec2022/kobo-update-4.35.20400.zip","b3aa426aba75de106f7fd4fd06bd5de0"],
887 | [dh+"10",dd+"386","4.35.20400","December 2022",da+"10/Dec2022/kobo-update-4.35.20400.zip","b8f76146e47413177168271d3439b3dc"],
888 | [dh+"11",dd+"389","4.36.21095","April 2023",da+"11/Apr2023/kobo-update-4.36.21095.zip","540d5db1b0878430dcbad0554c024ce5"],
889 | [dh+"3",dd+"310","4.37.21533","June 2023",da+"3/Jun2023/kobo-update-4.37.21533.zip","5ca26ba46a60d5eeac81cb4586913f72"],
890 | [dh+"4",dd+"320","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"],
891 | [dh+"4",dd+"330","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"],
892 | [dh+"4",dd+"350","4.37.21533","June 2023",da+"4/Jun2023/kobo-update-4.37.21533.zip","e66cf22d18a6fed3cb7496ac19925dda"],
893 | [dh+"5",dd+"360","4.37.21533","June 2023",da+"5/Jun2023/kobo-update-4.37.21533.zip","1b4d14823f09b4d4fb18e8407d16a815"],
894 | [dh+"5",dd+"370","4.37.21533","June 2023",da+"5/Jun2023/kobo-update-4.37.21533.zip","1b4d14823f09b4d4fb18e8407d16a815"],
895 | [dh+"6",dd+"371","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
896 | [dh+"6",dd+"372","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
897 | [dh+"6",dd+"373","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
898 | [dh+"6",dd+"374","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
899 | [dh+"6",dd+"375","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
900 | [dh+"7",dd+"376","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
901 | [dh+"7",dd+"378","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
902 | [dh+"7",dd+"379","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
903 | [dh+"7",dd+"380","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
904 | [dh+"6",dd+"381","4.37.21533","June 2023",da+"6/Jun2023/kobo-update-4.37.21533.zip","bff2c6f079f315726948f68df8d9d183"],
905 | [dh+"7",dd+"382","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
906 | [dh+"7",dd+"384","4.37.21533","June 2023",da+"7/Jun2023/kobo-update-4.37.21533.zip","0523941074761b9af46806882305609a"],
907 | [dh+"8",dd+"387","4.37.21533","June 2023",da+"8/Jun2023/kobo-update-4.37.21533.zip","7870a60cf6d03030a52cebddb70fc946"],
908 | [dh+"8",dd+"383","4.37.21533","June 2023",da+"8/Jun2023/kobo-update-4.37.21533.zip","7870a60cf6d03030a52cebddb70fc946"],
909 | [dh+"9",dd+"388","4.37.21533","June 2023",da+"9/Jun2023/kobo-update-4.37.21533.zip","302219cc121df3bd353eb4b53dce1f04"],
910 | [dh+"10",dd+"386","4.37.21533","June 2023",da+"10/Jun2023/kobo-update-4.37.21533.zip","f81f1ebb26cd566c6f27ae73ffaa5c5d"],
911 | [dh+"11",dd+"389","4.37.21533","June 2023",da+"11/Jun2023/kobo-update-4.37.21533.zip","df5ea93f5536ca5e4633e1850d97e747"],
912 | [dh+"3",dd+"310","4.37.21582","July 2023",da+"3/Jul2023/kobo-update-4.37.21582.zip","411509baad75cf287ebb2398fadb9331"],
913 | [dh+"4",dd+"320","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"],
914 | [dh+"4",dd+"330","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"],
915 | [dh+"4",dd+"350","4.37.21582","July 2023",da+"4/Jul2023/kobo-update-4.37.21582.zip","d782707eca0c169cb9f24f9662e5bc87"],
916 | [dh+"5",dd+"360","4.37.21582","July 2023",da+"5/Jul2023/kobo-update-4.37.21582.zip","c043bad65f10f365ef725c79039b328e"],
917 | [dh+"5",dd+"370","4.37.21582","July 2023",da+"5/Jul2023/kobo-update-4.37.21582.zip","c043bad65f10f365ef725c79039b328e"],
918 | [dh+"6",dd+"371","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
919 | [dh+"6",dd+"372","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
920 | [dh+"6",dd+"373","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
921 | [dh+"6",dd+"374","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
922 | [dh+"6",dd+"375","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
923 | [dh+"7",dd+"376","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
924 | [dh+"7",dd+"378","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
925 | [dh+"7",dd+"379","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
926 | [dh+"7",dd+"380","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
927 | [dh+"6",dd+"381","4.37.21582","July 2023",da+"6/Jul2023/kobo-update-4.37.21582.zip","76f954f90f4e4476ea15354111c99936"],
928 | [dh+"7",dd+"382","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
929 | [dh+"7",dd+"384","4.37.21582","July 2023",da+"7/Jul2023/kobo-update-4.37.21582.zip","af67b725a8a5c4e54e82697e59b7e933"],
930 | [dh+"8",dd+"387","4.37.21582","July 2023",da+"8/Jul2023/kobo-update-4.37.21582.zip","4941484508946b0d860f5b139fd491a1"],
931 | [dh+"8",dd+"383","4.37.21582","July 2023",da+"8/Jul2023/kobo-update-4.37.21582.zip","4941484508946b0d860f5b139fd491a1"],
932 | [dh+"9",dd+"388","4.37.21582","July 2023",da+"9/Jul2023/kobo-update-4.37.21582.zip","6b5a918391feffc9ec6583b21a376023"],
933 | [dh+"10",dd+"386","4.37.21582","July 2023",da+"10/Jul2023/kobo-update-4.37.21582.zip","21aea4804cfe5e9a393e8180a33d93dd"],
934 | [dh+"11",dd+"389","4.37.21582","July 2023",da+"11/Jul2023/kobo-update-4.37.21582.zip","d226931efa2626c2bdd07ca85fbb91be"],
935 | [dh+"3",dd+"310","4.37.21586","July 2023",da+"3/Jul2023/kobo-update-4.37.21586.zip","1f658d22a00caa5a6418191f1ee037a9"],
936 | [dh+"4",dd+"320","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"],
937 | [dh+"4",dd+"330","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"],
938 | [dh+"4",dd+"350","4.37.21586","July 2023",da+"4/Jul2023/kobo-update-4.37.21586.zip","37261dff022bc4a409b0d4d1e7f7af84"],
939 | [dh+"5",dd+"360","4.37.21586","July 2023",da+"5/Jul2023/kobo-update-4.37.21586.zip","c02750c7276a1a7d57bf12d9ce5e34ae"],
940 | [dh+"5",dd+"370","4.37.21586","July 2023",da+"5/Jul2023/kobo-update-4.37.21586.zip","c02750c7276a1a7d57bf12d9ce5e34ae"],
941 | [dh+"6",dd+"371","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
942 | [dh+"6",dd+"372","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
943 | [dh+"6",dd+"373","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
944 | [dh+"6",dd+"374","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
945 | [dh+"6",dd+"375","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
946 | [dh+"7",dd+"376","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
947 | [dh+"7",dd+"378","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
948 | [dh+"7",dd+"379","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
949 | [dh+"7",dd+"380","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
950 | [dh+"6",dd+"381","4.37.21586","July 2023",da+"6/Jul2023/kobo-update-4.37.21586.zip","334e0895fcca6ac7e4238f601808130d"],
951 | [dh+"7",dd+"382","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
952 | [dh+"7",dd+"384","4.37.21586","July 2023",da+"7/Jul2023/kobo-update-4.37.21586.zip","4a432e530b8135507d0177afbaa122da"],
953 | [dh+"8",dd+"387","4.37.21586","July 2023",da+"8/Jul2023/kobo-update-4.37.21586.zip","4834cf3a0da8c4b974e41f934ffbece2"],
954 | [dh+"8",dd+"383","4.37.21586","July 2023",da+"8/Jul2023/kobo-update-4.37.21586.zip","4834cf3a0da8c4b974e41f934ffbece2"],
955 | [dh+"9",dd+"388","4.37.21586","July 2023",da+"9/Jul2023/kobo-update-4.37.21586.zip","1717e8c63ea3cb08515537f0f70b251e"],
956 | [dh+"10",dd+"386","4.37.21586","July 2023",da+"10/Jul2023/kobo-update-4.37.21586.zip","9796a102222370de48919cc9d95f8265"],
957 | [dh+"11",dd+"389","4.37.21586","July 2023",da+"11/Jul2023/kobo-update-4.37.21586.zip","0ec8c092b74fe9a0c0d9f151b32f6da4"],
958 | [dh+"3",dd+"310","4.38.21908","August 2023",da+"3/Aug2023/kobo-update-4.38.21908.zip","8886847097768d7aef7af66a0a0c3fba"],
959 | [dh+"4",dd+"320","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"],
960 | [dh+"4",dd+"330","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"],
961 | [dh+"4",dd+"350","4.38.21908","August 2023",da+"4/Aug2023/kobo-update-4.38.21908.zip","4da0b0c244f57cde70ee6f6b28580423"],
962 | [dh+"5",dd+"360","4.38.21908","August 2023",da+"5/Aug2023/kobo-update-4.38.21908.zip","c60058996b024a7650bb1db57e89f849"],
963 | [dh+"5",dd+"370","4.38.21908","August 2023",da+"5/Aug2023/kobo-update-4.38.21908.zip","c60058996b024a7650bb1db57e89f849"],
964 | [dh+"6",dd+"371","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
965 | [dh+"6",dd+"372","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
966 | [dh+"6",dd+"373","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
967 | [dh+"6",dd+"374","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
968 | [dh+"6",dd+"375","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
969 | [dh+"7",dd+"376","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
970 | [dh+"7",dd+"378","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
971 | [dh+"7",dd+"379","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
972 | [dh+"7",dd+"380","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
973 | [dh+"6",dd+"381","4.38.21908","August 2023",da+"6/Aug2023/kobo-update-4.38.21908.zip","31dbcb719fd4d36baa91b81044050075"],
974 | [dh+"7",dd+"382","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
975 | [dh+"7",dd+"384","4.38.21908","August 2023",da+"7/Aug2023/kobo-update-4.38.21908.zip","4b48ea495a7873190bf6b10d2c8aed6a"],
976 | [dh+"8",dd+"387","4.38.21908","August 2023",da+"8/Aug2023/kobo-update-4.38.21908.zip","2d730e993413e2b0d700ad84e9154e13"],
977 | [dh+"8",dd+"383","4.38.21908","August 2023",da+"8/Aug2023/kobo-update-4.38.21908.zip","2d730e993413e2b0d700ad84e9154e13"],
978 | [dh+"9",dd+"388","4.38.21908","August 2023",da+"9/Aug2023/kobo-update-4.38.21908.zip","d6dffacfa241849dddcdb25e38885f75"],
979 | [dh+"10",dd+"386","4.38.21908","August 2023",da+"10/Aug2023/kobo-update-4.38.21908.zip","2b907f92fee626d6ee61df7046a98ee7"],
980 | [dh+"11",dd+"389","4.38.21908","August 2023",da+"11/Aug2023/kobo-update-4.38.21908.zip","89d5c7937974d61d15739738328533e4"],
981 | [dh+"11",dd+"390","4.39.22801","April 2024",da+"11/Apr2024/kobo-update-4.39.22801.zip","898d850f0410de35816adf0a4d9c2660"],
982 | [dh+"12",dd+"391","4.39.22801","April 2024",da+"12/Apr2024/kobo-update-4.39.22801.zip","f37e257ac23fdcc76167c033f16ec358"],
983 | [dh+"12",dd+"393","4.39.22801","April 2024",da+"12/Apr2024/kobo-update-4.39.22801.zip","f37e257ac23fdcc76167c033f16ec358"],
984 | [dh+"11",dd+"390","4.39.22861","April 2024",da+"11/Apr2024/kobo-update-4.39.22861.zip","0848a1678163c1a24478225a1a95755c"],
985 | [dh+"12",dd+"391","4.39.22861","April 2024",da+"12/Apr2024/kobo-update-4.39.22861.zip","008e9acbaf5a55a15d4b7abd8db4a6e8"],
986 | [dh+"12",dd+"393","4.39.22861","April 2024",da+"12/Apr2024/kobo-update-4.39.22861.zip","008e9acbaf5a55a15d4b7abd8db4a6e8"],
987 | [dh+"3",dd+"310","4.38.23038","June 2024",da+"3/Jun2024/kobo-update-4.38.23038.zip","28c82d823cb8f760e2ef57ef5145eff6"],
988 | [dh+"4",dd+"320","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"],
989 | [dh+"4",dd+"330","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"],
990 | [dh+"6",dd+"371","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
991 | [dh+"6",dd+"372","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
992 | [dh+"5",dd+"360","4.38.23038","June 2024",da+"5/Jun2024/kobo-update-4.38.23038.zip","1d9968f2ac60ace675466189a9f34930"],
993 | [dh+"4",dd+"350","4.38.23038","June 2024",da+"4/Jun2024/kobo-update-4.38.23038.zip","6a5a434c5a918604b10253cb5daba49a"],
994 | [dh+"5",dd+"370","4.38.23038","June 2024",da+"5/Jun2024/kobo-update-4.38.23038.zip","1d9968f2ac60ace675466189a9f34930"],
995 | [dh+"6",dd+"374","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
996 | [dh+"7",dd+"378","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
997 | [dh+"6",dd+"373","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
998 | [dh+"6",dd+"381","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
999 | [dh+"6",dd+"375","4.38.23038","June 2024",da+"6/Jun2024/kobo-update-4.38.23038.zip","d2d910d2eb0e0cf5e8e8ef87eae5d80d"],
1000 | [dh+"7",dd+"379","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
1001 | [dh+"7",dd+"382","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
1002 | [dh+"7",dd+"376","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
1003 | [dh+"7",dd+"380","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
1004 | [dh+"7",dd+"384","4.38.23038","June 2024",da+"7/Jun2024/kobo-update-4.38.23038.zip","23b710bd8b95d60be35a7456144ba85f"],
1005 | [dh+"8",dd+"387","4.38.23038","June 2024",da+"8/Jun2024/kobo-update-4.38.23038.zip","38df7247ef1da3030596dd29dc5b13a3"],
1006 | [dh+"8",dd+"383","4.38.23038","June 2024",da+"8/Jun2024/kobo-update-4.38.23038.zip","38df7247ef1da3030596dd29dc5b13a3"],
1007 | [dh+"9",dd+"388","4.38.23038","June 2024",da+"9/Jun2024/kobo-update-4.38.23038.zip","19cf00bdaba6b109e227eea03f75cfe3"],
1008 | [dh+"10",dd+"386","4.38.23038","June 2024",da+"10/Jun2024/kobo-update-4.38.23038.zip","686fef0582a49b8b4d9fbc6be346aa31"],
1009 | [dh+"11",dd+"389","4.38.23038","June 2024",da+"11/Jun2024/kobo-update-4.38.23038.zip","0c8fa70e7f0bcc186b86bb976c5824d2"],
1010 | [dh+"13",dd+"390","4.39.23027","June 2024",da+"13/Jun2024/kobo-update-4.39.23027.zip","f86d76f0023239901e0b1588c73d7a0f"],
1011 | [dh+"12",dd+"391","4.39.23027","June 2024",da+"12/Jun2024/kobo-update-4.39.23027.zip","3418bd784985783da57e86b40b111511"],
1012 | [dh+"12",dd+"393","4.39.23027","June 2024",da+"12/Jun2024/kobo-update-4.39.23027.zip","3418bd784985783da57e86b40b111511"],
1013 | [dh+"13",dd+"390","4.40.23081","August 2024",da+"13/Aug2024/kobo-update-4.40.23081.zip","2133d24ed5afc95fbc0351d06a76373e"],
1014 | [dh+"12",dd+"391","4.40.23081","August 2024",da+"12/Aug2024/kobo-update-4.40.23081.zip","323f454c629a0d52dbbc2a729f6caa1a"],
1015 | [dh+"12",dd+"393","4.40.23081","August 2024",da+"12/Aug2024/kobo-update-4.40.23081.zip","323f454c629a0d52dbbc2a729f6caa1a"],
1016 | [dh+"13",dd+"390","4.41.23145","October 2024",da+"13/Oct2024/kobo-update-4.41.23145.zip","8db87b3d27fc274eb07036345877db74"],
1017 | [dh+"12",dd+"391","4.41.23145","October 2024",da+"12/Oct2024/kobo-update-4.41.23145.zip","9fadf60b9e8b4e1938a4b1b54a3d4cec"],
1018 | [dh+"12",dd+"393","4.41.23145","October 2024",da+"12/Oct2024/kobo-update-4.41.23145.zip","9fadf60b9e8b4e1938a4b1b54a3d4cec"],
1019 | [dh+"3",dd+"310","4.38.23171","October 2024",da+"3/Oct2024/kobo-update-4.38.23171.zip","c6fe1bca82a342bbfb3897e4e65514aa"],
1020 | [dh+"4",dd+"320","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"],
1021 | [dh+"4",dd+"330","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"],
1022 | [dh+"6",dd+"371","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1023 | [dh+"6",dd+"372","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1024 | [dh+"5",dd+"360","4.38.23171","October 2024",da+"5/Oct2024/kobo-update-4.38.23171.zip","fa4ba6384aa1f00532c3a4310c35fe81"],
1025 | [dh+"4",dd+"350","4.38.23171","October 2024",da+"4/Oct2024/kobo-update-4.38.23171.zip","348ec3c050c7fb9d30dd2aa91dd329f9"],
1026 | [dh+"5",dd+"370","4.38.23171","October 2024",da+"5/Oct2024/kobo-update-4.38.23171.zip","fa4ba6384aa1f00532c3a4310c35fe81"],
1027 | [dh+"6",dd+"374","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1028 | [dh+"7",dd+"378","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1029 | [dh+"6",dd+"373","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1030 | [dh+"6",dd+"381","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1031 | [dh+"6",dd+"375","4.38.23171","October 2024",da+"6/Oct2024/kobo-update-4.38.23171.zip","370a67835a3d24832935dc5d36cfedd0"],
1032 | [dh+"7",dd+"379","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1033 | [dh+"7",dd+"382","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1034 | [dh+"7",dd+"376","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1035 | [dh+"7",dd+"380","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1036 | [dh+"7",dd+"384","4.38.23171","October 2024",da+"7/Oct2024/kobo-update-4.38.23171.zip","7a4f6a4fafd5434e1f62e3474e892162"],
1037 | [dh+"8",dd+"387","4.38.23171","October 2024",da+"8/Oct2024/kobo-update-4.38.23171.zip","a806a21c92812bd66170597f335925f9"],
1038 | [dh+"8",dd+"383","4.38.23171","October 2024",da+"8/Oct2024/kobo-update-4.38.23171.zip","a806a21c92812bd66170597f335925f9"],
1039 | [dh+"9",dd+"388","4.38.23171","October 2024",da+"9/Oct2024/kobo-update-4.38.23171.zip","1cd0d3a3bf0a01247680ddad017ca3ae"],
1040 | [dh+"10",dd+"386","4.38.23171","October 2024",da+"10/Oct2024/kobo-update-4.38.23171.zip","6c2ec94b88c4e8189f0a4c293d30386b"],
1041 | [dh+"11",dd+"389","4.38.23171","October 2024",da+"11/Oct2024/kobo-update-4.38.23171.zip","3fd93636086d302c8156b34f619acd25"],
1042 | [dh+"13",dd+"390","4.42.23296","May 2025",da+"13/May2025/kobo-update-4.42.23296.zip","dfebed1efc99faee5b49cb50604f2206"],
1043 | [dh+"12",dd+"391","4.42.23296","May 2025",da+"12/May2025/kobo-update-4.42.23296.zip","c695db481e0351999d3e677c0cce7cc6"],
1044 | [dh+"12",dd+"393","4.42.23296","May 2025",da+"12/May2025/kobo-update-4.42.23296.zip","c695db481e0351999d3e677c0cce7cc6"],
1045 | [dh+"3",dd+"310","4.38.23429","August 2025",da+"3/Aug2025/kobo-update-4.38.23429.zip","bad3e07aa9b45488cc7ca4e7a3754a51"],
1046 | [dh+"4",dd+"320","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"],
1047 | [dh+"4",dd+"330","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"],
1048 | [dh+"6",dd+"371","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"],
1049 | [dh+"6",dd+"372","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"],
1050 | [dh+"5",dd+"360","4.38.23429","August 2025",da+"5/Aug2025/kobo-update-4.38.23429.zip","880544ac0863b02172300b1b79c67e5c"],
1051 | [dh+"4",dd+"350","4.38.23429","August 2025",da+"4/Aug2025/kobo-update-4.38.23429.zip","b55c54f7dec9f776fa4cde4c5856b227"],
1052 | [dh+"5",dd+"370","4.38.23429","August 2025",da+"5/Aug2025/kobo-update-4.38.23429.zip","880544ac0863b02172300b1b79c67e5c"],
1053 | [dh+"6",dd+"373","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"],
1054 | [dh+"6",dd+"381","4.38.23429","August 2025",da+"6/Aug2025/kobo-update-4.38.23429.zip","506c19b727fd7f3265241da546659f7e"],
1055 | [dh+"7",dd+"382","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"],
1056 | [dh+"7",dd+"376","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"],
1057 | [dh+"7",dd+"380","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"],
1058 | [dh+"7",dd+"384","4.38.23429","August 2025",da+"7/Aug2025/kobo-update-4.38.23429.zip","504156e1043460a8021d5318d890d51e"],
1059 | [dh+"8",dd+"387","4.38.23429","August 2025",da+"8/Aug2025/kobo-update-4.38.23429.zip","aa651351165f45919f84b4cd374c1121"],
1060 | [dh+"8",dd+"383","4.38.23429","August 2025",da+"8/Aug2025/kobo-update-4.38.23429.zip","aa651351165f45919f84b4cd374c1121"],
1061 | [dh+"9",dd+"388","4.38.23429","August 2025",da+"9/Aug2025/kobo-update-4.38.23429.zip","2fef0a97c430cf84959b3b6be97ee0a7"],
1062 | [dh+"10",dd+"386","4.38.23429","August 2025",da+"10/Aug2025/kobo-update-4.38.23429.zip","a604d3a89022a4e52f07c0a317ff0d81"],
1063 | [dh+"11",dd+"389","4.38.23429","August 2025",da+"11/Aug2025/kobo-update-4.38.23429.zip","b2c8ddb1306d52037d5f5f3db8bb2de8"],
1064 | [dh+"13",dd+"390","4.43.23418","August 2025",da+"13/Aug2025/kobo-update-4.43.23418.zip","022bc0260b56d95e9ca2af5d2e287352"],
1065 | [dh+"12",dd+"391","4.43.23418","August 2025",da+"12/Aug2025/kobo-update-4.43.23418.zip","81128664146c3b3b241973c252436519"],
1066 | [dh+"12",dd+"393","4.43.23418","August 2025",da+"12/Aug2025/kobo-update-4.43.23418.zip","81128664146c3b3b241973c252436519"],
1067 | [dh+"8",dd+"387","4.38.23552","November 2025",da+"8/Nov2025/kobo-update-4.38.23552.zip","e63acc805362b3ecd07901135e7a92d4"],
1068 | [dh+"8",dd+"383","4.38.23552","November 2025",da+"8/Nov2025/kobo-update-4.38.23552.zip","e63acc805362b3ecd07901135e7a92d4"],
1069 | [dh+"9",dd+"388","4.38.23552","November 2025",da+"9/Nov2025/kobo-update-4.38.23552.zip","43c0d529289cacb4aa6c91e86096b6e4"],
1070 | [dh+"10",dd+"386","4.38.23552","November 2025",da+"10/Nov2025/kobo-update-4.38.23552.zip","852a81f0719b459b9eccef2fdb470b5f"],
1071 | [dh+"11",dd+"389","4.38.23552","November 2025",da+"11/Nov2025/kobo-update-4.38.23552.zip","5c01411d5b05cb7154a2464085cd09f9"],
1072 | [dh+"13",dd+"390","4.44.23552","November 2025",da+"13/Nov2025/kobo-update-4.44.23552.zip","648840df32495a29f135d7e387cdf197"],
1073 | [dh+"12",dd+"391","4.44.23552","November 2025",da+"12/Nov2025/kobo-update-4.44.23552.zip","ed95b9ee2a4dbb4536a6ce5742c993dc"],
1074 | [dh+"12",dd+"393","4.44.23552","November 2025",da+"12/Nov2025/kobo-update-4.44.23552.zip","ed95b9ee2a4dbb4536a6ce5742c993dc"],
1075 | ]}());
--------------------------------------------------------------------------------