From 8cc997763dc808a9bf8d827fd95414cf406ccfb3 Mon Sep 17 00:00:00 2001
From: exu
Date: Sun, 14 Apr 2024 17:19:52 +0200
Subject: [PATCH] Update Calibre config and plugins
---
.../.config/calibre/dynamic.pickle.json | 36 +-
.../.config/calibre/fonts/scanner_cache.json | 7544 ++++++++++-------
arch-config/.config/calibre/gui.json | 504 +-
arch-config/.config/calibre/gui.py.json | 5 +-
.../calibre/metadata-sources-cache.json | 24 +-
.../__pycache__/__init__.cpython-311.pyc | Bin 11562 -> 11562 bytes
.../__pycache__/_asn1.cpython-311.pyc | Bin 1852 -> 1852 bytes
.../__pycache__/_asymmetric.cpython-311.pyc | Bin 34182 -> 34182 bytes
.../__pycache__/_errors.cpython-311.pyc | Bin 1397 -> 1397 bytes
.../oscrypto/__pycache__/_ffi.cpython-311.pyc | Bin 18835 -> 18835 bytes
.../__pycache__/_rand.cpython-311.pyc | Bin 1629 -> 1629 bytes
.../__pycache__/_types.cpython-311.pyc | Bin 1592 -> 1592 bytes
.../__pycache__/asymmetric.cpython-311.pyc | Bin 13871 -> 13871 bytes
.../__pycache__/errors.cpython-311.pyc | Bin 4083 -> 4083 bytes
.../oscrypto/__pycache__/kdf.cpython-311.pyc | Bin 9730 -> 9730 bytes
.../oscrypto/__pycache__/keys.cpython-311.pyc | Bin 881 -> 881 bytes
.../__pycache__/symmetric.cpython-311.pyc | Bin 1556 -> 1556 bytes
.../oscrypto/__pycache__/util.cpython-311.pyc | Bin 2472 -> 2472 bytes
.../__pycache__/version.cpython-311.pyc | Bin 415 -> 415 bytes
.../__pycache__/__init__.cpython-311.pyc | Bin 196 -> 196 bytes
.../__pycache__/_libcrypto.cpython-311.pyc | Bin 4990 -> 4990 bytes
.../_libcrypto_cffi.cpython-311.pyc | Bin 11516 -> 11516 bytes
.../__pycache__/asymmetric.cpython-311.pyc | Bin 70662 -> 70662 bytes
.../__pycache__/symmetric.cpython-311.pyc | Bin 27426 -> 27426 bytes
.../_openssl/__pycache__/util.cpython-311.pyc | Bin 8204 -> 8204 bytes
.../.config/calibre/plugins/KFX Input.zip | Bin 2085213 -> 2379862 bytes
.../.config/calibre/save_to_disk.py.json | 15 +
.../.config/calibre/viewer-webengine.json | 10 +-
28 files changed, 5256 insertions(+), 2882 deletions(-)
create mode 100644 arch-config/.config/calibre/save_to_disk.py.json
diff --git a/arch-config/.config/calibre/dynamic.pickle.json b/arch-config/.config/calibre/dynamic.pickle.json
index 756caffd..cf1183d7 100644
--- a/arch-config/.config/calibre/dynamic.pickle.json
+++ b/arch-config/.config/calibre/dynamic.pickle.json
@@ -4,7 +4,7 @@
"Export ADE activation files": "/home/marc/Nextcloud/backups/adobe_account_backup_uuid_2d6cfbec-33fd-43ca-bcf9-e8b281114a17.zip",
"Export ADE keys": "/home/marc/Nextcloud/backups/adobe_uuid_2d6cfbec-33fd-43ca-bcf9-e8b281114a17.der",
"add a plugin dialog": "/home/marc/Downloads/DeDRM_tools_10.0.3",
- "add books dialog dir": "/home/marc/Downloads",
+ "add books dialog dir": "/home/exu/Nextcloud/Reading/books/Sanderson, Brandon/Oathbringer",
"add books dialog dir-last-used-filter-spec-all-files": false,
"choose calibre library": "/home/exu/.local/share/Calibre-Library",
"database location dialog": "/home/marc/Nextcloud/Books",
@@ -12,15 +12,39 @@
"notified-version-updates": {
"__class__": "set",
"__value__": [
- "5.24",
- "5.25",
"6.0",
- "5.28"
+ "5.28",
+ "5.24",
+ "5.25"
]
},
- "recursive book import root dir dialog": "/home/marc/Nextcloud/Books/Unterhaltung",
- "save to disk dialog": "/home/exu/Downloads",
+ "recursive book import root dir dialog": "/home/exu/Nextcloud/Reading/books",
+ "save to disk dialog": "/home/exu/Downloads/newBooks",
"sort_history": [
+ [
+ "authors",
+ true
+ ],
+ [
+ "series",
+ true
+ ],
+ [
+ "series",
+ false
+ ],
+ [
+ "series",
+ true
+ ],
+ [
+ "authors",
+ true
+ ],
+ [
+ "series",
+ true
+ ],
[
"timestamp",
false
diff --git a/arch-config/.config/calibre/fonts/scanner_cache.json b/arch-config/.config/calibre/fonts/scanner_cache.json
index 10d201bd..423b778e 100644
--- a/arch-config/.config/calibre/fonts/scanner_cache.json
+++ b/arch-config/.config/calibre/fonts/scanner_cache.json
@@ -1,5 +1,113 @@
{
"fonts": {
+ "/home/exu/.fonts/CustomTkinter_shapes_font.otf||3528:1703779424.157382": {
+ "family_name": "CustomTkinter_shapes_font",
+ "font-family": "CustomTkinter_shapes_font",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "CustomTkinter_shapes_font Regular",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": true,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "path": "/home/exu/.fonts/CustomTkinter_shapes_font.otf",
+ "preferred_family_name": "CustomTkinter_shapes_font",
+ "preferred_subfamily_name": "Regular",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/home/exu/.fonts/Roboto-Medium.ttf||168644:1703779424.157382": {
+ "family_name": "Roboto Medium",
+ "font-family": "Roboto Medium",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Roboto Medium",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "path": "/home/exu/.fonts/Roboto-Medium.ttf",
+ "preferred_family_name": "Roboto",
+ "preferred_subfamily_name": "Medium",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/home/exu/.fonts/Roboto-Regular.ttf||168260:1703779424.157382": {
+ "family_name": "Roboto",
+ "font-family": "Roboto",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Roboto",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "path": "/home/exu/.fonts/Roboto-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
"/usr/share/calibre/fonts/liberation/LiberationMono-Bold.ttf||307996:1633027421.0": {
"family_name": "Liberation Mono",
"font-family": "Liberation Mono",
@@ -432,7 +540,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/OTF/Font Awesome 6 Brands-Regular-400.otf||554744:1701447684.0": {
+ "/usr/share/fonts/OTF/Font Awesome 6 Brands-Regular-400.otf||557868:1712161894.0": {
"family_name": "Font Awesome 6 Brands Regular",
"font-family": "Font Awesome 6 Brands Regular",
"font-stretch": "normal",
@@ -468,7 +576,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/OTF/Font Awesome 6 Free-Regular-400.otf||189956:1701447684.0": {
+ "/usr/share/fonts/OTF/Font Awesome 6 Free-Regular-400.otf||189444:1712161894.0": {
"family_name": "Font Awesome 6 Free Regular",
"font-family": "Font Awesome 6 Free Regular",
"font-stretch": "normal",
@@ -504,7 +612,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/OTF/Font Awesome 6 Free-Solid-900.otf||1023996:1701447684.0": {
+ "/usr/share/fonts/OTF/Font Awesome 6 Free-Solid-900.otf||1025256:1712161894.0": {
"family_name": "Font Awesome 6 Free Solid",
"font-family": "Font Awesome 6 Free Solid",
"font-stretch": "normal",
@@ -828,6 +936,798 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
+ "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf||577192:1710752851.0": {
+ "family_name": "DejaVu Math TeX Gyre",
+ "font-family": "DejaVu Math TeX Gyre",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 12,
+ "full_name": "DejaVuMathTeXGyre-Regular",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf",
+ "preferred_family_name": "DejaVu Math TeX Gyre",
+ "preferred_subfamily_name": "Regular",
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf||708920:1710752851.0": {
+ "family_name": "DejaVu Sans",
+ "font-family": "DejaVu Sans",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 3,
+ 3,
+ 6,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Bold",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf||645600:1710752851.0": {
+ "family_name": "DejaVu Sans",
+ "font-family": "DejaVu Sans",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Bold Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 3,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Bold Oblique",
+ "subfamily_name": "Bold Oblique",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf||355824:1710752851.0": {
+ "family_name": "DejaVu Sans Light",
+ "font-family": "DejaVu Sans Light",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans ExtraLight",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 2,
+ 3,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "ExtraLight",
+ "subfamily_name": "ExtraLight",
+ "weight": 200,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf||637648:1710752851.0": {
+ "family_name": "DejaVu Sans",
+ "font-family": "DejaVu Sans",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 3,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Oblique",
+ "subfamily_name": "Oblique",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSans.ttf||759720:1710752851.0": {
+ "family_name": "DejaVu Sans",
+ "font-family": "DejaVu Sans",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 3,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSans.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Book",
+ "subfamily_name": "Book",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf||667844:1710752851.0": {
+ "family_name": "DejaVu Sans Condensed",
+ "font-family": "DejaVu Sans Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Condensed Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 6,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Condensed Bold",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf||614068:1710752851.0": {
+ "family_name": "DejaVu Sans Condensed",
+ "font-family": "DejaVu Sans Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Condensed Bold Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Condensed Bold Oblique",
+ "subfamily_name": "Bold Oblique",
+ "weight": 700,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf||601448:1710752851.0": {
+ "family_name": "DejaVu Sans Condensed",
+ "font-family": "DejaVu Sans Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Condensed Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Condensed Oblique",
+ "subfamily_name": "Oblique",
+ "weight": 400,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf||682828:1710752851.0": {
+ "family_name": "DejaVu Sans Condensed",
+ "font-family": "DejaVu Sans Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Condensed",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf",
+ "preferred_family_name": "DejaVu Sans",
+ "preferred_subfamily_name": "Condensed",
+ "subfamily_name": "Book",
+ "weight": 400,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf||334268:1710752851.0": {
+ "family_name": "DejaVu Sans Mono",
+ "font-family": "DejaVu Sans Mono",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Mono Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 7,
+ 9,
+ 3,
+ 6,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf||254960:1710752851.0": {
+ "family_name": "DejaVu Sans Mono",
+ "font-family": "DejaVu Sans Mono",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Mono Bold Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 7,
+ 9,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold Oblique",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf||253448:1710752851.0": {
+ "family_name": "DejaVu Sans Mono",
+ "font-family": "DejaVu Sans Mono",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Mono Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 9,
+ 3,
+ 3,
+ 4,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Oblique",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSansMono.ttf||343140:1710752851.0": {
+ "family_name": "DejaVu Sans Mono",
+ "font-family": "DejaVu Sans Mono",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Sans Mono",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 9,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSansMono.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Book",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf||356668:1710752851.0": {
+ "family_name": "DejaVu Serif",
+ "font-family": "DejaVu Serif",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 8,
+ 3,
+ 5,
+ 6,
+ 5,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Bold",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf||348020:1710752851.0": {
+ "family_name": "DejaVu Serif",
+ "font-family": "DejaVu Serif",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Bold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 8,
+ 3,
+ 5,
+ 3,
+ 5,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Bold Italic",
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf||346544:1710752851.0": {
+ "family_name": "DejaVu Serif",
+ "font-family": "DejaVu Serif",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 6,
+ 3,
+ 5,
+ 3,
+ 5,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Italic",
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerif.ttf||380660:1710752851.0": {
+ "family_name": "DejaVu Serif",
+ "font-family": "DejaVu Serif",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 6,
+ 3,
+ 5,
+ 6,
+ 5,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerif.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Book",
+ "subfamily_name": "Book",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf||331820:1710752851.0": {
+ "family_name": "DejaVu Serif Condensed",
+ "font-family": "DejaVu Serif Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Condensed Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 8,
+ 6,
+ 5,
+ 6,
+ 5,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Condensed Bold",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf||347076:1710752851.0": {
+ "family_name": "DejaVu Serif Condensed",
+ "font-family": "DejaVu Serif Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Condensed Bold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 8,
+ 6,
+ 5,
+ 3,
+ 5,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Condensed Bold Italic",
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf||345868:1710752851.0": {
+ "family_name": "DejaVu Serif Condensed",
+ "font-family": "DejaVu Serif Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Condensed Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 6,
+ 6,
+ 5,
+ 3,
+ 5,
+ 11,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Condensed Italic",
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf||347208:1710752851.0": {
+ "family_name": "DejaVu Serif Condensed",
+ "font-family": "DejaVu Serif Condensed",
+ "font-stretch": "semi-condensed",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "DejaVu Serif Condensed",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 1,
+ "panose": [
+ 2,
+ 6,
+ 6,
+ 6,
+ 5,
+ 6,
+ 5,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf",
+ "preferred_family_name": "DejaVu Serif",
+ "preferred_subfamily_name": "Condensed",
+ "subfamily_name": "Book",
+ "weight": 400,
+ "width": 4,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
"/usr/share/fonts/TTF/FiraCode-Bold.ttf||319368:1650723952.0": {
"family_name": "Fira Code",
"font-family": "Fira Code",
@@ -4680,6 +5580,1950 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
+ "/usr/share/fonts/TTF/Iosevka-Bold.ttf||9895104:1712429816.0": {
+ "family_name": "Iosevka",
+ "font-family": "Iosevka",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Bold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold"
+ },
+ "/usr/share/fonts/TTF/Iosevka-BoldItalic.ttf||10242352:1712429816.0": {
+ "family_name": "Iosevka",
+ "font-family": "Iosevka",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-BoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold Italic",
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-BoldOblique.ttf||10199120:1712429816.0": {
+ "family_name": "Iosevka Oblique",
+ "font-family": "Iosevka Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-BoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold Oblique",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Extended.ttf||9258832:1712429816.0": {
+ "family_name": "Iosevka Extended",
+ "font-family": "Iosevka Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Extended.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extended",
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedBold.ttf||9380700:1712429816.0": {
+ "family_name": "Iosevka Extended",
+ "font-family": "Iosevka Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold Extended",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold Extended",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedBoldItalic.ttf||9679192:1712429816.0": {
+ "family_name": "Iosevka Extended",
+ "font-family": "Iosevka Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold Extended Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold Extended Italic",
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedBoldOblique.ttf||9632748:1712429816.0": {
+ "family_name": "Iosevka Extended Oblique",
+ "font-family": "Iosevka Extended Oblique",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Iosevka Bold Extended Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 8,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Bold Extended Oblique",
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Bold Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBold.ttf||9395120:1712429816.0": {
+ "family_name": "Iosevka Extrabold Extended",
+ "font-family": "Iosevka Extrabold Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold Extended",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold Extended",
+ "subfamily_name": "Regular",
+ "weight": 800,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldItalic.ttf||9711624:1712429816.0": {
+ "family_name": "Iosevka Extrabold Extended",
+ "font-family": "Iosevka Extrabold Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold Extended Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 800,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldOblique.ttf||9664512:1712429816.0": {
+ "family_name": "Iosevka XBd Ex Obl",
+ "font-family": "Iosevka XBd Ex Obl",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold Extended Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 800,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLight.ttf||9201272:1712429816.0": {
+ "family_name": "Iosevka Extralight Extended",
+ "font-family": "Iosevka Extralight Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLight.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight Extended",
+ "subfamily_name": "Regular",
+ "weight": 200,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightItalic.ttf||9491184:1712429816.0": {
+ "family_name": "Iosevka Extralight Extended",
+ "font-family": "Iosevka Extralight Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 200,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightOblique.ttf||9445728:1712429816.0": {
+ "family_name": "Iosevka XLt Ex Obl",
+ "font-family": "Iosevka XLt Ex Obl",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 200,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedHeavy.ttf||9466084:1712429816.0": {
+ "family_name": "Iosevka Heavy Extended",
+ "font-family": "Iosevka Heavy Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy Extended",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavy.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy Extended",
+ "subfamily_name": "Regular",
+ "weight": 900,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyItalic.ttf||9704480:1712429816.0": {
+ "family_name": "Iosevka Heavy Extended",
+ "font-family": "Iosevka Heavy Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy Extended Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 900,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyOblique.ttf||9655472:1712429816.0": {
+ "family_name": "Iosevka Heavy Extended Oblique",
+ "font-family": "Iosevka Heavy Extended Oblique",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy Extended Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 900,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedItalic.ttf||9577888:1712429816.0": {
+ "family_name": "Iosevka Extended",
+ "font-family": "Iosevka Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedLight.ttf||9269096:1712429816.0": {
+ "family_name": "Iosevka Light Extended",
+ "font-family": "Iosevka Light Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLight.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light Extended",
+ "subfamily_name": "Regular",
+ "weight": 300,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedLightItalic.ttf||9591716:1712429816.0": {
+ "family_name": "Iosevka Light Extended",
+ "font-family": "Iosevka Light Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLightItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 300,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedLightOblique.ttf||9538784:1712429816.0": {
+ "family_name": "Iosevka Light Extended Oblique",
+ "font-family": "Iosevka Light Extended Oblique",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLightOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 300,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedMedium.ttf||9215848:1712429816.0": {
+ "family_name": "Iosevka Medium Extended",
+ "font-family": "Iosevka Medium Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMedium.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium Extended",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedMediumItalic.ttf||9593472:1712429816.0": {
+ "family_name": "Iosevka Medium Extended",
+ "font-family": "Iosevka Medium Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMediumItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 500,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedMediumOblique.ttf||9542408:1712429816.0": {
+ "family_name": "Iosevka Md Ex Obl",
+ "font-family": "Iosevka Md Ex Obl",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMediumOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedOblique.ttf||9524708:1712429816.0": {
+ "family_name": "Iosevka Extended Oblique",
+ "font-family": "Iosevka Extended Oblique",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBold.ttf||9338716:1712429816.0": {
+ "family_name": "Iosevka Semibold Extended",
+ "font-family": "Iosevka Semibold Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold Extended",
+ "subfamily_name": "Regular",
+ "weight": 600,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldItalic.ttf||9689968:1712429816.0": {
+ "family_name": "Iosevka Semibold Extended",
+ "font-family": "Iosevka Semibold Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 600,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldOblique.ttf||9638548:1712429816.0": {
+ "family_name": "Iosevka SmBd Ex Obl",
+ "font-family": "Iosevka SmBd Ex Obl",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 600,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedThin.ttf||9095976:1712429816.0": {
+ "family_name": "Iosevka Thin Extended",
+ "font-family": "Iosevka Thin Extended",
+ "font-stretch": "expanded",
+ "font-style": "normal",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin Extended",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThin.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin Extended",
+ "subfamily_name": "Regular",
+ "weight": 100,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin Extended"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedThinItalic.ttf||9373200:1712429816.0": {
+ "family_name": "Iosevka Thin Extended",
+ "font-family": "Iosevka Thin Extended",
+ "font-stretch": "expanded",
+ "font-style": "italic",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin Extended Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThinItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin Extended Italic",
+ "subfamily_name": "Italic",
+ "weight": 100,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin Extended Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtendedThinOblique.ttf||9325256:1712429816.0": {
+ "family_name": "Iosevka Thin Extended Oblique",
+ "font-family": "Iosevka Thin Extended Oblique",
+ "font-stretch": "expanded",
+ "font-style": "oblique",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin Extended Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThinOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin Extended Oblique",
+ "subfamily_name": "Regular",
+ "weight": 100,
+ "width": 7,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin Extended Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraBold.ttf||9973700:1712429816.0": {
+ "family_name": "Iosevka Extrabold",
+ "font-family": "Iosevka Extrabold",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraBold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold",
+ "subfamily_name": "Regular",
+ "weight": 800,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraBoldItalic.ttf||10274440:1712429816.0": {
+ "family_name": "Iosevka Extrabold",
+ "font-family": "Iosevka Extrabold",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraBoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold Italic",
+ "subfamily_name": "Italic",
+ "weight": 800,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraBoldOblique.ttf||10228788:1712429816.0": {
+ "family_name": "Iosevka Extrabold Oblique",
+ "font-family": "Iosevka Extrabold Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "800",
+ "fs_type": 0,
+ "full_name": "Iosevka Extrabold Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 9,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraBoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extrabold Oblique",
+ "subfamily_name": "Regular",
+ "weight": 800,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extrabold Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraLight.ttf||9593812:1712429816.0": {
+ "family_name": "Iosevka Extralight",
+ "font-family": "Iosevka Extralight",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraLight.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight",
+ "subfamily_name": "Regular",
+ "weight": 200,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraLightItalic.ttf||9900612:1712429816.0": {
+ "family_name": "Iosevka Extralight",
+ "font-family": "Iosevka Extralight",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraLightItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight Italic",
+ "subfamily_name": "Italic",
+ "weight": 200,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ExtraLightOblique.ttf||9856640:1712429816.0": {
+ "family_name": "Iosevka Extralight Oblique",
+ "font-family": "Iosevka Extralight Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "200",
+ "fs_type": 0,
+ "full_name": "Iosevka Extralight Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 3,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ExtraLightOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Extralight Oblique",
+ "subfamily_name": "Regular",
+ "weight": 200,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Extralight Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Heavy.ttf||9928412:1712429816.0": {
+ "family_name": "Iosevka Heavy",
+ "font-family": "Iosevka Heavy",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Heavy.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy",
+ "subfamily_name": "Regular",
+ "weight": 900,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy"
+ },
+ "/usr/share/fonts/TTF/Iosevka-HeavyItalic.ttf||10231688:1712429816.0": {
+ "family_name": "Iosevka Heavy",
+ "font-family": "Iosevka Heavy",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-HeavyItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy Italic",
+ "subfamily_name": "Italic",
+ "weight": 900,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-HeavyOblique.ttf||10187852:1712429816.0": {
+ "family_name": "Iosevka Heavy Oblique",
+ "font-family": "Iosevka Heavy Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "900",
+ "fs_type": 0,
+ "full_name": "Iosevka Heavy Oblique",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 10,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-HeavyOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Heavy Oblique",
+ "subfamily_name": "Regular",
+ "weight": 900,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Heavy Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Italic.ttf||10262408:1712429816.0": {
+ "family_name": "Iosevka",
+ "font-family": "Iosevka",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Italic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Italic",
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Light.ttf||9706712:1712429816.0": {
+ "family_name": "Iosevka Light",
+ "font-family": "Iosevka Light",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Light.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light",
+ "subfamily_name": "Regular",
+ "weight": 300,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light"
+ },
+ "/usr/share/fonts/TTF/Iosevka-LightItalic.ttf||10030860:1712429816.0": {
+ "family_name": "Iosevka Light",
+ "font-family": "Iosevka Light",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-LightItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light Italic",
+ "subfamily_name": "Italic",
+ "weight": 300,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-LightOblique.ttf||9980284:1712429816.0": {
+ "family_name": "Iosevka Light Oblique",
+ "font-family": "Iosevka Light Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "300",
+ "fs_type": 0,
+ "full_name": "Iosevka Light Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 4,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-LightOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Light Oblique",
+ "subfamily_name": "Regular",
+ "weight": 300,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Light Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Medium.ttf||9919256:1712429816.0": {
+ "family_name": "Iosevka Medium",
+ "font-family": "Iosevka Medium",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Medium.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium"
+ },
+ "/usr/share/fonts/TTF/Iosevka-MediumItalic.ttf||10271188:1712429816.0": {
+ "family_name": "Iosevka Medium",
+ "font-family": "Iosevka Medium",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-MediumItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium Italic",
+ "subfamily_name": "Italic",
+ "weight": 500,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-MediumOblique.ttf||10219100:1712429816.0": {
+ "family_name": "Iosevka Medium Oblique",
+ "font-family": "Iosevka Medium Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "500",
+ "fs_type": 0,
+ "full_name": "Iosevka Medium Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 6,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-MediumOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Medium Oblique",
+ "subfamily_name": "Regular",
+ "weight": 500,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Medium Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Oblique.ttf||10214472:1712429816.0": {
+ "family_name": "Iosevka Oblique",
+ "font-family": "Iosevka Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Oblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Oblique",
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Regular.ttf||9940724:1712429816.0": {
+ "family_name": "Iosevka",
+ "font-family": "Iosevka",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Iosevka",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 5,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Regular.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Regular",
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Regular"
+ },
+ "/usr/share/fonts/TTF/Iosevka-SemiBold.ttf||9898536:1712429816.0": {
+ "family_name": "Iosevka Semibold",
+ "font-family": "Iosevka Semibold",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-SemiBold.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold",
+ "subfamily_name": "Regular",
+ "weight": 600,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold"
+ },
+ "/usr/share/fonts/TTF/Iosevka-SemiBoldItalic.ttf||10292084:1712429816.0": {
+ "family_name": "Iosevka Semibold",
+ "font-family": "Iosevka Semibold",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-SemiBoldItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold Italic",
+ "subfamily_name": "Italic",
+ "weight": 600,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-SemiBoldOblique.ttf||10241500:1712429816.0": {
+ "family_name": "Iosevka Semibold Oblique",
+ "font-family": "Iosevka Semibold Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "600",
+ "fs_type": 0,
+ "full_name": "Iosevka Semibold Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 7,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-SemiBoldOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Semibold Oblique",
+ "subfamily_name": "Regular",
+ "weight": 600,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Semibold Oblique"
+ },
+ "/usr/share/fonts/TTF/Iosevka-Thin.ttf||9627760:1712429816.0": {
+ "family_name": "Iosevka Thin",
+ "font-family": "Iosevka Thin",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-Thin.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin",
+ "subfamily_name": "Regular",
+ "weight": 100,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ThinItalic.ttf||9926036:1712429816.0": {
+ "family_name": "Iosevka Thin",
+ "font-family": "Iosevka Thin",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ThinItalic.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin Italic",
+ "subfamily_name": "Italic",
+ "weight": 100,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin Italic"
+ },
+ "/usr/share/fonts/TTF/Iosevka-ThinOblique.ttf||9879476:1712429816.0": {
+ "family_name": "Iosevka Thin Oblique",
+ "font-family": "Iosevka Thin Oblique",
+ "font-stretch": "normal",
+ "font-style": "oblique",
+ "font-weight": "100",
+ "fs_type": 0,
+ "full_name": "Iosevka Thin Oblique",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": true,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 0,
+ 2,
+ 9,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 4
+ ],
+ "path": "/usr/share/fonts/TTF/Iosevka-ThinOblique.ttf",
+ "preferred_family_name": "Iosevka",
+ "preferred_subfamily_name": "Thin Oblique",
+ "subfamily_name": "Regular",
+ "weight": 100,
+ "width": 5,
+ "wws_family_name": "Iosevka",
+ "wws_subfamily_name": "Thin Oblique"
+ },
"/usr/share/fonts/TTF/Times.TTF||330412:1700237191.0": {
"family_name": "Times New Roman",
"font-family": "Times New Roman",
@@ -6084,1950 +8928,6 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/TTF/iosevka-bold.ttf||8955424:1700237156.0": {
- "family_name": "Iosevka",
- "font-family": "Iosevka",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-bold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold",
- "subfamily_name": "Bold",
- "weight": 700,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold"
- },
- "/usr/share/fonts/TTF/iosevka-bolditalic.ttf||9253204:1700237156.0": {
- "family_name": "Iosevka",
- "font-family": "Iosevka",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-bolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold Italic",
- "subfamily_name": "Bold Italic",
- "weight": 700,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold Italic"
- },
- "/usr/share/fonts/TTF/iosevka-boldoblique.ttf||9222768:1700237156.0": {
- "family_name": "Iosevka Oblique",
- "font-family": "Iosevka Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-boldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold Oblique",
- "subfamily_name": "Bold",
- "weight": 700,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extended.ttf||8429420:1700237156.0": {
- "family_name": "Iosevka Extended",
- "font-family": "Iosevka Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extended.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extended",
- "subfamily_name": "Regular",
- "weight": 400,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedbold.ttf||8506360:1700237156.0": {
- "family_name": "Iosevka Extended",
- "font-family": "Iosevka Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold Extended",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedbold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold Extended",
- "subfamily_name": "Bold",
- "weight": 700,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedbolditalic.ttf||8767616:1700237156.0": {
- "family_name": "Iosevka Extended",
- "font-family": "Iosevka Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold Extended Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedbolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold Extended Italic",
- "subfamily_name": "Bold Italic",
- "weight": 700,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedboldoblique.ttf||8733588:1700237156.0": {
- "family_name": "Iosevka Extended Oblique",
- "font-family": "Iosevka Extended Oblique",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Iosevka Bold Extended Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 8,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedboldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Bold Extended Oblique",
- "subfamily_name": "Bold",
- "weight": 700,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Bold Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextrabold.ttf||8520392:1700237156.0": {
- "family_name": "Iosevka Extrabold Extended",
- "font-family": "Iosevka Extrabold Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold Extended",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextrabold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold Extended",
- "subfamily_name": "Regular",
- "weight": 800,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextrabolditalic.ttf||8790360:1700237156.0": {
- "family_name": "Iosevka Extrabold Extended",
- "font-family": "Iosevka Extrabold Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold Extended Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextrabolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold Extended Italic",
- "subfamily_name": "Italic",
- "weight": 800,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextraboldoblique.ttf||8770356:1700237156.0": {
- "family_name": "Iosevka XBd Ex Obl",
- "font-family": "Iosevka XBd Ex Obl",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold Extended Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextraboldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 800,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextralight.ttf||8406124:1700237156.0": {
- "family_name": "Iosevka Extralight Extended",
- "font-family": "Iosevka Extralight Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextralight.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight Extended",
- "subfamily_name": "Regular",
- "weight": 200,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextralightitalic.ttf||8656528:1700237156.0": {
- "family_name": "Iosevka Extralight Extended",
- "font-family": "Iosevka Extralight Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextralightitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight Extended Italic",
- "subfamily_name": "Italic",
- "weight": 200,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedextralightoblique.ttf||8618720:1700237156.0": {
- "family_name": "Iosevka XLt Ex Obl",
- "font-family": "Iosevka XLt Ex Obl",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedextralightoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 200,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedheavy.ttf||8665584:1700237156.0": {
- "family_name": "Iosevka Heavy Extended",
- "font-family": "Iosevka Heavy Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy Extended",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedheavy.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy Extended",
- "subfamily_name": "Regular",
- "weight": 900,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedheavyitalic.ttf||8841984:1700237156.0": {
- "family_name": "Iosevka Heavy Extended",
- "font-family": "Iosevka Heavy Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy Extended Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedheavyitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy Extended Italic",
- "subfamily_name": "Italic",
- "weight": 900,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedheavyoblique.ttf||8806768:1700237156.0": {
- "family_name": "Iosevka Heavy Extended Oblique",
- "font-family": "Iosevka Heavy Extended Oblique",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy Extended Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedheavyoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 900,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendeditalic.ttf||8713792:1700237156.0": {
- "family_name": "Iosevka Extended",
- "font-family": "Iosevka Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendeditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extended Italic",
- "subfamily_name": "Italic",
- "weight": 400,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedlight.ttf||8450900:1700237156.0": {
- "family_name": "Iosevka Light Extended",
- "font-family": "Iosevka Light Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedlight.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light Extended",
- "subfamily_name": "Regular",
- "weight": 300,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedlightitalic.ttf||8703124:1700237156.0": {
- "family_name": "Iosevka Light Extended",
- "font-family": "Iosevka Light Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedlightitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light Extended Italic",
- "subfamily_name": "Italic",
- "weight": 300,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedlightoblique.ttf||8661844:1700237156.0": {
- "family_name": "Iosevka Light Extended Oblique",
- "font-family": "Iosevka Light Extended Oblique",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedlightoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 300,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedmedium.ttf||8378424:1700237156.0": {
- "family_name": "Iosevka Medium Extended",
- "font-family": "Iosevka Medium Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedmedium.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium Extended",
- "subfamily_name": "Regular",
- "weight": 500,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedmediumitalic.ttf||8700180:1700237156.0": {
- "family_name": "Iosevka Medium Extended",
- "font-family": "Iosevka Medium Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedmediumitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium Extended Italic",
- "subfamily_name": "Italic",
- "weight": 500,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedmediumoblique.ttf||8661976:1700237156.0": {
- "family_name": "Iosevka Md Ex Obl",
- "font-family": "Iosevka Md Ex Obl",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedmediumoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 500,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedoblique.ttf||8671816:1700237156.0": {
- "family_name": "Iosevka Extended Oblique",
- "font-family": "Iosevka Extended Oblique",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 400,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedsemibold.ttf||8492508:1700237156.0": {
- "family_name": "Iosevka Semibold Extended",
- "font-family": "Iosevka Semibold Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedsemibold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold Extended",
- "subfamily_name": "Regular",
- "weight": 600,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedsemibolditalic.ttf||8772988:1700237156.0": {
- "family_name": "Iosevka Semibold Extended",
- "font-family": "Iosevka Semibold Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedsemibolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold Extended Italic",
- "subfamily_name": "Italic",
- "weight": 600,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedsemiboldoblique.ttf||8734028:1700237156.0": {
- "family_name": "Iosevka SmBd Ex Obl",
- "font-family": "Iosevka SmBd Ex Obl",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedsemiboldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 600,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extendedthin.ttf||8307748:1700237156.0": {
- "family_name": "Iosevka Thin Extended",
- "font-family": "Iosevka Thin Extended",
- "font-stretch": "expanded",
- "font-style": "normal",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin Extended",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedthin.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin Extended",
- "subfamily_name": "Regular",
- "weight": 100,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin Extended"
- },
- "/usr/share/fonts/TTF/iosevka-extendedthinitalic.ttf||8506236:1700237156.0": {
- "family_name": "Iosevka Thin Extended",
- "font-family": "Iosevka Thin Extended",
- "font-stretch": "expanded",
- "font-style": "italic",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin Extended Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedthinitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin Extended Italic",
- "subfamily_name": "Italic",
- "weight": 100,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin Extended Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extendedthinoblique.ttf||8466788:1700237156.0": {
- "family_name": "Iosevka Thin Extended Oblique",
- "font-family": "Iosevka Thin Extended Oblique",
- "font-stretch": "expanded",
- "font-style": "oblique",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin Extended Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extendedthinoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin Extended Oblique",
- "subfamily_name": "Regular",
- "weight": 100,
- "width": 7,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin Extended Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extrabold.ttf||8987064:1700237156.0": {
- "family_name": "Iosevka Extrabold",
- "font-family": "Iosevka Extrabold",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extrabold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold",
- "subfamily_name": "Regular",
- "weight": 800,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold"
- },
- "/usr/share/fonts/TTF/iosevka-extrabolditalic.ttf||9292816:1700237156.0": {
- "family_name": "Iosevka Extrabold",
- "font-family": "Iosevka Extrabold",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extrabolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold Italic",
- "subfamily_name": "Italic",
- "weight": 800,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extraboldoblique.ttf||9274228:1700237156.0": {
- "family_name": "Iosevka Extrabold Oblique",
- "font-family": "Iosevka Extrabold Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "800",
- "fs_type": 0,
- "full_name": "Iosevka Extrabold Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 9,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extraboldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extrabold Oblique",
- "subfamily_name": "Regular",
- "weight": 800,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extrabold Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-extralight.ttf||8776092:1700237156.0": {
- "family_name": "Iosevka Extralight",
- "font-family": "Iosevka Extralight",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extralight.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight",
- "subfamily_name": "Regular",
- "weight": 200,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight"
- },
- "/usr/share/fonts/TTF/iosevka-extralightitalic.ttf||9045140:1700237156.0": {
- "family_name": "Iosevka Extralight",
- "font-family": "Iosevka Extralight",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extralightitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight Italic",
- "subfamily_name": "Italic",
- "weight": 200,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight Italic"
- },
- "/usr/share/fonts/TTF/iosevka-extralightoblique.ttf||9010472:1700237156.0": {
- "family_name": "Iosevka Extralight Oblique",
- "font-family": "Iosevka Extralight Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "200",
- "fs_type": 0,
- "full_name": "Iosevka Extralight Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 3,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-extralightoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Extralight Oblique",
- "subfamily_name": "Regular",
- "weight": 200,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Extralight Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-heavy.ttf||9030252:1700237156.0": {
- "family_name": "Iosevka Heavy",
- "font-family": "Iosevka Heavy",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-heavy.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy",
- "subfamily_name": "Regular",
- "weight": 900,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy"
- },
- "/usr/share/fonts/TTF/iosevka-heavyitalic.ttf||9279340:1700237156.0": {
- "family_name": "Iosevka Heavy",
- "font-family": "Iosevka Heavy",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy Italic",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-heavyitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy Italic",
- "subfamily_name": "Italic",
- "weight": 900,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy Italic"
- },
- "/usr/share/fonts/TTF/iosevka-heavyoblique.ttf||9263120:1700237156.0": {
- "family_name": "Iosevka Heavy Oblique",
- "font-family": "Iosevka Heavy Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Iosevka Heavy Oblique",
- "is_bold": true,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 10,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-heavyoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Heavy Oblique",
- "subfamily_name": "Regular",
- "weight": 900,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Heavy Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-italic.ttf||9242328:1700237156.0": {
- "family_name": "Iosevka",
- "font-family": "Iosevka",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-italic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Italic",
- "subfamily_name": "Italic",
- "weight": 400,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Italic"
- },
- "/usr/share/fonts/TTF/iosevka-light.ttf||8867824:1700237156.0": {
- "family_name": "Iosevka Light",
- "font-family": "Iosevka Light",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-light.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light",
- "subfamily_name": "Regular",
- "weight": 300,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light"
- },
- "/usr/share/fonts/TTF/iosevka-lightitalic.ttf||9157408:1700237156.0": {
- "family_name": "Iosevka Light",
- "font-family": "Iosevka Light",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-lightitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light Italic",
- "subfamily_name": "Italic",
- "weight": 300,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light Italic"
- },
- "/usr/share/fonts/TTF/iosevka-lightoblique.ttf||9118624:1700237156.0": {
- "family_name": "Iosevka Light Oblique",
- "font-family": "Iosevka Light Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Iosevka Light Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 4,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-lightoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Light Oblique",
- "subfamily_name": "Regular",
- "weight": 300,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Light Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-medium.ttf||8957732:1700237156.0": {
- "family_name": "Iosevka Medium",
- "font-family": "Iosevka Medium",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-medium.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium",
- "subfamily_name": "Regular",
- "weight": 500,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium"
- },
- "/usr/share/fonts/TTF/iosevka-mediumitalic.ttf||9243236:1700237156.0": {
- "family_name": "Iosevka Medium",
- "font-family": "Iosevka Medium",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-mediumitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium Italic",
- "subfamily_name": "Italic",
- "weight": 500,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium Italic"
- },
- "/usr/share/fonts/TTF/iosevka-mediumoblique.ttf||9205420:1700237156.0": {
- "family_name": "Iosevka Medium Oblique",
- "font-family": "Iosevka Medium Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Iosevka Medium Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 6,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-mediumoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Medium Oblique",
- "subfamily_name": "Regular",
- "weight": 500,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Medium Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-oblique.ttf||9206288:1700237156.0": {
- "family_name": "Iosevka Oblique",
- "font-family": "Iosevka Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-oblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Oblique",
- "subfamily_name": "Regular",
- "weight": 400,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-regular.ttf||8976284:1700237156.0": {
- "family_name": "Iosevka",
- "font-family": "Iosevka",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Iosevka",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 5,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-regular.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Regular",
- "subfamily_name": "Regular",
- "weight": 400,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Regular"
- },
- "/usr/share/fonts/TTF/iosevka-semibold.ttf||8981540:1700237156.0": {
- "family_name": "Iosevka Semibold",
- "font-family": "Iosevka Semibold",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-semibold.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold",
- "subfamily_name": "Regular",
- "weight": 600,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold"
- },
- "/usr/share/fonts/TTF/iosevka-semibolditalic.ttf||9263188:1700237156.0": {
- "family_name": "Iosevka Semibold",
- "font-family": "Iosevka Semibold",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-semibolditalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold Italic",
- "subfamily_name": "Italic",
- "weight": 600,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold Italic"
- },
- "/usr/share/fonts/TTF/iosevka-semiboldoblique.ttf||9227048:1700237156.0": {
- "family_name": "Iosevka Semibold Oblique",
- "font-family": "Iosevka Semibold Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "600",
- "fs_type": 0,
- "full_name": "Iosevka Semibold Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 7,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-semiboldoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Semibold Oblique",
- "subfamily_name": "Regular",
- "weight": 600,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Semibold Oblique"
- },
- "/usr/share/fonts/TTF/iosevka-thin.ttf||8775692:1700237156.0": {
- "family_name": "Iosevka Thin",
- "font-family": "Iosevka Thin",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-thin.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin",
- "subfamily_name": "Regular",
- "weight": 100,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin"
- },
- "/usr/share/fonts/TTF/iosevka-thinitalic.ttf||9012312:1700237156.0": {
- "family_name": "Iosevka Thin",
- "font-family": "Iosevka Thin",
- "font-stretch": "normal",
- "font-style": "italic",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin Italic",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-thinitalic.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin Italic",
- "subfamily_name": "Italic",
- "weight": 100,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin Italic"
- },
- "/usr/share/fonts/TTF/iosevka-thinoblique.ttf||8976396:1700237156.0": {
- "family_name": "Iosevka Thin Oblique",
- "font-family": "Iosevka Thin Oblique",
- "font-stretch": "normal",
- "font-style": "oblique",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Iosevka Thin Oblique",
- "is_bold": false,
- "is_italic": true,
- "is_oblique": true,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 0,
- 2,
- 9,
- 3,
- 0,
- 0,
- 0,
- 0,
- 4
- ],
- "path": "/usr/share/fonts/TTF/iosevka-thinoblique.ttf",
- "preferred_family_name": "Iosevka",
- "preferred_subfamily_name": "Thin Oblique",
- "subfamily_name": "Regular",
- "weight": 100,
- "width": 5,
- "wws_family_name": "Iosevka",
- "wws_subfamily_name": "Thin Oblique"
- },
"/usr/share/fonts/TTF/trebuc.ttf||126796:1700237191.0": {
"family_name": "Trebuchet MS",
"font-family": "Trebuchet MS",
@@ -8748,6 +9648,1122 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
+ "/usr/share/fonts/carlito/Carlito-Bold.ttf||682468:1684059993.0": {
+ "family_name": "Carlito",
+ "font-family": "Carlito",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Carlito Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 15,
+ 5,
+ 2,
+ 2,
+ 2,
+ 4,
+ 3,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/carlito/Carlito-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/carlito/Carlito-BoldItalic.ttf||808508:1684059993.0": {
+ "family_name": "Carlito",
+ "font-family": "Carlito",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 0,
+ "full_name": "Carlito Bold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 15,
+ 5,
+ 2,
+ 2,
+ 2,
+ 4,
+ 3,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/carlito/Carlito-BoldItalic.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/carlito/Carlito-Italic.ttf||615236:1684059993.0": {
+ "family_name": "Carlito",
+ "font-family": "Carlito",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Carlito Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 15,
+ 5,
+ 2,
+ 2,
+ 2,
+ 4,
+ 3,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/carlito/Carlito-Italic.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/carlito/Carlito-Regular.ttf||628032:1684059993.0": {
+ "family_name": "Carlito",
+ "font-family": "Carlito",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Carlito Regular",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 15,
+ 5,
+ 2,
+ 2,
+ 2,
+ 4,
+ 3,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/carlito/Carlito-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidKufi-Bold.ttf||81220:1616720154.0": {
+ "family_name": "Droid Arabic Kufi",
+ "font-family": "Droid Arabic Kufi",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Arabic Kufi Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidKufi-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidKufi-Regular.ttf||81224:1616720154.0": {
+ "family_name": "Droid Arabic Kufi",
+ "font-family": "Droid Arabic Kufi",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Arabic Kufi",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidKufi-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidNaskh-Bold.ttf||94620:1616720154.0": {
+ "family_name": "Droid Arabic Naskh",
+ "font-family": "Droid Arabic Naskh",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Arabic Naskh Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidNaskh-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidNaskh-Regular-SystemUI.ttf||158148:1616720154.0": {
+ "family_name": "Droid Naskh Shift Alt",
+ "font-family": "Droid Naskh Shift Alt",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Naskh Shift Alt",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidNaskh-Regular-SystemUI.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidNaskh-Regular.ttf||91340:1616720154.0": {
+ "family_name": "Droid Arabic Naskh",
+ "font-family": "Droid Arabic Naskh",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Arabic Naskh",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidNaskh-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSans-Bold.ttf||194488:1616720154.0": {
+ "family_name": "Droid Sans",
+ "font-family": "Droid Sans",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Sans Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSans-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSans.ttf||190776:1616720154.0": {
+ "family_name": "Droid Sans",
+ "font-family": "Droid Sans",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSans.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansArabic.ttf||35880:1616720154.0": {
+ "family_name": "Droid Sans Arabic",
+ "font-family": "Droid Sans Arabic",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Arabic",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 0,
+ 3,
+ 5,
+ 0,
+ 5,
+ 0,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansArabic.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansArmenian.ttf||13856:1616720154.0": {
+ "family_name": "Droid Sans Armenian",
+ "font-family": "Droid Sans Armenian",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Armenian",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansArmenian.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansDevanagari-Regular.ttf||123372:1616720154.0": {
+ "family_name": "Droid Sans Devanagari",
+ "font-family": "Droid Sans Devanagari",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Devanagari",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansDevanagari-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansEthiopic-Bold.ttf||222592:1616720154.0": {
+ "family_name": "Droid Sans Ethiopic",
+ "font-family": "Droid Sans Ethiopic",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Sans Ethiopic Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansEthiopic-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansEthiopic-Regular.ttf||227928:1616720154.0": {
+ "family_name": "Droid Sans Ethiopic",
+ "font-family": "Droid Sans Ethiopic",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Ethiopic",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansEthiopic-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansFallback.ttf||3838696:1616720154.0": {
+ "family_name": "Droid Sans Fallback",
+ "font-family": "Droid Sans Fallback",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Fallback",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 5,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansFallback.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansFallbackFull.ttf||5398328:1616720154.0": {
+ "family_name": "Droid Sans Fallback",
+ "font-family": "Droid Sans Fallback",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Fallback",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 5,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansFallbackFull.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansFallbackLegacy.ttf||3081908:1616720154.0": {
+ "family_name": "Droid Sans Fallback",
+ "font-family": "Droid Sans Fallback",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Fallback",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 5,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansFallbackLegacy.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansGeorgian.ttf||21096:1616720154.0": {
+ "family_name": "Droid Sans Georgian",
+ "font-family": "Droid Sans Georgian",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Georgian",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansGeorgian.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansHebrew-Bold.ttf||30280:1616720154.0": {
+ "family_name": "Droid Sans Hebrew",
+ "font-family": "Droid Sans Hebrew",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "600",
+ "fs_type": 8,
+ "full_name": "Droid Sans Hebrew Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 0,
+ 3,
+ 5,
+ 0,
+ 5,
+ 0,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansHebrew-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 600,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansHebrew-Regular.ttf||30024:1616720154.0": {
+ "family_name": "Droid Sans Hebrew",
+ "font-family": "Droid Sans Hebrew",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Hebrew",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 0,
+ 3,
+ 5,
+ 0,
+ 5,
+ 0,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansHebrew-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansJapanese.ttf||1173140:1616720154.0": {
+ "family_name": "Droid Sans Japanese",
+ "font-family": "Droid Sans Japanese",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Japanese",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 5,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansJapanese.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansMono.ttf||119380:1616720154.0": {
+ "family_name": "Droid Sans Mono",
+ "font-family": "Droid Sans Mono",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Mono",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 9,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansMono.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansTamil-Bold.ttf||36448:1616720154.0": {
+ "family_name": "Droid Sans Tamil",
+ "font-family": "Droid Sans Tamil",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Sans Tamil Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 8,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansTamil-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansTamil-Regular.ttf||36308:1616720154.0": {
+ "family_name": "Droid Sans Tamil",
+ "font-family": "Droid Sans Tamil",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Tamil",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansTamil-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSansThai.ttf||35584:1616720154.0": {
+ "family_name": "Droid Sans Thai",
+ "font-family": "Droid Sans Thai",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Sans Thai",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 11,
+ 6,
+ 6,
+ 3,
+ 8,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/droid/DroidSansThai.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSerif-Bold.ttf||185228:1616720154.0": {
+ "family_name": "Droid Serif",
+ "font-family": "Droid Serif",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Serif Bold",
+ "is_bold": true,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 2,
+ 8,
+ 0,
+ 6,
+ 5,
+ 0,
+ 2,
+ 2,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSerif-Bold.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSerif-BoldItalic.ttf||190304:1616720154.0": {
+ "family_name": "Droid Serif",
+ "font-family": "Droid Serif",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "bold",
+ "fs_type": 8,
+ "full_name": "Droid Serif Bold Italic",
+ "is_bold": true,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 2,
+ 8,
+ 0,
+ 6,
+ 5,
+ 0,
+ 9,
+ 2,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSerif-BoldItalic.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Bold Italic",
+ "weight": 700,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSerif-Italic.ttf||177560:1616720154.0": {
+ "family_name": "Droid Serif",
+ "font-family": "Droid Serif",
+ "font-stretch": "normal",
+ "font-style": "italic",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Serif Italic",
+ "is_bold": false,
+ "is_italic": true,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": false,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 2,
+ 6,
+ 0,
+ 6,
+ 5,
+ 0,
+ 9,
+ 2,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSerif-Italic.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Italic",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/droid/DroidSerif-Regular.ttf||172916:1616720154.0": {
+ "family_name": "Droid Serif",
+ "font-family": "Droid Serif",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 8,
+ "full_name": "Droid Serif",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": false,
+ "os2_version": 3,
+ "panose": [
+ 2,
+ 2,
+ 6,
+ 0,
+ 6,
+ 5,
+ 0,
+ 2,
+ 2,
+ 0
+ ],
+ "path": "/usr/share/fonts/droid/DroidSerif-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
"/usr/share/fonts/gnu-free/FreeMono.otf||430884:1589880580.0": {
"family_name": "FreeMono",
"font-family": "FreeMono",
@@ -10908,7 +12924,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoFangsongKSSRotated-Regular.ttf||633564:1701417168.0": {
+ "/usr/share/fonts/noto/NotoFangsongKSSRotated-Regular.ttf||633564:1711963959.0": {
"family_name": "Noto Fangsong KSS Rotated",
"font-family": "Noto Fangsong KSS Rotated",
"font-stretch": "normal",
@@ -10944,7 +12960,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoFangsongKSSVertical-Regular.ttf||221056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoFangsongKSSVertical-Regular.ttf||221056:1711963959.0": {
"family_name": "Noto Fangsong KSS Vertical",
"font-family": "Noto Fangsong KSS Vertical",
"font-stretch": "normal",
@@ -10980,7 +12996,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Black.ttf||269324:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Black.ttf||266040:1711963959.0": {
"family_name": "Noto Kufi Arabic Black",
"font-family": "Noto Kufi Arabic Black",
"font-stretch": "normal",
@@ -11016,7 +13032,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Bold.ttf||257232:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Bold.ttf||253948:1711963959.0": {
"family_name": "Noto Kufi Arabic",
"font-family": "Noto Kufi Arabic",
"font-stretch": "normal",
@@ -11052,7 +13068,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Light.ttf||225828:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Light.ttf||222564:1711963959.0": {
"family_name": "Noto Kufi Arabic Light",
"font-family": "Noto Kufi Arabic Light",
"font-stretch": "normal",
@@ -11088,7 +13104,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Medium.ttf||242584:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Medium.ttf||239536:1711963959.0": {
"family_name": "Noto Kufi Arabic Medium",
"font-family": "Noto Kufi Arabic Medium",
"font-stretch": "normal",
@@ -11124,7 +13140,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Regular.ttf||234392:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Regular.ttf||231108:1711963959.0": {
"family_name": "Noto Kufi Arabic",
"font-family": "Noto Kufi Arabic",
"font-stretch": "normal",
@@ -11160,7 +13176,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoKufiArabic-Thin.ttf||219548:1701417168.0": {
+ "/usr/share/fonts/noto/NotoKufiArabic-Thin.ttf||216264:1711963959.0": {
"family_name": "Noto Kufi Arabic Thin",
"font-family": "Noto Kufi Arabic Thin",
"font-stretch": "normal",
@@ -11196,223 +13212,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoLoopedThai-Black.ttf||69940:1701417168.0": {
- "family_name": "Noto Looped Thai Black",
- "font-family": "Noto Looped Thai Black",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "900",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Black",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 10,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Black.ttf",
- "preferred_family_name": "Noto Looped Thai",
- "preferred_subfamily_name": "Black",
- "subfamily_name": "Regular",
- "weight": 900,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoLoopedThai-Bold.ttf||71084:1701417168.0": {
- "family_name": "Noto Looped Thai",
- "font-family": "Noto Looped Thai",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "bold",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Bold",
- "is_bold": true,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": false,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 8,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Bold.ttf",
- "preferred_family_name": null,
- "preferred_subfamily_name": null,
- "subfamily_name": "Bold",
- "weight": 700,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoLoopedThai-Light.ttf||65672:1701417168.0": {
- "family_name": "Noto Looped Thai Light",
- "font-family": "Noto Looped Thai Light",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "300",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Light",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 4,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Light.ttf",
- "preferred_family_name": "Noto Looped Thai",
- "preferred_subfamily_name": "Light",
- "subfamily_name": "Regular",
- "weight": 300,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoLoopedThai-Medium.ttf||68012:1701417168.0": {
- "family_name": "Noto Looped Thai Medium",
- "font-family": "Noto Looped Thai Medium",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "500",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Medium",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 6,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Medium.ttf",
- "preferred_family_name": "Noto Looped Thai",
- "preferred_subfamily_name": "Medium",
- "subfamily_name": "Regular",
- "weight": 500,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoLoopedThai-Regular.ttf||66040:1701417168.0": {
- "family_name": "Noto Looped Thai",
- "font-family": "Noto Looped Thai",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "normal",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Regular",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 5,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Regular.ttf",
- "preferred_family_name": null,
- "preferred_subfamily_name": null,
- "subfamily_name": "Regular",
- "weight": 400,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoLoopedThai-Thin.ttf||62840:1701417168.0": {
- "family_name": "Noto Looped Thai Thin",
- "font-family": "Noto Looped Thai Thin",
- "font-stretch": "normal",
- "font-style": "normal",
- "font-weight": "100",
- "fs_type": 0,
- "full_name": "Noto Looped Thai Thin",
- "is_bold": false,
- "is_italic": false,
- "is_oblique": false,
- "is_otf": false,
- "is_regular": true,
- "is_wws": false,
- "os2_version": 4,
- "panose": [
- 2,
- 11,
- 2,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
- ],
- "path": "/usr/share/fonts/noto/NotoLoopedThai-Thin.ttf",
- "preferred_family_name": "Noto Looped Thai",
- "preferred_subfamily_name": "Thin",
- "subfamily_name": "Regular",
- "weight": 100,
- "width": 5,
- "wws_family_name": null,
- "wws_subfamily_name": null
- },
- "/usr/share/fonts/noto/NotoMusic-Regular.ttf||82308:1701417168.0": {
+ "/usr/share/fonts/noto/NotoMusic-Regular.ttf||82308:1711963959.0": {
"family_name": "Noto Music",
"font-family": "Noto Music",
"font-stretch": "normal",
@@ -11448,7 +13248,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabic-Bold.ttf||298672:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabic-Bold.ttf||298672:1711963959.0": {
"family_name": "Noto Naskh Arabic",
"font-family": "Noto Naskh Arabic",
"font-stretch": "normal",
@@ -11484,7 +13284,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabic-Medium.ttf||278536:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabic-Medium.ttf||278536:1711963959.0": {
"family_name": "Noto Naskh Arabic Medium",
"font-family": "Noto Naskh Arabic Medium",
"font-stretch": "normal",
@@ -11520,7 +13320,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabic-Regular.ttf||260252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabic-Regular.ttf||260252:1711963959.0": {
"family_name": "Noto Naskh Arabic",
"font-family": "Noto Naskh Arabic",
"font-stretch": "normal",
@@ -11556,7 +13356,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabicUI-Bold.ttf||243056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabicUI-Bold.ttf||243056:1711963959.0": {
"family_name": "Noto Naskh Arabic UI",
"font-family": "Noto Naskh Arabic UI",
"font-stretch": "normal",
@@ -11592,7 +13392,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabicUI-Medium.ttf||240964:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabicUI-Medium.ttf||240964:1711963959.0": {
"family_name": "Noto Naskh Arabic UI Medium",
"font-family": "Noto Naskh Arabic UI Medium",
"font-stretch": "normal",
@@ -11628,7 +13428,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNaskhArabicUI-Regular.ttf||234764:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNaskhArabicUI-Regular.ttf||234764:1711963959.0": {
"family_name": "Noto Naskh Arabic UI",
"font-family": "Noto Naskh Arabic UI",
"font-stretch": "normal",
@@ -11664,7 +13464,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNastaliqUrdu-Bold.ttf||585268:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNastaliqUrdu-Bold.ttf||585268:1711963959.0": {
"family_name": "Noto Nastaliq Urdu",
"font-family": "Noto Nastaliq Urdu",
"font-stretch": "normal",
@@ -11700,7 +13500,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoNastaliqUrdu-Regular.ttf||584008:1701417168.0": {
+ "/usr/share/fonts/noto/NotoNastaliqUrdu-Regular.ttf||584008:1711963959.0": {
"family_name": "Noto Nastaliq Urdu",
"font-family": "Noto Nastaliq Urdu",
"font-stretch": "normal",
@@ -11736,7 +13536,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Black.ttf||27700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Black.ttf||27700:1711963959.0": {
"family_name": "Noto Rashi Hebrew Black",
"font-family": "Noto Rashi Hebrew Black",
"font-stretch": "normal",
@@ -11772,7 +13572,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Bold.ttf||27700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Bold.ttf||27700:1711963959.0": {
"family_name": "Noto Rashi Hebrew",
"font-family": "Noto Rashi Hebrew",
"font-stretch": "normal",
@@ -11808,7 +13608,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Light.ttf||26804:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Light.ttf||26804:1711963959.0": {
"family_name": "Noto Rashi Hebrew Light",
"font-family": "Noto Rashi Hebrew Light",
"font-stretch": "normal",
@@ -11844,7 +13644,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Medium.ttf||26756:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Medium.ttf||26756:1711963959.0": {
"family_name": "Noto Rashi Hebrew Medium",
"font-family": "Noto Rashi Hebrew Medium",
"font-stretch": "normal",
@@ -11880,7 +13680,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Regular.ttf||26868:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Regular.ttf||26868:1711963959.0": {
"family_name": "Noto Rashi Hebrew",
"font-family": "Noto Rashi Hebrew",
"font-stretch": "normal",
@@ -11916,7 +13716,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoRashiHebrew-Thin.ttf||25676:1701417168.0": {
+ "/usr/share/fonts/noto/NotoRashiHebrew-Thin.ttf||25676:1711963959.0": {
"family_name": "Noto Rashi Hebrew Thin",
"font-family": "Noto Rashi Hebrew Thin",
"font-stretch": "normal",
@@ -11952,7 +13752,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Black.ttf||633020:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Black.ttf||633020:1711963959.0": {
"family_name": "Noto Sans Black",
"font-family": "Noto Sans Black",
"font-stretch": "normal",
@@ -11988,7 +13788,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-BlackItalic.ttf||651480:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-BlackItalic.ttf||651480:1711963959.0": {
"family_name": "Noto Sans Black",
"font-family": "Noto Sans Black",
"font-stretch": "normal",
@@ -12024,7 +13824,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Bold.ttf||616112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Bold.ttf||616112:1711963959.0": {
"family_name": "Noto Sans",
"font-family": "Noto Sans",
"font-stretch": "normal",
@@ -12060,7 +13860,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-BoldItalic.ttf||637484:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-BoldItalic.ttf||637484:1711963959.0": {
"family_name": "Noto Sans",
"font-family": "Noto Sans",
"font-stretch": "normal",
@@ -12096,7 +13896,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Italic.ttf||629208:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Italic.ttf||629208:1711963959.0": {
"family_name": "Noto Sans",
"font-family": "Noto Sans",
"font-stretch": "normal",
@@ -12132,7 +13932,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Light.ttf||596052:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Light.ttf||596052:1711963959.0": {
"family_name": "Noto Sans Light",
"font-family": "Noto Sans Light",
"font-stretch": "normal",
@@ -12168,7 +13968,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-LightItalic.ttf||624708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-LightItalic.ttf||624708:1711963959.0": {
"family_name": "Noto Sans Light",
"font-family": "Noto Sans Light",
"font-stretch": "normal",
@@ -12204,7 +14004,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Medium.ttf||608276:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Medium.ttf||608276:1711963959.0": {
"family_name": "Noto Sans Medium",
"font-family": "Noto Sans Medium",
"font-stretch": "normal",
@@ -12240,7 +14040,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-MediumItalic.ttf||632208:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-MediumItalic.ttf||632208:1711963959.0": {
"family_name": "Noto Sans Medium",
"font-family": "Noto Sans Medium",
"font-stretch": "normal",
@@ -12276,7 +14076,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Regular.ttf||610392:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Regular.ttf||610392:1711963959.0": {
"family_name": "Noto Sans",
"font-family": "Noto Sans",
"font-stretch": "normal",
@@ -12312,7 +14112,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-Thin.ttf||585592:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-Thin.ttf||585592:1711963959.0": {
"family_name": "Noto Sans Thin",
"font-family": "Noto Sans Thin",
"font-stretch": "normal",
@@ -12348,7 +14148,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSans-ThinItalic.ttf||614624:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSans-ThinItalic.ttf||614624:1711963959.0": {
"family_name": "Noto Sans Thin",
"font-family": "Noto Sans Thin",
"font-stretch": "normal",
@@ -12384,7 +14184,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAdlam-Bold.ttf||93728:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAdlam-Bold.ttf||93728:1711963959.0": {
"family_name": "Noto Sans Adlam",
"font-family": "Noto Sans Adlam",
"font-stretch": "normal",
@@ -12420,7 +14220,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAdlam-Regular.ttf||93820:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAdlam-Regular.ttf||93820:1711963959.0": {
"family_name": "Noto Sans Adlam",
"font-family": "Noto Sans Adlam",
"font-stretch": "normal",
@@ -12456,7 +14256,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Bold.ttf||36384:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Bold.ttf||36384:1711963959.0": {
"family_name": "Noto Sans Adlam Unjoined",
"font-family": "Noto Sans Adlam Unjoined",
"font-stretch": "normal",
@@ -12492,7 +14292,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Regular.ttf||36316:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Regular.ttf||36316:1711963959.0": {
"family_name": "Noto Sans Adlam Unjoined",
"font-family": "Noto Sans Adlam Unjoined",
"font-stretch": "normal",
@@ -12528,7 +14328,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAnatolianHieroglyphs-Regular.ttf||228120:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAnatolianHieroglyphs-Regular.ttf||228120:1711963959.0": {
"family_name": "Noto Sans Anatolian Hieroglyphs",
"font-family": "Noto Sans Anatolian Hieroglyphs",
"font-stretch": "normal",
@@ -12564,7 +14364,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Black.ttf||282488:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Black.ttf||282488:1711963959.0": {
"family_name": "Noto Sans Arabic Blk",
"font-family": "Noto Sans Arabic Blk",
"font-stretch": "normal",
@@ -12600,7 +14400,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Bold.ttf||278736:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Bold.ttf||278736:1711963959.0": {
"family_name": "Noto Sans Arabic",
"font-family": "Noto Sans Arabic",
"font-stretch": "normal",
@@ -12636,7 +14436,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Light.ttf||237360:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Light.ttf||237360:1711963959.0": {
"family_name": "Noto Sans Arabic Light",
"font-family": "Noto Sans Arabic Light",
"font-stretch": "normal",
@@ -12672,7 +14472,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Medium.ttf||275008:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Medium.ttf||275008:1711963959.0": {
"family_name": "Noto Sans Arabic Med",
"font-family": "Noto Sans Arabic Med",
"font-stretch": "normal",
@@ -12708,7 +14508,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Regular.ttf||247112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Regular.ttf||247112:1711963959.0": {
"family_name": "Noto Sans Arabic",
"font-family": "Noto Sans Arabic",
"font-stretch": "normal",
@@ -12744,7 +14544,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArabic-Thin.ttf||227704:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArabic-Thin.ttf||227704:1711963959.0": {
"family_name": "Noto Sans Arabic Thin",
"font-family": "Noto Sans Arabic Thin",
"font-stretch": "normal",
@@ -12780,7 +14580,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Black.ttf||32768:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Black.ttf||32768:1711963959.0": {
"family_name": "Noto Sans Armenian Black",
"font-family": "Noto Sans Armenian Black",
"font-stretch": "normal",
@@ -12816,7 +14616,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Bold.ttf||30784:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Bold.ttf||30784:1711963959.0": {
"family_name": "Noto Sans Armenian",
"font-family": "Noto Sans Armenian",
"font-stretch": "normal",
@@ -12852,7 +14652,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Light.ttf||29596:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Light.ttf||29596:1711963959.0": {
"family_name": "Noto Sans Armenian Light",
"font-family": "Noto Sans Armenian Light",
"font-stretch": "normal",
@@ -12888,7 +14688,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Medium.ttf||30700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Medium.ttf||30700:1711963959.0": {
"family_name": "Noto Sans Armenian Medium",
"font-family": "Noto Sans Armenian Medium",
"font-stretch": "normal",
@@ -12924,7 +14724,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Regular.ttf||30752:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Regular.ttf||30752:1711963959.0": {
"family_name": "Noto Sans Armenian",
"font-family": "Noto Sans Armenian",
"font-stretch": "normal",
@@ -12960,7 +14760,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansArmenian-Thin.ttf||30576:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansArmenian-Thin.ttf||30576:1711963959.0": {
"family_name": "Noto Sans Armenian Thin",
"font-family": "Noto Sans Armenian Thin",
"font-stretch": "normal",
@@ -12996,7 +14796,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansAvestan-Regular.ttf||22584:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansAvestan-Regular.ttf||22584:1711963959.0": {
"family_name": "Noto Sans Avestan",
"font-family": "Noto Sans Avestan",
"font-stretch": "normal",
@@ -13032,7 +14832,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBalinese-Bold.ttf||133200:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBalinese-Bold.ttf||93064:1711963959.0": {
"family_name": "Noto Sans Balinese",
"font-family": "Noto Sans Balinese",
"font-stretch": "normal",
@@ -13068,7 +14868,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBalinese-Medium.ttf||125408:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBalinese-Medium.ttf||92004:1711963959.0": {
"family_name": "Noto Sans Balinese Medium",
"font-family": "Noto Sans Balinese Medium",
"font-stretch": "normal",
@@ -13104,7 +14904,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBalinese-Regular.ttf||131112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBalinese-Regular.ttf||93268:1711963959.0": {
"family_name": "Noto Sans Balinese",
"font-family": "Noto Sans Balinese",
"font-stretch": "normal",
@@ -13140,7 +14940,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBamum-Bold.ttf||230444:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBamum-Bold.ttf||230444:1711963959.0": {
"family_name": "Noto Sans Bamum",
"font-family": "Noto Sans Bamum",
"font-stretch": "normal",
@@ -13176,7 +14976,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBamum-Medium.ttf||230228:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBamum-Medium.ttf||230228:1711963959.0": {
"family_name": "Noto Sans Bamum Medium",
"font-family": "Noto Sans Bamum Medium",
"font-stretch": "normal",
@@ -13212,7 +15012,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBamum-Regular.ttf||230008:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBamum-Regular.ttf||230008:1711963959.0": {
"family_name": "Noto Sans Bamum",
"font-family": "Noto Sans Bamum",
"font-stretch": "normal",
@@ -13248,7 +15048,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBassaVah-Bold.ttf||7868:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBassaVah-Bold.ttf||7868:1711963959.0": {
"family_name": "Noto Sans Bassa Vah",
"font-family": "Noto Sans Bassa Vah",
"font-stretch": "normal",
@@ -13284,7 +15084,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBassaVah-Medium.ttf||8084:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBassaVah-Medium.ttf||8084:1711963959.0": {
"family_name": "Noto Sans Bassa Vah Medium",
"font-family": "Noto Sans Bassa Vah Medium",
"font-stretch": "normal",
@@ -13320,7 +15120,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBassaVah-Regular.ttf||8116:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBassaVah-Regular.ttf||8116:1711963959.0": {
"family_name": "Noto Sans Bassa Vah",
"font-family": "Noto Sans Bassa Vah",
"font-stretch": "normal",
@@ -13356,7 +15156,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBatak-Regular.ttf||22336:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBatak-Regular.ttf||22336:1711963959.0": {
"family_name": "Noto Sans Batak",
"font-family": "Noto Sans Batak",
"font-stretch": "normal",
@@ -13392,7 +15192,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Black.ttf||218000:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Black.ttf||218000:1711963959.0": {
"family_name": "Noto Sans Bengali Black",
"font-family": "Noto Sans Bengali Black",
"font-stretch": "normal",
@@ -13428,7 +15228,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Bold.ttf||212540:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Bold.ttf||212540:1711963959.0": {
"family_name": "Noto Sans Bengali",
"font-family": "Noto Sans Bengali",
"font-stretch": "normal",
@@ -13464,7 +15264,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Light.ttf||195904:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Light.ttf||195904:1711963959.0": {
"family_name": "Noto Sans Bengali Light",
"font-family": "Noto Sans Bengali Light",
"font-stretch": "normal",
@@ -13500,7 +15300,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Medium.ttf||208384:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Medium.ttf||208384:1711963959.0": {
"family_name": "Noto Sans Bengali Medium",
"font-family": "Noto Sans Bengali Medium",
"font-stretch": "normal",
@@ -13536,7 +15336,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Regular.ttf||203696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Regular.ttf||203696:1711963959.0": {
"family_name": "Noto Sans Bengali",
"font-family": "Noto Sans Bengali",
"font-stretch": "normal",
@@ -13572,7 +15372,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengali-Thin.ttf||190188:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengali-Thin.ttf||190188:1711963959.0": {
"family_name": "Noto Sans Bengali Thin",
"font-family": "Noto Sans Bengali Thin",
"font-stretch": "normal",
@@ -13608,7 +15408,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Black.ttf||218108:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Black.ttf||218108:1711963959.0": {
"family_name": "Noto Sans Bengali UI Black",
"font-family": "Noto Sans Bengali UI Black",
"font-stretch": "normal",
@@ -13644,7 +15444,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Bold.ttf||212652:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Bold.ttf||212652:1711963959.0": {
"family_name": "Noto Sans Bengali UI",
"font-family": "Noto Sans Bengali UI",
"font-stretch": "normal",
@@ -13680,7 +15480,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Light.ttf||195944:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Light.ttf||195944:1711963959.0": {
"family_name": "Noto Sans Bengali UI Light",
"font-family": "Noto Sans Bengali UI Light",
"font-stretch": "normal",
@@ -13716,7 +15516,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Medium.ttf||208420:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Medium.ttf||208420:1711963959.0": {
"family_name": "Noto Sans Bengali UI Medium",
"font-family": "Noto Sans Bengali UI Medium",
"font-stretch": "normal",
@@ -13752,7 +15552,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Regular.ttf||203732:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Regular.ttf||203732:1711963959.0": {
"family_name": "Noto Sans Bengali UI",
"font-family": "Noto Sans Bengali UI",
"font-stretch": "normal",
@@ -13788,7 +15588,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBengaliUI-Thin.ttf||190228:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBengaliUI-Thin.ttf||190228:1711963959.0": {
"family_name": "Noto Sans Bengali UI Thin",
"font-family": "Noto Sans Bengali UI Thin",
"font-stretch": "normal",
@@ -13824,7 +15624,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBhaiksuki-Regular.ttf||232572:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBhaiksuki-Regular.ttf||232572:1711963959.0": {
"family_name": "Noto Sans Bhaiksuki",
"font-family": "Noto Sans Bhaiksuki",
"font-stretch": "normal",
@@ -13860,7 +15660,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBrahmi-Regular.ttf||40876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBrahmi-Regular.ttf||46972:1711963959.0": {
"family_name": "Noto Sans Brahmi",
"font-family": "Noto Sans Brahmi",
"font-stretch": "normal",
@@ -13873,7 +15673,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -13896,7 +15696,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBuginese-Regular.ttf||7232:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBuginese-Regular.ttf||7232:1711963959.0": {
"family_name": "Noto Sans Buginese",
"font-family": "Noto Sans Buginese",
"font-stretch": "normal",
@@ -13932,7 +15732,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansBuhid-Regular.ttf||5316:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansBuhid-Regular.ttf||5316:1711963959.0": {
"family_name": "Noto Sans Buhid",
"font-family": "Noto Sans Buhid",
"font-stretch": "normal",
@@ -13968,7 +15768,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Black.ttf||107072:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Black.ttf||171472:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal Black",
"font-family": "Noto Sans Canadian Aboriginal Black",
"font-stretch": "normal",
@@ -13981,7 +15781,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14004,7 +15804,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Bold.ttf||108052:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Bold.ttf||169356:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal",
"font-family": "Noto Sans Canadian Aboriginal",
"font-stretch": "normal",
@@ -14017,7 +15817,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": false,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14040,7 +15840,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Light.ttf||100700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Light.ttf||169792:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal Light",
"font-family": "Noto Sans Canadian Aboriginal Light",
"font-stretch": "normal",
@@ -14053,7 +15853,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14076,7 +15876,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Medium.ttf||111496:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Medium.ttf||171392:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal Medium",
"font-family": "Noto Sans Canadian Aboriginal Medium",
"font-stretch": "normal",
@@ -14089,7 +15889,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14112,7 +15912,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Regular.ttf||114300:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Regular.ttf||176372:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal",
"font-family": "Noto Sans Canadian Aboriginal",
"font-stretch": "normal",
@@ -14125,7 +15925,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14148,7 +15948,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Thin.ttf||100616:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Thin.ttf||166932:1711963959.0": {
"family_name": "Noto Sans Canadian Aboriginal Thin",
"font-family": "Noto Sans Canadian Aboriginal Thin",
"font-stretch": "normal",
@@ -14161,7 +15961,7 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": false,
+ "is_wws": true,
"os2_version": 4,
"panose": [
2,
@@ -14184,7 +15984,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCarian-Regular.ttf||12416:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCarian-Regular.ttf||12416:1711963959.0": {
"family_name": "Noto Sans Carian",
"font-family": "Noto Sans Carian",
"font-stretch": "normal",
@@ -14220,7 +16020,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCaucasianAlbanian-Regular.ttf||24752:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCaucasianAlbanian-Regular.ttf||24752:1711963959.0": {
"family_name": "Noto Sans Caucasian Albanian",
"font-family": "Noto Sans Caucasian Albanian",
"font-stretch": "normal",
@@ -14256,7 +16056,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansChakma-Regular.ttf||82348:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansChakma-Regular.ttf||82348:1711963959.0": {
"family_name": "Noto Sans Chakma",
"font-family": "Noto Sans Chakma",
"font-stretch": "normal",
@@ -14292,7 +16092,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Black.ttf||32236:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Black.ttf||32236:1711963959.0": {
"family_name": "Noto Sans Cham Black",
"font-family": "Noto Sans Cham Black",
"font-stretch": "normal",
@@ -14328,7 +16128,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Bold.ttf||32172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Bold.ttf||32172:1711963959.0": {
"family_name": "Noto Sans Cham",
"font-family": "Noto Sans Cham",
"font-stretch": "normal",
@@ -14364,7 +16164,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Light.ttf||31876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Light.ttf||31876:1711963959.0": {
"family_name": "Noto Sans Cham Light",
"font-family": "Noto Sans Cham Light",
"font-stretch": "normal",
@@ -14400,7 +16200,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Medium.ttf||32176:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Medium.ttf||32176:1711963959.0": {
"family_name": "Noto Sans Cham Medium",
"font-family": "Noto Sans Cham Medium",
"font-stretch": "normal",
@@ -14436,7 +16236,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Regular.ttf||32012:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Regular.ttf||32012:1711963959.0": {
"family_name": "Noto Sans Cham",
"font-family": "Noto Sans Cham",
"font-stretch": "normal",
@@ -14472,7 +16272,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCham-Thin.ttf||31984:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCham-Thin.ttf||31984:1711963959.0": {
"family_name": "Noto Sans Cham Thin",
"font-family": "Noto Sans Cham Thin",
"font-stretch": "normal",
@@ -14508,7 +16308,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Black.ttf||106256:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Black.ttf||106256:1711963959.0": {
"family_name": "Noto Sans Cherokee Black",
"font-family": "Noto Sans Cherokee Black",
"font-stretch": "normal",
@@ -14544,7 +16344,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Bold.ttf||108548:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Bold.ttf||108548:1711963959.0": {
"family_name": "Noto Sans Cherokee",
"font-family": "Noto Sans Cherokee",
"font-stretch": "normal",
@@ -14580,7 +16380,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Light.ttf||102516:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Light.ttf||102516:1711963959.0": {
"family_name": "Noto Sans Cherokee Light",
"font-family": "Noto Sans Cherokee Light",
"font-stretch": "normal",
@@ -14616,7 +16416,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Medium.ttf||107224:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Medium.ttf||107224:1711963959.0": {
"family_name": "Noto Sans Cherokee Medium",
"font-family": "Noto Sans Cherokee Medium",
"font-stretch": "normal",
@@ -14652,7 +16452,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Regular.ttf||94732:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Regular.ttf||94732:1711963959.0": {
"family_name": "Noto Sans Cherokee",
"font-family": "Noto Sans Cherokee",
"font-stretch": "normal",
@@ -14688,7 +16488,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCherokee-Thin.ttf||96928:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCherokee-Thin.ttf||96928:1711963959.0": {
"family_name": "Noto Sans Cherokee Thin",
"font-family": "Noto Sans Cherokee Thin",
"font-stretch": "normal",
@@ -14724,7 +16524,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansChorasmian-Regular.ttf||16996:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansChorasmian-Regular.ttf||17356:1711963959.0": {
"family_name": "Noto Sans Chorasmian",
"font-family": "Noto Sans Chorasmian",
"font-stretch": "normal",
@@ -14760,7 +16560,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCoptic-Regular.ttf||48948:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCoptic-Regular.ttf||48948:1711963959.0": {
"family_name": "Noto Sans Coptic",
"font-family": "Noto Sans Coptic",
"font-stretch": "normal",
@@ -14796,7 +16596,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCuneiform-Regular.ttf||819980:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCuneiform-Regular.ttf||819980:1711963959.0": {
"family_name": "Noto Sans Cuneiform",
"font-family": "Noto Sans Cuneiform",
"font-stretch": "normal",
@@ -14832,7 +16632,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCypriot-Regular.ttf||14656:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCypriot-Regular.ttf||14656:1711963959.0": {
"family_name": "Noto Sans Cypriot",
"font-family": "Noto Sans Cypriot",
"font-stretch": "normal",
@@ -14868,7 +16668,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansCyproMinoan-Regular.ttf||12552:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansCyproMinoan-Regular.ttf||12552:1711963959.0": {
"family_name": "Noto Sans Cypro Minoan",
"font-family": "Noto Sans Cypro Minoan",
"font-stretch": "normal",
@@ -14904,7 +16704,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDeseret-Regular.ttf||19504:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDeseret-Regular.ttf||19504:1711963959.0": {
"family_name": "Noto Sans Deseret",
"font-family": "Noto Sans Deseret",
"font-stretch": "normal",
@@ -14940,7 +16740,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Black.ttf||246024:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Black.ttf||246024:1711963959.0": {
"family_name": "Noto Sans Devanagari Black",
"font-family": "Noto Sans Devanagari Black",
"font-stretch": "normal",
@@ -14976,7 +16776,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Bold.ttf||240796:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Bold.ttf||240796:1711963959.0": {
"family_name": "Noto Sans Devanagari",
"font-family": "Noto Sans Devanagari",
"font-stretch": "normal",
@@ -15012,7 +16812,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Light.ttf||230556:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Light.ttf||230556:1711963959.0": {
"family_name": "Noto Sans Devanagari Light",
"font-family": "Noto Sans Devanagari Light",
"font-stretch": "normal",
@@ -15048,7 +16848,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Medium.ttf||239068:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Medium.ttf||239068:1711963959.0": {
"family_name": "Noto Sans Devanagari Medium",
"font-family": "Noto Sans Devanagari Medium",
"font-stretch": "normal",
@@ -15084,7 +16884,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Regular.ttf||234540:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Regular.ttf||234540:1711963959.0": {
"family_name": "Noto Sans Devanagari",
"font-family": "Noto Sans Devanagari",
"font-stretch": "normal",
@@ -15120,7 +16920,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagari-Thin.ttf||233196:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagari-Thin.ttf||233196:1711963959.0": {
"family_name": "Noto Sans Devanagari Thin",
"font-family": "Noto Sans Devanagari Thin",
"font-stretch": "normal",
@@ -15156,7 +16956,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Black.ttf||246020:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Black.ttf||246020:1711963959.0": {
"family_name": "Noto Sans Devanagari UI Black",
"font-family": "Noto Sans Devanagari UI Black",
"font-stretch": "normal",
@@ -15192,7 +16992,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Bold.ttf||240840:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Bold.ttf||240840:1711963959.0": {
"family_name": "Noto Sans Devanagari UI",
"font-family": "Noto Sans Devanagari UI",
"font-stretch": "normal",
@@ -15228,7 +17028,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Light.ttf||230592:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Light.ttf||230592:1711963959.0": {
"family_name": "Noto Sans Devanagari UI Light",
"font-family": "Noto Sans Devanagari UI Light",
"font-stretch": "normal",
@@ -15264,7 +17064,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Medium.ttf||239100:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Medium.ttf||239100:1711963959.0": {
"family_name": "Noto Sans Devanagari UI Medium",
"font-family": "Noto Sans Devanagari UI Medium",
"font-stretch": "normal",
@@ -15300,7 +17100,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Regular.ttf||234516:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Regular.ttf||234516:1711963959.0": {
"family_name": "Noto Sans Devanagari UI",
"font-family": "Noto Sans Devanagari UI",
"font-stretch": "normal",
@@ -15336,7 +17136,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDevanagariUI-Thin.ttf||232964:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDevanagariUI-Thin.ttf||232964:1711963959.0": {
"family_name": "Noto Sans Devanagari UI Thin",
"font-family": "Noto Sans Devanagari UI Thin",
"font-stretch": "normal",
@@ -15372,7 +17172,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDuployan-Bold.ttf||1921848:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDuployan-Bold.ttf||1921848:1711963959.0": {
"family_name": "Noto Sans Duployan",
"font-family": "Noto Sans Duployan",
"font-stretch": "normal",
@@ -15408,7 +17208,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansDuployan-Regular.ttf||1903408:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansDuployan-Regular.ttf||1903408:1711963959.0": {
"family_name": "Noto Sans Duployan",
"font-family": "Noto Sans Duployan",
"font-stretch": "normal",
@@ -15444,7 +17244,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEgyptianHieroglyphs-Regular.ttf||585148:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEgyptianHieroglyphs-Regular.ttf||585148:1711963959.0": {
"family_name": "Noto Sans Egyptian Hieroglyphs",
"font-family": "Noto Sans Egyptian Hieroglyphs",
"font-stretch": "normal",
@@ -15480,7 +17280,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansElbasan-Regular.ttf||18888:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansElbasan-Regular.ttf||18888:1711963959.0": {
"family_name": "Noto Sans Elbasan",
"font-family": "Noto Sans Elbasan",
"font-stretch": "normal",
@@ -15516,7 +17316,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansElymaic-Regular.ttf||8884:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansElymaic-Regular.ttf||8884:1711963959.0": {
"family_name": "Noto Sans Elymaic",
"font-family": "Noto Sans Elymaic",
"font-stretch": "normal",
@@ -15552,7 +17352,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Black.ttf||374056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Black.ttf||374056:1711963959.0": {
"family_name": "Noto Sans Ethiopic Black",
"font-family": "Noto Sans Ethiopic Black",
"font-stretch": "normal",
@@ -15588,7 +17388,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Bold.ttf||375172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Bold.ttf||375172:1711963959.0": {
"family_name": "Noto Sans Ethiopic",
"font-family": "Noto Sans Ethiopic",
"font-stretch": "normal",
@@ -15624,7 +17424,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Light.ttf||370940:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Light.ttf||370940:1711963959.0": {
"family_name": "Noto Sans Ethiopic Light",
"font-family": "Noto Sans Ethiopic Light",
"font-stretch": "normal",
@@ -15660,7 +17460,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Medium.ttf||379976:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Medium.ttf||379976:1711963959.0": {
"family_name": "Noto Sans Ethiopic Medium",
"font-family": "Noto Sans Ethiopic Medium",
"font-stretch": "normal",
@@ -15696,7 +17496,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Regular.ttf||376804:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Regular.ttf||376804:1711963959.0": {
"family_name": "Noto Sans Ethiopic",
"font-family": "Noto Sans Ethiopic",
"font-stretch": "normal",
@@ -15732,7 +17532,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansEthiopic-Thin.ttf||336968:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansEthiopic-Thin.ttf||336968:1711963959.0": {
"family_name": "Noto Sans Ethiopic Thin",
"font-family": "Noto Sans Ethiopic Thin",
"font-stretch": "normal",
@@ -15768,9 +17568,9 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf||56864:1701417168.0": {
- "family_name": "Noto Sans Georgian Blk",
- "font-family": "Noto Sans Georgian Blk",
+ "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf||56820:1711963959.0": {
+ "family_name": "Noto Sans Georgian Black",
+ "font-family": "Noto Sans Georgian Black",
"font-stretch": "normal",
"font-style": "normal",
"font-weight": "900",
@@ -15781,19 +17581,19 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 10,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf",
"preferred_family_name": "Noto Sans Georgian",
@@ -15804,43 +17604,43 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf||54860:1701417168.0": {
- "family_name": "Noto Sans Georgian",
- "font-family": "Noto Sans Georgian",
+ "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf||54748:1711963959.0": {
+ "family_name": "Noto Sans Georgian Bold",
+ "font-family": "Noto Sans Georgian Bold",
"font-stretch": "normal",
"font-style": "normal",
"font-weight": "bold",
"fs_type": 0,
"full_name": "Noto Sans Georgian Bold",
- "is_bold": true,
+ "is_bold": false,
"is_italic": false,
"is_oblique": false,
"is_otf": false,
- "is_regular": false,
- "is_wws": true,
+ "is_regular": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 8,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf",
- "preferred_family_name": null,
- "preferred_subfamily_name": null,
- "subfamily_name": "Bold",
+ "preferred_family_name": "Noto Sans Georgian",
+ "preferred_subfamily_name": "Bold",
+ "subfamily_name": "Regular",
"weight": 700,
"width": 5,
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf||52488:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf||52420:1711963959.0": {
"family_name": "Noto Sans Georgian Light",
"font-family": "Noto Sans Georgian Light",
"font-stretch": "normal",
@@ -15853,19 +17653,19 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 4,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf",
"preferred_family_name": "Noto Sans Georgian",
@@ -15876,9 +17676,9 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf||53832:1701417168.0": {
- "family_name": "Noto Sans Georgian Med",
- "font-family": "Noto Sans Georgian Med",
+ "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf||53640:1711963959.0": {
+ "family_name": "Noto Sans Georgian Medium",
+ "font-family": "Noto Sans Georgian Medium",
"font-stretch": "normal",
"font-style": "normal",
"font-weight": "500",
@@ -15889,19 +17689,19 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 6,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf",
"preferred_family_name": "Noto Sans Georgian",
@@ -15912,7 +17712,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf||52984:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf||52888:1711963959.0": {
"family_name": "Noto Sans Georgian",
"font-family": "Noto Sans Georgian",
"font-stretch": "normal",
@@ -15925,19 +17725,19 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 5,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf",
"preferred_family_name": null,
@@ -15948,7 +17748,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf||52836:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf||52752:1711963959.0": {
"family_name": "Noto Sans Georgian Thin",
"font-family": "Noto Sans Georgian Thin",
"font-stretch": "normal",
@@ -15961,19 +17761,19 @@
"is_oblique": false,
"is_otf": false,
"is_regular": true,
- "is_wws": true,
+ "is_wws": false,
"os2_version": 4,
"panose": [
- 2,
- 11,
- 2,
- 2,
- 4,
- 5,
- 4,
- 2,
- 2,
- 4
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
],
"path": "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf",
"preferred_family_name": "Noto Sans Georgian",
@@ -15984,7 +17784,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGlagolitic-Regular.ttf||40812:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGlagolitic-Regular.ttf||40812:1711963959.0": {
"family_name": "Noto Sans Glagolitic",
"font-family": "Noto Sans Glagolitic",
"font-stretch": "normal",
@@ -16020,7 +17820,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGothic-Regular.ttf||11824:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGothic-Regular.ttf||11824:1711963959.0": {
"family_name": "Noto Sans Gothic",
"font-family": "Noto Sans Gothic",
"font-stretch": "normal",
@@ -16056,7 +17856,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGrantha-Regular.ttf||359204:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGrantha-Regular.ttf||359204:1711963959.0": {
"family_name": "Noto Sans Grantha",
"font-family": "Noto Sans Grantha",
"font-stretch": "normal",
@@ -16092,7 +17892,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Black.ttf||205948:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Black.ttf||205948:1711963959.0": {
"family_name": "Noto Sans Gujarati Black",
"font-family": "Noto Sans Gujarati Black",
"font-stretch": "normal",
@@ -16128,7 +17928,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Bold.ttf||201032:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Bold.ttf||201032:1711963959.0": {
"family_name": "Noto Sans Gujarati",
"font-family": "Noto Sans Gujarati",
"font-stretch": "normal",
@@ -16164,7 +17964,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Light.ttf||189768:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Light.ttf||189768:1711963959.0": {
"family_name": "Noto Sans Gujarati Light",
"font-family": "Noto Sans Gujarati Light",
"font-stretch": "normal",
@@ -16200,7 +18000,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Medium.ttf||201304:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Medium.ttf||201304:1711963959.0": {
"family_name": "Noto Sans Gujarati Medium",
"font-family": "Noto Sans Gujarati Medium",
"font-stretch": "normal",
@@ -16236,7 +18036,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Regular.ttf||200704:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Regular.ttf||200704:1711963959.0": {
"family_name": "Noto Sans Gujarati",
"font-family": "Noto Sans Gujarati",
"font-stretch": "normal",
@@ -16272,7 +18072,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujarati-Thin.ttf||195680:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujarati-Thin.ttf||195680:1711963959.0": {
"family_name": "Noto Sans Gujarati Thin",
"font-family": "Noto Sans Gujarati Thin",
"font-stretch": "normal",
@@ -16308,7 +18108,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Black.ttf||205952:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Black.ttf||205952:1711963959.0": {
"family_name": "Noto Sans Gujarati UI Black",
"font-family": "Noto Sans Gujarati UI Black",
"font-stretch": "normal",
@@ -16344,7 +18144,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Bold.ttf||201072:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Bold.ttf||201072:1711963959.0": {
"family_name": "Noto Sans Gujarati UI",
"font-family": "Noto Sans Gujarati UI",
"font-stretch": "normal",
@@ -16380,7 +18180,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Light.ttf||189816:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Light.ttf||189816:1711963959.0": {
"family_name": "Noto Sans Gujarati UI Light",
"font-family": "Noto Sans Gujarati UI Light",
"font-stretch": "normal",
@@ -16416,7 +18216,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Medium.ttf||201348:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Medium.ttf||201348:1711963959.0": {
"family_name": "Noto Sans Gujarati UI Medium",
"font-family": "Noto Sans Gujarati UI Medium",
"font-stretch": "normal",
@@ -16452,7 +18252,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Regular.ttf||200744:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Regular.ttf||200744:1711963959.0": {
"family_name": "Noto Sans Gujarati UI",
"font-family": "Noto Sans Gujarati UI",
"font-stretch": "normal",
@@ -16488,7 +18288,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGujaratiUI-Thin.ttf||195724:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGujaratiUI-Thin.ttf||195724:1711963959.0": {
"family_name": "Noto Sans Gujarati UI Thin",
"font-family": "Noto Sans Gujarati UI Thin",
"font-stretch": "normal",
@@ -16524,7 +18324,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGunjalaGondi-Bold.ttf||70396:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGunjalaGondi-Bold.ttf||70396:1711963959.0": {
"family_name": "Noto Sans Gunjala Gondi",
"font-family": "Noto Sans Gunjala Gondi",
"font-stretch": "normal",
@@ -16560,7 +18360,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGunjalaGondi-Medium.ttf||69324:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGunjalaGondi-Medium.ttf||69324:1711963959.0": {
"family_name": "Noto Sans Gunjala Gondi Medium",
"font-family": "Noto Sans Gunjala Gondi Medium",
"font-stretch": "normal",
@@ -16596,7 +18396,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGunjalaGondi-Regular.ttf||69884:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGunjalaGondi-Regular.ttf||69884:1711963959.0": {
"family_name": "Noto Sans Gunjala Gondi",
"font-family": "Noto Sans Gunjala Gondi",
"font-stretch": "normal",
@@ -16632,7 +18432,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Black.ttf||56876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Black.ttf||56876:1711963959.0": {
"family_name": "Noto Sans Gurmukhi Black",
"font-family": "Noto Sans Gurmukhi Black",
"font-stretch": "normal",
@@ -16668,7 +18468,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Bold.ttf||55088:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Bold.ttf||55088:1711963959.0": {
"family_name": "Noto Sans Gurmukhi",
"font-family": "Noto Sans Gurmukhi",
"font-stretch": "normal",
@@ -16704,7 +18504,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Light.ttf||54792:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Light.ttf||54792:1711963959.0": {
"family_name": "Noto Sans Gurmukhi Light",
"font-family": "Noto Sans Gurmukhi Light",
"font-stretch": "normal",
@@ -16740,7 +18540,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Medium.ttf||55260:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Medium.ttf||55260:1711963959.0": {
"family_name": "Noto Sans Gurmukhi Medium",
"font-family": "Noto Sans Gurmukhi Medium",
"font-stretch": "normal",
@@ -16776,7 +18576,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Regular.ttf||55172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Regular.ttf||55172:1711963959.0": {
"family_name": "Noto Sans Gurmukhi",
"font-family": "Noto Sans Gurmukhi",
"font-stretch": "normal",
@@ -16812,7 +18612,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhi-Thin.ttf||53752:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhi-Thin.ttf||53752:1711963959.0": {
"family_name": "Noto Sans Gurmukhi Thin",
"font-family": "Noto Sans Gurmukhi Thin",
"font-stretch": "normal",
@@ -16848,7 +18648,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Black.ttf||56932:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Black.ttf||56932:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI Black",
"font-family": "Noto Sans Gurmukhi UI Black",
"font-stretch": "normal",
@@ -16884,7 +18684,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Bold.ttf||55144:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Bold.ttf||55144:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI",
"font-family": "Noto Sans Gurmukhi UI",
"font-stretch": "normal",
@@ -16920,7 +18720,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Light.ttf||54840:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Light.ttf||54840:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI Light",
"font-family": "Noto Sans Gurmukhi UI Light",
"font-stretch": "normal",
@@ -16956,7 +18756,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Medium.ttf||55308:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Medium.ttf||55308:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI Medium",
"font-family": "Noto Sans Gurmukhi UI Medium",
"font-stretch": "normal",
@@ -16992,7 +18792,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Regular.ttf||55216:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Regular.ttf||55216:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI",
"font-family": "Noto Sans Gurmukhi UI",
"font-stretch": "normal",
@@ -17028,7 +18828,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansGurmukhiUI-Thin.ttf||53800:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansGurmukhiUI-Thin.ttf||53800:1711963959.0": {
"family_name": "Noto Sans Gurmukhi UI Thin",
"font-family": "Noto Sans Gurmukhi UI Thin",
"font-stretch": "normal",
@@ -17064,7 +18864,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHanifiRohingya-Bold.ttf||28016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHanifiRohingya-Bold.ttf||28016:1711963959.0": {
"family_name": "Noto Sans Hanifi Rohingya",
"font-family": "Noto Sans Hanifi Rohingya",
"font-stretch": "normal",
@@ -17100,7 +18900,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHanifiRohingya-Medium.ttf||27744:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHanifiRohingya-Medium.ttf||27744:1711963959.0": {
"family_name": "Noto Sans Hanifi Rohingya Medium",
"font-family": "Noto Sans Hanifi Rohingya Medium",
"font-stretch": "normal",
@@ -17136,7 +18936,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHanifiRohingya-Regular.ttf||27580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHanifiRohingya-Regular.ttf||27580:1711963959.0": {
"family_name": "Noto Sans Hanifi Rohingya",
"font-family": "Noto Sans Hanifi Rohingya",
"font-stretch": "normal",
@@ -17172,7 +18972,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHanunoo-Regular.ttf||7668:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHanunoo-Regular.ttf||7668:1711963959.0": {
"family_name": "Noto Sans Hanunoo",
"font-family": "Noto Sans Hanunoo",
"font-stretch": "normal",
@@ -17208,7 +19008,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHatran-Regular.ttf||4756:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHatran-Regular.ttf||4756:1711963959.0": {
"family_name": "Noto Sans Hatran",
"font-family": "Noto Sans Hatran",
"font-stretch": "normal",
@@ -17244,7 +19044,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Black.ttf||26300:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Black.ttf||26300:1711963959.0": {
"family_name": "Noto Sans Hebrew Black",
"font-family": "Noto Sans Hebrew Black",
"font-stretch": "normal",
@@ -17280,7 +19080,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Bold.ttf||26200:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Bold.ttf||26200:1711963959.0": {
"family_name": "Noto Sans Hebrew",
"font-family": "Noto Sans Hebrew",
"font-stretch": "normal",
@@ -17316,7 +19116,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Light.ttf||25624:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Light.ttf||25624:1711963959.0": {
"family_name": "Noto Sans Hebrew Light",
"font-family": "Noto Sans Hebrew Light",
"font-stretch": "normal",
@@ -17352,7 +19152,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Medium.ttf||26280:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Medium.ttf||26280:1711963959.0": {
"family_name": "Noto Sans Hebrew Medium",
"font-family": "Noto Sans Hebrew Medium",
"font-stretch": "normal",
@@ -17388,7 +19188,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Regular.ttf||25844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Regular.ttf||25844:1711963959.0": {
"family_name": "Noto Sans Hebrew",
"font-family": "Noto Sans Hebrew",
"font-stretch": "normal",
@@ -17424,7 +19224,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansHebrew-Thin.ttf||25868:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansHebrew-Thin.ttf||25868:1711963959.0": {
"family_name": "Noto Sans Hebrew Thin",
"font-family": "Noto Sans Hebrew Thin",
"font-stretch": "normal",
@@ -17460,7 +19260,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansImperialAramaic-Regular.ttf||6112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansImperialAramaic-Regular.ttf||6112:1711963959.0": {
"family_name": "Noto Sans Imperial Aramaic",
"font-family": "Noto Sans Imperial Aramaic",
"font-stretch": "normal",
@@ -17496,7 +19296,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansIndicSiyaqNumbers-Regular.ttf||32288:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansIndicSiyaqNumbers-Regular.ttf||32288:1711963959.0": {
"family_name": "Noto Sans Indic Siyaq Numbers",
"font-family": "Noto Sans Indic Siyaq Numbers",
"font-stretch": "normal",
@@ -17532,7 +19332,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansInscriptionalPahlavi-Regular.ttf||5580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansInscriptionalPahlavi-Regular.ttf||5580:1711963959.0": {
"family_name": "Noto Sans Inscriptional Pahlavi",
"font-family": "Noto Sans Inscriptional Pahlavi",
"font-stretch": "normal",
@@ -17568,7 +19368,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansInscriptionalParthian-Regular.ttf||7344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansInscriptionalParthian-Regular.ttf||7344:1711963959.0": {
"family_name": "Noto Sans Inscriptional Parthian",
"font-family": "Noto Sans Inscriptional Parthian",
"font-stretch": "normal",
@@ -17604,7 +19404,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansJavanese-Bold.ttf||113336:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansJavanese-Bold.ttf||113336:1711963959.0": {
"family_name": "Noto Sans Javanese",
"font-family": "Noto Sans Javanese",
"font-stretch": "normal",
@@ -17640,7 +19440,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansJavanese-Regular.ttf||120504:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansJavanese-Regular.ttf||120504:1711963959.0": {
"family_name": "Noto Sans Javanese",
"font-family": "Noto Sans Javanese",
"font-stretch": "normal",
@@ -17676,7 +19476,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKaithi-Regular.ttf||65908:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKaithi-Regular.ttf||65908:1711963959.0": {
"family_name": "Noto Sans Kaithi",
"font-family": "Noto Sans Kaithi",
"font-stretch": "normal",
@@ -17712,7 +19512,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Black.ttf||204676:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Black.ttf||204676:1711963959.0": {
"family_name": "Noto Sans Kannada Black",
"font-family": "Noto Sans Kannada Black",
"font-stretch": "normal",
@@ -17748,7 +19548,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Bold.ttf||187520:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Bold.ttf||187520:1711963959.0": {
"family_name": "Noto Sans Kannada",
"font-family": "Noto Sans Kannada",
"font-stretch": "normal",
@@ -17784,7 +19584,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Light.ttf||179764:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Light.ttf||179764:1711963959.0": {
"family_name": "Noto Sans Kannada Light",
"font-family": "Noto Sans Kannada Light",
"font-stretch": "normal",
@@ -17820,7 +19620,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Medium.ttf||187196:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Medium.ttf||187196:1711963959.0": {
"family_name": "Noto Sans Kannada Medium",
"font-family": "Noto Sans Kannada Medium",
"font-stretch": "normal",
@@ -17856,7 +19656,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Regular.ttf||182716:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Regular.ttf||182716:1711963959.0": {
"family_name": "Noto Sans Kannada",
"font-family": "Noto Sans Kannada",
"font-stretch": "normal",
@@ -17892,7 +19692,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannada-Thin.ttf||180260:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannada-Thin.ttf||180260:1711963959.0": {
"family_name": "Noto Sans Kannada Thin",
"font-family": "Noto Sans Kannada Thin",
"font-stretch": "normal",
@@ -17928,7 +19728,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Black.ttf||205164:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Black.ttf||205164:1711963959.0": {
"family_name": "Noto Sans Kannada UI Black",
"font-family": "Noto Sans Kannada UI Black",
"font-stretch": "normal",
@@ -17964,7 +19764,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Bold.ttf||187708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Bold.ttf||187708:1711963959.0": {
"family_name": "Noto Sans Kannada UI",
"font-family": "Noto Sans Kannada UI",
"font-stretch": "normal",
@@ -18000,7 +19800,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Light.ttf||179792:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Light.ttf||179792:1711963959.0": {
"family_name": "Noto Sans Kannada UI Light",
"font-family": "Noto Sans Kannada UI Light",
"font-stretch": "normal",
@@ -18036,7 +19836,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Medium.ttf||187208:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Medium.ttf||187208:1711963959.0": {
"family_name": "Noto Sans Kannada UI Medium",
"font-family": "Noto Sans Kannada UI Medium",
"font-stretch": "normal",
@@ -18072,7 +19872,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Regular.ttf||182804:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Regular.ttf||182804:1711963959.0": {
"family_name": "Noto Sans Kannada UI",
"font-family": "Noto Sans Kannada UI",
"font-stretch": "normal",
@@ -18108,7 +19908,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKannadaUI-Thin.ttf||180284:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKannadaUI-Thin.ttf||180284:1711963959.0": {
"family_name": "Noto Sans Kannada UI Thin",
"font-family": "Noto Sans Kannada UI Thin",
"font-stretch": "normal",
@@ -18144,7 +19944,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKawi-Bold.ttf||39508:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKawi-Bold.ttf||39508:1711963959.0": {
"family_name": "Noto Sans Kawi",
"font-family": "Noto Sans Kawi",
"font-stretch": "normal",
@@ -18180,7 +19980,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKawi-Regular.ttf||39844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKawi-Regular.ttf||39844:1711963959.0": {
"family_name": "Noto Sans Kawi",
"font-family": "Noto Sans Kawi",
"font-stretch": "normal",
@@ -18216,7 +20016,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKayahLi-Bold.ttf||17424:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKayahLi-Bold.ttf||17424:1711963959.0": {
"family_name": "Noto Sans Kayah Li",
"font-family": "Noto Sans Kayah Li",
"font-stretch": "normal",
@@ -18252,7 +20052,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKayahLi-Medium.ttf||17564:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKayahLi-Medium.ttf||17564:1711963959.0": {
"family_name": "Noto Sans Kayah Li Medium",
"font-family": "Noto Sans Kayah Li Medium",
"font-stretch": "normal",
@@ -18288,7 +20088,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKayahLi-Regular.ttf||17428:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKayahLi-Regular.ttf||17428:1711963959.0": {
"family_name": "Noto Sans Kayah Li",
"font-family": "Noto Sans Kayah Li",
"font-stretch": "normal",
@@ -18324,7 +20124,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKharoshthi-Regular.ttf||34252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKharoshthi-Regular.ttf||34252:1711963959.0": {
"family_name": "Noto Sans Kharoshthi",
"font-family": "Noto Sans Kharoshthi",
"font-stretch": "normal",
@@ -18360,7 +20160,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Black.ttf||119792:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Black.ttf||119792:1711963959.0": {
"family_name": "Noto Sans Khmer Black",
"font-family": "Noto Sans Khmer Black",
"font-stretch": "normal",
@@ -18396,7 +20196,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Bold.ttf||113740:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Bold.ttf||113740:1711963959.0": {
"family_name": "Noto Sans Khmer",
"font-family": "Noto Sans Khmer",
"font-stretch": "normal",
@@ -18432,7 +20232,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Light.ttf||110600:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Light.ttf||110600:1711963959.0": {
"family_name": "Noto Sans Khmer Light",
"font-family": "Noto Sans Khmer Light",
"font-stretch": "normal",
@@ -18468,7 +20268,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Medium.ttf||114172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Medium.ttf||114172:1711963959.0": {
"family_name": "Noto Sans Khmer Medium",
"font-family": "Noto Sans Khmer Medium",
"font-stretch": "normal",
@@ -18504,7 +20304,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Regular.ttf||114576:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Regular.ttf||114576:1711963959.0": {
"family_name": "Noto Sans Khmer",
"font-family": "Noto Sans Khmer",
"font-stretch": "normal",
@@ -18540,7 +20340,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhmer-Thin.ttf||110220:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhmer-Thin.ttf||110220:1711963959.0": {
"family_name": "Noto Sans Khmer Thin",
"font-family": "Noto Sans Khmer Thin",
"font-stretch": "normal",
@@ -18576,7 +20376,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhojki-Regular.ttf||70444:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhojki-Regular.ttf||70444:1711963959.0": {
"family_name": "Noto Sans Khojki",
"font-family": "Noto Sans Khojki",
"font-stretch": "normal",
@@ -18612,7 +20412,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansKhudawadi-Regular.ttf||18644:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansKhudawadi-Regular.ttf||18644:1711963959.0": {
"family_name": "Noto Sans Khudawadi",
"font-family": "Noto Sans Khudawadi",
"font-stretch": "normal",
@@ -18648,7 +20448,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Black.ttf||37344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Black.ttf||37344:1711963959.0": {
"family_name": "Noto Sans Lao Black",
"font-family": "Noto Sans Lao Black",
"font-stretch": "normal",
@@ -18684,7 +20484,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Bold.ttf||37252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Bold.ttf||37252:1711963959.0": {
"family_name": "Noto Sans Lao",
"font-family": "Noto Sans Lao",
"font-stretch": "normal",
@@ -18720,7 +20520,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Light.ttf||34288:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Light.ttf||34288:1711963959.0": {
"family_name": "Noto Sans Lao Light",
"font-family": "Noto Sans Lao Light",
"font-stretch": "normal",
@@ -18756,7 +20556,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Medium.ttf||36116:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Medium.ttf||36116:1711963959.0": {
"family_name": "Noto Sans Lao Medium",
"font-family": "Noto Sans Lao Medium",
"font-stretch": "normal",
@@ -18792,7 +20592,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Regular.ttf||35884:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Regular.ttf||35884:1711963959.0": {
"family_name": "Noto Sans Lao",
"font-family": "Noto Sans Lao",
"font-stretch": "normal",
@@ -18828,7 +20628,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLao-Thin.ttf||34256:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLao-Thin.ttf||34256:1711963959.0": {
"family_name": "Noto Sans Lao Thin",
"font-family": "Noto Sans Lao Thin",
"font-stretch": "normal",
@@ -18864,7 +20664,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Black.ttf||57348:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Black.ttf||57348:1711963959.0": {
"family_name": "Noto Sans Lao Looped Black",
"font-family": "Noto Sans Lao Looped Black",
"font-stretch": "normal",
@@ -18900,7 +20700,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Bold.ttf||56240:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Bold.ttf||56240:1711963959.0": {
"family_name": "Noto Sans Lao Looped",
"font-family": "Noto Sans Lao Looped",
"font-stretch": "normal",
@@ -18936,7 +20736,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Light.ttf||54032:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Light.ttf||54032:1711963959.0": {
"family_name": "Noto Sans Lao Looped Light",
"font-family": "Noto Sans Lao Looped Light",
"font-stretch": "normal",
@@ -18972,7 +20772,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Medium.ttf||56516:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Medium.ttf||56516:1711963959.0": {
"family_name": "Noto Sans Lao Looped Medium",
"font-family": "Noto Sans Lao Looped Medium",
"font-stretch": "normal",
@@ -19008,7 +20808,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Regular.ttf||56300:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Regular.ttf||56300:1711963959.0": {
"family_name": "Noto Sans Lao Looped",
"font-family": "Noto Sans Lao Looped",
"font-stretch": "normal",
@@ -19044,7 +20844,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLaoLooped-Thin.ttf||53508:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLaoLooped-Thin.ttf||53508:1711963959.0": {
"family_name": "Noto Sans Lao Looped Thin",
"font-family": "Noto Sans Lao Looped Thin",
"font-stretch": "normal",
@@ -19080,7 +20880,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLepcha-Regular.ttf||26084:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLepcha-Regular.ttf||26084:1711963959.0": {
"family_name": "Noto Sans Lepcha",
"font-family": "Noto Sans Lepcha",
"font-stretch": "normal",
@@ -19116,7 +20916,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLimbu-Regular.ttf||12576:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLimbu-Regular.ttf||12576:1711963959.0": {
"family_name": "Noto Sans Limbu",
"font-family": "Noto Sans Limbu",
"font-stretch": "normal",
@@ -19152,7 +20952,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLinearA-Regular.ttf||57880:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLinearA-Regular.ttf||57880:1711963959.0": {
"family_name": "Noto Sans Linear A",
"font-family": "Noto Sans Linear A",
"font-stretch": "normal",
@@ -19188,7 +20988,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLinearB-Regular.ttf||62596:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLinearB-Regular.ttf||62596:1711963959.0": {
"family_name": "Noto Sans Linear B",
"font-family": "Noto Sans Linear B",
"font-stretch": "normal",
@@ -19224,7 +21024,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLisu-Bold.ttf||12704:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLisu-Bold.ttf||12704:1711963959.0": {
"family_name": "Noto Sans Lisu",
"font-family": "Noto Sans Lisu",
"font-stretch": "normal",
@@ -19260,7 +21060,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLisu-Medium.ttf||12708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLisu-Medium.ttf||12708:1711963959.0": {
"family_name": "Noto Sans Lisu Medium",
"font-family": "Noto Sans Lisu Medium",
"font-stretch": "normal",
@@ -19296,7 +21096,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLisu-Regular.ttf||12696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLisu-Regular.ttf||12696:1711963959.0": {
"family_name": "Noto Sans Lisu",
"font-family": "Noto Sans Lisu",
"font-stretch": "normal",
@@ -19332,7 +21132,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLycian-Regular.ttf||4200:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLycian-Regular.ttf||4200:1711963959.0": {
"family_name": "Noto Sans Lycian",
"font-family": "Noto Sans Lycian",
"font-stretch": "normal",
@@ -19368,7 +21168,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansLydian-Regular.ttf||4680:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansLydian-Regular.ttf||4680:1711963959.0": {
"family_name": "Noto Sans Lydian",
"font-family": "Noto Sans Lydian",
"font-stretch": "normal",
@@ -19404,7 +21204,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMahajani-Regular.ttf||22376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMahajani-Regular.ttf||22376:1711963959.0": {
"family_name": "Noto Sans Mahajani",
"font-family": "Noto Sans Mahajani",
"font-stretch": "normal",
@@ -19440,7 +21240,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Black.ttf||118572:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Black.ttf||118572:1711963959.0": {
"family_name": "Noto Sans Malayalam Black",
"font-family": "Noto Sans Malayalam Black",
"font-stretch": "normal",
@@ -19476,7 +21276,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Bold.ttf||118480:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Bold.ttf||118480:1711963959.0": {
"family_name": "Noto Sans Malayalam",
"font-family": "Noto Sans Malayalam",
"font-stretch": "normal",
@@ -19512,7 +21312,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Light.ttf||106412:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Light.ttf||106412:1711963959.0": {
"family_name": "Noto Sans Malayalam Light",
"font-family": "Noto Sans Malayalam Light",
"font-stretch": "normal",
@@ -19548,7 +21348,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Medium.ttf||114532:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Medium.ttf||114532:1711963959.0": {
"family_name": "Noto Sans Malayalam Medium",
"font-family": "Noto Sans Malayalam Medium",
"font-stretch": "normal",
@@ -19584,7 +21384,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Regular.ttf||112936:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Regular.ttf||112936:1711963959.0": {
"family_name": "Noto Sans Malayalam",
"font-family": "Noto Sans Malayalam",
"font-stretch": "normal",
@@ -19620,7 +21420,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalam-Thin.ttf||105640:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalam-Thin.ttf||105640:1711963959.0": {
"family_name": "Noto Sans Malayalam Thin",
"font-family": "Noto Sans Malayalam Thin",
"font-stretch": "normal",
@@ -19656,7 +21456,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Black.ttf||118392:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Black.ttf||118392:1711963959.0": {
"family_name": "Noto Sans Malayalam UI Black",
"font-family": "Noto Sans Malayalam UI Black",
"font-stretch": "normal",
@@ -19692,7 +21492,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Bold.ttf||118264:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Bold.ttf||118264:1711963959.0": {
"family_name": "Noto Sans Malayalam UI",
"font-family": "Noto Sans Malayalam UI",
"font-stretch": "normal",
@@ -19728,7 +21528,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Light.ttf||106488:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Light.ttf||106488:1711963959.0": {
"family_name": "Noto Sans Malayalam UI Light",
"font-family": "Noto Sans Malayalam UI Light",
"font-stretch": "normal",
@@ -19764,7 +21564,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Medium.ttf||114692:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Medium.ttf||114692:1711963959.0": {
"family_name": "Noto Sans Malayalam UI Medium",
"font-family": "Noto Sans Malayalam UI Medium",
"font-stretch": "normal",
@@ -19800,7 +21600,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Regular.ttf||113092:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Regular.ttf||113092:1711963959.0": {
"family_name": "Noto Sans Malayalam UI",
"font-family": "Noto Sans Malayalam UI",
"font-stretch": "normal",
@@ -19836,7 +21636,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMalayalamUI-Thin.ttf||105904:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMalayalamUI-Thin.ttf||105904:1711963959.0": {
"family_name": "Noto Sans Malayalam UI Thin",
"font-family": "Noto Sans Malayalam UI Thin",
"font-stretch": "normal",
@@ -19872,7 +21672,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMandaic-Regular.ttf||28684:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMandaic-Regular.ttf||28684:1711963959.0": {
"family_name": "Noto Sans Mandaic",
"font-family": "Noto Sans Mandaic",
"font-stretch": "normal",
@@ -19908,7 +21708,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansManichaean-Regular.ttf||51996:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansManichaean-Regular.ttf||51996:1711963959.0": {
"family_name": "Noto Sans Manichaean",
"font-family": "Noto Sans Manichaean",
"font-stretch": "normal",
@@ -19944,7 +21744,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMarchen-Regular.ttf||128164:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMarchen-Regular.ttf||128164:1711963959.0": {
"family_name": "Noto Sans Marchen",
"font-family": "Noto Sans Marchen",
"font-stretch": "normal",
@@ -19980,7 +21780,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMasaramGondi-Regular.ttf||30672:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMasaramGondi-Regular.ttf||30672:1711963959.0": {
"family_name": "Noto Sans Masaram Gondi",
"font-family": "Noto Sans Masaram Gondi",
"font-stretch": "normal",
@@ -20016,7 +21816,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMath-Regular.ttf||966008:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMath-Regular.ttf||966008:1711963959.0": {
"family_name": "Noto Sans Math",
"font-family": "Noto Sans Math",
"font-stretch": "normal",
@@ -20052,7 +21852,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMayanNumerals-Regular.ttf||4444:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMayanNumerals-Regular.ttf||4444:1711963959.0": {
"family_name": "Noto Sans Mayan Numerals",
"font-family": "Noto Sans Mayan Numerals",
"font-stretch": "normal",
@@ -20088,7 +21888,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMedefaidrin-Bold.ttf||44492:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMedefaidrin-Bold.ttf||44492:1711963959.0": {
"family_name": "Noto Sans Medefaidrin",
"font-family": "Noto Sans Medefaidrin",
"font-stretch": "normal",
@@ -20124,7 +21924,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMedefaidrin-Medium.ttf||42880:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMedefaidrin-Medium.ttf||42880:1711963959.0": {
"family_name": "Noto Sans Medefaidrin Medium",
"font-family": "Noto Sans Medefaidrin Medium",
"font-stretch": "normal",
@@ -20160,7 +21960,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMedefaidrin-Regular.ttf||43112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMedefaidrin-Regular.ttf||43112:1711963959.0": {
"family_name": "Noto Sans Medefaidrin",
"font-family": "Noto Sans Medefaidrin",
"font-stretch": "normal",
@@ -20196,7 +21996,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Black.ttf||16344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Black.ttf||16344:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek Black",
"font-family": "Noto Sans Meetei Mayek Black",
"font-stretch": "normal",
@@ -20232,7 +22032,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Bold.ttf||16336:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Bold.ttf||16336:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek",
"font-family": "Noto Sans Meetei Mayek",
"font-stretch": "normal",
@@ -20268,7 +22068,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Light.ttf||16644:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Light.ttf||16644:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek Light",
"font-family": "Noto Sans Meetei Mayek Light",
"font-stretch": "normal",
@@ -20304,7 +22104,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Medium.ttf||16520:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Medium.ttf||16520:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek Medium",
"font-family": "Noto Sans Meetei Mayek Medium",
"font-stretch": "normal",
@@ -20340,7 +22140,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Regular.ttf||16584:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Regular.ttf||16584:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek",
"font-family": "Noto Sans Meetei Mayek",
"font-stretch": "normal",
@@ -20376,7 +22176,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeeteiMayek-Thin.ttf||16628:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeeteiMayek-Thin.ttf||16628:1711963959.0": {
"family_name": "Noto Sans Meetei Mayek Thin",
"font-family": "Noto Sans Meetei Mayek Thin",
"font-stretch": "normal",
@@ -20412,7 +22212,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMendeKikakui-Regular.ttf||35196:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMendeKikakui-Regular.ttf||35196:1711963959.0": {
"family_name": "Noto Sans Mende Kikakui",
"font-family": "Noto Sans Mende Kikakui",
"font-stretch": "normal",
@@ -20448,7 +22248,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMeroitic-Regular.ttf||33384:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMeroitic-Regular.ttf||33384:1711963959.0": {
"family_name": "Noto Sans Meroitic",
"font-family": "Noto Sans Meroitic",
"font-stretch": "normal",
@@ -20484,7 +22284,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMiao-Regular.ttf||36424:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMiao-Regular.ttf||36424:1711963959.0": {
"family_name": "Noto Sans Miao",
"font-family": "Noto Sans Miao",
"font-stretch": "normal",
@@ -20520,7 +22320,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansModi-Regular.ttf||44220:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansModi-Regular.ttf||44220:1711963959.0": {
"family_name": "Noto Sans Modi",
"font-family": "Noto Sans Modi",
"font-stretch": "normal",
@@ -20556,7 +22356,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMongolian-Regular.ttf||398916:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMongolian-Regular.ttf||398916:1711963959.0": {
"family_name": "Noto Sans Mongolian",
"font-family": "Noto Sans Mongolian",
"font-stretch": "normal",
@@ -20592,7 +22392,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Black.ttf||622272:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Black.ttf||622272:1711963959.0": {
"family_name": "Noto Sans Mono Black",
"font-family": "Noto Sans Mono Black",
"font-stretch": "normal",
@@ -20628,7 +22428,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Bold.ttf||610908:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Bold.ttf||610908:1711963959.0": {
"family_name": "Noto Sans Mono",
"font-family": "Noto Sans Mono",
"font-stretch": "normal",
@@ -20664,7 +22464,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Light.ttf||585580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Light.ttf||585580:1711963959.0": {
"family_name": "Noto Sans Mono Light",
"font-family": "Noto Sans Mono Light",
"font-stretch": "normal",
@@ -20700,7 +22500,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Medium.ttf||597720:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Medium.ttf||597720:1711963959.0": {
"family_name": "Noto Sans Mono Medium",
"font-family": "Noto Sans Mono Medium",
"font-stretch": "normal",
@@ -20736,7 +22536,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Regular.ttf||596428:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Regular.ttf||596428:1711963959.0": {
"family_name": "Noto Sans Mono",
"font-family": "Noto Sans Mono",
"font-stretch": "normal",
@@ -20772,7 +22572,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMono-Thin.ttf||584136:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMono-Thin.ttf||584136:1711963959.0": {
"family_name": "Noto Sans Mono Thin",
"font-family": "Noto Sans Mono Thin",
"font-stretch": "normal",
@@ -20808,7 +22608,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMro-Regular.ttf||6628:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMro-Regular.ttf||6628:1711963959.0": {
"family_name": "Noto Sans Mro",
"font-family": "Noto Sans Mro",
"font-stretch": "normal",
@@ -20844,7 +22644,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMultani-Regular.ttf||16496:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMultani-Regular.ttf||16496:1711963959.0": {
"family_name": "Noto Sans Multani",
"font-family": "Noto Sans Multani",
"font-stretch": "normal",
@@ -20880,7 +22680,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Black.ttf||222864:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Black.ttf||222864:1711963959.0": {
"family_name": "Noto Sans Myanmar Black",
"font-family": "Noto Sans Myanmar Black",
"font-stretch": "normal",
@@ -20916,7 +22716,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Bold.ttf||208760:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Bold.ttf||208760:1711963959.0": {
"family_name": "Noto Sans Myanmar",
"font-family": "Noto Sans Myanmar",
"font-stretch": "normal",
@@ -20952,7 +22752,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Light.ttf||194140:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Light.ttf||194140:1711963959.0": {
"family_name": "Noto Sans Myanmar Light",
"font-family": "Noto Sans Myanmar Light",
"font-stretch": "normal",
@@ -20988,7 +22788,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Medium.ttf||197360:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Medium.ttf||197360:1711963959.0": {
"family_name": "Noto Sans Myanmar Medium",
"font-family": "Noto Sans Myanmar Medium",
"font-stretch": "normal",
@@ -21024,7 +22824,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Regular.ttf||195088:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Regular.ttf||195088:1711963959.0": {
"family_name": "Noto Sans Myanmar",
"font-family": "Noto Sans Myanmar",
"font-stretch": "normal",
@@ -21060,7 +22860,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansMyanmar-Thin.ttf||196844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansMyanmar-Thin.ttf||196844:1711963959.0": {
"family_name": "Noto Sans Myanmar Thin",
"font-family": "Noto Sans Myanmar Thin",
"font-stretch": "normal",
@@ -21096,7 +22896,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNKo-Regular.ttf||39592:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNKo-Regular.ttf||39592:1711963959.0": {
"family_name": "Noto Sans NKo",
"font-family": "Noto Sans NKo",
"font-stretch": "normal",
@@ -21132,7 +22932,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNKoUnjoined-Bold.ttf||20324:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNKoUnjoined-Bold.ttf||20324:1711963959.0": {
"family_name": "Noto Sans NKo Unjoined",
"font-family": "Noto Sans NKo Unjoined",
"font-stretch": "normal",
@@ -21168,7 +22968,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNKoUnjoined-Regular.ttf||20148:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNKoUnjoined-Regular.ttf||20148:1711963959.0": {
"family_name": "Noto Sans NKo Unjoined",
"font-family": "Noto Sans NKo Unjoined",
"font-stretch": "normal",
@@ -21204,7 +23004,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNabataean-Regular.ttf||8048:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNabataean-Regular.ttf||8048:1711963959.0": {
"family_name": "Noto Sans Nabataean",
"font-family": "Noto Sans Nabataean",
"font-stretch": "normal",
@@ -21240,7 +23040,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNagMundari-Bold.ttf||17116:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNagMundari-Bold.ttf||17116:1711963959.0": {
"family_name": "Noto Sans Nag Mundari",
"font-family": "Noto Sans Nag Mundari",
"font-stretch": "normal",
@@ -21276,7 +23076,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNagMundari-Regular.ttf||17344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNagMundari-Regular.ttf||17344:1711963959.0": {
"family_name": "Noto Sans Nag Mundari",
"font-family": "Noto Sans Nag Mundari",
"font-stretch": "normal",
@@ -21312,7 +23112,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNandinagari-Regular.ttf||211572:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNandinagari-Regular.ttf||211572:1711963959.0": {
"family_name": "Noto Sans Nandinagari",
"font-family": "Noto Sans Nandinagari",
"font-stretch": "normal",
@@ -21348,7 +23148,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNewTaiLue-Bold.ttf||18584:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNewTaiLue-Bold.ttf||18584:1711963959.0": {
"family_name": "Noto Sans New Tai Lue",
"font-family": "Noto Sans New Tai Lue",
"font-stretch": "normal",
@@ -21384,7 +23184,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNewTaiLue-Medium.ttf||20032:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNewTaiLue-Medium.ttf||20032:1711963959.0": {
"family_name": "Noto Sans New Tai Lue Medium",
"font-family": "Noto Sans New Tai Lue Medium",
"font-stretch": "normal",
@@ -21420,7 +23220,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNewTaiLue-Regular.ttf||20288:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNewTaiLue-Regular.ttf||20288:1711963959.0": {
"family_name": "Noto Sans New Tai Lue",
"font-family": "Noto Sans New Tai Lue",
"font-stretch": "normal",
@@ -21456,7 +23256,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNewa-Regular.ttf||152712:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNewa-Regular.ttf||152712:1711963959.0": {
"family_name": "Noto Sans Newa",
"font-family": "Noto Sans Newa",
"font-stretch": "normal",
@@ -21492,7 +23292,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansNushu-Regular.ttf||116276:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansNushu-Regular.ttf||116276:1711963959.0": {
"family_name": "Noto Sans Nushu",
"font-family": "Noto Sans Nushu",
"font-stretch": "normal",
@@ -21528,7 +23328,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOgham-Regular.ttf||4396:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOgham-Regular.ttf||4396:1711963959.0": {
"family_name": "Noto Sans Ogham",
"font-family": "Noto Sans Ogham",
"font-stretch": "normal",
@@ -21564,7 +23364,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOlChiki-Bold.ttf||14964:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOlChiki-Bold.ttf||14964:1711963959.0": {
"family_name": "Noto Sans Ol Chiki",
"font-family": "Noto Sans Ol Chiki",
"font-stretch": "normal",
@@ -21600,7 +23400,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOlChiki-Medium.ttf||15568:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOlChiki-Medium.ttf||15568:1711963959.0": {
"family_name": "Noto Sans Ol Chiki Medium",
"font-family": "Noto Sans Ol Chiki Medium",
"font-stretch": "normal",
@@ -21636,7 +23436,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOlChiki-Regular.ttf||15684:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOlChiki-Regular.ttf||15684:1711963959.0": {
"family_name": "Noto Sans Ol Chiki",
"font-family": "Noto Sans Ol Chiki",
"font-stretch": "normal",
@@ -21672,7 +23472,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldHungarian-Regular.ttf||53616:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldHungarian-Regular.ttf||53616:1711963959.0": {
"family_name": "Noto Sans Old Hungarian",
"font-family": "Noto Sans Old Hungarian",
"font-stretch": "normal",
@@ -21708,7 +23508,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldItalic-Regular.ttf||7268:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldItalic-Regular.ttf||7268:1711963959.0": {
"family_name": "Noto Sans Old Italic",
"font-family": "Noto Sans Old Italic",
"font-stretch": "normal",
@@ -21744,7 +23544,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldNorthArabian-Regular.ttf||6912:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldNorthArabian-Regular.ttf||6912:1711963959.0": {
"family_name": "Noto Sans Old North Arabian",
"font-family": "Noto Sans Old North Arabian",
"font-stretch": "normal",
@@ -21780,7 +23580,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldPermic-Regular.ttf||9696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldPermic-Regular.ttf||9696:1711963959.0": {
"family_name": "Noto Sans Old Permic",
"font-family": "Noto Sans Old Permic",
"font-stretch": "normal",
@@ -21816,7 +23616,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldPersian-Regular.ttf||12436:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldPersian-Regular.ttf||12436:1711963959.0": {
"family_name": "Noto Sans Old Persian",
"font-family": "Noto Sans Old Persian",
"font-stretch": "normal",
@@ -21852,7 +23652,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldSogdian-Regular.ttf||17648:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldSogdian-Regular.ttf||17648:1711963959.0": {
"family_name": "Noto Sans Old Sogdian",
"font-family": "Noto Sans Old Sogdian",
"font-stretch": "normal",
@@ -21888,7 +23688,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldSouthArabian-Regular.ttf||4960:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldSouthArabian-Regular.ttf||4960:1711963959.0": {
"family_name": "Noto Sans Old South Arabian",
"font-family": "Noto Sans Old South Arabian",
"font-stretch": "normal",
@@ -21924,7 +23724,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOldTurkic-Regular.ttf||14980:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOldTurkic-Regular.ttf||14980:1711963959.0": {
"family_name": "Noto Sans Old Turkic",
"font-family": "Noto Sans Old Turkic",
"font-stretch": "normal",
@@ -21960,9 +23760,9 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOriya-Black.ttf||107716:1701417168.0": {
- "family_name": "Noto Sans Oriya Black",
- "font-family": "Noto Sans Oriya Black",
+ "/usr/share/fonts/noto/NotoSansOriya-Black.ttf||112208:1711963959.0": {
+ "family_name": "Noto Sans Oriya Blk",
+ "font-family": "Noto Sans Oriya Blk",
"font-stretch": "normal",
"font-style": "normal",
"font-weight": "900",
@@ -21996,7 +23796,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOriya-Bold.ttf||109112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOriya-Bold.ttf||113652:1711963959.0": {
"family_name": "Noto Sans Oriya",
"font-family": "Noto Sans Oriya",
"font-stretch": "normal",
@@ -22032,7 +23832,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOriya-Regular.ttf||111656:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOriya-Regular.ttf||114952:1711963959.0": {
"family_name": "Noto Sans Oriya",
"font-family": "Noto Sans Oriya",
"font-stretch": "normal",
@@ -22068,7 +23868,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOriya-Thin.ttf||114844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOriya-Thin.ttf||118112:1711963959.0": {
"family_name": "Noto Sans Oriya Thin",
"font-family": "Noto Sans Oriya Thin",
"font-stretch": "normal",
@@ -22104,7 +23904,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOsage-Regular.ttf||20596:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOsage-Regular.ttf||20596:1711963959.0": {
"family_name": "Noto Sans Osage",
"font-family": "Noto Sans Osage",
"font-stretch": "normal",
@@ -22140,7 +23940,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansOsmanya-Regular.ttf||16584:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansOsmanya-Regular.ttf||16584:1711963959.0": {
"family_name": "Noto Sans Osmanya",
"font-family": "Noto Sans Osmanya",
"font-stretch": "normal",
@@ -22176,7 +23976,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPahawhHmong-Regular.ttf||18168:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPahawhHmong-Regular.ttf||18168:1711963959.0": {
"family_name": "Noto Sans Pahawh Hmong",
"font-family": "Noto Sans Pahawh Hmong",
"font-stretch": "normal",
@@ -22212,7 +24012,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPalmyrene-Regular.ttf||15380:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPalmyrene-Regular.ttf||15380:1711963959.0": {
"family_name": "Noto Sans Palmyrene",
"font-family": "Noto Sans Palmyrene",
"font-stretch": "normal",
@@ -22248,7 +24048,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPauCinHau-Regular.ttf||9048:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPauCinHau-Regular.ttf||9048:1711963959.0": {
"family_name": "Noto Sans Pau Cin Hau",
"font-family": "Noto Sans Pau Cin Hau",
"font-stretch": "normal",
@@ -22284,7 +24084,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPhags-Pa-Regular.ttf||39652:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPhags-Pa-Regular.ttf||39652:1711963959.0": {
"family_name": "Noto Sans Phags-Pa",
"font-family": "Noto Sans Phags-Pa",
"font-stretch": "normal",
@@ -22320,7 +24120,43 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPhoenician-Regular.ttf||5912:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPhagsPa-Regular.ttf||39668:1711963959.0": {
+ "family_name": "Noto Sans PhagsPa",
+ "font-family": "Noto Sans PhagsPa",
+ "font-stretch": "normal",
+ "font-style": "normal",
+ "font-weight": "normal",
+ "fs_type": 0,
+ "full_name": "Noto Sans PhagsPa Regular",
+ "is_bold": false,
+ "is_italic": false,
+ "is_oblique": false,
+ "is_otf": false,
+ "is_regular": true,
+ "is_wws": true,
+ "os2_version": 4,
+ "panose": [
+ 2,
+ 11,
+ 5,
+ 2,
+ 4,
+ 5,
+ 4,
+ 2,
+ 2,
+ 4
+ ],
+ "path": "/usr/share/fonts/noto/NotoSansPhagsPa-Regular.ttf",
+ "preferred_family_name": null,
+ "preferred_subfamily_name": null,
+ "subfamily_name": "Regular",
+ "weight": 400,
+ "width": 5,
+ "wws_family_name": null,
+ "wws_subfamily_name": null
+ },
+ "/usr/share/fonts/noto/NotoSansPhoenician-Regular.ttf||5912:1711963959.0": {
"family_name": "Noto Sans Phoenician",
"font-family": "Noto Sans Phoenician",
"font-stretch": "normal",
@@ -22356,7 +24192,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansPsalterPahlavi-Regular.ttf||35384:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansPsalterPahlavi-Regular.ttf||35384:1711963959.0": {
"family_name": "Noto Sans Psalter Pahlavi",
"font-family": "Noto Sans Psalter Pahlavi",
"font-stretch": "normal",
@@ -22392,7 +24228,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansRejang-Regular.ttf||7536:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansRejang-Regular.ttf||7536:1711963959.0": {
"family_name": "Noto Sans Rejang",
"font-family": "Noto Sans Rejang",
"font-stretch": "normal",
@@ -22428,7 +24264,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansRunic-Regular.ttf||9856:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansRunic-Regular.ttf||9856:1711963959.0": {
"family_name": "Noto Sans Runic",
"font-family": "Noto Sans Runic",
"font-stretch": "normal",
@@ -22464,7 +24300,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSamaritan-Regular.ttf||10788:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSamaritan-Regular.ttf||10788:1711963959.0": {
"family_name": "Noto Sans Samaritan",
"font-family": "Noto Sans Samaritan",
"font-stretch": "normal",
@@ -22500,7 +24336,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSaurashtra-Regular.ttf||35252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSaurashtra-Regular.ttf||35252:1711963959.0": {
"family_name": "Noto Sans Saurashtra",
"font-family": "Noto Sans Saurashtra",
"font-stretch": "normal",
@@ -22536,7 +24372,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSharada-Regular.ttf||53372:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSharada-Regular.ttf||53372:1711963959.0": {
"family_name": "Noto Sans Sharada",
"font-family": "Noto Sans Sharada",
"font-stretch": "normal",
@@ -22572,7 +24408,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansShavian-Regular.ttf||12996:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansShavian-Regular.ttf||12996:1711963959.0": {
"family_name": "Noto Sans Shavian",
"font-family": "Noto Sans Shavian",
"font-stretch": "normal",
@@ -22608,7 +24444,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSiddham-Regular.ttf||144848:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSiddham-Regular.ttf||144848:1711963959.0": {
"family_name": "Noto Sans Siddham",
"font-family": "Noto Sans Siddham",
"font-stretch": "normal",
@@ -22644,7 +24480,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSignWriting-Regular.ttf||5214924:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSignWriting-Regular.ttf||5214924:1711963959.0": {
"family_name": "Noto Sans SignWriting",
"font-family": "Noto Sans SignWriting",
"font-stretch": "normal",
@@ -22680,7 +24516,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Black.ttf||358336:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Black.ttf||358336:1711963959.0": {
"family_name": "Noto Sans Sinhala Black",
"font-family": "Noto Sans Sinhala Black",
"font-stretch": "normal",
@@ -22716,7 +24552,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Bold.ttf||341216:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Bold.ttf||341216:1711963959.0": {
"family_name": "Noto Sans Sinhala",
"font-family": "Noto Sans Sinhala",
"font-stretch": "normal",
@@ -22752,7 +24588,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Light.ttf||324780:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Light.ttf||324780:1711963959.0": {
"family_name": "Noto Sans Sinhala Light",
"font-family": "Noto Sans Sinhala Light",
"font-stretch": "normal",
@@ -22788,7 +24624,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Medium.ttf||314240:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Medium.ttf||314240:1711963959.0": {
"family_name": "Noto Sans Sinhala Medium",
"font-family": "Noto Sans Sinhala Medium",
"font-stretch": "normal",
@@ -22824,7 +24660,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Regular.ttf||308964:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Regular.ttf||308964:1711963959.0": {
"family_name": "Noto Sans Sinhala",
"font-family": "Noto Sans Sinhala",
"font-stretch": "normal",
@@ -22860,7 +24696,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhala-Thin.ttf||287384:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhala-Thin.ttf||287384:1711963959.0": {
"family_name": "Noto Sans Sinhala Thin",
"font-family": "Noto Sans Sinhala Thin",
"font-stretch": "normal",
@@ -22896,7 +24732,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Black.ttf||358356:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Black.ttf||358356:1711963959.0": {
"family_name": "Noto Sans Sinhala UI Black",
"font-family": "Noto Sans Sinhala UI Black",
"font-stretch": "normal",
@@ -22932,7 +24768,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Bold.ttf||341236:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Bold.ttf||341236:1711963959.0": {
"family_name": "Noto Sans Sinhala UI",
"font-family": "Noto Sans Sinhala UI",
"font-stretch": "normal",
@@ -22968,7 +24804,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Light.ttf||324800:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Light.ttf||324800:1711963959.0": {
"family_name": "Noto Sans Sinhala UI Light",
"font-family": "Noto Sans Sinhala UI Light",
"font-stretch": "normal",
@@ -23004,7 +24840,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Medium.ttf||314260:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Medium.ttf||314260:1711963959.0": {
"family_name": "Noto Sans Sinhala UI Medium",
"font-family": "Noto Sans Sinhala UI Medium",
"font-stretch": "normal",
@@ -23040,7 +24876,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Regular.ttf||308984:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Regular.ttf||308984:1711963959.0": {
"family_name": "Noto Sans Sinhala UI",
"font-family": "Noto Sans Sinhala UI",
"font-stretch": "normal",
@@ -23076,7 +24912,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSinhalaUI-Thin.ttf||287404:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSinhalaUI-Thin.ttf||287404:1711963959.0": {
"family_name": "Noto Sans Sinhala UI Thin",
"font-family": "Noto Sans Sinhala UI Thin",
"font-stretch": "normal",
@@ -23112,7 +24948,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSogdian-Regular.ttf||96428:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSogdian-Regular.ttf||96428:1711963959.0": {
"family_name": "Noto Sans Sogdian",
"font-family": "Noto Sans Sogdian",
"font-stretch": "normal",
@@ -23148,7 +24984,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSoraSompeng-Bold.ttf||8208:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSoraSompeng-Bold.ttf||8208:1711963959.0": {
"family_name": "Noto Sans Sora Sompeng",
"font-family": "Noto Sans Sora Sompeng",
"font-stretch": "normal",
@@ -23184,7 +25020,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSoraSompeng-Medium.ttf||8064:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSoraSompeng-Medium.ttf||8064:1711963959.0": {
"family_name": "Noto Sans Sora Sompeng Medium",
"font-family": "Noto Sans Sora Sompeng Medium",
"font-stretch": "normal",
@@ -23220,7 +25056,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSoraSompeng-Regular.ttf||8048:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSoraSompeng-Regular.ttf||8048:1711963959.0": {
"family_name": "Noto Sans Sora Sompeng",
"font-family": "Noto Sans Sora Sompeng",
"font-stretch": "normal",
@@ -23256,7 +25092,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSoyombo-Regular.ttf||66356:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSoyombo-Regular.ttf||66356:1711963959.0": {
"family_name": "Noto Sans Soyombo",
"font-family": "Noto Sans Soyombo",
"font-stretch": "normal",
@@ -23292,7 +25128,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSundanese-Bold.ttf||22712:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSundanese-Bold.ttf||22712:1711963959.0": {
"family_name": "Noto Sans Sundanese",
"font-family": "Noto Sans Sundanese",
"font-stretch": "normal",
@@ -23328,7 +25164,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSundanese-Medium.ttf||22452:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSundanese-Medium.ttf||22452:1711963959.0": {
"family_name": "Noto Sans Sundanese",
"font-family": "Noto Sans Sundanese",
"font-stretch": "normal",
@@ -23364,7 +25200,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSundanese-Regular.ttf||22640:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSundanese-Regular.ttf||22640:1711963959.0": {
"family_name": "Noto Sans Sundanese",
"font-family": "Noto Sans Sundanese",
"font-stretch": "normal",
@@ -23400,7 +25236,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSylotiNagri-Regular.ttf||16740:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSylotiNagri-Regular.ttf||16740:1711963959.0": {
"family_name": "Noto Sans Syloti Nagri",
"font-family": "Noto Sans Syloti Nagri",
"font-stretch": "normal",
@@ -23436,7 +25272,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Black.ttf||235968:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Black.ttf||235968:1711963959.0": {
"family_name": "Noto Sans Symbols Black",
"font-family": "Noto Sans Symbols Black",
"font-stretch": "normal",
@@ -23472,7 +25308,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Bold.ttf||228028:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Bold.ttf||228028:1711963959.0": {
"family_name": "Noto Sans Symbols",
"font-family": "Noto Sans Symbols",
"font-stretch": "normal",
@@ -23508,7 +25344,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Light.ttf||228800:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Light.ttf||228800:1711963959.0": {
"family_name": "Noto Sans Symbols Light",
"font-family": "Noto Sans Symbols Light",
"font-stretch": "normal",
@@ -23544,7 +25380,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Medium.ttf||227616:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Medium.ttf||227616:1711963959.0": {
"family_name": "Noto Sans Symbols Medium",
"font-family": "Noto Sans Symbols Medium",
"font-stretch": "normal",
@@ -23580,7 +25416,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Regular.ttf||226980:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Regular.ttf||226980:1711963959.0": {
"family_name": "Noto Sans Symbols",
"font-family": "Noto Sans Symbols",
"font-stretch": "normal",
@@ -23616,7 +25452,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols-Thin.ttf||231428:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols-Thin.ttf||231428:1711963959.0": {
"family_name": "Noto Sans Symbols Thin",
"font-family": "Noto Sans Symbols Thin",
"font-stretch": "normal",
@@ -23652,7 +25488,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSymbols2-Regular.ttf||671568:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSymbols2-Regular.ttf||671568:1711963959.0": {
"family_name": "Noto Sans Symbols 2",
"font-family": "Noto Sans Symbols 2",
"font-stretch": "normal",
@@ -23688,7 +25524,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriac-Black.ttf||75804:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriac-Black.ttf||75804:1711963959.0": {
"family_name": "Noto Sans Syriac Black",
"font-family": "Noto Sans Syriac Black",
"font-stretch": "normal",
@@ -23724,7 +25560,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriac-Regular.ttf||73796:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriac-Regular.ttf||73796:1711963959.0": {
"family_name": "Noto Sans Syriac",
"font-family": "Noto Sans Syriac",
"font-stretch": "normal",
@@ -23760,7 +25596,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriac-Thin.ttf||73192:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriac-Thin.ttf||73192:1711963959.0": {
"family_name": "Noto Sans Syriac Thin",
"font-family": "Noto Sans Syriac Thin",
"font-stretch": "normal",
@@ -23796,7 +25632,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacEastern-Black.ttf||62536:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacEastern-Black.ttf||62536:1711963959.0": {
"family_name": "Noto Sans Syriac Eastern Black",
"font-family": "Noto Sans Syriac Eastern Black",
"font-stretch": "normal",
@@ -23832,7 +25668,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacEastern-Regular.ttf||61312:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacEastern-Regular.ttf||61312:1711963959.0": {
"family_name": "Noto Sans Syriac Eastern",
"font-family": "Noto Sans Syriac Eastern",
"font-stretch": "normal",
@@ -23868,7 +25704,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacEastern-Thin.ttf||62024:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacEastern-Thin.ttf||62024:1711963959.0": {
"family_name": "Noto Sans Syriac Eastern Thin",
"font-family": "Noto Sans Syriac Eastern Thin",
"font-stretch": "normal",
@@ -23904,7 +25740,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacWestern-Black.ttf||75472:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacWestern-Black.ttf||75472:1711963959.0": {
"family_name": "Noto Sans Syriac Western Black",
"font-family": "Noto Sans Syriac Western Black",
"font-stretch": "normal",
@@ -23940,7 +25776,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacWestern-Regular.ttf||75036:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacWestern-Regular.ttf||75036:1711963959.0": {
"family_name": "Noto Sans Syriac Western",
"font-family": "Noto Sans Syriac Western",
"font-stretch": "normal",
@@ -23976,7 +25812,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansSyriacWestern-Thin.ttf||75356:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansSyriacWestern-Thin.ttf||75356:1711963959.0": {
"family_name": "Noto Sans Syriac Western Thin",
"font-family": "Noto Sans Syriac Western Thin",
"font-stretch": "normal",
@@ -24012,7 +25848,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTagalog-Regular.ttf||7060:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTagalog-Regular.ttf||7060:1711963959.0": {
"family_name": "Noto Sans Tagalog",
"font-family": "Noto Sans Tagalog",
"font-stretch": "normal",
@@ -24048,7 +25884,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTagbanwa-Regular.ttf||5940:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTagbanwa-Regular.ttf||5940:1711963959.0": {
"family_name": "Noto Sans Tagbanwa",
"font-family": "Noto Sans Tagbanwa",
"font-stretch": "normal",
@@ -24084,7 +25920,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTaiLe-Regular.ttf||19476:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTaiLe-Regular.ttf||19476:1711963959.0": {
"family_name": "Noto Sans Tai Le",
"font-family": "Noto Sans Tai Le",
"font-stretch": "normal",
@@ -24120,7 +25956,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTaiTham-Bold.ttf||116848:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTaiTham-Bold.ttf||116848:1711963959.0": {
"family_name": "Noto Sans Tai Tham",
"font-family": "Noto Sans Tai Tham",
"font-stretch": "normal",
@@ -24156,7 +25992,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTaiTham-Medium.ttf||118420:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTaiTham-Medium.ttf||118420:1711963959.0": {
"family_name": "Noto Sans Tai Tham Medium",
"font-family": "Noto Sans Tai Tham Medium",
"font-stretch": "normal",
@@ -24192,7 +26028,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTaiTham-Regular.ttf||116880:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTaiTham-Regular.ttf||116880:1711963959.0": {
"family_name": "Noto Sans Tai Tham",
"font-family": "Noto Sans Tai Tham",
"font-stretch": "normal",
@@ -24228,7 +26064,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTaiViet-Regular.ttf||30580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTaiViet-Regular.ttf||30580:1711963959.0": {
"family_name": "Noto Sans Tai Viet",
"font-family": "Noto Sans Tai Viet",
"font-stretch": "normal",
@@ -24264,7 +26100,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTakri-Regular.ttf||18456:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTakri-Regular.ttf||18456:1711963959.0": {
"family_name": "Noto Sans Takri",
"font-family": "Noto Sans Takri",
"font-stretch": "normal",
@@ -24300,7 +26136,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Black.ttf||76300:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Black.ttf||76300:1711963959.0": {
"family_name": "Noto Sans Tamil Black",
"font-family": "Noto Sans Tamil Black",
"font-stretch": "normal",
@@ -24336,7 +26172,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Bold.ttf||77176:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Bold.ttf||77176:1711963959.0": {
"family_name": "Noto Sans Tamil",
"font-family": "Noto Sans Tamil",
"font-stretch": "normal",
@@ -24372,7 +26208,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Light.ttf||66344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Light.ttf||66344:1711963959.0": {
"family_name": "Noto Sans Tamil Light",
"font-family": "Noto Sans Tamil Light",
"font-stretch": "normal",
@@ -24408,7 +26244,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Medium.ttf||74124:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Medium.ttf||74124:1711963959.0": {
"family_name": "Noto Sans Tamil Medium",
"font-family": "Noto Sans Tamil Medium",
"font-stretch": "normal",
@@ -24444,7 +26280,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Regular.ttf||73992:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Regular.ttf||73992:1711963959.0": {
"family_name": "Noto Sans Tamil",
"font-family": "Noto Sans Tamil",
"font-stretch": "normal",
@@ -24480,7 +26316,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamil-Thin.ttf||66248:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamil-Thin.ttf||66248:1711963959.0": {
"family_name": "Noto Sans Tamil Thin",
"font-family": "Noto Sans Tamil Thin",
"font-stretch": "normal",
@@ -24516,7 +26352,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilSupplement-Regular.ttf||15516:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilSupplement-Regular.ttf||15516:1711963959.0": {
"family_name": "Noto Sans Tamil Supplement",
"font-family": "Noto Sans Tamil Supplement",
"font-stretch": "normal",
@@ -24552,7 +26388,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Black.ttf||76368:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Black.ttf||76368:1711963959.0": {
"family_name": "Noto Sans Tamil UI Black",
"font-family": "Noto Sans Tamil UI Black",
"font-stretch": "normal",
@@ -24588,7 +26424,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Bold.ttf||77232:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Bold.ttf||77232:1711963959.0": {
"family_name": "Noto Sans Tamil UI",
"font-family": "Noto Sans Tamil UI",
"font-stretch": "normal",
@@ -24624,7 +26460,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Light.ttf||66400:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Light.ttf||66400:1711963959.0": {
"family_name": "Noto Sans Tamil UI Light",
"font-family": "Noto Sans Tamil UI Light",
"font-stretch": "normal",
@@ -24660,7 +26496,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Medium.ttf||74172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Medium.ttf||74172:1711963959.0": {
"family_name": "Noto Sans Tamil UI Medium",
"font-family": "Noto Sans Tamil UI Medium",
"font-stretch": "normal",
@@ -24696,7 +26532,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Regular.ttf||74060:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Regular.ttf||74060:1711963959.0": {
"family_name": "Noto Sans Tamil UI",
"font-family": "Noto Sans Tamil UI",
"font-stretch": "normal",
@@ -24732,7 +26568,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTamilUI-Thin.ttf||66300:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTamilUI-Thin.ttf||66300:1711963959.0": {
"family_name": "Noto Sans Tamil UI Thin",
"font-family": "Noto Sans Tamil UI Thin",
"font-stretch": "normal",
@@ -24768,7 +26604,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTangsa-Bold.ttf||21572:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTangsa-Bold.ttf||21572:1711963959.0": {
"family_name": "Noto Sans Tangsa",
"font-family": "Noto Sans Tangsa",
"font-stretch": "normal",
@@ -24804,7 +26640,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTangsa-Medium.ttf||24000:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTangsa-Medium.ttf||24000:1711963959.0": {
"family_name": "Noto Sans Tangsa Medium",
"font-family": "Noto Sans Tangsa Medium",
"font-stretch": "normal",
@@ -24840,7 +26676,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTangsa-Regular.ttf||23056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTangsa-Regular.ttf||23056:1711963959.0": {
"family_name": "Noto Sans Tangsa",
"font-family": "Noto Sans Tangsa",
"font-stretch": "normal",
@@ -24876,7 +26712,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Black.ttf||247048:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Black.ttf||247048:1711963959.0": {
"family_name": "Noto Sans Telugu Black",
"font-family": "Noto Sans Telugu Black",
"font-stretch": "normal",
@@ -24912,7 +26748,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Bold.ttf||243412:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Bold.ttf||243412:1711963959.0": {
"family_name": "Noto Sans Telugu",
"font-family": "Noto Sans Telugu",
"font-stretch": "normal",
@@ -24948,7 +26784,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Light.ttf||229872:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Light.ttf||229872:1711963959.0": {
"family_name": "Noto Sans Telugu Light",
"font-family": "Noto Sans Telugu Light",
"font-stretch": "normal",
@@ -24984,7 +26820,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Medium.ttf||244580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Medium.ttf||244580:1711963959.0": {
"family_name": "Noto Sans Telugu Medium",
"font-family": "Noto Sans Telugu Medium",
"font-stretch": "normal",
@@ -25020,7 +26856,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Regular.ttf||235176:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Regular.ttf||235176:1711963959.0": {
"family_name": "Noto Sans Telugu",
"font-family": "Noto Sans Telugu",
"font-stretch": "normal",
@@ -25056,7 +26892,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTelugu-Thin.ttf||221016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTelugu-Thin.ttf||221016:1711963959.0": {
"family_name": "Noto Sans Telugu Thin",
"font-family": "Noto Sans Telugu Thin",
"font-stretch": "normal",
@@ -25092,7 +26928,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Black.ttf||248368:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Black.ttf||248368:1711963959.0": {
"family_name": "Noto Sans Telugu UI Black",
"font-family": "Noto Sans Telugu UI Black",
"font-stretch": "normal",
@@ -25128,7 +26964,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Bold.ttf||244516:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Bold.ttf||244516:1711963959.0": {
"family_name": "Noto Sans Telugu UI",
"font-family": "Noto Sans Telugu UI",
"font-stretch": "normal",
@@ -25164,7 +27000,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Light.ttf||231016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Light.ttf||231016:1711963959.0": {
"family_name": "Noto Sans Telugu UI Light",
"font-family": "Noto Sans Telugu UI Light",
"font-stretch": "normal",
@@ -25200,7 +27036,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Medium.ttf||245696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Medium.ttf||245696:1711963959.0": {
"family_name": "Noto Sans Telugu UI Medium",
"font-family": "Noto Sans Telugu UI Medium",
"font-stretch": "normal",
@@ -25236,7 +27072,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Regular.ttf||236276:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Regular.ttf||236276:1711963959.0": {
"family_name": "Noto Sans Telugu UI",
"font-family": "Noto Sans Telugu UI",
"font-stretch": "normal",
@@ -25272,7 +27108,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTeluguUI-Thin.ttf||222172:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTeluguUI-Thin.ttf||222172:1711963959.0": {
"family_name": "Noto Sans Telugu UI Thin",
"font-family": "Noto Sans Telugu UI Thin",
"font-stretch": "normal",
@@ -25308,7 +27144,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTest-Regular.ttf||2560:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTest-Regular.ttf||2560:1711963959.0": {
"family_name": "Noto Sans Test",
"font-family": "Noto Sans Test",
"font-stretch": "normal",
@@ -25344,7 +27180,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Black.ttf||27160:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Black.ttf||27160:1711963959.0": {
"family_name": "Noto Sans Thaana Black",
"font-family": "Noto Sans Thaana Black",
"font-stretch": "normal",
@@ -25380,7 +27216,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Bold.ttf||27000:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Bold.ttf||27000:1711963959.0": {
"family_name": "Noto Sans Thaana",
"font-family": "Noto Sans Thaana",
"font-stretch": "normal",
@@ -25416,7 +27252,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Light.ttf||28392:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Light.ttf||28392:1711963959.0": {
"family_name": "Noto Sans Thaana Light",
"font-family": "Noto Sans Thaana Light",
"font-stretch": "normal",
@@ -25452,7 +27288,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Medium.ttf||27344:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Medium.ttf||27344:1711963959.0": {
"family_name": "Noto Sans Thaana Medium",
"font-family": "Noto Sans Thaana Medium",
"font-stretch": "normal",
@@ -25488,7 +27324,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Regular.ttf||27308:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Regular.ttf||27308:1711963959.0": {
"family_name": "Noto Sans Thaana",
"font-family": "Noto Sans Thaana",
"font-stretch": "normal",
@@ -25524,7 +27360,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaana-Thin.ttf||27988:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaana-Thin.ttf||27988:1711963959.0": {
"family_name": "Noto Sans Thaana Thin",
"font-family": "Noto Sans Thaana Thin",
"font-stretch": "normal",
@@ -25560,7 +27396,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Black.ttf||39128:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Black.ttf||39128:1711963959.0": {
"family_name": "Noto Sans Thai Blk",
"font-family": "Noto Sans Thai Blk",
"font-stretch": "normal",
@@ -25596,7 +27432,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Bold.ttf||37824:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Bold.ttf||37824:1711963959.0": {
"family_name": "Noto Sans Thai",
"font-family": "Noto Sans Thai",
"font-stretch": "normal",
@@ -25632,7 +27468,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Light.ttf||35508:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Light.ttf||35508:1711963959.0": {
"family_name": "Noto Sans Thai Light",
"font-family": "Noto Sans Thai Light",
"font-stretch": "normal",
@@ -25668,7 +27504,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Medium.ttf||38296:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Medium.ttf||38296:1711963959.0": {
"family_name": "Noto Sans Thai Med",
"font-family": "Noto Sans Thai Med",
"font-stretch": "normal",
@@ -25704,7 +27540,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Regular.ttf||37780:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Regular.ttf||37780:1711963959.0": {
"family_name": "Noto Sans Thai",
"font-family": "Noto Sans Thai",
"font-stretch": "normal",
@@ -25740,7 +27576,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThai-Thin.ttf||34812:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThai-Thin.ttf||34812:1711963959.0": {
"family_name": "Noto Sans Thai Thin",
"font-family": "Noto Sans Thai Thin",
"font-stretch": "normal",
@@ -25776,7 +27612,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Black.ttf||69976:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Black.ttf||69976:1711963959.0": {
"family_name": "Noto Sans Thai Looped Black",
"font-family": "Noto Sans Thai Looped Black",
"font-stretch": "normal",
@@ -25812,7 +27648,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Bold.ttf||71120:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Bold.ttf||71120:1711963959.0": {
"family_name": "Noto Sans Thai Looped",
"font-family": "Noto Sans Thai Looped",
"font-stretch": "normal",
@@ -25848,7 +27684,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Light.ttf||65708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Light.ttf||65708:1711963959.0": {
"family_name": "Noto Sans Thai Looped Light",
"font-family": "Noto Sans Thai Looped Light",
"font-stretch": "normal",
@@ -25884,7 +27720,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Medium.ttf||68048:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Medium.ttf||68048:1711963959.0": {
"family_name": "Noto Sans Thai Looped Medium",
"font-family": "Noto Sans Thai Looped Medium",
"font-stretch": "normal",
@@ -25920,7 +27756,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Regular.ttf||66076:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Regular.ttf||66076:1711963959.0": {
"family_name": "Noto Sans Thai Looped",
"font-family": "Noto Sans Thai Looped",
"font-stretch": "normal",
@@ -25956,7 +27792,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansThaiLooped-Thin.ttf||62876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansThaiLooped-Thin.ttf||62876:1711963959.0": {
"family_name": "Noto Sans Thai Looped Thin",
"font-family": "Noto Sans Thai Looped Thin",
"font-stretch": "normal",
@@ -25992,7 +27828,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinagh-Regular.ttf||79376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinagh-Regular.ttf||79376:1711963959.0": {
"family_name": "Noto Sans Tifinagh",
"font-family": "Noto Sans Tifinagh",
"font-stretch": "normal",
@@ -26028,7 +27864,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAPT-Regular.ttf||79372:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAPT-Regular.ttf||79372:1711963959.0": {
"family_name": "Noto Sans Tifinagh APT",
"font-family": "Noto Sans Tifinagh APT",
"font-stretch": "normal",
@@ -26064,7 +27900,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAdrar-Regular.ttf||79000:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAdrar-Regular.ttf||79000:1711963959.0": {
"family_name": "Noto Sans Tifinagh Adrar",
"font-family": "Noto Sans Tifinagh Adrar",
"font-stretch": "normal",
@@ -26100,7 +27936,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAgrawImazighen-Regular.ttf||79232:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAgrawImazighen-Regular.ttf||79232:1711963959.0": {
"family_name": "Noto Sans Tifinagh Agraw Imazighen",
"font-family": "Noto Sans Tifinagh Agraw Imazighen",
"font-stretch": "normal",
@@ -26136,7 +27972,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAhaggar-Regular.ttf||79508:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAhaggar-Regular.ttf||79508:1711963959.0": {
"family_name": "Noto Sans Tifinagh Ahaggar",
"font-family": "Noto Sans Tifinagh Ahaggar",
"font-stretch": "normal",
@@ -26172,7 +28008,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAir-Regular.ttf||79560:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAir-Regular.ttf||79560:1711963959.0": {
"family_name": "Noto Sans Tifinagh Air",
"font-family": "Noto Sans Tifinagh Air",
"font-stretch": "normal",
@@ -26208,7 +28044,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghAzawagh-Regular.ttf||79660:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghAzawagh-Regular.ttf||79660:1711963959.0": {
"family_name": "Noto Sans Tifinagh Azawagh",
"font-family": "Noto Sans Tifinagh Azawagh",
"font-stretch": "normal",
@@ -26244,7 +28080,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghGhat-Regular.ttf||79016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghGhat-Regular.ttf||79016:1711963959.0": {
"family_name": "Noto Sans Tifinagh Ghat",
"font-family": "Noto Sans Tifinagh Ghat",
"font-stretch": "normal",
@@ -26280,7 +28116,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghHawad-Regular.ttf||79184:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghHawad-Regular.ttf||79184:1711963959.0": {
"family_name": "Noto Sans Tifinagh Hawad",
"font-family": "Noto Sans Tifinagh Hawad",
"font-stretch": "normal",
@@ -26316,7 +28152,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghRhissaIxa-Regular.ttf||79308:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghRhissaIxa-Regular.ttf||79308:1711963959.0": {
"family_name": "Noto Sans Tifinagh Rhissa Ixa",
"font-family": "Noto Sans Tifinagh Rhissa Ixa",
"font-stretch": "normal",
@@ -26352,7 +28188,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghSIL-Regular.ttf||79620:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghSIL-Regular.ttf||79620:1711963959.0": {
"family_name": "Noto Sans Tifinagh SIL",
"font-family": "Noto Sans Tifinagh SIL",
"font-stretch": "normal",
@@ -26388,7 +28224,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTifinaghTawellemmet-Regular.ttf||79632:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTifinaghTawellemmet-Regular.ttf||79632:1711963959.0": {
"family_name": "Noto Sans Tifinagh Tawellemmet",
"font-family": "Noto Sans Tifinagh Tawellemmet",
"font-stretch": "normal",
@@ -26424,7 +28260,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansTirhuta-Regular.ttf||96848:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansTirhuta-Regular.ttf||96848:1711963959.0": {
"family_name": "Noto Sans Tirhuta",
"font-family": "Noto Sans Tirhuta",
"font-stretch": "normal",
@@ -26460,7 +28296,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansUgaritic-Regular.ttf||7016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansUgaritic-Regular.ttf||7016:1711963959.0": {
"family_name": "Noto Sans Ugaritic",
"font-family": "Noto Sans Ugaritic",
"font-stretch": "normal",
@@ -26496,7 +28332,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansVai-Regular.ttf||91252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansVai-Regular.ttf||91252:1711963959.0": {
"family_name": "Noto Sans Vai",
"font-family": "Noto Sans Vai",
"font-stretch": "normal",
@@ -26532,7 +28368,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansVithkuqi-Bold.ttf||18224:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansVithkuqi-Bold.ttf||18224:1711963959.0": {
"family_name": "Noto Sans Vithkuqi",
"font-family": "Noto Sans Vithkuqi",
"font-stretch": "normal",
@@ -26568,7 +28404,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansVithkuqi-Medium.ttf||18348:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansVithkuqi-Medium.ttf||18348:1711963959.0": {
"family_name": "Noto Sans Vithkuqi Medium",
"font-family": "Noto Sans Vithkuqi Medium",
"font-stretch": "normal",
@@ -26604,7 +28440,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansVithkuqi-Regular.ttf||18548:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansVithkuqi-Regular.ttf||18548:1711963959.0": {
"family_name": "Noto Sans Vithkuqi",
"font-family": "Noto Sans Vithkuqi",
"font-stretch": "normal",
@@ -26640,7 +28476,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansWancho-Regular.ttf||18448:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansWancho-Regular.ttf||18448:1711963959.0": {
"family_name": "Noto Sans Wancho",
"font-family": "Noto Sans Wancho",
"font-stretch": "normal",
@@ -26676,7 +28512,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansWarangCiti-Regular.ttf||27264:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansWarangCiti-Regular.ttf||27264:1711963959.0": {
"family_name": "Noto Sans Warang Citi",
"font-family": "Noto Sans Warang Citi",
"font-stretch": "normal",
@@ -26712,7 +28548,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansYi-Regular.ttf||183036:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansYi-Regular.ttf||183036:1711963959.0": {
"family_name": "Noto Sans Yi",
"font-family": "Noto Sans Yi",
"font-stretch": "normal",
@@ -26748,7 +28584,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSansZanabazarSquare-Regular.ttf||20544:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSansZanabazarSquare-Regular.ttf||20544:1711963959.0": {
"family_name": "Noto Sans Zanabazar Square",
"font-family": "Noto Sans Zanabazar Square",
"font-stretch": "normal",
@@ -26784,7 +28620,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Black.ttf||815952:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Black.ttf||815952:1711963959.0": {
"family_name": "Noto Serif Black",
"font-family": "Noto Serif Black",
"font-stretch": "normal",
@@ -26820,7 +28656,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-BlackItalic.ttf||807328:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-BlackItalic.ttf||807328:1711963959.0": {
"family_name": "Noto Serif Black",
"font-family": "Noto Serif Black",
"font-stretch": "normal",
@@ -26856,7 +28692,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Bold.ttf||769256:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Bold.ttf||769256:1711963959.0": {
"family_name": "Noto Serif Bold",
"font-family": "Noto Serif Bold",
"font-stretch": "normal",
@@ -26892,7 +28728,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-BoldItalic.ttf||783700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-BoldItalic.ttf||783700:1711963959.0": {
"family_name": "Noto Serif",
"font-family": "Noto Serif",
"font-stretch": "normal",
@@ -26928,7 +28764,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Italic.ttf||758388:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Italic.ttf||758388:1711963959.0": {
"family_name": "Noto Serif",
"font-family": "Noto Serif",
"font-stretch": "normal",
@@ -26964,7 +28800,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Light.ttf||753348:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Light.ttf||753348:1711963959.0": {
"family_name": "Noto Serif Light",
"font-family": "Noto Serif Light",
"font-stretch": "normal",
@@ -27000,7 +28836,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-LightItalic.ttf||742292:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-LightItalic.ttf||742292:1711963959.0": {
"family_name": "Noto Serif Light",
"font-family": "Noto Serif Light",
"font-stretch": "normal",
@@ -27036,7 +28872,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Medium.ttf||762780:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Medium.ttf||762780:1711963959.0": {
"family_name": "Noto Serif Medium",
"font-family": "Noto Serif Medium",
"font-stretch": "normal",
@@ -27072,7 +28908,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-MediumItalic.ttf||781112:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-MediumItalic.ttf||781112:1711963959.0": {
"family_name": "Noto Serif Medium",
"font-family": "Noto Serif Medium",
"font-stretch": "normal",
@@ -27108,7 +28944,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Regular.ttf||738844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Regular.ttf||738844:1711963959.0": {
"family_name": "Noto Serif",
"font-family": "Noto Serif",
"font-stretch": "normal",
@@ -27144,7 +28980,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-Thin.ttf||790016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-Thin.ttf||790016:1711963959.0": {
"family_name": "Noto Serif Thin",
"font-family": "Noto Serif Thin",
"font-stretch": "normal",
@@ -27180,7 +29016,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerif-ThinItalic.ttf||753388:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerif-ThinItalic.ttf||753388:1711963959.0": {
"family_name": "Noto Serif Thin",
"font-family": "Noto Serif Thin",
"font-stretch": "normal",
@@ -27216,7 +29052,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifAhom-Regular.ttf||21212:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifAhom-Regular.ttf||21212:1711963959.0": {
"family_name": "Noto Serif Ahom",
"font-family": "Noto Serif Ahom",
"font-stretch": "normal",
@@ -27252,7 +29088,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Black.ttf||32340:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Black.ttf||32340:1711963959.0": {
"family_name": "Noto Serif Armenian Black",
"font-family": "Noto Serif Armenian Black",
"font-stretch": "normal",
@@ -27288,7 +29124,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Bold.ttf||30260:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Bold.ttf||30260:1711963959.0": {
"family_name": "Noto Serif Armenian",
"font-family": "Noto Serif Armenian",
"font-stretch": "normal",
@@ -27324,7 +29160,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Light.ttf||30748:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Light.ttf||30748:1711963959.0": {
"family_name": "Noto Serif Armenian Light",
"font-family": "Noto Serif Armenian Light",
"font-stretch": "normal",
@@ -27360,7 +29196,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Medium.ttf||31656:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Medium.ttf||31656:1711963959.0": {
"family_name": "Noto Serif Armenian Medium",
"font-family": "Noto Serif Armenian Medium",
"font-stretch": "normal",
@@ -27396,7 +29232,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Regular.ttf||31040:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Regular.ttf||31040:1711963959.0": {
"family_name": "Noto Serif Armenian",
"font-family": "Noto Serif Armenian",
"font-stretch": "normal",
@@ -27432,7 +29268,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifArmenian-Thin.ttf||30504:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifArmenian-Thin.ttf||30504:1711963959.0": {
"family_name": "Noto Serif Armenian Thin",
"font-family": "Noto Serif Armenian Thin",
"font-stretch": "normal",
@@ -27468,7 +29304,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBalinese-Regular.ttf||52660:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBalinese-Regular.ttf||52660:1711963959.0": {
"family_name": "Noto Serif Balinese",
"font-family": "Noto Serif Balinese",
"font-stretch": "normal",
@@ -27504,7 +29340,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Black.ttf||269460:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Black.ttf||269460:1711963959.0": {
"family_name": "Noto Serif Bengali Black",
"font-family": "Noto Serif Bengali Black",
"font-stretch": "normal",
@@ -27540,7 +29376,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Bold.ttf||258628:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Bold.ttf||258628:1711963959.0": {
"family_name": "Noto Serif Bengali",
"font-family": "Noto Serif Bengali",
"font-stretch": "normal",
@@ -27576,7 +29412,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Light.ttf||233416:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Light.ttf||233416:1711963959.0": {
"family_name": "Noto Serif Bengali Light",
"font-family": "Noto Serif Bengali Light",
"font-stretch": "normal",
@@ -27612,7 +29448,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Medium.ttf||256104:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Medium.ttf||256104:1711963959.0": {
"family_name": "Noto Serif Bengali Medium",
"font-family": "Noto Serif Bengali Medium",
"font-stretch": "normal",
@@ -27648,7 +29484,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Regular.ttf||263696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Regular.ttf||263696:1711963959.0": {
"family_name": "Noto Serif Bengali",
"font-family": "Noto Serif Bengali",
"font-stretch": "normal",
@@ -27684,7 +29520,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifBengali-Thin.ttf||235440:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifBengali-Thin.ttf||235440:1711963959.0": {
"family_name": "Noto Serif Bengali Thin",
"font-family": "Noto Serif Bengali Thin",
"font-stretch": "normal",
@@ -27720,7 +29556,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Black.ttf||259444:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Black.ttf||259444:1711963959.0": {
"family_name": "Noto Serif Devanagari Black",
"font-family": "Noto Serif Devanagari Black",
"font-stretch": "normal",
@@ -27756,7 +29592,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Bold.ttf||257240:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Bold.ttf||257240:1711963959.0": {
"family_name": "Noto Serif Devanagari",
"font-family": "Noto Serif Devanagari",
"font-stretch": "normal",
@@ -27792,7 +29628,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Light.ttf||234536:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Light.ttf||234536:1711963959.0": {
"family_name": "Noto Serif Devanagari Light",
"font-family": "Noto Serif Devanagari Light",
"font-stretch": "normal",
@@ -27828,7 +29664,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Medium.ttf||258624:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Medium.ttf||258624:1711963959.0": {
"family_name": "Noto Serif Devanagari Medium",
"font-family": "Noto Serif Devanagari Medium",
"font-stretch": "normal",
@@ -27864,7 +29700,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Regular.ttf||252752:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Regular.ttf||252752:1711963959.0": {
"family_name": "Noto Serif Devanagari",
"font-family": "Noto Serif Devanagari",
"font-stretch": "normal",
@@ -27900,7 +29736,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDevanagari-Thin.ttf||246808:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDevanagari-Thin.ttf||246808:1711963959.0": {
"family_name": "Noto Serif Devanagari Thin",
"font-family": "Noto Serif Devanagari Thin",
"font-stretch": "normal",
@@ -27936,7 +29772,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Black.ttf||732616:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Black.ttf||732616:1711963959.0": {
"family_name": "Noto Serif Display Black",
"font-family": "Noto Serif Display Black",
"font-stretch": "normal",
@@ -27972,7 +29808,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-BlackItalic.ttf||700308:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-BlackItalic.ttf||700308:1711963959.0": {
"family_name": "Noto Serif Display Black",
"font-family": "Noto Serif Display Black",
"font-stretch": "normal",
@@ -28008,7 +29844,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Bold.ttf||682480:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Bold.ttf||682480:1711963959.0": {
"family_name": "Noto Serif Display",
"font-family": "Noto Serif Display",
"font-stretch": "normal",
@@ -28044,7 +29880,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-BoldItalic.ttf||682972:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-BoldItalic.ttf||682972:1711963959.0": {
"family_name": "Noto Serif Display",
"font-family": "Noto Serif Display",
"font-stretch": "normal",
@@ -28080,7 +29916,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Italic.ttf||676588:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Italic.ttf||676588:1711963959.0": {
"family_name": "Noto Serif Display",
"font-family": "Noto Serif Display",
"font-stretch": "normal",
@@ -28116,7 +29952,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Light.ttf||682184:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Light.ttf||682184:1711963959.0": {
"family_name": "Noto Serif Display Light",
"font-family": "Noto Serif Display Light",
"font-stretch": "normal",
@@ -28152,7 +29988,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-LightItalic.ttf||678832:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-LightItalic.ttf||678832:1711963959.0": {
"family_name": "Noto Serif Display Light",
"font-family": "Noto Serif Display Light",
"font-stretch": "normal",
@@ -28188,7 +30024,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Medium.ttf||680660:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Medium.ttf||680660:1711963959.0": {
"family_name": "Noto Serif Display Medium",
"font-family": "Noto Serif Display Medium",
"font-stretch": "normal",
@@ -28224,7 +30060,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-MediumItalic.ttf||684720:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-MediumItalic.ttf||684720:1711963959.0": {
"family_name": "Noto Serif Display Medium",
"font-family": "Noto Serif Display Medium",
"font-stretch": "normal",
@@ -28260,7 +30096,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Regular.ttf||670076:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Regular.ttf||670076:1711963959.0": {
"family_name": "Noto Serif Display",
"font-family": "Noto Serif Display",
"font-stretch": "normal",
@@ -28296,7 +30132,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-Thin.ttf||698700:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-Thin.ttf||698700:1711963959.0": {
"family_name": "Noto Serif Display Thin",
"font-family": "Noto Serif Display Thin",
"font-stretch": "normal",
@@ -28332,7 +30168,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDisplay-ThinItalic.ttf||686332:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDisplay-ThinItalic.ttf||686332:1711963959.0": {
"family_name": "Noto Serif Display Thin",
"font-family": "Noto Serif Display Thin",
"font-stretch": "normal",
@@ -28368,7 +30204,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDivesAkuru-Regular.ttf||47376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDivesAkuru-Regular.ttf||47376:1711963959.0": {
"family_name": "Noto Serif Dives Akuru",
"font-family": "Noto Serif Dives Akuru",
"font-stretch": "normal",
@@ -28404,7 +30240,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifDogra-Regular.ttf||28800:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifDogra-Regular.ttf||28800:1711963959.0": {
"family_name": "Noto Serif Dogra",
"font-family": "Noto Serif Dogra",
"font-stretch": "normal",
@@ -28440,7 +30276,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Black.ttf||311480:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Black.ttf||311480:1711963959.0": {
"family_name": "Noto Serif Ethiopic Black",
"font-family": "Noto Serif Ethiopic Black",
"font-stretch": "normal",
@@ -28476,7 +30312,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Bold.ttf||308144:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Bold.ttf||308144:1711963959.0": {
"family_name": "Noto Serif Ethiopic",
"font-family": "Noto Serif Ethiopic",
"font-stretch": "normal",
@@ -28512,7 +30348,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Light.ttf||318708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Light.ttf||318708:1711963959.0": {
"family_name": "Noto Serif Ethiopic Light",
"font-family": "Noto Serif Ethiopic Light",
"font-stretch": "normal",
@@ -28548,7 +30384,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Medium.ttf||309428:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Medium.ttf||309428:1711963959.0": {
"family_name": "Noto Serif Ethiopic Medium",
"font-family": "Noto Serif Ethiopic Medium",
"font-stretch": "normal",
@@ -28584,7 +30420,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Regular.ttf||309844:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Regular.ttf||309844:1711963959.0": {
"family_name": "Noto Serif Ethiopic",
"font-family": "Noto Serif Ethiopic",
"font-stretch": "normal",
@@ -28620,7 +30456,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifEthiopic-Thin.ttf||306760:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifEthiopic-Thin.ttf||306760:1711963959.0": {
"family_name": "Noto Serif Ethiopic Thin",
"font-family": "Noto Serif Ethiopic Thin",
"font-stretch": "normal",
@@ -28656,7 +30492,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Black.ttf||65152:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Black.ttf||65152:1711963959.0": {
"family_name": "Noto Serif Georgian Bk",
"font-family": "Noto Serif Georgian Bk",
"font-stretch": "normal",
@@ -28692,7 +30528,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Bold.ttf||64396:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Bold.ttf||64396:1711963959.0": {
"family_name": "Noto Serif Georgian",
"font-family": "Noto Serif Georgian",
"font-stretch": "normal",
@@ -28728,7 +30564,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Light.ttf||62016:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Light.ttf||62016:1711963959.0": {
"family_name": "Noto Serif Georgian Lt",
"font-family": "Noto Serif Georgian Lt",
"font-stretch": "normal",
@@ -28764,7 +30600,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Medium.ttf||63296:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Medium.ttf||63296:1711963959.0": {
"family_name": "Noto Serif Georgian Md",
"font-family": "Noto Serif Georgian Md",
"font-stretch": "normal",
@@ -28800,7 +30636,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Regular.ttf||61956:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Regular.ttf||61956:1711963959.0": {
"family_name": "Noto Serif Georgian",
"font-family": "Noto Serif Georgian",
"font-stretch": "normal",
@@ -28836,7 +30672,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGeorgian-Thin.ttf||62680:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGeorgian-Thin.ttf||62680:1711963959.0": {
"family_name": "Noto Serif Georgian Th",
"font-family": "Noto Serif Georgian Th",
"font-stretch": "normal",
@@ -28872,7 +30708,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGrantha-Regular.ttf||371800:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGrantha-Regular.ttf||371800:1711963959.0": {
"family_name": "Noto Serif Grantha",
"font-family": "Noto Serif Grantha",
"font-stretch": "normal",
@@ -28908,7 +30744,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Black.ttf||144804:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Black.ttf||144804:1711963959.0": {
"family_name": "Noto Serif Gujarati Black",
"font-family": "Noto Serif Gujarati Black",
"font-stretch": "normal",
@@ -28944,7 +30780,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Bold.ttf||148572:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Bold.ttf||148572:1711963959.0": {
"family_name": "Noto Serif Gujarati",
"font-family": "Noto Serif Gujarati",
"font-stretch": "normal",
@@ -28980,7 +30816,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Light.ttf||144936:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Light.ttf||144936:1711963959.0": {
"family_name": "Noto Serif Gujarati Light",
"font-family": "Noto Serif Gujarati Light",
"font-stretch": "normal",
@@ -29016,7 +30852,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Medium.ttf||146204:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Medium.ttf||146204:1711963959.0": {
"family_name": "Noto Serif Gujarati Medium",
"font-family": "Noto Serif Gujarati Medium",
"font-stretch": "normal",
@@ -29052,7 +30888,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Regular.ttf||146056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Regular.ttf||146056:1711963959.0": {
"family_name": "Noto Serif Gujarati",
"font-family": "Noto Serif Gujarati",
"font-stretch": "normal",
@@ -29088,7 +30924,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGujarati-Thin.ttf||140220:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGujarati-Thin.ttf||140220:1711963959.0": {
"family_name": "Noto Serif Gujarati Thin",
"font-family": "Noto Serif Gujarati Thin",
"font-stretch": "normal",
@@ -29124,7 +30960,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Black.ttf||55108:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Black.ttf||55108:1711963959.0": {
"family_name": "Noto Serif Gurmukhi Black",
"font-family": "Noto Serif Gurmukhi Black",
"font-stretch": "normal",
@@ -29160,7 +30996,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Bold.ttf||54256:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Bold.ttf||54256:1711963959.0": {
"family_name": "Noto Serif Gurmukhi",
"font-family": "Noto Serif Gurmukhi",
"font-stretch": "normal",
@@ -29196,7 +31032,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Light.ttf||53212:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Light.ttf||53212:1711963959.0": {
"family_name": "Noto Serif Gurmukhi Light",
"font-family": "Noto Serif Gurmukhi Light",
"font-stretch": "normal",
@@ -29232,7 +31068,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Medium.ttf||53872:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Medium.ttf||53872:1711963959.0": {
"family_name": "Noto Serif Gurmukhi Medium",
"font-family": "Noto Serif Gurmukhi Medium",
"font-stretch": "normal",
@@ -29268,7 +31104,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Regular.ttf||53316:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Regular.ttf||53316:1711963959.0": {
"family_name": "Noto Serif Gurmukhi",
"font-family": "Noto Serif Gurmukhi",
"font-stretch": "normal",
@@ -29304,7 +31140,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifGurmukhi-Thin.ttf||51532:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifGurmukhi-Thin.ttf||51532:1711963959.0": {
"family_name": "Noto Serif Gurmukhi Thin",
"font-family": "Noto Serif Gurmukhi Thin",
"font-stretch": "normal",
@@ -29340,7 +31176,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Black.ttf||31104:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Black.ttf||31104:1711963959.0": {
"family_name": "Noto Serif Hebrew Black",
"font-family": "Noto Serif Hebrew Black",
"font-stretch": "normal",
@@ -29376,7 +31212,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Bold.ttf||31944:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Bold.ttf||31944:1711963959.0": {
"family_name": "Noto Serif Hebrew",
"font-family": "Noto Serif Hebrew",
"font-stretch": "normal",
@@ -29412,7 +31248,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Light.ttf||30252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Light.ttf||30252:1711963959.0": {
"family_name": "Noto Serif Hebrew Light",
"font-family": "Noto Serif Hebrew Light",
"font-stretch": "normal",
@@ -29448,7 +31284,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Medium.ttf||31768:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Medium.ttf||31768:1711963959.0": {
"family_name": "Noto Serif Hebrew Medium",
"font-family": "Noto Serif Hebrew Medium",
"font-stretch": "normal",
@@ -29484,7 +31320,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Regular.ttf||31200:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Regular.ttf||31200:1711963959.0": {
"family_name": "Noto Serif Hebrew",
"font-family": "Noto Serif Hebrew",
"font-stretch": "normal",
@@ -29520,7 +31356,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifHebrew-Thin.ttf||29900:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifHebrew-Thin.ttf||29900:1711963959.0": {
"family_name": "Noto Serif Hebrew Thin",
"font-family": "Noto Serif Hebrew Thin",
"font-stretch": "normal",
@@ -29556,7 +31392,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Black.ttf||189696:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Black.ttf||189696:1711963959.0": {
"family_name": "Noto Serif Kannada Black",
"font-family": "Noto Serif Kannada Black",
"font-stretch": "normal",
@@ -29592,7 +31428,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Bold.ttf||180648:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Bold.ttf||180648:1711963959.0": {
"family_name": "Noto Serif Kannada",
"font-family": "Noto Serif Kannada",
"font-stretch": "normal",
@@ -29628,7 +31464,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Light.ttf||164904:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Light.ttf||164904:1711963959.0": {
"family_name": "Noto Serif Kannada Light",
"font-family": "Noto Serif Kannada Light",
"font-stretch": "normal",
@@ -29664,7 +31500,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Medium.ttf||160580:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Medium.ttf||160580:1711963959.0": {
"family_name": "Noto Serif Kannada Medium",
"font-family": "Noto Serif Kannada Medium",
"font-stretch": "normal",
@@ -29700,7 +31536,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Regular.ttf||194376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Regular.ttf||194376:1711963959.0": {
"family_name": "Noto Serif Kannada",
"font-family": "Noto Serif Kannada",
"font-stretch": "normal",
@@ -29736,7 +31572,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKannada-Thin.ttf||151164:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKannada-Thin.ttf||151164:1711963959.0": {
"family_name": "Noto Serif Kannada Thin",
"font-family": "Noto Serif Kannada Thin",
"font-stretch": "normal",
@@ -29772,7 +31608,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhitanSmallScript-Regular.ttf||609232:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhitanSmallScript-Regular.ttf||609232:1711963959.0": {
"family_name": "Noto Serif Khitan Small Script",
"font-family": "Noto Serif Khitan Small Script",
"font-stretch": "normal",
@@ -29808,7 +31644,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Black.ttf||152288:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Black.ttf||152288:1711963959.0": {
"family_name": "Noto Serif Khmer Black",
"font-family": "Noto Serif Khmer Black",
"font-stretch": "normal",
@@ -29844,7 +31680,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Bold.ttf||152152:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Bold.ttf||152152:1711963959.0": {
"family_name": "Noto Serif Khmer",
"font-family": "Noto Serif Khmer",
"font-stretch": "normal",
@@ -29880,7 +31716,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Light.ttf||150796:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Light.ttf||150796:1711963959.0": {
"family_name": "Noto Serif Khmer Light",
"font-family": "Noto Serif Khmer Light",
"font-stretch": "normal",
@@ -29916,7 +31752,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Medium.ttf||150704:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Medium.ttf||150704:1711963959.0": {
"family_name": "Noto Serif Khmer Medium",
"font-family": "Noto Serif Khmer Medium",
"font-stretch": "normal",
@@ -29952,7 +31788,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Regular.ttf||154372:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Regular.ttf||154372:1711963959.0": {
"family_name": "Noto Serif Khmer",
"font-family": "Noto Serif Khmer",
"font-stretch": "normal",
@@ -29988,7 +31824,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhmer-Thin.ttf||143328:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhmer-Thin.ttf||143328:1711963959.0": {
"family_name": "Noto Serif Khmer Thin",
"font-family": "Noto Serif Khmer Thin",
"font-stretch": "normal",
@@ -30024,7 +31860,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhojki-Bold.ttf||147916:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhojki-Bold.ttf||147916:1711963959.0": {
"family_name": "Noto Serif Khojki",
"font-family": "Noto Serif Khojki",
"font-stretch": "normal",
@@ -30060,7 +31896,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifKhojki-Regular.ttf||146988:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifKhojki-Regular.ttf||146988:1711963959.0": {
"family_name": "Noto Serif Khojki",
"font-family": "Noto Serif Khojki",
"font-stretch": "normal",
@@ -30096,7 +31932,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Black.ttf||46388:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Black.ttf||46388:1711963959.0": {
"family_name": "Noto Serif Lao Black",
"font-family": "Noto Serif Lao Black",
"font-stretch": "normal",
@@ -30132,7 +31968,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Bold.ttf||45336:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Bold.ttf||45336:1711963959.0": {
"family_name": "Noto Serif Lao",
"font-family": "Noto Serif Lao",
"font-stretch": "normal",
@@ -30168,7 +32004,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Light.ttf||42888:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Light.ttf||42888:1711963959.0": {
"family_name": "Noto Serif Lao Light",
"font-family": "Noto Serif Lao Light",
"font-stretch": "normal",
@@ -30204,7 +32040,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Medium.ttf||43328:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Medium.ttf||43328:1711963959.0": {
"family_name": "Noto Serif Lao Medium",
"font-family": "Noto Serif Lao Medium",
"font-stretch": "normal",
@@ -30240,7 +32076,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Regular.ttf||42880:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Regular.ttf||42880:1711963959.0": {
"family_name": "Noto Serif Lao",
"font-family": "Noto Serif Lao",
"font-stretch": "normal",
@@ -30276,7 +32112,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifLao-Thin.ttf||42448:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifLao-Thin.ttf||42448:1711963959.0": {
"family_name": "Noto Serif Lao Thin",
"font-family": "Noto Serif Lao Thin",
"font-stretch": "normal",
@@ -30312,7 +32148,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMakasar-Regular.ttf||6992:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMakasar-Regular.ttf||6992:1711963959.0": {
"family_name": "Noto Serif Makasar",
"font-family": "Noto Serif Makasar",
"font-stretch": "normal",
@@ -30348,7 +32184,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Black.ttf||116252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Black.ttf||116252:1711963959.0": {
"family_name": "Noto Serif Malayalam Black",
"font-family": "Noto Serif Malayalam Black",
"font-stretch": "normal",
@@ -30384,7 +32220,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Bold.ttf||113036:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Bold.ttf||113036:1711963959.0": {
"family_name": "Noto Serif Malayalam",
"font-family": "Noto Serif Malayalam",
"font-stretch": "normal",
@@ -30420,7 +32256,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Light.ttf||109120:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Light.ttf||109120:1711963959.0": {
"family_name": "Noto Serif Malayalam Light",
"font-family": "Noto Serif Malayalam Light",
"font-stretch": "normal",
@@ -30456,7 +32292,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Medium.ttf||112316:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Medium.ttf||112316:1711963959.0": {
"family_name": "Noto Serif Malayalam Medium",
"font-family": "Noto Serif Malayalam Medium",
"font-stretch": "normal",
@@ -30492,7 +32328,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Regular.ttf||111872:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Regular.ttf||111872:1711963959.0": {
"family_name": "Noto Serif Malayalam",
"font-family": "Noto Serif Malayalam",
"font-stretch": "normal",
@@ -30528,7 +32364,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMalayalam-Thin.ttf||106864:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMalayalam-Thin.ttf||106864:1711963959.0": {
"family_name": "Noto Serif Malayalam Thin",
"font-family": "Noto Serif Malayalam Thin",
"font-stretch": "normal",
@@ -30564,7 +32400,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Black.ttf||289676:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Black.ttf||289676:1711963959.0": {
"family_name": "Noto Serif Myanmar Black",
"font-family": "Noto Serif Myanmar Black",
"font-stretch": "normal",
@@ -30600,7 +32436,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Bold.ttf||283636:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Bold.ttf||283636:1711963959.0": {
"family_name": "Noto Serif Myanmar",
"font-family": "Noto Serif Myanmar",
"font-stretch": "normal",
@@ -30636,7 +32472,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Light.ttf||272280:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Light.ttf||272280:1711963959.0": {
"family_name": "Noto Serif Myanmar Light",
"font-family": "Noto Serif Myanmar Light",
"font-stretch": "normal",
@@ -30672,7 +32508,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Medium.ttf||278400:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Medium.ttf||278400:1711963959.0": {
"family_name": "Noto Serif Myanmar Medium",
"font-family": "Noto Serif Myanmar Medium",
"font-stretch": "normal",
@@ -30708,7 +32544,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Regular.ttf||277152:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Regular.ttf||277152:1711963959.0": {
"family_name": "Noto Serif Myanmar",
"font-family": "Noto Serif Myanmar",
"font-stretch": "normal",
@@ -30744,7 +32580,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifMyanmar-Thin.ttf||262364:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifMyanmar-Thin.ttf||262364:1711963959.0": {
"family_name": "Noto Serif Myanmar Thin",
"font-family": "Noto Serif Myanmar Thin",
"font-stretch": "normal",
@@ -30780,7 +32616,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifNPHmong-Bold.ttf||24876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifNPHmong-Bold.ttf||24876:1711963959.0": {
"family_name": "Noto Serif NP Hmong",
"font-family": "Noto Serif NP Hmong",
"font-stretch": "normal",
@@ -30816,7 +32652,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifNPHmong-Medium.ttf||24436:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifNPHmong-Medium.ttf||24436:1711963959.0": {
"family_name": "Noto Serif NP Hmong Medium",
"font-family": "Noto Serif NP Hmong Medium",
"font-stretch": "normal",
@@ -30852,7 +32688,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifNPHmong-Regular.ttf||24376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifNPHmong-Regular.ttf||24376:1711963959.0": {
"family_name": "Noto Serif NP Hmong",
"font-family": "Noto Serif NP Hmong",
"font-stretch": "normal",
@@ -30888,7 +32724,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifOldUyghur-Regular.ttf||30724:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifOldUyghur-Regular.ttf||30724:1711963959.0": {
"family_name": "Noto Serif Old Uyghur",
"font-family": "Noto Serif Old Uyghur",
"font-stretch": "normal",
@@ -30924,7 +32760,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifOriya-Bold.ttf||147812:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifOriya-Bold.ttf||147812:1711963959.0": {
"family_name": "Noto Serif Oriya",
"font-family": "Noto Serif Oriya",
"font-stretch": "normal",
@@ -30960,7 +32796,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifOriya-Medium.ttf||150872:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifOriya-Medium.ttf||150872:1711963959.0": {
"family_name": "Noto Serif Oriya Medium",
"font-family": "Noto Serif Oriya Medium",
"font-stretch": "normal",
@@ -30996,7 +32832,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifOriya-Regular.ttf||148896:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifOriya-Regular.ttf||148896:1711963959.0": {
"family_name": "Noto Serif Oriya",
"font-family": "Noto Serif Oriya",
"font-stretch": "normal",
@@ -31032,7 +32868,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifOttomanSiyaq-Regular.ttf||19268:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifOttomanSiyaq-Regular.ttf||19268:1711963959.0": {
"family_name": "Noto Serif Ottoman Siyaq",
"font-family": "Noto Serif Ottoman Siyaq",
"font-stretch": "normal",
@@ -31068,7 +32904,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Black.ttf||343268:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Black.ttf||343268:1711963959.0": {
"family_name": "Noto Serif Sinhala Black",
"font-family": "Noto Serif Sinhala Black",
"font-stretch": "normal",
@@ -31104,7 +32940,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Bold.ttf||337684:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Bold.ttf||337684:1711963959.0": {
"family_name": "Noto Serif Sinhala",
"font-family": "Noto Serif Sinhala",
"font-stretch": "normal",
@@ -31140,7 +32976,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Light.ttf||338692:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Light.ttf||338692:1711963959.0": {
"family_name": "Noto Serif Sinhala Light",
"font-family": "Noto Serif Sinhala Light",
"font-stretch": "normal",
@@ -31176,7 +33012,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Medium.ttf||325508:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Medium.ttf||325508:1711963959.0": {
"family_name": "Noto Serif Sinhala Medium",
"font-family": "Noto Serif Sinhala Medium",
"font-stretch": "normal",
@@ -31212,7 +33048,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Regular.ttf||325860:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Regular.ttf||325860:1711963959.0": {
"family_name": "Noto Serif Sinhala",
"font-family": "Noto Serif Sinhala",
"font-stretch": "normal",
@@ -31248,7 +33084,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifSinhala-Thin.ttf||323040:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifSinhala-Thin.ttf||323040:1711963959.0": {
"family_name": "Noto Serif Sinhala Thin",
"font-family": "Noto Serif Sinhala Thin",
"font-stretch": "normal",
@@ -31284,7 +33120,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Black.ttf||82996:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Black.ttf||82996:1711963959.0": {
"family_name": "Noto Serif Tamil Black",
"font-family": "Noto Serif Tamil Black",
"font-stretch": "normal",
@@ -31320,7 +33156,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-BlackItalic.ttf||83264:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-BlackItalic.ttf||83264:1711963959.0": {
"family_name": "Noto Serif Tamil Black",
"font-family": "Noto Serif Tamil Black",
"font-stretch": "normal",
@@ -31356,7 +33192,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Bold.ttf||78376:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Bold.ttf||78376:1711963959.0": {
"family_name": "Noto Serif Tamil",
"font-family": "Noto Serif Tamil",
"font-stretch": "normal",
@@ -31392,7 +33228,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-BoldItalic.ttf||79740:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-BoldItalic.ttf||79740:1711963959.0": {
"family_name": "Noto Serif Tamil",
"font-family": "Noto Serif Tamil",
"font-stretch": "normal",
@@ -31428,7 +33264,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Italic.ttf||78816:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Italic.ttf||78816:1711963959.0": {
"family_name": "Noto Serif Tamil",
"font-family": "Noto Serif Tamil",
"font-stretch": "normal",
@@ -31464,7 +33300,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Light.ttf||78424:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Light.ttf||78424:1711963959.0": {
"family_name": "Noto Serif Tamil Light",
"font-family": "Noto Serif Tamil Light",
"font-stretch": "normal",
@@ -31500,7 +33336,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-LightItalic.ttf||78916:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-LightItalic.ttf||78916:1711963959.0": {
"family_name": "Noto Serif Tamil Light",
"font-family": "Noto Serif Tamil Light",
"font-stretch": "normal",
@@ -31536,7 +33372,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Medium.ttf||80436:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Medium.ttf||80436:1711963959.0": {
"family_name": "Noto Serif Tamil Medium",
"font-family": "Noto Serif Tamil Medium",
"font-stretch": "normal",
@@ -31572,7 +33408,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-MediumItalic.ttf||81732:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-MediumItalic.ttf||81732:1711963959.0": {
"family_name": "Noto Serif Tamil Medium",
"font-family": "Noto Serif Tamil Medium",
"font-stretch": "normal",
@@ -31608,7 +33444,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Regular.ttf||79476:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Regular.ttf||79476:1711963959.0": {
"family_name": "Noto Serif Tamil",
"font-family": "Noto Serif Tamil",
"font-stretch": "normal",
@@ -31644,7 +33480,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-Thin.ttf||80680:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-Thin.ttf||80680:1711963959.0": {
"family_name": "Noto Serif Tamil Thin",
"font-family": "Noto Serif Tamil Thin",
"font-stretch": "normal",
@@ -31680,7 +33516,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTamil-ThinItalic.ttf||81268:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTamil-ThinItalic.ttf||81268:1711963959.0": {
"family_name": "Noto Serif Tamil Thin",
"font-family": "Noto Serif Tamil Thin",
"font-stretch": "normal",
@@ -31716,7 +33552,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTangut-Regular.ttf||5692096:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTangut-Regular.ttf||5692096:1711963959.0": {
"family_name": "Noto Serif Tangut",
"font-family": "Noto Serif Tangut",
"font-stretch": "normal",
@@ -31752,7 +33588,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Black.ttf||369992:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Black.ttf||369992:1711963959.0": {
"family_name": "Noto Serif Telugu Black",
"font-family": "Noto Serif Telugu Black",
"font-stretch": "normal",
@@ -31788,7 +33624,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Bold.ttf||331876:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Bold.ttf||331876:1711963959.0": {
"family_name": "Noto Serif Telugu",
"font-family": "Noto Serif Telugu",
"font-stretch": "normal",
@@ -31824,7 +33660,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Light.ttf||288484:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Light.ttf||288484:1711963959.0": {
"family_name": "Noto Serif Telugu Light",
"font-family": "Noto Serif Telugu Light",
"font-stretch": "normal",
@@ -31860,7 +33696,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Medium.ttf||304292:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Medium.ttf||304292:1711963959.0": {
"family_name": "Noto Serif Telugu Medium",
"font-family": "Noto Serif Telugu Medium",
"font-stretch": "normal",
@@ -31896,7 +33732,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Regular.ttf||311724:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Regular.ttf||311724:1711963959.0": {
"family_name": "Noto Serif Telugu",
"font-family": "Noto Serif Telugu",
"font-stretch": "normal",
@@ -31932,7 +33768,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTelugu-Thin.ttf||290952:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTelugu-Thin.ttf||290952:1711963959.0": {
"family_name": "Noto Serif Telugu Thin",
"font-family": "Noto Serif Telugu Thin",
"font-stretch": "normal",
@@ -31968,7 +33804,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTest-Bold.ttf||2796:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTest-Bold.ttf||2796:1711963959.0": {
"family_name": "Noto Serif Test",
"font-family": "Noto Serif Test",
"font-stretch": "normal",
@@ -32004,7 +33840,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTest-Regular.ttf||2772:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTest-Regular.ttf||2772:1711963959.0": {
"family_name": "Noto Serif Test",
"font-family": "Noto Serif Test",
"font-stretch": "normal",
@@ -32040,7 +33876,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Black.ttf||48424:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Black.ttf||48424:1711963959.0": {
"family_name": "Noto Serif Thai Black",
"font-family": "Noto Serif Thai Black",
"font-stretch": "normal",
@@ -32076,7 +33912,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Bold.ttf||46544:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Bold.ttf||46544:1711963959.0": {
"family_name": "Noto Serif Thai",
"font-family": "Noto Serif Thai",
"font-stretch": "normal",
@@ -32112,7 +33948,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Light.ttf||46448:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Light.ttf||46448:1711963959.0": {
"family_name": "Noto Serif Thai Light",
"font-family": "Noto Serif Thai Light",
"font-stretch": "normal",
@@ -32148,7 +33984,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Medium.ttf||45488:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Medium.ttf||45488:1711963959.0": {
"family_name": "Noto Serif Thai Medium",
"font-family": "Noto Serif Thai Medium",
"font-stretch": "normal",
@@ -32184,7 +34020,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Regular.ttf||45424:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Regular.ttf||45424:1711963959.0": {
"family_name": "Noto Serif Thai",
"font-family": "Noto Serif Thai",
"font-stretch": "normal",
@@ -32220,7 +34056,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifThai-Thin.ttf||45168:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifThai-Thin.ttf||45168:1711963959.0": {
"family_name": "Noto Serif Thai Thin",
"font-family": "Noto Serif Thai Thin",
"font-stretch": "normal",
@@ -32256,7 +34092,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Black.ttf||590864:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Black.ttf||590864:1711963959.0": {
"family_name": "Noto Serif Tibetan Black",
"font-family": "Noto Serif Tibetan Black",
"font-stretch": "normal",
@@ -32292,7 +34128,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Bold.ttf||602368:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Bold.ttf||602368:1711963959.0": {
"family_name": "Noto Serif Tibetan",
"font-family": "Noto Serif Tibetan",
"font-stretch": "normal",
@@ -32328,7 +34164,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Light.ttf||613040:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Light.ttf||613040:1711963959.0": {
"family_name": "Noto Serif Tibetan Light",
"font-family": "Noto Serif Tibetan Light",
"font-stretch": "normal",
@@ -32364,7 +34200,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Medium.ttf||608512:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Medium.ttf||608512:1711963959.0": {
"family_name": "Noto Serif Tibetan Medium",
"font-family": "Noto Serif Tibetan Medium",
"font-stretch": "normal",
@@ -32400,7 +34236,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Regular.ttf||609688:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Regular.ttf||609688:1711963959.0": {
"family_name": "Noto Serif Tibetan",
"font-family": "Noto Serif Tibetan",
"font-stretch": "normal",
@@ -32436,7 +34272,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifTibetan-Thin.ttf||623556:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifTibetan-Thin.ttf||623556:1711963959.0": {
"family_name": "Noto Serif Tibetan Thin",
"font-family": "Noto Serif Tibetan Thin",
"font-stretch": "normal",
@@ -32472,7 +34308,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifToto-Bold.ttf||6896:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifToto-Bold.ttf||6896:1711963959.0": {
"family_name": "Noto Serif Toto",
"font-family": "Noto Serif Toto",
"font-stretch": "normal",
@@ -32508,7 +34344,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifToto-Medium.ttf||6996:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifToto-Medium.ttf||6996:1711963959.0": {
"family_name": "Noto Serif Toto Medium",
"font-family": "Noto Serif Toto Medium",
"font-stretch": "normal",
@@ -32544,7 +34380,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifToto-Regular.ttf||6964:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifToto-Regular.ttf||6964:1711963959.0": {
"family_name": "Noto Serif Toto",
"font-family": "Noto Serif Toto",
"font-stretch": "normal",
@@ -32580,7 +34416,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifVithkuqi-Bold.ttf||19056:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifVithkuqi-Bold.ttf||19056:1711963959.0": {
"family_name": "Noto Serif Vithkuqi",
"font-family": "Noto Serif Vithkuqi",
"font-stretch": "normal",
@@ -32616,7 +34452,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifVithkuqi-Medium.ttf||19052:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifVithkuqi-Medium.ttf||19052:1711963959.0": {
"family_name": "Noto Serif Vithkuqi Medium",
"font-family": "Noto Serif Vithkuqi Medium",
"font-stretch": "normal",
@@ -32652,7 +34488,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifVithkuqi-Regular.ttf||19092:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifVithkuqi-Regular.ttf||19092:1711963959.0": {
"family_name": "Noto Serif Vithkuqi",
"font-family": "Noto Serif Vithkuqi",
"font-stretch": "normal",
@@ -32688,7 +34524,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifYezidi-Bold.ttf||18072:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifYezidi-Bold.ttf||18072:1711963959.0": {
"family_name": "Noto Serif Yezidi",
"font-family": "Noto Serif Yezidi",
"font-stretch": "normal",
@@ -32724,7 +34560,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifYezidi-Medium.ttf||18276:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifYezidi-Medium.ttf||18276:1711963959.0": {
"family_name": "Noto Serif Yezidi Medium",
"font-family": "Noto Serif Yezidi Medium",
"font-stretch": "normal",
@@ -32760,7 +34596,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoSerifYezidi-Regular.ttf||18252:1701417168.0": {
+ "/usr/share/fonts/noto/NotoSerifYezidi-Regular.ttf||18252:1711963959.0": {
"family_name": "Noto Serif Yezidi",
"font-family": "Noto Serif Yezidi",
"font-stretch": "normal",
@@ -32796,7 +34632,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoTraditionalNushu-Bold.ttf||104624:1701417168.0": {
+ "/usr/share/fonts/noto/NotoTraditionalNushu-Bold.ttf||104624:1711963959.0": {
"family_name": "Noto Traditional Nushu",
"font-family": "Noto Traditional Nushu",
"font-stretch": "normal",
@@ -32832,7 +34668,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoTraditionalNushu-Light.ttf||106828:1701417168.0": {
+ "/usr/share/fonts/noto/NotoTraditionalNushu-Light.ttf||106828:1711963959.0": {
"family_name": "Noto Traditional Nushu Light",
"font-family": "Noto Traditional Nushu Light",
"font-stretch": "normal",
@@ -32868,7 +34704,7 @@
"wws_family_name": null,
"wws_subfamily_name": null
},
- "/usr/share/fonts/noto/NotoTraditionalNushu-Regular.ttf||104708:1701417168.0": {
+ "/usr/share/fonts/noto/NotoTraditionalNushu-Regular.ttf||104708:1711963959.0": {
"family_name": "Noto Traditional Nushu",
"font-family": "Noto Traditional Nushu",
"font-stretch": "normal",
diff --git a/arch-config/.config/calibre/gui.json b/arch-config/.config/calibre/gui.json
index 52e0b95b..23f45851 100644
--- a/arch-config/.config/calibre/gui.json
+++ b/arch-config/.config/calibre/gui.json
@@ -55,7 +55,7 @@
],
"basic_metadata_widget_splitter_state": {
"__class__": "bytearray",
- "__value__": "AAAA/wAAAAEAAAADAAAA6wAAAZwAAAEKAf////8BAAAAAQA="
+ "__value__": "AAAA/wAAAAEAAAADAAAA6wAAAdoAAAEKAf////8BAAAAAQA="
},
"book_details_splitter_horizontal_state": [
true,
@@ -257,6 +257,57 @@
}
}
},
+ "geometry-of-bulk_metadata_window_geometry": {
+ "frame_geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 0,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 0,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 0,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAAAAAAAAAAABzkAAAQFAAAAAAAAAAAAAAc5AAAEBQAAAAEAAAAACFUAAAAAAAAAAAAABzkAAAQF"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
"geometry-of-calibre_main_window_geometry": {
"frame_geometry": {
"height": 1154,
@@ -359,19 +410,458 @@
}
}
},
+ "geometry-of-diff_dialog_geom": {
+ "frame_geometry": {
+ "height": 980,
+ "width": 1210,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 980,
+ "width": 1210,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 980,
+ "width": 1210,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAADQ4AAAPTAAAIVQAAAAAAAA0OAAAD0wAAAAEAAAAACFUAAAhVAAAAAAAADQ4AAAPT"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-duplicates-question-dialog-geometry": {
+ "frame_geometry": {
+ "height": 384,
+ "width": 748,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 384,
+ "width": 748,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 384,
+ "width": 748,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAAC0AAAAF/AAAIVQAAAAAAAAtAAAABfwAAAAEAAAAACFUAAAhVAAAAAAAAC0AAAAF/"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-jobs_dialog_geometry": {
+ "frame_geometry": {
+ "height": 542,
+ "width": 883,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 542,
+ "width": 883,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 542,
+ "width": 883,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAAC8cAAAIdAAAIVQAAAAAAAAvHAAACHQAAAAEAAAAACFUAAAhVAAAAAAAAC8cAAAId"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-metadata_single_gui_geom": {
+ "frame_geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAAC6YAAAJXAAAIVQAAAAAAAAumAAACVwAAAAEAAAAACFUAAAhVAAAAAAAAC6YAAAJX"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-metasingle_window_geometry3": {
+ "frame_geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 1030,
+ "width": 1850,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAAD44AAAQFAAAIVQAAAAAAAA+OAAAEBQAAAAEAAAAACFUAAAhVAAAAAAAAD44AAAQF"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-preferences dialog geometry": {
+ "frame_geometry": {
+ "height": 720,
+ "width": 1295,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 720,
+ "width": 1295,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 720,
+ "width": 1295,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAADWMAAALPAAAIVQAAAAAAAA1jAAACzwAAAAEAAAAACFUAAAhVAAAAAAAADWMAAALP"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-single-cover-fetch-dialog-geometry": {
+ "frame_geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 0,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 0,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 600,
+ "width": 850,
+ "x": 0,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAAAAAAAAAAAA1EAAAJXAAAAAAAAAAAAAANRAAACVwAAAAEAAAAACFUAAAAAAAAAAAAAA1EAAAJX"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "geometry-of-template_editor_dialog_geometry": {
+ "frame_geometry": {
+ "height": 478,
+ "width": 706,
+ "x": 2133,
+ "y": 0
+ },
+ "full_screened": false,
+ "geometry": {
+ "height": 478,
+ "width": 706,
+ "x": 2133,
+ "y": 0
+ },
+ "maximized": false,
+ "normal_geometry": {
+ "height": 478,
+ "width": 706,
+ "x": 2133,
+ "y": 0
+ },
+ "qt": {
+ "__class__": "bytearray",
+ "__value__": "AdnQywADAAAAAAhVAAAAAAAACxYAAAHdAAAIVQAAAAAAAAsWAAAB3QAAAAEAAAAACFUAAAhVAAAAAAAACxYAAAHd"
+ },
+ "screen": {
+ "depth": 32,
+ "device_pixel_ratio": 2.0,
+ "geometry_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133,
+ "x": 2133,
+ "y": 0
+ },
+ "index_in_screens_list": 1,
+ "manufacturer": "HP Inc.",
+ "model": "OMEN 27q",
+ "name": "DP-2",
+ "serial": "",
+ "size_in_logical_pixels": {
+ "height": 1200,
+ "width": 2133
+ },
+ "virtual_geometry": {
+ "height": 1200,
+ "width": 4266,
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "gpm_template_editor_font": "Fira Sans",
+ "gpm_template_editor_word_wrap_mode": true,
"grid view visible": false,
"jobs view column layout3": {
"__class__": "bytearray",
- "__value__": "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA04AAAAFAQEBAAAAAAAAAAAAAAAAAGT/////AAAAhAAAAAAAAAAFAAABRAAAAAEAAAAAAAAAtgAAAAEAAAAAAAAAjAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAD6AAAAAAA"
+ "__value__": "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA04AAAAFAQEBAAAAAAAAAAAAAAAAAGT/////AAAAhAAAAAAAAAAFAAABRAAAAAEAAAAAAAAAtgAAAAEAAAAAAAAAjAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAD6AAAAAAAAAAAAA=="
},
"jobs_dialog_geometry": {
"__class__": "bytearray",
"__value__": "AdnQywADAAAAAAGYAAABEQAABQ4AAAMyAAABmgAAARMAAAUMAAADMAAAAAAAAAAAB4AAAAGaAAABEwAABQwAAAMw"
},
"library_usage_stats": {
- "/home/exu/.local/share/Calibre-Library": 2,
+ "/home/exu/.local/share/Calibre-Library": 18,
"/home/marc/Calibre-Bibliothek": 200
},
+ "main_window_central_widget_state": {
+ "layout": "wide",
+ "narrow_desires": {
+ "book_details_height": 0.23066202090592333,
+ "cover_browser_width": 0.34992954438703616,
+ "quick_view_height": 0.2564459930313589,
+ "tag_browser_width": 0.2498825739783936
+ },
+ "narrow_visibility": {
+ "book_details": true,
+ "book_list": true,
+ "cover_browser": false,
+ "quick_view": false,
+ "tag_browser": true
+ },
+ "wide_desires": {
+ "book_details_width": 0.21042743071864725,
+ "cover_browser_height": 0.21367521367521367,
+ "quick_view_height": 0.2621082621082621,
+ "tag_browser_width": 0.09394081728511038
+ },
+ "wide_visibility": {
+ "book_details": true,
+ "book_list": true,
+ "cover_browser": false,
+ "quick_view": false,
+ "tag_browser": true
+ }
+ },
"metadata-download-identify-widget-splitter-state": {
"__class__": "bytearray",
"__value__": "AAAA/wAAAAEAAAACAAACAAAAAQAA/////wEAAAABAA=="
@@ -400,6 +890,7 @@
"authors": true,
"rating": true,
"series": true,
+ "timestamp": false,
"title": true
},
"quick_start_guide_added": true,
@@ -419,6 +910,7 @@
"¤ ¤ ¤"
],
"search bar visible": true,
+ "show_files_after_save": false,
"single-cover-fetch-dialog-geometry": {
"__class__": "bytearray",
"__value__": "AdnQywADAAAAAAIhAAAA5wAABXYAAANCAAACIwAAAOkAAAV0AAADQAAAAAAAAAAAB4AAAAIjAAAA6QAABXQAAANA"
@@ -432,5 +924,9 @@
"__class__": "bytearray",
"__value__": "AdnQywADAAAAAAKTAAAAyAAABRYAAANlAAAClQAAAMoAAAUUAAADYwAAAAAAAAAAB4AAAAKVAAAAygAABRQAAANj"
},
- "tag_editor_last_filter": "add_tag_input"
+ "tag_editor_last_filter": "add_tag_input",
+ "template_editor_table_widths": [
+ 90,
+ 551
+ ]
}
\ No newline at end of file
diff --git a/arch-config/.config/calibre/gui.py.json b/arch-config/.config/calibre/gui.py.json
index b7a61032..6a61b2ea 100644
--- a/arch-config/.config/calibre/gui.py.json
+++ b/arch-config/.config/calibre/gui.py.json
@@ -55,7 +55,10 @@
"oldest_news": 60,
"overwrite_author_title_metadata": true,
"plugin_search_history": [],
- "save_to_disk_template_history": [],
+ "save_to_disk_template_history": [
+ "{authors} - {series}/{series} {series_index} - {title}",
+ "{author_sort}/{title}/{title} - {authors}"
+ ],
"scheduler_search_history": [],
"search_as_you_type": false,
"send_to_device_template_history": [],
diff --git a/arch-config/.config/calibre/metadata-sources-cache.json b/arch-config/.config/calibre/metadata-sources-cache.json
index f83301a3..d1773ecb 100644
--- a/arch-config/.config/calibre/metadata-sources-cache.json
+++ b/arch-config/.config/calibre/metadata-sources-cache.json
@@ -1,18 +1,18 @@
{
- "amazon": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal \nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport re\nimport string\nimport socket\nimport time\nfrom functools import partial\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\nfrom threading import Thread\ntry:\n from urllib.parse import urlparse\nexcept ImportError:\n from urlparse import urlparse\n\nfrom mechanize import HTTPError\n\nfrom calibre import as_unicode, browser, random_user_agent, xml_replace_entities\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Option, Source, fixauthors, fixcase\nfrom calibre.utils.localization import canonicalize_lang\nfrom calibre.utils.random_ua import accept_header_for_ua\nfrom calibre.ebooks.oeb.base import urlquote\n\n\ndef sort_matches_preferring_kindle_editions(matches):\n upos_map = {url:i for i, url in enumerate(matches)}\n\n def skey(url):\n opos = upos_map[url]\n parts = url.split('/')\n try:\n idx = parts.index('dp')\n except Exception:\n idx = -1\n if idx < 0 or idx + 1 >= len(parts) or not parts[idx+1].startswith('B'):\n return 1, opos\n return 0, opos\n matches.sort(key=skey)\n return matches\n\n\ndef iri_quote_plus(url):\n ans = urlquote(url)\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans.replace('%20', '+')\n\n\ndef user_agent_is_ok(ua):\n return 'Mobile/' not in ua and 'Mobile ' not in ua\n\n\nclass CaptchaError(Exception):\n pass\n\n\nclass SearchFailed(ValueError):\n pass\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef parse_details_page(url, log, timeout, browser, domain):\n from calibre.utils.cleantext import clean_ascii_chars\n from calibre.ebooks.chardet import xml_to_unicode\n from lxml.html import tostring\n try:\n from calibre.ebooks.metadata.sources.update import search_engines_module\n get_data_for_cached_url = search_engines_module().get_data_for_cached_url\n except Exception:\n get_data_for_cached_url = lambda *a: None\n raw = get_data_for_cached_url(url)\n if raw:\n log('Using cached details for url:', url)\n else:\n log('Downloading details from:', url)\n try:\n raw = browser.open_novisit(url, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('URL malformed: %r' % url)\n return\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = 'Details page timed out. Try again later.'\n log.error(msg)\n else:\n msg = 'Failed to make details query: %r' % url\n log.exception(msg)\n return\n\n oraw = raw\n if 'amazon.com.br' in url:\n # amazon.com.br serves utf-8 but has an incorrect latin1 tag\n raw = raw.decode('utf-8')\n raw = xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True)[0]\n if '404 - ' in raw:\n raise ValueError('URL malformed: %r' % url)\n if '>Could not find the requested document in the cache.<' in raw:\n raise ValueError('No cached entry for %s found' % url)\n\n try:\n root = parse_html(clean_ascii_chars(raw))\n except Exception:\n msg = 'Failed to parse amazon details page: %r' % url\n log.exception(msg)\n return\n if domain == 'jp':\n for a in root.xpath('//a[@href]'):\n if ('black-curtain-redirect.html' in a.get('href')) or ('/black-curtain/save-eligibility/black-curtain' in a.get('href')):\n url = a.get('href')\n if url:\n if url.startswith('/'):\n url = 'https://amazon.co.jp' + a.get('href')\n log('Black curtain redirect found, following')\n return parse_details_page(url, log, timeout, browser, domain)\n\n errmsg = root.xpath('//*[@id=\"errorMessage\"]')\n if errmsg:\n msg = 'Failed to parse amazon details page: %r' % url\n msg += tostring(errmsg, method='text', encoding='unicode').strip()\n log.error(msg)\n return\n\n from css_selectors import Select\n selector = Select(root)\n return oraw, root, selector\n\n\ndef parse_asin(root, log, url):\n try:\n link = root.xpath('//link[@rel=\"canonical\" and @href]')\n for l in link:\n return l.get('href').rpartition('/')[-1]\n except Exception:\n log.exception('Error parsing ASIN for url: %r' % url)\n\n\nclass Worker(Thread): # Get details {{{\n\n '''\n Get book details from amazons book page in a separate thread\n '''\n\n def __init__(self, url, result_queue, browser, log, relevance, domain,\n plugin, timeout=20, testing=False, preparsed_root=None,\n cover_url_processor=None, filter_result=None):\n Thread.__init__(self)\n self.cover_url_processor = cover_url_processor\n self.preparsed_root = preparsed_root\n self.daemon = True\n self.testing = testing\n self.url, self.result_queue = url, result_queue\n self.log, self.timeout = log, timeout\n self.filter_result = filter_result or (lambda x, log: True)\n self.relevance, self.plugin = relevance, plugin\n self.browser = browser\n self.cover_url = self.amazon_id = self.isbn = None\n self.domain = domain\n from lxml.html import tostring\n self.tostring = tostring\n\n months = { # {{{\n 'de': {\n 1: ['jän', 'januar'],\n 2: ['februar'],\n 3: ['märz'],\n 5: ['mai'],\n 6: ['juni'],\n 7: ['juli'],\n 10: ['okt', 'oktober'],\n 12: ['dez', 'dezember']\n },\n 'it': {\n 1: ['gennaio', 'enn'],\n 2: ['febbraio', 'febbr'],\n 3: ['marzo'],\n 4: ['aprile'],\n 5: ['maggio', 'magg'],\n 6: ['giugno'],\n 7: ['luglio'],\n 8: ['agosto', 'ag'],\n 9: ['settembre', 'sett'],\n 10: ['ottobre', 'ott'],\n 11: ['novembre'],\n 12: ['dicembre', 'dic'],\n },\n 'fr': {\n 1: ['janv'],\n 2: ['févr'],\n 3: ['mars'],\n 4: ['avril'],\n 5: ['mai'],\n 6: ['juin'],\n 7: ['juil'],\n 8: ['août'],\n 9: ['sept'],\n 12: ['déc'],\n },\n 'br': {\n 1: ['janeiro'],\n 2: ['fevereiro'],\n 3: ['março'],\n 4: ['abril'],\n 5: ['maio'],\n 6: ['junho'],\n 7: ['julho'],\n 8: ['agosto'],\n 9: ['setembro'],\n 10: ['outubro'],\n 11: ['novembro'],\n 12: ['dezembro'],\n },\n 'es': {\n 1: ['enero'],\n 2: ['febrero'],\n 3: ['marzo'],\n 4: ['abril'],\n 5: ['mayo'],\n 6: ['junio'],\n 7: ['julio'],\n 8: ['agosto'],\n 9: ['septiembre', 'setiembre'],\n 10: ['octubre'],\n 11: ['noviembre'],\n 12: ['diciembre'],\n },\n 'se': {\n 1: ['januari'],\n 2: ['februari'],\n 3: ['mars'],\n 4: ['april'],\n 5: ['maj'],\n 6: ['juni'],\n 7: ['juli'],\n 8: ['augusti'],\n 9: ['september'],\n 10: ['oktober'],\n 11: ['november'],\n 12: ['december'],\n },\n 'jp': {\n 1: ['1月'],\n 2: ['2月'],\n 3: ['3月'],\n 4: ['4月'],\n 5: ['5月'],\n 6: ['6月'],\n 7: ['7月'],\n 8: ['8月'],\n 9: ['9月'],\n 10: ['10月'],\n 11: ['11月'],\n 12: ['12月'],\n },\n 'nl': {\n 1: ['januari'], 2: ['februari'], 3: ['maart'], 5: ['mei'], 6: ['juni'], 7: ['juli'], 8: ['augustus'], 10: ['oktober'],\n }\n\n } # }}}\n\n self.english_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n self.months = months.get(self.domain, {})\n\n self.pd_xpath = '''\n //h2[text()=\"Product Details\" or \\\n text()=\"Produktinformation\" or \\\n text()=\"Dettagli prodotto\" or \\\n text()=\"Product details\" or \\\n text()=\"Détails sur le produit\" or \\\n text()=\"Detalles del producto\" or \\\n text()=\"Detalhes do produto\" or \\\n text()=\"Productgegevens\" or \\\n text()=\"基本信息\" or \\\n starts-with(text(), \"登録情報\")]/../div[@class=\"content\"]\n '''\n # Editor: is for Spanish\n self.publisher_xpath = '''\n descendant::*[starts-with(text(), \"Publisher:\") or \\\n starts-with(text(), \"Verlag:\") or \\\n starts-with(text(), \"Editore:\") or \\\n starts-with(text(), \"Editeur\") or \\\n starts-with(text(), \"Editor:\") or \\\n starts-with(text(), \"Editora:\") or \\\n starts-with(text(), \"Uitgever:\") or \\\n starts-with(text(), \"Utgivare:\") or \\\n starts-with(text(), \"出版社:\")]\n '''\n self.pubdate_xpath = '''\n descendant::*[starts-with(text(), \"Publication Date:\") or \\\n starts-with(text(), \"Audible.com Release Date:\")]\n '''\n self.publisher_names = {'Publisher', 'Uitgever', 'Verlag', 'Utgivare', 'Herausgeber',\n 'Editore', 'Editeur', 'Editor', 'Editora', '出版社'}\n\n self.language_xpath = '''\n descendant::*[\n starts-with(text(), \"Language:\") \\\n or text() = \"Language\" \\\n or text() = \"Sprache:\" \\\n or text() = \"Lingua:\" \\\n or text() = \"Idioma:\" \\\n or starts-with(text(), \"Langue\") \\\n or starts-with(text(), \"言語\") \\\n or starts-with(text(), \"Språk\") \\\n or starts-with(text(), \"语种\")\n ]\n '''\n self.language_names = {'Language', 'Sprache', 'Språk',\n 'Lingua', 'Idioma', 'Langue', '言語', 'Taal', '语种'}\n\n self.tags_xpath = '''\n descendant::h2[\n text() = \"Look for Similar Items by Category\" or\n text() = \"Ähnliche Artikel finden\" or\n text() = \"Buscar productos similares por categoría\" or\n text() = \"Ricerca articoli simili per categoria\" or\n text() = \"Rechercher des articles similaires par rubrique\" or\n text() = \"Procure por items similares por categoria\" or\n text() = \"関連商品を探す\"\n ]/../descendant::ul/li\n '''\n\n self.ratings_pat = re.compile(\n r'([0-9.,]+) ?(out of|von|van|su|étoiles sur|つ星のうち|de un máximo de|de|av) '\n r'([\\d\\.]+)( (stars|Sternen|stelle|estrellas|estrelas|sterren|stjärnor)){0,1}'\n )\n self.ratings_pat_cn = re.compile('([0-9.]+) 颗星,最多 5 颗星')\n self.ratings_pat_jp = re.compile(r'\\d+つ星のうち([\\d\\.]+)')\n\n lm = {\n 'eng': ('English', 'Englisch', 'Engels', 'Engelska'),\n 'fra': ('French', 'Français'),\n 'ita': ('Italian', 'Italiano'),\n 'deu': ('German', 'Deutsch'),\n 'spa': ('Spanish', 'Espa\\xf1ol', 'Espaniol'),\n 'jpn': ('Japanese', '日本語'),\n 'por': ('Portuguese', 'Português'),\n 'nld': ('Dutch', 'Nederlands',),\n 'chs': ('Chinese', '中文', '简体中文'),\n 'swe': ('Swedish', 'Svenska'),\n }\n self.lang_map = {}\n for code, names in lm.items():\n for name in names:\n self.lang_map[name] = code\n\n self.series_pat = re.compile(\n r'''\n \\|\\s* # Prefix\n (Series)\\s*:\\s* # Series declaration\n (?P.+?)\\s+ # The series name\n \\((Book)\\s* # Book declaration\n (?P[0-9.]+) # Series index\n \\s*\\)\n ''', re.X)\n\n def delocalize_datestr(self, raw):\n if self.domain == 'cn':\n return raw.replace('年', '-').replace('月', '-').replace('日', '')\n if not self.months:\n return raw\n ans = raw.lower()\n for i, vals in self.months.items():\n for x in vals:\n ans = ans.replace(x, self.english_months[i])\n ans = ans.replace(' de ', ' ')\n return ans\n\n def run(self):\n try:\n self.get_details()\n except:\n self.log.exception('get_details failed for url: %r' % self.url)\n\n def get_details(self):\n if self.preparsed_root is None:\n raw, root, selector = parse_details_page(\n self.url, self.log, self.timeout, self.browser, self.domain)\n else:\n raw, root, selector = self.preparsed_root\n\n from css_selectors import Select\n self.selector = Select(root)\n self.parse_details(raw, root)\n\n def parse_details(self, raw, root):\n asin = parse_asin(root, self.log, self.url)\n if not asin and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError(\n 'Amazon returned a CAPTCHA page, probably because you downloaded too many books. Wait for some time and try again.')\n if self.testing:\n import tempfile\n import uuid\n with tempfile.NamedTemporaryFile(prefix=(asin or type('')(uuid.uuid4())) + '_',\n suffix='.html', delete=False) as f:\n f.write(raw)\n print('Downloaded HTML for', asin, 'saved in', f.name)\n\n try:\n title = self.parse_title(root)\n except:\n self.log.exception('Error parsing title for url: %r' % self.url)\n title = None\n\n try:\n authors = self.parse_authors(root)\n except:\n self.log.exception('Error parsing authors for url: %r' % self.url)\n authors = []\n\n if not title or not authors or not asin:\n self.log.error(\n 'Could not find title/authors/asin for %r' % self.url)\n self.log.error('ASIN: %r Title: %r Authors: %r' % (asin, title,\n authors))\n return\n\n mi = Metadata(title, authors)\n idtype = 'amazon' if self.domain == 'com' else 'amazon_' + self.domain\n mi.set_identifier(idtype, asin)\n self.amazon_id = asin\n\n try:\n mi.rating = self.parse_rating(root)\n except:\n self.log.exception('Error parsing ratings for url: %r' % self.url)\n\n try:\n mi.comments = self.parse_comments(root, raw)\n except:\n self.log.exception('Error parsing comments for url: %r' % self.url)\n\n try:\n series, series_index = self.parse_series(root)\n if series:\n mi.series, mi.series_index = series, series_index\n elif self.testing:\n mi.series, mi.series_index = 'Dummy series for testing', 1\n except:\n self.log.exception('Error parsing series for url: %r' % self.url)\n\n try:\n mi.tags = self.parse_tags(root)\n except:\n self.log.exception('Error parsing tags for url: %r' % self.url)\n\n try:\n self.cover_url = self.parse_cover(root, raw)\n except:\n self.log.exception('Error parsing cover for url: %r' % self.url)\n if self.cover_url_processor is not None and self.cover_url and self.cover_url.startswith('/'):\n self.cover_url = self.cover_url_processor(self.cover_url)\n mi.has_cover = bool(self.cover_url)\n\n detail_bullets = root.xpath('//*[@data-feature-name=\"detailBullets\"]')\n non_hero = tuple(self.selector(\n 'div#bookDetails_container_div div#nonHeroSection')) or tuple(self.selector(\n '#productDetails_techSpec_sections'))\n if detail_bullets:\n self.parse_detail_bullets(root, mi, detail_bullets[0])\n elif non_hero:\n try:\n self.parse_new_details(root, mi, non_hero[0])\n except:\n self.log.exception(\n 'Failed to parse new-style book details section')\n\n else:\n pd = root.xpath(self.pd_xpath)\n if pd:\n pd = pd[0]\n\n try:\n isbn = self.parse_isbn(pd)\n if isbn:\n self.isbn = mi.isbn = isbn\n except:\n self.log.exception(\n 'Error parsing ISBN for url: %r' % self.url)\n\n try:\n mi.publisher = self.parse_publisher(pd)\n except:\n self.log.exception(\n 'Error parsing publisher for url: %r' % self.url)\n\n try:\n mi.pubdate = self.parse_pubdate(pd)\n except:\n self.log.exception(\n 'Error parsing publish date for url: %r' % self.url)\n\n try:\n lang = self.parse_language(pd)\n if lang:\n mi.language = lang\n except:\n self.log.exception(\n 'Error parsing language for url: %r' % self.url)\n\n else:\n self.log.warning(\n 'Failed to find product description for url: %r' % self.url)\n\n mi.source_relevance = self.relevance\n\n if self.amazon_id:\n if self.isbn:\n self.plugin.cache_isbn_to_identifier(self.isbn, self.amazon_id)\n if self.cover_url:\n self.plugin.cache_identifier_to_cover_url(self.amazon_id,\n self.cover_url)\n\n self.plugin.clean_downloaded_metadata(mi)\n\n if self.filter_result(mi, self.log):\n self.result_queue.put(mi)\n\n def totext(self, elem, only_printable=False):\n res = self.tostring(elem, encoding='unicode', method='text')\n if only_printable:\n try:\n filtered_characters = list(s for s in res if s.isprintable())\n except AttributeError:\n filtered_characters = list(s for s in res if s in string.printable)\n res = ''.join(filtered_characters).strip()\n return res\n\n def parse_title(self, root):\n\n def sanitize_title(title):\n ans = title.strip()\n if not ans.startswith('['):\n ans = re.sub(r'[(\\[].*[)\\]]', '', title).strip()\n return ans\n\n h1 = root.xpath('//h1[@id=\"title\"]')\n if h1:\n h1 = h1[0]\n for child in h1.xpath('./*[contains(@class, \"a-color-secondary\")]'):\n h1.remove(child)\n return sanitize_title(self.totext(h1))\n tdiv = root.xpath('//h1[contains(@class, \"parseasinTitle\")]')\n if not tdiv:\n span = root.xpath('//*[@id=\"ebooksTitle\"]')\n if span:\n return sanitize_title(self.totext(span[0]))\n raise ValueError('No title block found')\n tdiv = tdiv[0]\n actual_title = tdiv.xpath('descendant::*[@id=\"btAsinTitle\"]')\n if actual_title:\n title = self.tostring(actual_title[0], encoding='unicode',\n method='text').strip()\n else:\n title = self.tostring(tdiv, encoding='unicode',\n method='text').strip()\n return sanitize_title(title)\n\n def parse_authors(self, root):\n for sel in (\n '#byline .author .contributorNameID',\n '#byline .author a.a-link-normal',\n '#bylineInfo .author .contributorNameID',\n '#bylineInfo .author a.a-link-normal',\n '#bylineInfo #bylineContributor',\n ):\n matches = tuple(self.selector(sel))\n if matches:\n authors = [self.totext(x) for x in matches]\n return [a for a in authors if a]\n\n x = '//h1[contains(@class, \"parseasinTitle\")]/following-sibling::span/*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]'\n aname = root.xpath(x)\n if not aname:\n aname = root.xpath('''\n //h1[contains(@class, \"parseasinTitle\")]/following-sibling::*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]\n ''')\n for x in aname:\n x.tail = ''\n authors = [self.tostring(x, encoding='unicode', method='text').strip() for x\n in aname]\n authors = [a for a in authors if a]\n return authors\n\n def parse_rating(self, root):\n for x in root.xpath('//div[@id=\"cpsims-feature\" or @id=\"purchase-sims-feature\" or @id=\"rhf\"]'):\n # Remove the similar books section as it can cause spurious\n # ratings matches\n x.getparent().remove(x)\n\n rating_paths = (\n '//div[@data-feature-name=\"averageCustomerReviews\" or @id=\"averageCustomerReviews\"]',\n '//div[@class=\"jumpBar\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//div[@class=\"buying\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//span[@class=\"crAvgStars\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]'\n )\n ratings = None\n for p in rating_paths:\n ratings = root.xpath(p)\n if ratings:\n break\n\n def parse_ratings_text(text):\n try:\n m = self.ratings_pat.match(text)\n return float(m.group(1).replace(',', '.')) / float(m.group(3)) * 5\n except Exception:\n pass\n\n if ratings:\n ratings = ratings[0]\n for elem in ratings.xpath('descendant::*[@title]'):\n t = elem.get('title').strip()\n if self.domain == 'cn':\n m = self.ratings_pat_cn.match(t)\n if m is not None:\n return float(m.group(1))\n elif self.domain == 'jp':\n m = self.ratings_pat_jp.match(t)\n if m is not None:\n return float(m.group(1))\n else:\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n for elem in ratings.xpath('descendant::span[@class=\"a-icon-alt\"]'):\n t = self.tostring(\n elem, encoding='unicode', method='text', with_tail=False).strip()\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n\n def _render_comments(self, desc):\n from calibre.library.comments import sanitize_comments_html\n\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for c in desc.xpath('descendant::*[@class=\"seeAll\" or'\n ' @class=\"emptyClear\" or @id=\"collapsePS\" or'\n ' @id=\"expandPS\"]'):\n c.getparent().remove(c)\n for b in desc.xpath('descendant::b[@style]'):\n # Bing highlights search results\n s = b.get('style', '')\n if 'color' in s:\n b.tag = 'span'\n del b.attrib['style']\n\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = self.tostring(desc, method='html', encoding='unicode').strip()\n desc = xml_replace_entities(desc, 'utf-8')\n\n # Encoding bug in Amazon data U+fffd (replacement char)\n # in some examples it is present in place of '\n desc = desc.replace('\\ufffd', \"'\")\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove the notice about text referring to out of print editions\n desc = re.sub(r'(?s)--This text ref.*?', '', desc)\n # Remove comments\n desc = re.sub(r'(?s)', '', desc)\n return sanitize_comments_html(desc)\n\n def parse_comments(self, root, raw):\n try:\n from urllib.parse import unquote\n except ImportError:\n from urllib import unquote\n ans = ''\n ns = tuple(self.selector('#bookDescription_feature_div noscript'))\n if ns:\n ns = ns[0]\n if len(ns) == 0 and ns.text:\n import html5lib\n # html5lib parsed noscript as CDATA\n ns = html5lib.parseFragment(\n '%s
' % (ns.text), treebuilder='lxml', namespaceHTMLElements=False)[0]\n else:\n ns.tag = 'div'\n ans = self._render_comments(ns)\n else:\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"content\"]')\n if desc:\n ans = self._render_comments(desc[0])\n else:\n ns = tuple(self.selector('#bookDescription_feature_div .a-expander-content'))\n if ns:\n ans = self._render_comments(ns[0])\n\n desc = root.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n else:\n # Idiot chickens from amazon strike again. This data is now stored\n # in a JS variable inside a script tag URL encoded.\n m = re.search(br'var\\s+iframeContent\\s*=\\s*\"([^\"]+)\"', raw)\n if m is not None:\n try:\n text = unquote(m.group(1)).decode('utf-8')\n nr = parse_html(text)\n desc = nr.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n except Exception as e:\n self.log.warn(\n 'Parsing of obfuscated product description failed with error: %s' % as_unicode(e))\n else:\n desc = root.xpath('//div[@id=\"productDescription_fullView\"]')\n if desc:\n ans += self._render_comments(desc[0])\n\n return ans\n\n def parse_series(self, root):\n ans = (None, None)\n\n # This is found on the paperback/hardback pages for books on amazon.com\n series = root.xpath('//div[@data-feature-name=\"seriesTitle\"]')\n if series:\n series = series[0]\n spans = series.xpath('./span')\n if spans:\n raw = self.tostring(\n spans[0], encoding='unicode', method='text', with_tail=False).strip()\n m = re.search(r'\\s+([0-9.]+)$', raw.strip())\n if m is not None:\n series_index = float(m.group(1))\n s = series.xpath('./a[@id=\"series-page-link\"]')\n if s:\n series = self.tostring(\n s[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n else:\n series = root.xpath('//div[@id=\"seriesBulletWidget_feature_div\"]')\n if series:\n a = series[0].xpath('descendant::a')\n if a:\n raw = self.tostring(a[0], encoding='unicode', method='text', with_tail=False)\n if self.domain == 'jp':\n m = re.search(r'(?P[0-9.]+)\\s*(?:巻|冊)\\s*\\(全\\s*([0-9.]+)\\s*(?:巻|冊)\\):\\s*(?P.+)', raw.strip())\n else:\n m = re.search(r'(?:Book|Libro|Buch)\\s+(?P[0-9.]+)\\s+(?:of|de|von)\\s+([0-9.]+)\\s*:\\s*(?P.+)', raw.strip())\n if m is not None:\n ans = (m.group('series').strip(), float(m.group('index')))\n\n # This is found on Kindle edition pages on amazon.com\n if ans == (None, None):\n for span in root.xpath('//div[@id=\"aboutEbooksSection\"]//li/span'):\n text = (span.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = span.xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n # This is found on newer Kindle edition pages on amazon.com\n if ans == (None, None):\n for b in root.xpath('//div[@id=\"reviewFeatureGroup\"]/span/b'):\n text = (b.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = b.getparent().xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).partition('(')[0].strip()\n if series:\n ans = series, series_index\n\n if ans == (None, None):\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"buying\"]')\n if desc:\n raw = self.tostring(desc[0], method='text', encoding='unicode')\n raw = re.sub(r'\\s+', ' ', raw)\n match = self.series_pat.search(raw)\n if match is not None:\n s, i = match.group('series'), float(match.group('index'))\n if s:\n ans = (s, i)\n if ans[0]:\n ans = (re.sub(r'\\s+Series$', '', ans[0]).strip(), ans[1])\n ans = (re.sub(r'\\(.+?\\s+Series\\)$', '', ans[0]).strip(), ans[1])\n return ans\n\n def parse_tags(self, root):\n ans = []\n exclude_tokens = {'kindle', 'a-z'}\n exclude = {'special features', 'by authors',\n 'authors & illustrators', 'books', 'new; used & rental textbooks'}\n seen = set()\n for li in root.xpath(self.tags_xpath):\n for i, a in enumerate(li.iterdescendants('a')):\n if i > 0:\n # we ignore the first category since it is almost always\n # too broad\n raw = (a.text or '').strip().replace(',', ';')\n lraw = icu_lower(raw)\n tokens = frozenset(lraw.split())\n if raw and lraw not in exclude and not tokens.intersection(exclude_tokens) and lraw not in seen:\n ans.append(raw)\n seen.add(lraw)\n return ans\n\n def parse_cover(self, root, raw=b\"\"):\n # Look for the image URL in javascript, using the first image in the\n # image gallery as the cover\n import json\n imgpat = re.compile(r\"\"\"'imageGalleryData'\\s*:\\s*(\\[\\s*{.+])\"\"\")\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n try:\n return json.loads(m.group(1))[0]['mainUrl']\n except Exception:\n continue\n\n def clean_img_src(src):\n parts = src.split('/')\n if len(parts) > 3:\n bn = parts[-1]\n sparts = bn.split('_')\n if len(sparts) > 2:\n bn = re.sub(r'\\.\\.jpg$', '.jpg', (sparts[0] + sparts[-1]))\n return ('/'.join(parts[:-1])) + '/' + bn\n\n imgpat2 = re.compile(r'var imageSrc = \"([^\"]+)\"')\n for script in root.xpath('//script'):\n m = imgpat2.search(script.text or '')\n if m is not None:\n src = m.group(1)\n url = clean_img_src(src)\n if url:\n return url\n\n imgs = root.xpath(\n '//img[(@id=\"prodImage\" or @id=\"original-main-image\" or @id=\"main-image\" or @id=\"main-image-nonjs\") and @src]')\n if not imgs:\n imgs = (\n root.xpath('//div[@class=\"main-image-inner-wrapper\"]/img[@src]') or\n root.xpath('//div[@id=\"main-image-container\" or @id=\"ebooks-main-image-container\"]//img[@src]') or\n root.xpath(\n '//div[@id=\"mainImageContainer\"]//img[@data-a-dynamic-image]')\n )\n for img in imgs:\n try:\n idata = json.loads(img.get('data-a-dynamic-image'))\n except Exception:\n imgs = ()\n else:\n mwidth = 0\n try:\n url = None\n for iurl, (width, height) in idata.items():\n if width > mwidth:\n mwidth = width\n url = iurl\n return url\n except Exception:\n pass\n\n for img in imgs:\n src = img.get('src')\n if 'data:' in src:\n continue\n if 'loading-' in src:\n js_img = re.search(br'\"largeImage\":\"(https?://[^\"]+)\",', raw)\n if js_img:\n src = js_img.group(1).decode('utf-8')\n if ('/no-image-avail' not in src and 'loading-' not in src and '/no-img-sm' not in src):\n self.log('Found image: %s' % src)\n url = clean_img_src(src)\n if url:\n return url\n\n def parse_detail_bullets(self, root, mi, container):\n ul = next(self.selector('.detail-bullet-list', root=container))\n for span in self.selector('.a-list-item', root=ul):\n cells = span.xpath('./span')\n if len(cells) >= 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_new_details(self, root, mi, non_hero):\n table = non_hero.xpath('descendant::table')[0]\n for tr in table.xpath('descendant::tr'):\n cells = tr.xpath('descendant::*[local-name()=\"td\" or local-name()=\"th\"]')\n if len(cells) == 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_detail_cells(self, mi, c1, c2):\n name = self.totext(c1, only_printable=True).strip().strip(':').strip()\n val = self.totext(c2).strip()\n if not val:\n return\n if name in self.language_names:\n ans = self.lang_map.get(val, None)\n if not ans:\n ans = canonicalize_lang(val)\n if ans:\n mi.language = ans\n elif name in self.publisher_names:\n pub = val.partition(';')[0].partition('(')[0].strip()\n if pub:\n mi.publisher = pub\n date = val.rpartition('(')[-1].replace(')', '').strip()\n try:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(date)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n except:\n self.log.exception('Failed to parse pubdate: %s' % val)\n elif name in {'ISBN', 'ISBN-10', 'ISBN-13'}:\n ans = check_isbn(val)\n if ans:\n self.isbn = mi.isbn = ans\n elif name in {'Publication date'}:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(val)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n\n def parse_isbn(self, pd):\n items = pd.xpath(\n 'descendant::*[starts-with(text(), \"ISBN\")]')\n if not items:\n items = pd.xpath(\n 'descendant::b[contains(text(), \"ISBN:\")]')\n for x in reversed(items):\n if x.tail:\n ans = check_isbn(x.tail.strip())\n if ans:\n return ans\n\n def parse_publisher(self, pd):\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail.partition(';')[0]\n return ans.partition('(')[0].strip()\n\n def parse_pubdate(self, pd):\n from calibre.utils.date import parse_only_date\n for x in reversed(pd.xpath(self.pubdate_xpath)):\n if x.tail:\n date = x.tail.strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail\n date = ans.rpartition('(')[-1].replace(')', '').strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n\n def parse_language(self, pd):\n for x in reversed(pd.xpath(self.language_xpath)):\n if x.tail:\n raw = x.tail.strip().partition(',')[0].strip()\n ans = self.lang_map.get(raw, None)\n if ans:\n return ans\n ans = canonicalize_lang(ans)\n if ans:\n return ans\n# }}}\n\n\nclass Amazon(Source):\n\n name = 'Amazon.com'\n version = (1, 3, 0)\n minimum_calibre_version = (2, 82, 0)\n description = _('Downloads metadata and covers from Amazon')\n\n capabilities = frozenset(('identify', 'cover'))\n touched_fields = frozenset(('title', 'authors', 'identifier:amazon',\n 'rating', 'comments', 'publisher', 'pubdate',\n 'languages', 'series', 'tags'))\n has_html_comments = True\n supports_gzip_transfer_encoding = True\n prefer_results_with_isbn = False\n\n AMAZON_DOMAINS = {\n 'com': _('US'),\n 'fr': _('France'),\n 'de': _('Germany'),\n 'uk': _('UK'),\n 'au': _('Australia'),\n 'it': _('Italy'),\n 'jp': _('Japan'),\n 'es': _('Spain'),\n 'br': _('Brazil'),\n 'in': _('India'),\n 'nl': _('Netherlands'),\n 'cn': _('China'),\n 'ca': _('Canada'),\n 'se': _('Sweden'),\n }\n\n SERVERS = {\n 'auto': _('Choose server automatically'),\n 'amazon': _('Amazon servers'),\n 'bing': _('Bing search cache'),\n 'google': _('Google search cache'),\n 'wayback': _('Wayback machine cache (slow)'),\n 'ddg': _('DuckDuckGo search and Google cache'),\n }\n\n options = (\n Option('domain', 'choices', 'com', _('Amazon country website to use:'),\n _('Metadata from Amazon will be fetched using this '\n 'country\\'s Amazon website.'), choices=AMAZON_DOMAINS),\n Option('server', 'choices', 'auto', _('Server to get data from:'),\n _(\n 'Amazon has started blocking attempts to download'\n ' metadata from its servers. To get around this problem,'\n ' calibre can fetch the Amazon data from many different'\n ' places where it is cached. Choose the source you prefer.'\n ), choices=SERVERS),\n Option('use_mobi_asin', 'bool', False, _('Use the MOBI-ASIN for metadata search'),\n _(\n 'Enable this option to search for metadata with an'\n ' ASIN identifier from the MOBI file at the current country website,'\n ' unless any other amazon id is available. Note that if the'\n ' MOBI file came from a different Amazon country store, you could get'\n ' incorrect results.'\n )),\n Option('prefer_kindle_edition', 'bool', False, _('Prefer the Kindle edition, when available'),\n _(\n 'When searching for a book and the search engine returns both paper and Kindle editions,'\n ' always prefer the Kindle edition, instead of whatever the search engine returns at the'\n ' top.')\n ),\n )\n\n def __init__(self, *args, **kwargs):\n Source.__init__(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def id_from_url(self, url):\n from polyglot.urllib import urlparse\n purl = urlparse(url)\n if purl.netloc and purl.path and '/dp/' in purl.path:\n host_parts = tuple(x.lower() for x in purl.netloc.split('.'))\n if 'amazon' in host_parts:\n domain = host_parts[-1]\n parts = purl.path.split('/')\n idx = parts.index('dp')\n try:\n val = parts[idx+1]\n except IndexError:\n return\n aid = 'amazon' if domain == 'com' else ('amazon_' + domain)\n return aid, val\n\n def test_fields(self, mi):\n '''\n Return the first field from self.touched_fields that is null on the\n mi object\n '''\n for key in self.touched_fields:\n if key.startswith('identifier:'):\n key = key.partition(':')[-1]\n if key == 'amazon':\n if self.domain != 'com':\n key += '_' + self.domain\n if not mi.has_identifier(key):\n return 'identifier: ' + key\n elif mi.is_null(key):\n return key\n\n @property\n def browser(self):\n br = self._browser\n if br is None:\n ua = 'Mobile '\n while not user_agent_is_ok(ua):\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n self._browser = br = browser(user_agent=ua)\n br.set_handle_gzip(True)\n if self.use_search_engine:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n else:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ('Referer', self.referrer_for_domain()),\n ]\n return br\n\n def save_settings(self, *args, **kwargs):\n Source.save_settings(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def set_amazon_id_touched_fields(self):\n ident_name = \"identifier:amazon\"\n if self.domain != 'com':\n ident_name += '_' + self.domain\n tf = [x for x in self.touched_fields if not\n x.startswith('identifier:amazon')] + [ident_name]\n self.touched_fields = frozenset(tf)\n\n def get_domain_and_asin(self, identifiers, extra_domains=()):\n identifiers = {k.lower(): v for k, v in identifiers.items()}\n for key, val in identifiers.items():\n if key in ('amazon', 'asin'):\n return 'com', val\n if key.startswith('amazon_'):\n domain = key.partition('_')[-1]\n if domain and (domain in self.AMAZON_DOMAINS or domain in extra_domains):\n return domain, val\n if self.prefs['use_mobi_asin']:\n val = identifiers.get('mobi-asin')\n if val is not None:\n return self.domain, val\n return None, None\n\n def referrer_for_domain(self, domain=None):\n domain = domain or self.domain\n return {\n 'uk': 'https://www.amazon.co.uk/',\n 'au': 'https://www.amazon.com.au/',\n 'br': 'https://www.amazon.com.br/',\n 'jp': 'https://www.amazon.co.jp/',\n }.get(domain, 'https://www.amazon.%s/' % domain)\n\n def _get_book_url(self, identifiers): # {{{\n domain, asin = self.get_domain_and_asin(\n identifiers, extra_domains=('au', 'ca'))\n if domain and asin:\n url = None\n r = self.referrer_for_domain(domain)\n if r is not None:\n url = r + 'dp/' + asin\n if url:\n idtype = 'amazon' if domain == 'com' else 'amazon_' + domain\n return domain, idtype, asin, url\n\n def get_book_url(self, identifiers):\n ans = self._get_book_url(identifiers)\n if ans is not None:\n return ans[1:]\n\n def get_book_url_name(self, idtype, idval, url):\n if idtype == 'amazon':\n return self.name\n return 'A' + idtype.replace('_', '.')[1:]\n # }}}\n\n @property\n def domain(self):\n x = getattr(self, 'testing_domain', None)\n if x is not None:\n return x\n domain = self.prefs['domain']\n if domain not in self.AMAZON_DOMAINS:\n domain = 'com'\n\n return domain\n\n @property\n def server(self):\n x = getattr(self, 'testing_server', None)\n if x is not None:\n return x\n server = self.prefs['server']\n if server not in self.SERVERS:\n server = 'auto'\n return server\n\n @property\n def use_search_engine(self):\n return self.server != 'amazon'\n\n def clean_downloaded_metadata(self, mi):\n docase = (\n mi.language == 'eng' or\n (mi.is_null('language') and self.domain in {'com', 'uk', 'au'})\n )\n if mi.title and docase:\n # Remove series information from title\n m = re.search(r'\\S+\\s+(\\(.+?\\s+Book\\s+\\d+\\))$', mi.title)\n if m is not None:\n mi.title = mi.title.replace(m.group(1), '').strip()\n mi.title = fixcase(mi.title)\n mi.authors = fixauthors(mi.authors)\n if mi.tags and docase:\n mi.tags = list(map(fixcase, mi.tags))\n mi.isbn = check_isbn(mi.isbn)\n if mi.series and docase:\n mi.series = fixcase(mi.series)\n if mi.title and mi.series:\n for pat in (r':\\s*Book\\s+\\d+\\s+of\\s+%s$', r'\\(%s\\)$', r':\\s*%s\\s+Book\\s+\\d+$'):\n pat = pat % re.escape(mi.series)\n q = re.sub(pat, '', mi.title, flags=re.I).strip()\n if q and q != mi.title:\n mi.title = q\n break\n\n def get_website_domain(self, domain):\n return {'uk': 'co.uk', 'jp': 'co.jp', 'br': 'com.br', 'au': 'com.au'}.get(domain, domain)\n\n def create_query(self, log, title=None, authors=None, identifiers={}, # {{{\n domain=None, for_amazon=True):\n try:\n from urllib.parse import urlencode, unquote_plus\n except ImportError:\n from urllib import urlencode, unquote_plus\n if domain is None:\n domain = self.domain\n\n idomain, asin = self.get_domain_and_asin(identifiers)\n if idomain is not None:\n domain = idomain\n\n # See the amazon detailed search page to get all options\n terms = []\n q = {'search-alias': 'aps',\n 'unfiltered': '1',\n }\n\n if domain == 'com':\n q['sort'] = 'relevanceexprank'\n else:\n q['sort'] = 'relevancerank'\n\n isbn = check_isbn(identifiers.get('isbn', None))\n\n if asin is not None:\n q['field-keywords'] = asin\n terms.append(asin)\n elif isbn is not None:\n q['field-isbn'] = isbn\n if len(isbn) == 13:\n terms.extend('({} OR {}-{})'.format(isbn, isbn[:3], isbn[3:]).split())\n else:\n terms.append(isbn)\n else:\n # Only return book results\n q['search-alias'] = {'br': 'digital-text',\n 'nl': 'aps'}.get(domain, 'stripbooks')\n if title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q['field-title'] = ' '.join(title_tokens)\n terms.extend(title_tokens)\n if authors:\n author_tokens = list(self.get_author_tokens(authors,\n only_first_author=True))\n if author_tokens:\n q['field-author'] = ' '.join(author_tokens)\n terms.extend(author_tokens)\n\n if not ('field-keywords' in q or 'field-isbn' in q or\n ('field-title' in q)):\n # Insufficient metadata to make an identify query\n return None, None\n\n if not for_amazon:\n return terms, domain\n\n if domain == 'nl':\n q['__mk_nl_NL'] = 'ÅMÅŽÕÑ'\n if 'field-keywords' not in q:\n q['field-keywords'] = ''\n for f in 'field-isbn field-title field-author'.split():\n q['field-keywords'] += ' ' + q.pop(f, '')\n q['field-keywords'] = q['field-keywords'].strip()\n\n encoded_q = dict([(x.encode('utf-8', 'ignore'), y.encode(\n 'utf-8', 'ignore')) for x, y in q.items()])\n url_query = urlencode(encoded_q)\n # amazon's servers want IRIs with unicode characters not percent esaped\n parts = []\n for x in url_query.split(b'&' if isinstance(url_query, bytes) else '&'):\n k, v = x.split(b'=' if isinstance(x, bytes) else '=', 1)\n parts.append('{}={}'.format(iri_quote_plus(unquote_plus(k)), iri_quote_plus(unquote_plus(v))))\n url_query = '&'.join(parts)\n url = 'https://www.amazon.%s/s/?' % self.get_website_domain(\n domain) + url_query\n return url, domain\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n domain, asin = self.get_domain_and_asin(identifiers)\n if asin is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n asin = self.cached_isbn_to_identifier(isbn)\n if asin is not None:\n url = self.cached_identifier_to_cover_url(asin)\n\n return url\n # }}}\n\n def parse_results_page(self, root, domain): # {{{\n from lxml.html import tostring\n\n matches = []\n\n def title_ok(title):\n title = title.lower()\n bad = ['bulk pack', '[audiobook]', '[audio cd]',\n '(a book companion)', '( slipcase with door )', ': free sampler']\n if self.domain == 'com':\n bad.extend(['(%s edition)' % x for x in ('spanish', 'german')])\n for x in bad:\n if x in title:\n return False\n if title and title[0] in '[{' and re.search(r'\\(\\s*author\\s*\\)', title) is not None:\n # Bad entries in the catalog\n return False\n return True\n\n for query in (\n '//div[contains(@class, \"s-result-list\")]//h2/a[@href]',\n '//div[contains(@class, \"s-result-list\")]//div[@data-index]//h5//a[@href]',\n r'//li[starts-with(@id, \"result_\")]//a[@href and contains(@class, \"s-access-detail-page\")]',\n ):\n result_links = root.xpath(query)\n if result_links:\n break\n for a in result_links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n\n if not matches:\n # Previous generation of results page markup\n for div in root.xpath(r'//div[starts-with(@id, \"result_\")]'):\n links = div.xpath(r'descendant::a[@class=\"title\" and @href]')\n if not links:\n # New amazon markup\n links = div.xpath('descendant::h3/a[@href]')\n for a in links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n\n if not matches:\n # This can happen for some user agents that Amazon thinks are\n # mobile/less capable\n for td in root.xpath(\n r'//div[@id=\"Results\"]/descendant::td[starts-with(@id, \"search:Td:\")]'):\n for a in td.xpath(r'descendant::td[@class=\"dataColumn\"]/descendant::a[@href]/span[@class=\"srTitle\"]/..'):\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n if not matches and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError('Amazon returned a CAPTCHA page. Recently Amazon has begun using statistical'\n ' profiling to block access to its website. As such this metadata plugin is'\n ' unlikely to ever work reliably.')\n\n # Keep only the top 3 matches as the matches are sorted by relevance by\n # Amazon so lower matches are not likely to be very relevant\n return matches[:3]\n # }}}\n\n def search_amazon(self, br, testing, log, abort, title, authors, identifiers, timeout): # {{{\n from calibre.utils.cleantext import clean_ascii_chars\n from calibre.ebooks.chardet import xml_to_unicode\n matches = []\n query, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if query is None:\n log.error('Insufficient metadata to construct query')\n raise SearchFailed()\n try:\n raw = br.open_novisit(query, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('Query malformed: %r' % query)\n raise SearchFailed()\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = _('Amazon timed out. Try again later.')\n log.error(msg)\n else:\n msg = 'Failed to make identify query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n raw = clean_ascii_chars(xml_to_unicode(raw,\n strip_encoding_pats=True, resolve_entities=True)[0])\n\n if testing:\n import tempfile\n with tempfile.NamedTemporaryFile(prefix='amazon_results_',\n suffix='.html', delete=False) as f:\n f.write(raw.encode('utf-8'))\n print('Downloaded html for results page saved in', f.name)\n\n matches = []\n found = '404 - ' not in raw\n\n if found:\n try:\n root = parse_html(raw)\n except Exception:\n msg = 'Failed to parse amazon page for query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n matches = self.parse_results_page(root, domain)\n\n return matches, query, domain, None\n # }}}\n\n def search_search_engine(self, br, testing, log, abort, title, authors, identifiers, timeout, override_server=None): # {{{\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n terms, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers, for_amazon=False)\n site = self.referrer_for_domain(\n domain)[len('https://'):].partition('/')[0]\n matches = []\n server = override_server or self.server\n urlproc, sfunc = se.google_url_processor, se.google_search\n if server == 'bing':\n urlproc, sfunc = se.bing_url_processor, se.bing_search\n elif server == 'wayback':\n urlproc, sfunc = se.wayback_url_processor, se.ddg_search\n elif server == 'ddg':\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n try:\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n except HTTPError as err:\n if err.code == 429 and sfunc is se.google_search:\n log('Got too many requests error from Google, trying via DuckDuckGo')\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n else:\n raise\n\n br.set_current_header('Referer', qurl)\n for result in results:\n if abort.is_set():\n return matches, terms, domain, None\n\n purl = urlparse(result.url)\n if '/dp/' in purl.path and site in purl.netloc:\n url = result.cached_url\n if url is None:\n url = se.get_cached_url(result.url, br, timeout=timeout)\n if url is None:\n log('Failed to find cached page for:', result.url)\n continue\n if url not in matches:\n matches.append(url)\n if len(matches) >= 3:\n break\n else:\n log('Skipping non-book result:', result)\n if not matches:\n log('No search engine results for terms:', ' '.join(terms))\n if urlproc is se.google_url_processor:\n # Google does not cache adult titles\n log('Trying the bing search engine instead')\n return self.search_search_engine(br, testing, log, abort, title, authors, identifiers, timeout, 'bing')\n return matches, terms, domain, urlproc\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=60):\n '''\n Note this method will retry without identifiers automatically if no\n match is found with identifiers.\n '''\n\n testing = getattr(self, 'running_a_test', False)\n\n udata = self._get_book_url(identifiers)\n br = self.browser\n log('User-agent:', br.current_user_agent())\n log('Server:', self.server)\n if testing:\n print('User-agent:', br.current_user_agent())\n if udata is not None and not self.use_search_engine:\n # Try to directly get details page instead of running a search\n # Cannot use search engine as the directly constructed URL is\n # usually redirected to a full URL by amazon, and is therefore\n # not cached\n domain, idtype, asin, durl = udata\n if durl is not None:\n preparsed_root = parse_details_page(\n durl, log, timeout, br, domain)\n if preparsed_root is not None:\n qasin = parse_asin(preparsed_root[1], log, durl)\n if qasin == asin:\n w = Worker(durl, result_queue, br, log, 0, domain,\n self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)\n try:\n w.get_details()\n return\n except Exception:\n log.exception(\n 'get_details failed for url: %r' % durl)\n func = self.search_search_engine if self.use_search_engine else self.search_amazon\n try:\n matches, query, domain, cover_url_processor = func(\n br, testing, log, abort, title, authors, identifiers, timeout)\n except SearchFailed:\n return\n\n if abort.is_set():\n return\n\n if not matches:\n if identifiers and title and authors:\n log('No matches found with identifiers, retrying using only'\n ' title and authors. Query: %r' % query)\n time.sleep(1)\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n log.error('No matches found with query: %r' % query)\n return\n\n if self.prefs['prefer_kindle_edition']:\n matches = sort_matches_preferring_kindle_editions(matches)\n\n workers = [Worker(\n url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout,\n cover_url_processor=cover_url_processor, filter_result=partial(\n self.filter_result, title, authors, identifiers)) for i, url in enumerate(matches)]\n\n for w in workers:\n # Don't send all requests at the same time\n time.sleep(1)\n w.start()\n if abort.is_set():\n return\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n return None\n # }}}\n\n def filter_result(self, title, authors, identifiers, mi, log): # {{{\n if not self.use_search_engine:\n return True\n if title is not None:\n\n def tokenize_title(x):\n return icu_lower(x).replace(\"'\", '').replace('\"', '').rstrip(':')\n\n tokens = {tokenize_title(x) for x in title.split() if len(x) > 3}\n if tokens:\n result_tokens = {tokenize_title(x) for x in mi.title.split()}\n if not tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'as its title does not match')\n return False\n if authors:\n author_tokens = set()\n for author in authors:\n author_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n result_tokens = set()\n for author in mi.authors:\n result_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n if author_tokens and not author_tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'by', ' & '.join(mi.authors), 'as its author does not match')\n return False\n return True\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=60, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n log('Downloading cover from:', cached_url)\n br = self.browser\n if self.use_search_engine:\n br = br.clone_browser()\n br.set_current_header('Referer', self.referrer_for_domain(self.domain))\n try:\n time.sleep(1)\n cdata = br.open_novisit(\n cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\ndef manual_tests(domain, **kw): # {{{\n # To run these test use:\n # calibre-debug -c \"from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')\"\n from calibre.ebooks.metadata.sources.test import (test_identify_plugin,\n isbn_test, title_test, authors_test, comments_test, series_test)\n all_tests = {}\n all_tests['com'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus',\n exact=True), series_test('The Heroes of Olympus', 5)]\n ),\n\n ( # Kindle edition with series\n {'identifiers': {'amazon': 'B0085UEQDO'}},\n [title_test('Three Parts Dead', exact=True),\n series_test('Craft Sequence', 1)]\n ),\n\n ( # + in title and uses id=\"main-image\" for cover\n {'identifiers': {'amazon': '1933988770'}},\n [title_test(\n 'C++ Concurrency in Action: Practical Multithreading', exact=True)]\n ),\n\n\n ( # Different comments markup, using Book Description section\n {'identifiers': {'amazon': '0982514506'}},\n [title_test(\n \"Griffin's Destiny: Book Three: The Griffin's Daughter Trilogy\",\n exact=True),\n comments_test('Jelena'), comments_test('Ashinji'),\n ]\n ),\n\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C#'),\n authors_test(['Rockford Lhotka'])\n ]\n ),\n\n ( # No specific problems\n {'identifiers': {'isbn': '0743273567'}},\n [title_test('the great gatsby: the only authorized edition', exact=True),\n authors_test(['Francis Scott Fitzgerald'])]\n ),\n\n ]\n\n # }}}\n\n all_tests['de'] = [ # {{{\n # series\n (\n {'identifiers': {'isbn': '3499275120'}},\n [title_test('Vespasian: Das Schwert des Tribuns: Historischer Roman',\n exact=False), authors_test(['Robert Fabbri']), series_test('Die Vespasian-Reihe', 1)\n ]\n\n ),\n\n ( # umlaut in title/authors\n {'title': 'Flüsternde Wälder',\n 'authors': ['Nicola Förg']},\n [title_test('Flüsternde Wälder'),\n authors_test(['Nicola Förg'], subset=True)\n ]\n ),\n\n (\n {'identifiers': {'isbn': '9783453314979'}},\n [title_test('Die letzten Wächter: Roman',\n exact=False), authors_test(['Sergej Lukianenko'])\n ]\n\n ),\n\n (\n {'identifiers': {'isbn': '3548283519'}},\n [title_test('Wer Wind Sät: Der Fünfte Fall Für Bodenstein Und Kirchhoff',\n exact=False), authors_test(['Nele Neuhaus'])\n ]\n\n ),\n ] # }}}\n\n all_tests['it'] = [ # {{{\n (\n {'identifiers': {'isbn': '8838922195'}},\n [title_test('La briscola in cinque',\n exact=True), authors_test(['Marco Malvaldi'])\n ]\n\n ),\n ] # }}}\n\n all_tests['fr'] = [ # {{{\n (\n {'identifiers': {'amazon_fr': 'B07L7ST4RS'}},\n [title_test('Le secret de Lola', exact=True),\n authors_test(['Amélie BRIZIO'])\n ]\n ),\n (\n {'identifiers': {'isbn': '2221116798'}},\n [title_test('L\\'étrange voyage de Monsieur Daldry',\n exact=True), authors_test(['Marc Levy'])\n ]\n\n ),\n ] # }}}\n\n all_tests['es'] = [ # {{{\n (\n {'identifiers': {'isbn': '8483460831'}},\n [title_test('Tiempos Interesantes',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['se'] = [ # {{{\n (\n {'identifiers': {'isbn': '9780552140287'}},\n [title_test('Men At Arms: A Discworld Novel: 14',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['jp'] = [ # {{{\n ( # Adult filtering test\n {'identifiers': {'isbn': '4799500066'}},\n [title_test('Bitch Trap'), ]\n ),\n\n ( # isbn -> title, authors\n {'identifiers': {'isbn': '9784101302720'}},\n [title_test('精霊の守り人',\n exact=True), authors_test(['上橋 菜穂子'])\n ]\n ),\n ( # title, authors -> isbn (will use Shift_JIS encoding in query.)\n {'title': '考えない練習',\n 'authors': ['小池 龍之介']},\n [isbn_test('9784093881067'), ]\n ),\n ] # }}}\n\n all_tests['br'] = [ # {{{\n (\n {'title': 'Guerra dos Tronos'},\n [title_test('A Guerra dos Tronos - As Crônicas de Gelo e Fogo',\n exact=True), authors_test(['George R. R. Martin'])\n ]\n\n ),\n ] # }}}\n\n all_tests['nl'] = [ # {{{\n (\n {'title': 'Freakonomics'},\n [title_test('Freakonomics',\n exact=True), authors_test(['Steven Levitt & Stephen Dubner & R. Kuitenbrouwer & O. Brenninkmeijer & A. van Den Berg'])\n ]\n\n ),\n ] # }}}\n\n all_tests['cn'] = [ # {{{\n (\n {'identifiers': {'isbn': '9787115369512'}},\n [title_test('若为自由故 自由软件之父理查德斯托曼传', exact=True),\n authors_test(['[美]sam Williams', '邓楠,李凡希'])]\n ),\n (\n {'title': '爱上Raspberry Pi'},\n [title_test('爱上Raspberry Pi',\n exact=True), authors_test(['Matt Richardson', 'Shawn Wallace', '李凡希'])\n ]\n\n ),\n ] # }}}\n\n all_tests['ca'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'isbn': '9781623808747'}},\n [title_test('Parting Shot', exact=True),\n authors_test(['Mary Calmes'])]\n ),\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C# 2008 Business Objects'),\n authors_test(['Rockford Lhotka'])]\n ),\n ( # noscript description\n {'identifiers': {'amazon_ca': '162380874X'}},\n [title_test('Parting Shot', exact=True), authors_test(['Mary Calmes'])\n ]\n ),\n ] # }}}\n\n all_tests['in'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon_in': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus', exact=True)]\n ),\n ] # }}}\n\n def do_test(domain, start=0, stop=None, server='auto'):\n tests = all_tests[domain]\n if stop is None:\n stop = len(tests)\n tests = tests[start:stop]\n test_identify_plugin(Amazon.name, tests, modify_plugin=lambda p: (\n setattr(p, 'testing_domain', domain),\n setattr(p, 'touched_fields', p.touched_fields - {'tags'}),\n setattr(p, 'testing_server', server),\n ))\n\n do_test(domain, **kw)\n# }}}\n",
- "big_book_search": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Source, Option\n\n\ndef get_urls(br, tokens):\n from urllib.parse import quote_plus\n from html5_parser import parse\n escaped = (quote_plus(x) for x in tokens if x and x.strip())\n q = '+'.join(escaped)\n url = 'https://bigbooksearch.com/please-dont-scrape-my-site-you-will-put-my-api-key-over-the-usage-limit-and-the-site-will-break/books/'+q\n raw = br.open(url).read()\n root = parse(raw.decode('utf-8'))\n urls = [i.get('src') for i in root.xpath('//img[@src]')]\n return urls\n\n\nclass BigBookSearch(Source):\n\n name = 'Big Book Search'\n version = (1, 0, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads multiple book covers from Amazon. Useful to find alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the search result')),\n )\n supports_gzip_transfer_encoding = True\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n br = self.browser\n tokens = tuple(self.get_title_tokens(title)) + tuple(self.get_author_tokens(authors))\n urls = get_urls(br, tokens)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n\ndef test():\n from calibre import browser\n import pprint\n br = browser()\n urls = get_urls(br, ['consider', 'phlebas', 'banks'])\n pprint.pprint(urls)\n\n\nif __name__ == '__main__':\n test()\n",
- "edelweiss": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nimport time, re\nfrom threading import Thread\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, random_user_agent\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\ndef clean_html(raw):\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n return clean_ascii_chars(xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True, assume_utf8=True)[0])\n\n\ndef parse_html(raw):\n raw = clean_html(raw)\n from html5_parser import parse\n return parse(raw)\n\n\ndef astext(node):\n from lxml import etree\n return etree.tostring(node, method='text', encoding='unicode',\n with_tail=False).strip()\n\n\nclass Worker(Thread): # {{{\n\n def __init__(self, basic_data, relevance, result_queue, br, timeout, log, plugin):\n Thread.__init__(self)\n self.daemon = True\n self.basic_data = basic_data\n self.br, self.log, self.timeout = br, log, timeout\n self.result_queue, self.plugin, self.sku = result_queue, plugin, self.basic_data['sku']\n self.relevance = relevance\n\n def run(self):\n url = ('https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/product/two_Enhanced.ascx&'\n 'sku={0}&idPrefix=content_1_{0}&mode=0'.format(self.sku))\n try:\n raw = self.br.open_novisit(url, timeout=self.timeout).read()\n except:\n self.log.exception('Failed to load comments page: %r'%url)\n return\n\n try:\n mi = self.parse(raw)\n mi.source_relevance = self.relevance\n self.plugin.clean_downloaded_metadata(mi)\n self.result_queue.put(mi)\n except:\n self.log.exception('Failed to parse details for sku: %s'%self.sku)\n\n def parse(self, raw):\n from calibre.ebooks.metadata.book.base import Metadata\n from calibre.utils.date import UNDEFINED_DATE\n root = parse_html(raw)\n mi = Metadata(self.basic_data['title'], self.basic_data['authors'])\n\n # Identifiers\n if self.basic_data['isbns']:\n mi.isbn = self.basic_data['isbns'][0]\n mi.set_identifier('edelweiss', self.sku)\n\n # Tags\n if self.basic_data['tags']:\n mi.tags = self.basic_data['tags']\n mi.tags = [t[1:].strip() if t.startswith('&') else t for t in mi.tags]\n\n # Publisher\n mi.publisher = self.basic_data['publisher']\n\n # Pubdate\n if self.basic_data['pubdate'] and self.basic_data['pubdate'].year != UNDEFINED_DATE:\n mi.pubdate = self.basic_data['pubdate']\n\n # Rating\n if self.basic_data['rating']:\n mi.rating = self.basic_data['rating']\n\n # Comments\n comments = ''\n for cid in ('summary', 'contributorbio', 'quotes_reviews'):\n cid = 'desc_{}{}-content'.format(cid, self.sku)\n div = root.xpath('//*[@id=\"{}\"]'.format(cid))\n if div:\n comments += self.render_comments(div[0])\n if comments:\n mi.comments = comments\n\n mi.has_cover = self.plugin.cached_identifier_to_cover_url(self.sku) is not None\n return mi\n\n def render_comments(self, desc):\n from lxml import etree\n from calibre.library.comments import sanitize_comments_html\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = etree.tostring(desc, method='html', encoding='unicode').strip()\n\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove comments\n desc = re.sub(r'(?s)', '', desc)\n return sanitize_comments_html(desc)\n# }}}\n\n\ndef get_basic_data(browser, log, *skus):\n from calibre.utils.date import parse_only_date\n from mechanize import Request\n zeroes = ','.join('0' for sku in skus)\n data = {\n 'skus': ','.join(skus),\n 'drc': zeroes,\n 'startPosition': '0',\n 'sequence': '1',\n 'selected': zeroes,\n 'itemID': '0',\n 'orderID': '0',\n 'mailingID': '',\n 'tContentWidth': '926',\n 'originalOrder': ','.join(type('')(i) for i in range(len(skus))),\n 'selectedOrderID': '0',\n 'selectedSortColumn': '0',\n 'listType': '1',\n 'resultType': '32',\n 'blockView': '1',\n }\n items_data_url = 'https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/listviews/ListView_Title_Multi.ascx'\n req = Request(items_data_url, data)\n response = browser.open_novisit(req)\n raw = response.read()\n root = parse_html(raw)\n for item in root.xpath('//div[@data-priority]'):\n row = item.getparent().getparent()\n sku = item.get('id').split('-')[-1]\n isbns = [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_sku\")]/text()')[0].split(',') if check_isbn(x.strip())]\n isbns.sort(key=len, reverse=True)\n try:\n tags = [x.strip() for x in astext(row.xpath('descendant::*[contains(@class, \"pev_categories\")]')[0]).split('/')]\n except IndexError:\n tags = []\n rating = 0\n for bar in row.xpath('descendant::*[contains(@class, \"bgdColorCommunity\")]/@style'):\n m = re.search(r'width: (\\d+)px;.*max-width: (\\d+)px', bar)\n if m is not None:\n rating = float(m.group(1)) / float(m.group(2))\n break\n try:\n pubdate = parse_only_date(astext(row.xpath('descendant::*[contains(@class, \"pev_shipDate\")]')[0]\n ).split(':')[-1].split(u'\\xa0')[-1].strip(), assume_utc=True)\n except Exception:\n log.exception('Error parsing published date')\n pubdate = None\n authors = []\n for x in [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_contributor\")]/@title')]:\n authors.extend(a.strip() for a in x.split(','))\n entry = {\n 'sku': sku,\n 'cover': row.xpath('descendant::img/@src')[0].split('?')[0],\n 'publisher': astext(row.xpath('descendant::*[contains(@class, \"headerPublisher\")]')[0]),\n 'title': astext(row.xpath('descendant::*[@id=\"title_{}\"]'.format(sku))[0]),\n 'authors': authors,\n 'isbns': isbns,\n 'tags': tags,\n 'pubdate': pubdate,\n 'format': ' '.join(row.xpath('descendant::*[contains(@class, \"pev_format\")]/text()')).strip(),\n 'rating': rating,\n }\n if entry['cover'].startswith('/'):\n entry['cover'] = None\n yield entry\n\n\nclass Edelweiss(Source):\n\n name = 'Edelweiss'\n version = (2, 0, 1)\n minimum_calibre_version = (3, 6, 0)\n description = _('Downloads metadata and covers from Edelweiss - A catalog updated by book publishers')\n\n capabilities = frozenset(['identify', 'cover'])\n touched_fields = frozenset([\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:edelweiss', 'rating'])\n supports_gzip_transfer_encoding = True\n has_html_comments = True\n\n @property\n def user_agent(self):\n # Pass in an index to random_user_agent() to test with a particular\n # user agent\n return random_user_agent(allow_ie=False)\n\n def _get_book_url(self, sku):\n if sku:\n return 'https://www.edelweiss.plus/#sku={}&page=1'.format(sku)\n\n def get_book_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if sku:\n return 'edelweiss', sku, self._get_book_url(sku)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if not sku:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n sku = self.cached_isbn_to_identifier(isbn)\n return self.cached_identifier_to_cover_url(sku)\n # }}}\n\n def create_query(self, log, title=None, authors=None, identifiers={}):\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n import time\n BASE_URL = ('https://www.edelweiss.plus/GetTreelineControl.aspx?'\n 'controlName=/uc/listviews/controls/ListView_data.ascx&itemID=0&resultType=32&dashboardType=8&itemType=1&dataType=products&keywordSearch&')\n keywords = []\n isbn = check_isbn(identifiers.get('isbn', None))\n if isbn is not None:\n keywords.append(isbn)\n elif title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n keywords.extend(title_tokens)\n author_tokens = self.get_author_tokens(authors, only_first_author=True)\n if author_tokens:\n keywords.extend(author_tokens)\n if not keywords:\n return None\n params = {\n 'q': (' '.join(keywords)).encode('utf-8'),\n '_': type('')(int(time.time()))\n }\n return BASE_URL+urlencode(params)\n\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=30):\n import json\n\n br = self.browser\n br.addheaders = [\n ('Referer', 'https://www.edelweiss.plus/'),\n ('X-Requested-With', 'XMLHttpRequest'),\n ('Cache-Control', 'no-cache'),\n ('Pragma', 'no-cache'),\n ]\n if 'edelweiss' in identifiers:\n items = [identifiers['edelweiss']]\n else:\n log.error('Currently Edelweiss returns random books for search queries')\n return\n query = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n log('Using query URL:', query)\n try:\n raw = br.open(query, timeout=timeout).read().decode('utf-8')\n except Exception as e:\n log.exception('Failed to make identify query: %r'%query)\n return as_unicode(e)\n items = re.search(r'window[.]items\\s*=\\s*(.+?);', raw)\n if items is None:\n log.error('Failed to get list of matching items')\n log.debug('Response text:')\n log.debug(raw)\n return\n items = json.loads(items.group(1))\n\n if (not items and identifiers and title and authors and\n not abort.is_set()):\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n\n if not items:\n return\n\n workers = []\n items = items[:5]\n for i, item in enumerate(get_basic_data(self.browser, log, *items)):\n sku = item['sku']\n for isbn in item['isbns']:\n self.cache_isbn_to_identifier(isbn, sku)\n if item['cover']:\n self.cache_identifier_to_cover_url(sku, item['cover'])\n fmt = item['format'].lower()\n if 'audio' in fmt or 'mp3' in fmt:\n continue # Audio-book, ignore\n workers.append(Worker(item, i, result_queue, br.clone_browser(), timeout, log, self))\n\n if not workers:\n return\n\n for w in workers:\n w.start()\n # Don't send all requests at the same time\n time.sleep(0.1)\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n br = self.browser\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\nif __name__ == '__main__':\n from calibre.ebooks.metadata.sources.test import (\n test_identify_plugin, title_test, authors_test, comments_test, pubdate_test)\n tests = [\n ( # A title and author search\n {'title': 'The Husband\\'s Secret', 'authors':['Liane Moriarty']},\n [title_test('The Husband\\'s Secret', exact=True),\n authors_test(['Liane Moriarty'])]\n ),\n\n ( # An isbn present in edelweiss\n {'identifiers':{'isbn': '9780312621360'}, },\n [title_test('Flame: A Sky Chasers Novel', exact=True),\n authors_test(['Amy Kathleen Ryan'])]\n ),\n\n # Multiple authors and two part title and no general description\n ({'identifiers':{'edelweiss':'0321180607'}},\n [title_test(\n \"XQuery From the Experts: A Guide to the W3C XML Query Language\"\n , exact=True), authors_test([\n 'Howard Katz', 'Don Chamberlin', 'Denise Draper', 'Mary Fernandez',\n 'Michael Kay', 'Jonathan Robie', 'Michael Rys', 'Jerome Simeon',\n 'Jim Tivy', 'Philip Wadler']), pubdate_test(2003, 8, 22),\n comments_test('Jérôme Siméon'), lambda mi: bool(mi.comments and 'No title summary' not in mi.comments)\n ]),\n ]\n start, stop = 0, len(tests)\n\n tests = tests[start:stop]\n test_identify_plugin(Edelweiss.name, tests)\n",
- "google": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal \nfrom __future__ import absolute_import, division, print_function, unicode_literals\nimport hashlib\nimport os\nimport re\nimport regex\nimport sys\nimport tempfile\nimport time\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, replace_entities, prepare_string_for_xml\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.ebooks.metadata import authors_to_string, check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Source\nfrom calibre.utils.cleantext import clean_ascii_chars\nfrom calibre.utils.localization import canonicalize_lang\n\nNAMESPACES = {\n 'openSearch': 'http://a9.com/-/spec/opensearchrss/1.0/',\n 'atom': 'http://www.w3.org/2005/Atom',\n 'dc': 'http://purl.org/dc/terms',\n 'gd': 'http://schemas.google.com/g/2005'\n}\n\n\ndef pretty_google_books_comments(raw):\n raw = replace_entities(raw)\n # Paragraphs in the comments are removed but whatever software googl uses\n # to do this does not insert a space so we often find the pattern\n # word.Capital in the comments which can be used to find paragraph markers.\n parts = []\n for x in re.split(r'([a-z)\"”])(\\.)([A-Z(\"“])', raw):\n if x == '.':\n parts.append('.
\\n\\n')\n else:\n parts.append(prepare_string_for_xml(x))\n raw = '
' + ''.join(parts) + '
'\n return raw\n\n\ndef get_details(browser, url, timeout): # {{{\n try:\n raw = browser.open_novisit(url, timeout=timeout).read()\n except Exception as e:\n gc = getattr(e, 'getcode', lambda: -1)\n if gc() != 403:\n raise\n # Google is throttling us, wait a little\n time.sleep(2)\n raw = browser.open_novisit(url, timeout=timeout).read()\n\n return raw\n\n\n# }}}\n\nxpath_cache = {}\n\n\ndef XPath(x):\n ans = xpath_cache.get(x)\n if ans is None:\n from lxml import etree\n ans = xpath_cache[x] = etree.XPath(x, namespaces=NAMESPACES)\n return ans\n\n\ndef to_metadata(browser, log, entry_, timeout, running_a_test=False): # {{{\n from lxml import etree\n\n # total_results = XPath('//openSearch:totalResults')\n # start_index = XPath('//openSearch:startIndex')\n # items_per_page = XPath('//openSearch:itemsPerPage')\n entry = XPath('//atom:entry')\n entry_id = XPath('descendant::atom:id')\n url = XPath('descendant::atom:link[@rel=\"self\"]/@href')\n creator = XPath('descendant::dc:creator')\n identifier = XPath('descendant::dc:identifier')\n title = XPath('descendant::dc:title')\n date = XPath('descendant::dc:date')\n publisher = XPath('descendant::dc:publisher')\n subject = XPath('descendant::dc:subject')\n description = XPath('descendant::dc:description')\n language = XPath('descendant::dc:language')\n\n # print(etree.tostring(entry_, pretty_print=True))\n\n def get_text(extra, x):\n try:\n ans = x(extra)\n if ans:\n ans = ans[0].text\n if ans and ans.strip():\n return ans.strip()\n except:\n log.exception('Programming error:')\n return None\n\n def get_extra_details():\n raw = get_details(browser, details_url, timeout)\n if running_a_test:\n with open(os.path.join(tempfile.gettempdir(), 'Google-' + details_url.split('/')[-1] + '.xml'), 'wb') as f:\n f.write(raw)\n print('Book details saved to:', f.name, file=sys.stderr)\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return entry(feed)[0]\n\n if isinstance(entry_, str):\n google_id = entry_\n details_url = 'https://www.google.com/books/feeds/volumes/' + google_id\n extra = get_extra_details()\n title_ = ': '.join([x.text for x in title(extra)]).strip()\n authors = [x.text.strip() for x in creator(extra) if x.text]\n else:\n id_url = entry_id(entry_)[0].text\n google_id = id_url.split('/')[-1]\n details_url = url(entry_)[0]\n title_ = ': '.join([x.text for x in title(entry_)]).strip()\n authors = [x.text.strip() for x in creator(entry_) if x.text]\n if not id_url or not title:\n # Silently discard this entry\n return None\n extra = None\n\n if not authors:\n authors = [_('Unknown')]\n if not title:\n return None\n if extra is None:\n extra = get_extra_details()\n mi = Metadata(title_, authors)\n mi.identifiers = {'google': google_id}\n mi.comments = get_text(extra, description)\n lang = canonicalize_lang(get_text(extra, language))\n if lang:\n mi.language = lang\n mi.publisher = get_text(extra, publisher)\n\n # ISBN\n isbns = []\n for x in identifier(extra):\n t = type('')(x.text).strip()\n if t[:5].upper() in ('ISBN:', 'LCCN:', 'OCLC:'):\n if t[:5].upper() == 'ISBN:':\n t = check_isbn(t[5:])\n if t:\n isbns.append(t)\n if isbns:\n mi.isbn = sorted(isbns, key=len)[-1]\n mi.all_isbns = isbns\n\n # Tags\n try:\n btags = [x.text for x in subject(extra) if x.text]\n tags = []\n for t in btags:\n atags = [y.strip() for y in t.split('/')]\n for tag in atags:\n if tag not in tags:\n tags.append(tag)\n except:\n log.exception('Failed to parse tags:')\n tags = []\n if tags:\n mi.tags = [x.replace(',', ';') for x in tags]\n\n # pubdate\n pubdate = get_text(extra, date)\n if pubdate:\n from calibre.utils.date import parse_date, utcnow\n try:\n default = utcnow().replace(day=15)\n mi.pubdate = parse_date(pubdate, assume_utc=True, default=default)\n except:\n log.error('Failed to parse pubdate %r' % pubdate)\n\n # Cover\n mi.has_google_cover = None\n for x in extra.xpath(\n '//*[@href and @rel=\"http://schemas.google.com/books/2008/thumbnail\"]'\n ):\n mi.has_google_cover = x.get('href')\n break\n\n return mi\n\n\n# }}}\n\n\nclass GoogleBooks(Source):\n\n name = 'Google'\n version = (1, 1, 0)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads metadata and covers from Google Books')\n\n capabilities = frozenset({'identify'})\n touched_fields = frozenset({\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:google', 'languages'\n })\n supports_gzip_transfer_encoding = True\n cached_cover_url_is_reliable = False\n\n GOOGLE_COVER = 'https://books.google.com/books?id=%s&printsec=frontcover&img=1'\n\n DUMMY_IMAGE_MD5 = frozenset(\n ('0de4383ebad0adad5eeb8975cd796657', 'a64fa89d7ebc97075c1d363fc5fea71f')\n )\n\n def get_book_url(self, identifiers): # {{{\n goog = identifiers.get('google', None)\n if goog is not None:\n return ('google', goog, 'https://books.google.com/books?id=%s' % goog)\n # }}}\n\n def id_from_url(self, url): # {{{\n from polyglot.urllib import parse_qs, urlparse\n purl = urlparse(url)\n if purl.netloc == 'books.google.com':\n q = parse_qs(purl.query)\n gid = q.get('id')\n if gid:\n return 'google', gid[0]\n # }}}\n\n def create_query(self, title=None, authors=None, identifiers={}, capitalize_isbn=False): # {{{\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n BASE_URL = 'https://books.google.com/books/feeds/volumes?'\n isbn = check_isbn(identifiers.get('isbn', None))\n q = ''\n if isbn is not None:\n q += ('ISBN:' if capitalize_isbn else 'isbn:') + isbn\n elif title or authors:\n\n def build_term(prefix, parts):\n return ' '.join('in' + prefix + ':' + x for x in parts)\n\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += build_term('title', title_tokens)\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += ('+' if q else '') + build_term('author', author_tokens)\n\n if not q:\n return None\n if not isinstance(q, bytes):\n q = q.encode('utf-8')\n return BASE_URL + urlencode({\n 'q': q,\n 'max-results': 20,\n 'start-index': 1,\n 'min-viewability': 'none',\n })\n\n # }}}\n\n def download_cover( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30,\n get_best_cover=False\n ):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(\n log,\n rq,\n abort,\n title=title,\n authors=authors,\n identifiers=identifiers\n )\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(\n key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers\n )\n )\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n br = self.browser\n for candidate in (0, 1):\n if abort.is_set():\n return\n url = cached_url + '&zoom={}'.format(candidate)\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(url, timeout=timeout).read()\n if cdata:\n if hashlib.md5(cdata).hexdigest() in self.DUMMY_IMAGE_MD5:\n log.warning('Google returned a dummy image, ignoring')\n else:\n result_queue.put((self, cdata))\n break\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n goog = identifiers.get('google', None)\n if goog is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n goog = self.cached_isbn_to_identifier(isbn)\n if goog is not None:\n url = self.cached_identifier_to_cover_url(goog)\n\n return url\n\n # }}}\n\n def postprocess_downloaded_google_metadata(self, ans, relevance=0): # {{{\n if not isinstance(ans, Metadata):\n return ans\n ans.source_relevance = relevance\n goog = ans.identifiers['google']\n for isbn in getattr(ans, 'all_isbns', []):\n self.cache_isbn_to_identifier(isbn, goog)\n if getattr(ans, 'has_google_cover', False):\n self.cache_identifier_to_cover_url(goog, self.GOOGLE_COVER % goog)\n if ans.comments:\n ans.comments = pretty_google_books_comments(ans.comments)\n self.clean_downloaded_metadata(ans)\n return ans\n # }}}\n\n def get_all_details( # {{{\n self,\n br,\n log,\n entries,\n abort,\n result_queue,\n timeout\n ):\n from lxml import etree\n for relevance, i in enumerate(entries):\n try:\n ans = self.postprocess_downloaded_google_metadata(to_metadata(br, log, i, timeout, self.running_a_test), relevance)\n if isinstance(ans, Metadata):\n result_queue.put(ans)\n except Exception:\n log.exception(\n 'Failed to get metadata for identify entry:', etree.tostring(i)\n )\n if abort.is_set():\n break\n\n # }}}\n\n def identify_via_web_search( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n isbn = check_isbn(identifiers.get('isbn', None))\n q = []\n strip_punc_pat = regex.compile(r'[\\p{C}|\\p{M}|\\p{P}|\\p{S}|\\p{Z}]+', regex.UNICODE)\n google_ids = []\n check_tokens = set()\n has_google_id = 'google' in identifiers\n\n def to_check_tokens(*tokens):\n for t in tokens:\n if len(t) < 3:\n continue\n t = t.lower()\n if t in ('and', 'not', 'the'):\n continue\n yield strip_punc_pat.sub('', t)\n\n if has_google_id:\n google_ids.append(identifiers['google'])\n elif isbn is not None:\n q.append(isbn)\n elif title or authors:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += title_tokens\n check_tokens |= set(to_check_tokens(*title_tokens))\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += author_tokens\n check_tokens |= set(to_check_tokens(*author_tokens))\n if not q and not google_ids:\n return None\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n br = se.google_specialize_browser(se.browser())\n if not has_google_id:\n url = se.google_format_query(q, tbm='bks')\n log('Making query:', url)\n r = []\n root = se.query(br, url, 'google', timeout=timeout, save_raw=r.append)\n pat = re.compile(r'id=([^&]+)')\n for q in se.google_parse_results(root, r[0], log=log, ignore_uncached=False):\n m = pat.search(q.url)\n if m is None or not q.url.startswith('https://books.google'):\n continue\n google_ids.append(m.group(1))\n\n if not google_ids and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n found = False\n seen = set()\n for relevance, gid in enumerate(google_ids):\n if gid in seen:\n continue\n seen.add(gid)\n try:\n ans = to_metadata(br, log, gid, timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n if isbn:\n if isbn not in ans.all_isbns:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the ISBN:', isbn,\n 'not in', ' '.join(ans.all_isbns))\n continue\n elif check_tokens:\n candidate = set(to_check_tokens(*self.get_title_tokens(ans.title)))\n candidate |= set(to_check_tokens(*self.get_author_tokens(ans.authors)))\n if candidate.intersection(check_tokens) != check_tokens:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the query')\n continue\n ans = self.postprocess_downloaded_google_metadata(ans, relevance)\n result_queue.put(ans)\n found = True\n except:\n log.exception('Failed to get metadata for google books id:', gid)\n if abort.is_set():\n break\n if not found and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n # }}}\n\n def identify( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from lxml import etree\n entry = XPath('//atom:entry')\n identifiers = identifiers.copy()\n br = self.browser\n if 'google' in identifiers:\n try:\n ans = to_metadata(br, log, identifiers['google'], timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n self.postprocess_downloaded_google_metadata(ans)\n result_queue.put(ans)\n return\n except Exception:\n log.exception('Failed to get metadata for Google identifier:', identifiers['google'])\n del identifiers['google']\n\n query = self.create_query(\n title=title, authors=authors, identifiers=identifiers\n )\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n\n def make_query(query):\n log('Making query:', query)\n try:\n raw = br.open_novisit(query, timeout=timeout).read()\n except Exception as e:\n log.exception('Failed to make identify query: %r' % query)\n return False, as_unicode(e)\n\n try:\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return True, entry(feed)\n except Exception as e:\n log.exception('Failed to parse identify results')\n return False, as_unicode(e)\n ok, entries = make_query(query)\n if not ok:\n return entries\n if not entries and not abort.is_set():\n log('No results found, doing a web search instead')\n return self.identify_via_web_search(log, result_queue, abort, title, authors, identifiers, timeout)\n\n # There is no point running these queries in threads as google\n # throttles requests returning 403 Forbidden errors\n self.get_all_details(br, log, entries, abort, result_queue, timeout)\n\n # }}}\n\n\nif __name__ == '__main__': # tests {{{\n # To run these test use:\n # calibre-debug src/calibre/ebooks/metadata/sources/google.py\n from calibre.ebooks.metadata.sources.test import (\n authors_test, test_identify_plugin, title_test\n )\n tests = [\n ({\n 'identifiers': {'google': 's7NIrgEACAAJ'},\n }, [title_test('Ride Every Stride', exact=False)]),\n\n ({\n 'identifiers': {'isbn': '0743273567'},\n 'title': 'Great Gatsby',\n 'authors': ['Fitzgerald']\n }, [\n title_test('The great gatsby', exact=True),\n authors_test(['F. Scott Fitzgerald'])\n ]),\n\n ({\n 'title': 'Flatland',\n 'authors': ['Abbott']\n }, [title_test('Flatland', exact=False)]),\n\n ({\n 'title': 'The Blood Red Indian Summer: A Berger and Mitry Mystery',\n 'authors': ['David Handler'],\n }, [title_test('The Blood Red Indian Summer: A Berger and Mitry Mystery')\n ]),\n\n ({\n # requires using web search to find the book\n 'title': 'Dragon Done It',\n 'authors': ['Eric Flint'],\n }, [\n title_test('The dragon done it', exact=True),\n authors_test(['Eric Flint', 'Mike Resnick'])\n ]),\n\n ]\n test_identify_plugin(GoogleBooks.name, tests[:])\n\n# }}}\n",
- "google_images": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nfrom collections import OrderedDict\n\nfrom calibre import random_user_agent\nfrom calibre.ebooks.metadata.sources.base import Source, Option\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef imgurl_from_id(raw, tbnid):\n from json import JSONDecoder\n q = '\"{}\",['.format(tbnid)\n start_pos = raw.index(q)\n if start_pos < 100:\n return\n jd = JSONDecoder()\n data = jd.raw_decode('[' + raw[start_pos:])[0]\n # from pprint import pprint\n # pprint(data)\n url_num = 0\n for x in data:\n if isinstance(x, list) and len(x) == 3:\n q = x[0]\n if hasattr(q, 'lower') and q.lower().startswith('http'):\n url_num += 1\n if url_num > 1:\n return q\n\n\nclass GoogleImages(Source):\n\n name = 'Google Images'\n version = (1, 0, 3)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from a Google Image search. Useful to find larger/alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n supports_gzip_transfer_encoding = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the Google search result')),\n Option('size', 'choices', 'svga', _('Cover size'),\n _('Search for covers larger than the specified size'),\n choices=OrderedDict((\n ('any', _('Any size'),),\n ('l', _('Large'),),\n ('qsvga', _('Larger than %s')%'400x300',),\n ('vga', _('Larger than %s')%'640x480',),\n ('svga', _('Larger than %s')%'600x800',),\n ('xga', _('Larger than %s')%'1024x768',),\n ('2mp', _('Larger than %s')%'2 MP',),\n ('4mp', _('Larger than %s')%'4 MP',),\n ))),\n )\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n timeout = max(60, timeout) # Needs at least a minute\n title = ' '.join(self.get_title_tokens(title))\n author = ' '.join(self.get_author_tokens(authors))\n urls = self.get_image_urls(title, author, log, abort, timeout)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n @property\n def user_agent(self):\n return random_user_agent(allow_ie=False)\n\n def get_image_urls(self, title, author, log, abort, timeout):\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n from collections import OrderedDict\n ans = OrderedDict()\n br = self.browser\n q = urlencode({'as_q': ('%s %s'%(title, author)).encode('utf-8')})\n if isinstance(q, bytes):\n q = q.decode('utf-8')\n sz = self.prefs['size']\n if sz == 'any':\n sz = ''\n elif sz == 'l':\n sz = 'isz:l,'\n else:\n sz = 'isz:lt,islt:%s,' % sz\n # See https://www.google.com/advanced_image_search to understand this\n # URL scheme\n url = 'https://www.google.com/search?as_st=y&tbm=isch&{}&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs={}iar:t,ift:jpg'.format(q, sz)\n log('Search URL: ' + url)\n br.set_simple_cookie('CONSENT', 'YES+', '.google.com', path='/')\n raw = clean_ascii_chars(br.open(url).read().decode('utf-8'))\n root = parse_html(raw)\n results = root.xpath('//div/@data-tbnid') # could also use data-id\n # from calibre.utils.ipython import ipython\n # ipython({'root': root, 'raw': raw, 'url': url, 'results': results})\n for tbnid in results:\n try:\n imgurl = imgurl_from_id(raw, tbnid)\n except Exception:\n continue\n if imgurl:\n ans[imgurl] = True\n return list(ans)\n\n\ndef test():\n try:\n from queue import Queue\n except ImportError:\n from Queue import Queue\n from threading import Event\n from calibre.utils.logging import default_log\n p = GoogleImages(None)\n p.log = default_log\n rq = Queue()\n p.download_cover(default_log, rq, Event(), title='The Heroes',\n authors=('Joe Abercrombie',))\n print('Downloaded', rq.qsize(), 'covers')\n\n\nif __name__ == '__main__':\n test()\n",
+ "amazon": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal \nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport re\nimport socket\nimport string\nimport time\nfrom functools import partial\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom threading import Thread\n\ntry:\n from urllib.parse import urlparse\nexcept ImportError:\n from urlparse import urlparse\n\nfrom mechanize import HTTPError\n\nfrom calibre import as_unicode, browser, random_user_agent, xml_replace_entities\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Option, Source, fixauthors, fixcase\nfrom calibre.ebooks.oeb.base import urlquote\nfrom calibre.utils.icu import lower as icu_lower\nfrom calibre.utils.localization import canonicalize_lang\nfrom calibre.utils.random_ua import accept_header_for_ua\n\n\ndef sort_matches_preferring_kindle_editions(matches):\n upos_map = {url:i for i, url in enumerate(matches)}\n\n def skey(url):\n opos = upos_map[url]\n parts = url.split('/')\n try:\n idx = parts.index('dp')\n except Exception:\n idx = -1\n if idx < 0 or idx + 1 >= len(parts) or not parts[idx+1].startswith('B'):\n return 1, opos\n return 0, opos\n matches.sort(key=skey)\n return matches\n\n\ndef iri_quote_plus(url):\n ans = urlquote(url)\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans.replace('%20', '+')\n\n\ndef user_agent_is_ok(ua):\n return 'Mobile/' not in ua and 'Mobile ' not in ua\n\n\nclass CaptchaError(Exception):\n pass\n\n\nclass SearchFailed(ValueError):\n pass\n\n\nclass UrlNotFound(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'The URL {} was not found (HTTP 404)'.format(url))\n\n\nclass UrlTimedOut(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'Timed out fetching {} try again later'.format(url))\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef parse_details_page(url, log, timeout, browser, domain):\n from lxml.html import tostring\n\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from calibre.ebooks.metadata.sources.update import search_engines_module\n get_data_for_cached_url = search_engines_module().get_data_for_cached_url\n except Exception:\n def get_data_for_cached_url(*a):\n return None\n raw = get_data_for_cached_url(url)\n if raw:\n log('Using cached details for url:', url)\n else:\n log('Downloading details from:', url)\n try:\n raw = browser.open_novisit(url, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('URL not found: %r' % url)\n raise UrlNotFound(url)\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = 'Details page timed out. Try again later.'\n log.error(msg)\n raise UrlTimedOut(url)\n else:\n msg = 'Failed to make details query: %r' % url\n log.exception(msg)\n raise ValueError('Could not make details query for {}'.format(url))\n\n oraw = raw\n if 'amazon.com.br' in url:\n # amazon.com.br serves utf-8 but has an incorrect latin1 tag\n raw = raw.decode('utf-8')\n raw = xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True)[0]\n if '404 - ' in raw:\n raise ValueError('Got a 404 page for: %r' % url)\n if '>Could not find the requested document in the cache.<' in raw:\n raise ValueError('No cached entry for %s found' % url)\n\n try:\n root = parse_html(clean_ascii_chars(raw))\n except Exception:\n msg = 'Failed to parse amazon details page: %r' % url\n log.exception(msg)\n raise ValueError(msg)\n if domain == 'jp':\n for a in root.xpath('//a[@href]'):\n if ('black-curtain-redirect.html' in a.get('href')) or ('/black-curtain/save-eligibility/black-curtain' in a.get('href')):\n url = a.get('href')\n if url:\n if url.startswith('/'):\n url = 'https://amazon.co.jp' + a.get('href')\n log('Black curtain redirect found, following')\n return parse_details_page(url, log, timeout, browser, domain)\n\n errmsg = root.xpath('//*[@id=\"errorMessage\"]')\n if errmsg:\n msg = 'Failed to parse amazon details page: %r' % url\n msg += tostring(errmsg, method='text', encoding='unicode').strip()\n log.error(msg)\n raise ValueError(msg)\n\n from css_selectors import Select\n selector = Select(root)\n return oraw, root, selector\n\n\ndef parse_asin(root, log, url):\n try:\n link = root.xpath('//link[@rel=\"canonical\" and @href]')\n for l in link:\n return l.get('href').rpartition('/')[-1]\n except Exception:\n log.exception('Error parsing ASIN for url: %r' % url)\n\n\nclass Worker(Thread): # Get details {{{\n\n '''\n Get book details from amazons book page in a separate thread\n '''\n\n def __init__(self, url, result_queue, browser, log, relevance, domain,\n plugin, timeout=20, testing=False, preparsed_root=None,\n cover_url_processor=None, filter_result=None):\n Thread.__init__(self)\n self.cover_url_processor = cover_url_processor\n self.preparsed_root = preparsed_root\n self.daemon = True\n self.testing = testing\n self.url, self.result_queue = url, result_queue\n self.log, self.timeout = log, timeout\n self.filter_result = filter_result or (lambda x, log: True)\n self.relevance, self.plugin = relevance, plugin\n self.browser = browser\n self.cover_url = self.amazon_id = self.isbn = None\n self.domain = domain\n from lxml.html import tostring\n self.tostring = tostring\n\n months = { # {{{\n 'de': {\n 1: ['jän', 'januar'],\n 2: ['februar'],\n 3: ['märz'],\n 5: ['mai'],\n 6: ['juni'],\n 7: ['juli'],\n 10: ['okt', 'oktober'],\n 12: ['dez', 'dezember']\n },\n 'it': {\n 1: ['gennaio', 'enn'],\n 2: ['febbraio', 'febbr'],\n 3: ['marzo'],\n 4: ['aprile'],\n 5: ['maggio', 'magg'],\n 6: ['giugno'],\n 7: ['luglio'],\n 8: ['agosto', 'ag'],\n 9: ['settembre', 'sett'],\n 10: ['ottobre', 'ott'],\n 11: ['novembre'],\n 12: ['dicembre', 'dic'],\n },\n 'fr': {\n 1: ['janv'],\n 2: ['févr'],\n 3: ['mars'],\n 4: ['avril'],\n 5: ['mai'],\n 6: ['juin'],\n 7: ['juil'],\n 8: ['août'],\n 9: ['sept'],\n 10: ['oct', 'octobre'],\n 11: ['nov', 'novembre'],\n 12: ['déc', 'décembre'],\n },\n 'br': {\n 1: ['janeiro'],\n 2: ['fevereiro'],\n 3: ['março'],\n 4: ['abril'],\n 5: ['maio'],\n 6: ['junho'],\n 7: ['julho'],\n 8: ['agosto'],\n 9: ['setembro'],\n 10: ['outubro'],\n 11: ['novembro'],\n 12: ['dezembro'],\n },\n 'es': {\n 1: ['enero'],\n 2: ['febrero'],\n 3: ['marzo'],\n 4: ['abril'],\n 5: ['mayo'],\n 6: ['junio'],\n 7: ['julio'],\n 8: ['agosto'],\n 9: ['septiembre', 'setiembre'],\n 10: ['octubre'],\n 11: ['noviembre'],\n 12: ['diciembre'],\n },\n 'se': {\n 1: ['januari'],\n 2: ['februari'],\n 3: ['mars'],\n 4: ['april'],\n 5: ['maj'],\n 6: ['juni'],\n 7: ['juli'],\n 8: ['augusti'],\n 9: ['september'],\n 10: ['oktober'],\n 11: ['november'],\n 12: ['december'],\n },\n 'jp': {\n 1: ['1月'],\n 2: ['2月'],\n 3: ['3月'],\n 4: ['4月'],\n 5: ['5月'],\n 6: ['6月'],\n 7: ['7月'],\n 8: ['8月'],\n 9: ['9月'],\n 10: ['10月'],\n 11: ['11月'],\n 12: ['12月'],\n },\n 'nl': {\n 1: ['januari'], 2: ['februari'], 3: ['maart'], 5: ['mei'], 6: ['juni'], 7: ['juli'], 8: ['augustus'], 10: ['oktober'],\n }\n\n } # }}}\n\n self.english_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n self.months = months.get(self.domain, {})\n\n self.pd_xpath = '''\n //h2[text()=\"Product Details\" or \\\n text()=\"Produktinformation\" or \\\n text()=\"Dettagli prodotto\" or \\\n text()=\"Product details\" or \\\n text()=\"Détails sur le produit\" or \\\n text()=\"Detalles del producto\" or \\\n text()=\"Detalhes do produto\" or \\\n text()=\"Productgegevens\" or \\\n text()=\"基本信息\" or \\\n starts-with(text(), \"登録情報\")]/../div[@class=\"content\"]\n '''\n # Editor: is for Spanish\n self.publisher_xpath = '''\n descendant::*[starts-with(text(), \"Publisher:\") or \\\n starts-with(text(), \"Verlag:\") or \\\n starts-with(text(), \"Editore:\") or \\\n starts-with(text(), \"Editeur\") or \\\n starts-with(text(), \"Editor:\") or \\\n starts-with(text(), \"Editora:\") or \\\n starts-with(text(), \"Uitgever:\") or \\\n starts-with(text(), \"Utgivare:\") or \\\n starts-with(text(), \"出版社:\")]\n '''\n self.pubdate_xpath = '''\n descendant::*[starts-with(text(), \"Publication Date:\") or \\\n starts-with(text(), \"Audible.com Release Date:\")]\n '''\n self.publisher_names = {'Publisher', 'Uitgever', 'Verlag', 'Utgivare', 'Herausgeber',\n 'Editore', 'Editeur', 'Éditeur', 'Editor', 'Editora', '出版社'}\n\n self.language_xpath = '''\n descendant::*[\n starts-with(text(), \"Language:\") \\\n or text() = \"Language\" \\\n or text() = \"Sprache:\" \\\n or text() = \"Lingua:\" \\\n or text() = \"Idioma:\" \\\n or starts-with(text(), \"Langue\") \\\n or starts-with(text(), \"言語\") \\\n or starts-with(text(), \"Språk\") \\\n or starts-with(text(), \"语种\")\n ]\n '''\n self.language_names = {'Language', 'Sprache', 'Språk',\n 'Lingua', 'Idioma', 'Langue', '言語', 'Taal', '语种'}\n\n self.tags_xpath = '''\n descendant::h2[\n text() = \"Look for Similar Items by Category\" or\n text() = \"Ähnliche Artikel finden\" or\n text() = \"Buscar productos similares por categoría\" or\n text() = \"Ricerca articoli simili per categoria\" or\n text() = \"Rechercher des articles similaires par rubrique\" or\n text() = \"Procure por items similares por categoria\" or\n text() = \"関連商品を探す\"\n ]/../descendant::ul/li\n '''\n\n self.ratings_pat = re.compile(\n r'([0-9.,]+) ?(out of|von|van|su|étoiles sur|つ星のうち|de un máximo de|de|av) '\n r'([\\d\\.]+)( (stars|Sternen|stelle|estrellas|estrelas|sterren|stjärnor)){0,1}'\n )\n self.ratings_pat_cn = re.compile('([0-9.]+) 颗星,最多 5 颗星')\n self.ratings_pat_jp = re.compile(r'\\d+つ星のうち([\\d\\.]+)')\n\n lm = {\n 'eng': ('English', 'Englisch', 'Engels', 'Engelska'),\n 'fra': ('French', 'Français'),\n 'ita': ('Italian', 'Italiano'),\n 'deu': ('German', 'Deutsch'),\n 'spa': ('Spanish', 'Espa\\xf1ol', 'Espaniol'),\n 'jpn': ('Japanese', '日本語'),\n 'por': ('Portuguese', 'Português'),\n 'nld': ('Dutch', 'Nederlands',),\n 'chs': ('Chinese', '中文', '简体中文'),\n 'swe': ('Swedish', 'Svenska'),\n }\n self.lang_map = {}\n for code, names in lm.items():\n for name in names:\n self.lang_map[name] = code\n\n self.series_pat = re.compile(\n r'''\n \\|\\s* # Prefix\n (Series)\\s*:\\s* # Series declaration\n (?P.+?)\\s+ # The series name\n \\((Book)\\s* # Book declaration\n (?P[0-9.]+) # Series index\n \\s*\\)\n ''', re.X)\n\n def delocalize_datestr(self, raw):\n if self.domain == 'cn':\n return raw.replace('年', '-').replace('月', '-').replace('日', '')\n if not self.months:\n return raw\n ans = raw.lower()\n for i, vals in self.months.items():\n for x in vals:\n ans = ans.replace(x, self.english_months[i])\n ans = ans.replace(' de ', ' ')\n return ans\n\n def run(self):\n try:\n self.get_details()\n except:\n self.log.exception('get_details failed for url: %r' % self.url)\n\n def get_details(self):\n if self.preparsed_root is None:\n raw, root, selector = parse_details_page(\n self.url, self.log, self.timeout, self.browser, self.domain)\n else:\n raw, root, selector = self.preparsed_root\n\n from css_selectors import Select\n self.selector = Select(root)\n self.parse_details(raw, root)\n\n def parse_details(self, raw, root):\n asin = parse_asin(root, self.log, self.url)\n if not asin and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError(\n 'Amazon returned a CAPTCHA page, probably because you downloaded too many books. Wait for some time and try again.')\n if self.testing:\n import tempfile\n import uuid\n with tempfile.NamedTemporaryFile(prefix=(asin or type('')(uuid.uuid4())) + '_',\n suffix='.html', delete=False) as f:\n f.write(raw)\n print('Downloaded HTML for', asin, 'saved in', f.name)\n\n try:\n title = self.parse_title(root)\n except:\n self.log.exception('Error parsing title for url: %r' % self.url)\n title = None\n\n try:\n authors = self.parse_authors(root)\n except:\n self.log.exception('Error parsing authors for url: %r' % self.url)\n authors = []\n\n if not title or not authors or not asin:\n self.log.error(\n 'Could not find title/authors/asin for %r' % self.url)\n self.log.error('ASIN: %r Title: %r Authors: %r' % (asin, title,\n authors))\n return\n\n mi = Metadata(title, authors)\n idtype = 'amazon' if self.domain == 'com' else 'amazon_' + self.domain\n mi.set_identifier(idtype, asin)\n self.amazon_id = asin\n\n try:\n mi.rating = self.parse_rating(root)\n except:\n self.log.exception('Error parsing ratings for url: %r' % self.url)\n\n try:\n mi.comments = self.parse_comments(root, raw)\n except:\n self.log.exception('Error parsing comments for url: %r' % self.url)\n\n try:\n series, series_index = self.parse_series(root)\n if series:\n mi.series, mi.series_index = series, series_index\n elif self.testing:\n mi.series, mi.series_index = 'Dummy series for testing', 1\n except:\n self.log.exception('Error parsing series for url: %r' % self.url)\n\n try:\n mi.tags = self.parse_tags(root)\n except:\n self.log.exception('Error parsing tags for url: %r' % self.url)\n\n try:\n self.cover_url = self.parse_cover(root, raw)\n except:\n self.log.exception('Error parsing cover for url: %r' % self.url)\n if self.cover_url_processor is not None and self.cover_url and self.cover_url.startswith('/'):\n self.cover_url = self.cover_url_processor(self.cover_url)\n mi.has_cover = bool(self.cover_url)\n\n detail_bullets = root.xpath('//*[@data-feature-name=\"detailBullets\"]')\n non_hero = tuple(self.selector(\n 'div#bookDetails_container_div div#nonHeroSection')) or tuple(self.selector(\n '#productDetails_techSpec_sections'))\n feature_and_detail_bullets = root.xpath('//*[@data-feature-name=\"featureBulletsAndDetailBullets\"]')\n if detail_bullets:\n self.parse_detail_bullets(root, mi, detail_bullets[0])\n elif non_hero:\n try:\n self.parse_new_details(root, mi, non_hero[0])\n except:\n self.log.exception(\n 'Failed to parse new-style book details section')\n elif feature_and_detail_bullets:\n self.parse_detail_bullets(root, mi, feature_and_detail_bullets[0], ul_selector='ul')\n\n else:\n pd = root.xpath(self.pd_xpath)\n if pd:\n pd = pd[0]\n\n try:\n isbn = self.parse_isbn(pd)\n if isbn:\n self.isbn = mi.isbn = isbn\n except:\n self.log.exception(\n 'Error parsing ISBN for url: %r' % self.url)\n\n try:\n mi.publisher = self.parse_publisher(pd)\n except:\n self.log.exception(\n 'Error parsing publisher for url: %r' % self.url)\n\n try:\n mi.pubdate = self.parse_pubdate(pd)\n except:\n self.log.exception(\n 'Error parsing publish date for url: %r' % self.url)\n\n try:\n lang = self.parse_language(pd)\n if lang:\n mi.language = lang\n except:\n self.log.exception(\n 'Error parsing language for url: %r' % self.url)\n\n else:\n self.log.warning(\n 'Failed to find product description for url: %r' % self.url)\n\n mi.source_relevance = self.relevance\n\n if self.amazon_id:\n if self.isbn:\n self.plugin.cache_isbn_to_identifier(self.isbn, self.amazon_id)\n if self.cover_url:\n self.plugin.cache_identifier_to_cover_url(self.amazon_id,\n self.cover_url)\n\n self.plugin.clean_downloaded_metadata(mi)\n\n if self.filter_result(mi, self.log):\n self.result_queue.put(mi)\n\n def totext(self, elem, only_printable=False):\n res = self.tostring(elem, encoding='unicode', method='text')\n if only_printable:\n try:\n filtered_characters = list(s for s in res if s.isprintable())\n except AttributeError:\n filtered_characters = list(s for s in res if s in string.printable)\n res = ''.join(filtered_characters).strip()\n return res\n\n def parse_title(self, root):\n\n def sanitize_title(title):\n ans = title.strip()\n if not ans.startswith('['):\n ans = re.sub(r'[(\\[].*[)\\]]', '', title).strip()\n return ans\n\n h1 = root.xpath('//h1[@id=\"title\"]')\n if h1:\n h1 = h1[0]\n for child in h1.xpath('./*[contains(@class, \"a-color-secondary\")]'):\n h1.remove(child)\n return sanitize_title(self.totext(h1))\n tdiv = root.xpath('//h1[contains(@class, \"parseasinTitle\")]')\n if not tdiv:\n span = root.xpath('//*[@id=\"ebooksTitle\"]')\n if span:\n return sanitize_title(self.totext(span[0]))\n h1 = root.xpath('//h1[@data-feature-name=\"title\"]')\n if h1:\n return sanitize_title(self.totext(h1[0]))\n raise ValueError('No title block found')\n tdiv = tdiv[0]\n actual_title = tdiv.xpath('descendant::*[@id=\"btAsinTitle\"]')\n if actual_title:\n title = self.tostring(actual_title[0], encoding='unicode',\n method='text').strip()\n else:\n title = self.tostring(tdiv, encoding='unicode',\n method='text').strip()\n return sanitize_title(title)\n\n def parse_authors(self, root):\n for sel in (\n '#byline .author .contributorNameID',\n '#byline .author a.a-link-normal',\n '#bylineInfo .author .contributorNameID',\n '#bylineInfo .author a.a-link-normal',\n '#bylineInfo #bylineContributor',\n '#bylineInfo #contributorLink',\n ):\n matches = tuple(self.selector(sel))\n if matches:\n authors = [self.totext(x) for x in matches]\n return [a for a in authors if a]\n\n x = '//h1[contains(@class, \"parseasinTitle\")]/following-sibling::span/*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]'\n aname = root.xpath(x)\n if not aname:\n aname = root.xpath('''\n //h1[contains(@class, \"parseasinTitle\")]/following-sibling::*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]\n ''')\n for x in aname:\n x.tail = ''\n authors = [self.tostring(x, encoding='unicode', method='text').strip() for x\n in aname]\n authors = [a for a in authors if a]\n return authors\n\n def parse_rating(self, root):\n for x in root.xpath('//div[@id=\"cpsims-feature\" or @id=\"purchase-sims-feature\" or @id=\"rhf\"]'):\n # Remove the similar books section as it can cause spurious\n # ratings matches\n x.getparent().remove(x)\n\n rating_paths = (\n '//div[@data-feature-name=\"averageCustomerReviews\" or @id=\"averageCustomerReviews\"]',\n '//div[@class=\"jumpBar\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//div[@class=\"buying\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//span[@class=\"crAvgStars\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]'\n )\n ratings = None\n for p in rating_paths:\n ratings = root.xpath(p)\n if ratings:\n break\n\n def parse_ratings_text(text):\n try:\n m = self.ratings_pat.match(text)\n return float(m.group(1).replace(',', '.')) / float(m.group(3)) * 5\n except Exception:\n pass\n\n if ratings:\n ratings = ratings[0]\n for elem in ratings.xpath('descendant::*[@title]'):\n t = elem.get('title').strip()\n if self.domain == 'cn':\n m = self.ratings_pat_cn.match(t)\n if m is not None:\n return float(m.group(1))\n elif self.domain == 'jp':\n m = self.ratings_pat_jp.match(t)\n if m is not None:\n return float(m.group(1))\n else:\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n for elem in ratings.xpath('descendant::span[@class=\"a-icon-alt\"]'):\n t = self.tostring(\n elem, encoding='unicode', method='text', with_tail=False).strip()\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n else:\n # found in kindle book pages on amazon.com\n for x in root.xpath('//a[@id=\"acrCustomerReviewLink\"]'):\n spans = x.xpath('./span')\n if spans:\n txt = self.tostring(spans[0], method='text', encoding='unicode', with_tail=False).strip()\n try:\n return float(txt.replace(',', '.'))\n except Exception:\n pass\n\n def _render_comments(self, desc):\n from calibre.library.comments import sanitize_comments_html\n\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for c in desc.xpath('descendant::*[@class=\"seeAll\" or'\n ' @class=\"emptyClear\" or @id=\"collapsePS\" or'\n ' @id=\"expandPS\"]'):\n c.getparent().remove(c)\n for b in desc.xpath('descendant::b[@style]'):\n # Bing highlights search results\n s = b.get('style', '')\n if 'color' in s:\n b.tag = 'span'\n del b.attrib['style']\n\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n for a in desc.xpath('descendant::span[@class=\"a-text-italic\"]'):\n a.tag = 'i'\n for a in desc.xpath('descendant::span[@class=\"a-text-bold\"]'):\n a.tag = 'b'\n desc = self.tostring(desc, method='html', encoding='unicode').strip()\n desc = xml_replace_entities(desc, 'utf-8')\n\n # Encoding bug in Amazon data U+fffd (replacement char)\n # in some examples it is present in place of '\n desc = desc.replace('\\ufffd', \"'\")\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove the notice about text referring to out of print editions\n desc = re.sub(r'(?s)--This text ref.*?', '', desc)\n # Remove comments\n desc = re.sub(r'(?s)', '', desc)\n return sanitize_comments_html(desc)\n\n def parse_comments(self, root, raw):\n try:\n from urllib.parse import unquote\n except ImportError:\n from urllib import unquote\n ans = ''\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionOverviewContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionOverviewContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans = self._render_comments(ovr)\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionEditorialsContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionEditorialsContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans += self._render_comments(ovr)\n else:\n ns = tuple(self.selector('#bookDescription_feature_div noscript'))\n if ns:\n ns = ns[0]\n if len(ns) == 0 and ns.text:\n import html5lib\n\n # html5lib parsed noscript as CDATA\n ns = html5lib.parseFragment(\n '%s
' % (ns.text), treebuilder='lxml', namespaceHTMLElements=False)[0]\n else:\n ns.tag = 'div'\n ans = self._render_comments(ns)\n else:\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"content\"]')\n if desc:\n ans = self._render_comments(desc[0])\n else:\n ns = tuple(self.selector('#bookDescription_feature_div .a-expander-content'))\n if ns:\n ans = self._render_comments(ns[0])\n\n desc = root.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n else:\n # Idiot chickens from amazon strike again. This data is now stored\n # in a JS variable inside a script tag URL encoded.\n m = re.search(br'var\\s+iframeContent\\s*=\\s*\"([^\"]+)\"', raw)\n if m is not None:\n try:\n text = unquote(m.group(1)).decode('utf-8')\n nr = parse_html(text)\n desc = nr.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n except Exception as e:\n self.log.warn(\n 'Parsing of obfuscated product description failed with error: %s' % as_unicode(e))\n else:\n desc = root.xpath('//div[@id=\"productDescription_fullView\"]')\n if desc:\n ans += self._render_comments(desc[0])\n\n return ans\n\n def parse_series(self, root):\n ans = (None, None)\n\n # This is found on kindle pages for books on amazon.com\n series = root.xpath('//*[@id=\"rpi-attribute-book_details-series\"]')\n if series:\n spans = series[0].xpath('descendant::span')\n if spans:\n texts = [self.tostring(x, encoding='unicode', method='text', with_tail=False).strip() for x in spans]\n texts = list(filter(None, texts))\n if len(texts) == 2:\n idxinfo, series = texts\n m = re.search(r'[0-9.]+', idxinfo.strip())\n if m is not None:\n ans = series, float(m.group())\n return ans\n\n # This is found on the paperback/hardback pages for books on amazon.com\n series = root.xpath('//div[@data-feature-name=\"seriesTitle\"]')\n if series:\n series = series[0]\n spans = series.xpath('./span')\n if spans:\n raw = self.tostring(\n spans[0], encoding='unicode', method='text', with_tail=False).strip()\n m = re.search(r'\\s+([0-9.]+)$', raw.strip())\n if m is not None:\n series_index = float(m.group(1))\n s = series.xpath('./a[@id=\"series-page-link\"]')\n if s:\n series = self.tostring(\n s[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n else:\n series = root.xpath('//div[@id=\"seriesBulletWidget_feature_div\"]')\n if series:\n a = series[0].xpath('descendant::a')\n if a:\n raw = self.tostring(a[0], encoding='unicode', method='text', with_tail=False)\n if self.domain == 'jp':\n m = re.search(r'(?P[0-9.]+)\\s*(?:巻|冊)\\s*\\(全\\s*([0-9.]+)\\s*(?:巻|冊)\\):\\s*(?P.+)', raw.strip())\n else:\n m = re.search(r'(?:Book|Libro|Buch)\\s+(?P[0-9.]+)\\s+(?:of|de|von)\\s+([0-9.]+)\\s*:\\s*(?P.+)', raw.strip())\n if m is not None:\n ans = (m.group('series').strip(), float(m.group('index')))\n\n # This is found on Kindle edition pages on amazon.com\n if ans == (None, None):\n for span in root.xpath('//div[@id=\"aboutEbooksSection\"]//li/span'):\n text = (span.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = span.xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n # This is found on newer Kindle edition pages on amazon.com\n if ans == (None, None):\n for b in root.xpath('//div[@id=\"reviewFeatureGroup\"]/span/b'):\n text = (b.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = b.getparent().xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).partition('(')[0].strip()\n if series:\n ans = series, series_index\n\n if ans == (None, None):\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"buying\"]')\n if desc:\n raw = self.tostring(desc[0], method='text', encoding='unicode')\n raw = re.sub(r'\\s+', ' ', raw)\n match = self.series_pat.search(raw)\n if match is not None:\n s, i = match.group('series'), float(match.group('index'))\n if s:\n ans = (s, i)\n if ans[0]:\n ans = (re.sub(r'\\s+Series$', '', ans[0]).strip(), ans[1])\n ans = (re.sub(r'\\(.+?\\s+Series\\)$', '', ans[0]).strip(), ans[1])\n return ans\n\n def parse_tags(self, root):\n ans = []\n exclude_tokens = {'kindle', 'a-z'}\n exclude = {'special features', 'by authors',\n 'authors & illustrators', 'books', 'new; used & rental textbooks'}\n seen = set()\n for li in root.xpath(self.tags_xpath):\n for i, a in enumerate(li.iterdescendants('a')):\n if i > 0:\n # we ignore the first category since it is almost always\n # too broad\n raw = (a.text or '').strip().replace(',', ';')\n lraw = icu_lower(raw)\n tokens = frozenset(lraw.split())\n if raw and lraw not in exclude and not tokens.intersection(exclude_tokens) and lraw not in seen:\n ans.append(raw)\n seen.add(lraw)\n return ans\n\n def parse_cover(self, root, raw=b\"\"):\n # Look for the image URL in javascript, using the first image in the\n # image gallery as the cover\n import json\n imgpat = re.compile(r'\"hiRes\":\"(.+?)\",\"thumb\"')\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n return m.group(1)\n imgpat = re.compile(r\"\"\"'imageGalleryData'\\s*:\\s*(\\[\\s*{.+])\"\"\")\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n try:\n return json.loads(m.group(1))[0]['mainUrl']\n except Exception:\n continue\n\n def clean_img_src(src):\n parts = src.split('/')\n if len(parts) > 3:\n bn = parts[-1]\n sparts = bn.split('_')\n if len(sparts) > 2:\n bn = re.sub(r'\\.\\.jpg$', '.jpg', (sparts[0] + sparts[-1]))\n return ('/'.join(parts[:-1])) + '/' + bn\n\n imgpat2 = re.compile(r'var imageSrc = \"([^\"]+)\"')\n for script in root.xpath('//script'):\n m = imgpat2.search(script.text or '')\n if m is not None:\n src = m.group(1)\n url = clean_img_src(src)\n if url:\n return url\n\n imgs = root.xpath(\n '//img[(@id=\"prodImage\" or @id=\"original-main-image\" or @id=\"main-image\" or @id=\"main-image-nonjs\") and @src]')\n if not imgs:\n imgs = (\n root.xpath('//div[@class=\"main-image-inner-wrapper\"]/img[@src]') or\n root.xpath('//div[@id=\"main-image-container\" or @id=\"ebooks-main-image-container\"]//img[@src]') or\n root.xpath(\n '//div[@id=\"mainImageContainer\"]//img[@data-a-dynamic-image]')\n )\n for img in imgs:\n try:\n idata = json.loads(img.get('data-a-dynamic-image'))\n except Exception:\n imgs = ()\n else:\n mwidth = 0\n try:\n url = None\n for iurl, (width, height) in idata.items():\n if width > mwidth:\n mwidth = width\n url = iurl\n\n return url\n except Exception:\n pass\n\n for img in imgs:\n src = img.get('src')\n if 'data:' in src:\n continue\n if 'loading-' in src:\n js_img = re.search(br'\"largeImage\":\"(https?://[^\"]+)\",', raw)\n if js_img:\n src = js_img.group(1).decode('utf-8')\n if ('/no-image-avail' not in src and 'loading-' not in src and '/no-img-sm' not in src):\n self.log('Found image: %s' % src)\n url = clean_img_src(src)\n if url:\n return url\n\n def parse_detail_bullets(self, root, mi, container, ul_selector='.detail-bullet-list'):\n try:\n ul = next(self.selector(ul_selector, root=container))\n except StopIteration:\n return\n for span in self.selector('.a-list-item', root=ul):\n cells = span.xpath('./span')\n if len(cells) >= 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_new_details(self, root, mi, non_hero):\n table = non_hero.xpath('descendant::table')[0]\n for tr in table.xpath('descendant::tr'):\n cells = tr.xpath('descendant::*[local-name()=\"td\" or local-name()=\"th\"]')\n if len(cells) == 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_detail_cells(self, mi, c1, c2):\n name = self.totext(c1, only_printable=True).strip().strip(':').strip()\n val = self.totext(c2).strip()\n val = val.replace('\\u200e', '').replace('\\u200f', '')\n if not val:\n return\n if name in self.language_names:\n ans = self.lang_map.get(val)\n if not ans:\n ans = canonicalize_lang(val)\n if ans:\n mi.language = ans\n elif name in self.publisher_names:\n pub = val.partition(';')[0].partition('(')[0].strip()\n if pub:\n mi.publisher = pub\n date = val.rpartition('(')[-1].replace(')', '').strip()\n try:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(date)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n except:\n self.log.exception('Failed to parse pubdate: %s' % val)\n elif name in {'ISBN', 'ISBN-10', 'ISBN-13'}:\n ans = check_isbn(val)\n if ans:\n self.isbn = mi.isbn = ans\n elif name in {'Publication date'}:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(val)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n\n def parse_isbn(self, pd):\n items = pd.xpath(\n 'descendant::*[starts-with(text(), \"ISBN\")]')\n if not items:\n items = pd.xpath(\n 'descendant::b[contains(text(), \"ISBN:\")]')\n for x in reversed(items):\n if x.tail:\n ans = check_isbn(x.tail.strip())\n if ans:\n return ans\n\n def parse_publisher(self, pd):\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail.partition(';')[0]\n return ans.partition('(')[0].strip()\n\n def parse_pubdate(self, pd):\n from calibre.utils.date import parse_only_date\n for x in reversed(pd.xpath(self.pubdate_xpath)):\n if x.tail:\n date = x.tail.strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail\n date = ans.rpartition('(')[-1].replace(')', '').strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n\n def parse_language(self, pd):\n for x in reversed(pd.xpath(self.language_xpath)):\n if x.tail:\n raw = x.tail.strip().partition(',')[0].strip()\n ans = self.lang_map.get(raw, None)\n if ans:\n return ans\n ans = canonicalize_lang(ans)\n if ans:\n return ans\n# }}}\n\n\nclass Amazon(Source):\n\n name = 'Amazon.com'\n version = (1, 3, 7)\n minimum_calibre_version = (2, 82, 0)\n description = _('Downloads metadata and covers from Amazon')\n\n capabilities = frozenset(('identify', 'cover'))\n touched_fields = frozenset(('title', 'authors', 'identifier:amazon',\n 'rating', 'comments', 'publisher', 'pubdate',\n 'languages', 'series', 'tags'))\n has_html_comments = True\n supports_gzip_transfer_encoding = True\n prefer_results_with_isbn = False\n\n AMAZON_DOMAINS = {\n 'com': _('US'),\n 'fr': _('France'),\n 'de': _('Germany'),\n 'uk': _('UK'),\n 'au': _('Australia'),\n 'it': _('Italy'),\n 'jp': _('Japan'),\n 'es': _('Spain'),\n 'br': _('Brazil'),\n 'in': _('India'),\n 'nl': _('Netherlands'),\n 'cn': _('China'),\n 'ca': _('Canada'),\n 'se': _('Sweden'),\n }\n\n SERVERS = {\n 'auto': _('Choose server automatically'),\n 'amazon': _('Amazon servers'),\n 'bing': _('Bing search cache'),\n 'google': _('Google search cache'),\n 'wayback': _('Wayback machine cache (slow)'),\n 'ddg': _('DuckDuckGo search and Google cache'),\n }\n\n options = (\n Option('domain', 'choices', 'com', _('Amazon country website to use:'),\n _('Metadata from Amazon will be fetched using this '\n 'country\\'s Amazon website.'), choices=AMAZON_DOMAINS),\n Option('server', 'choices', 'auto', _('Server to get data from:'),\n _(\n 'Amazon has started blocking attempts to download'\n ' metadata from its servers. To get around this problem,'\n ' calibre can fetch the Amazon data from many different'\n ' places where it is cached. Choose the source you prefer.'\n ), choices=SERVERS),\n Option('use_mobi_asin', 'bool', False, _('Use the MOBI-ASIN for metadata search'),\n _(\n 'Enable this option to search for metadata with an'\n ' ASIN identifier from the MOBI file at the current country website,'\n ' unless any other amazon id is available. Note that if the'\n ' MOBI file came from a different Amazon country store, you could get'\n ' incorrect results.'\n )),\n Option('prefer_kindle_edition', 'bool', False, _('Prefer the Kindle edition, when available'),\n _(\n 'When searching for a book and the search engine returns both paper and Kindle editions,'\n ' always prefer the Kindle edition, instead of whatever the search engine returns at the'\n ' top.')\n ),\n )\n\n def __init__(self, *args, **kwargs):\n Source.__init__(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def id_from_url(self, url):\n from polyglot.urllib import urlparse\n purl = urlparse(url)\n if purl.netloc and purl.path and '/dp/' in purl.path:\n host_parts = tuple(x.lower() for x in purl.netloc.split('.'))\n if 'amazon' in host_parts:\n domain = host_parts[-1]\n parts = purl.path.split('/')\n idx = parts.index('dp')\n try:\n val = parts[idx+1]\n except IndexError:\n return\n aid = 'amazon' if domain == 'com' else ('amazon_' + domain)\n return aid, val\n\n def test_fields(self, mi):\n '''\n Return the first field from self.touched_fields that is null on the\n mi object\n '''\n for key in self.touched_fields:\n if key.startswith('identifier:'):\n key = key.partition(':')[-1]\n if key == 'amazon':\n if self.domain != 'com':\n key += '_' + self.domain\n if not mi.has_identifier(key):\n return 'identifier: ' + key\n elif mi.is_null(key):\n return key\n\n @property\n def browser(self):\n br = self._browser\n if br is None:\n ua = 'Mobile '\n while not user_agent_is_ok(ua):\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n self._browser = br = browser(user_agent=ua)\n br.set_handle_gzip(True)\n if self.use_search_engine:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n else:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ('Referer', self.referrer_for_domain()),\n ]\n return br\n\n def save_settings(self, *args, **kwargs):\n Source.save_settings(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def set_amazon_id_touched_fields(self):\n ident_name = \"identifier:amazon\"\n if self.domain != 'com':\n ident_name += '_' + self.domain\n tf = [x for x in self.touched_fields if not\n x.startswith('identifier:amazon')] + [ident_name]\n self.touched_fields = frozenset(tf)\n\n def get_domain_and_asin(self, identifiers, extra_domains=()):\n identifiers = {k.lower(): v for k, v in identifiers.items()}\n for key, val in identifiers.items():\n if key in ('amazon', 'asin'):\n return 'com', val\n if key.startswith('amazon_'):\n domain = key.partition('_')[-1]\n if domain and (domain in self.AMAZON_DOMAINS or domain in extra_domains):\n return domain, val\n if self.prefs['use_mobi_asin']:\n val = identifiers.get('mobi-asin')\n if val is not None:\n return self.domain, val\n return None, None\n\n def referrer_for_domain(self, domain=None):\n domain = domain or self.domain\n return {\n 'uk': 'https://www.amazon.co.uk/',\n 'au': 'https://www.amazon.com.au/',\n 'br': 'https://www.amazon.com.br/',\n 'jp': 'https://www.amazon.co.jp/',\n 'mx': 'https://www.amazon.com.mx/',\n }.get(domain, 'https://www.amazon.%s/' % domain)\n\n def _get_book_url(self, identifiers): # {{{\n domain, asin = self.get_domain_and_asin(\n identifiers, extra_domains=('au', 'ca'))\n if domain and asin:\n url = None\n r = self.referrer_for_domain(domain)\n if r is not None:\n url = r + 'dp/' + asin\n if url:\n idtype = 'amazon' if domain == 'com' else 'amazon_' + domain\n return domain, idtype, asin, url\n\n def get_book_url(self, identifiers):\n ans = self._get_book_url(identifiers)\n if ans is not None:\n return ans[1:]\n\n def get_book_url_name(self, idtype, idval, url):\n if idtype == 'amazon':\n return self.name\n return 'A' + idtype.replace('_', '.')[1:]\n # }}}\n\n @property\n def domain(self):\n x = getattr(self, 'testing_domain', None)\n if x is not None:\n return x\n domain = self.prefs['domain']\n if domain not in self.AMAZON_DOMAINS:\n domain = 'com'\n\n return domain\n\n @property\n def server(self):\n x = getattr(self, 'testing_server', None)\n if x is not None:\n return x\n server = self.prefs['server']\n if server not in self.SERVERS:\n server = 'auto'\n return server\n\n @property\n def use_search_engine(self):\n return self.server != 'amazon'\n\n def clean_downloaded_metadata(self, mi):\n docase = (\n mi.language == 'eng' or\n (mi.is_null('language') and self.domain in {'com', 'uk', 'au'})\n )\n if mi.title and docase:\n # Remove series information from title\n m = re.search(r'\\S+\\s+(\\(.+?\\s+Book\\s+\\d+\\))$', mi.title)\n if m is not None:\n mi.title = mi.title.replace(m.group(1), '').strip()\n mi.title = fixcase(mi.title)\n mi.authors = fixauthors(mi.authors)\n if mi.tags and docase:\n mi.tags = list(map(fixcase, mi.tags))\n mi.isbn = check_isbn(mi.isbn)\n if mi.series and docase:\n mi.series = fixcase(mi.series)\n if mi.title and mi.series:\n for pat in (r':\\s*Book\\s+\\d+\\s+of\\s+%s$', r'\\(%s\\)$', r':\\s*%s\\s+Book\\s+\\d+$'):\n pat = pat % re.escape(mi.series)\n q = re.sub(pat, '', mi.title, flags=re.I).strip()\n if q and q != mi.title:\n mi.title = q\n break\n\n def get_website_domain(self, domain):\n return {'uk': 'co.uk', 'jp': 'co.jp', 'br': 'com.br', 'au': 'com.au'}.get(domain, domain)\n\n def create_query(self, log, title=None, authors=None, identifiers={}, # {{{\n domain=None, for_amazon=True):\n try:\n from urllib.parse import unquote_plus, urlencode\n except ImportError:\n from urllib import unquote_plus, urlencode\n if domain is None:\n domain = self.domain\n\n idomain, asin = self.get_domain_and_asin(identifiers)\n if idomain is not None:\n domain = idomain\n\n # See the amazon detailed search page to get all options\n terms = []\n q = {'search-alias': 'aps',\n 'unfiltered': '1',\n }\n\n if domain == 'com':\n q['sort'] = 'relevanceexprank'\n else:\n q['sort'] = 'relevancerank'\n\n isbn = check_isbn(identifiers.get('isbn', None))\n\n if asin is not None:\n q['field-keywords'] = asin\n terms.append(asin)\n elif isbn is not None:\n q['field-isbn'] = isbn\n if len(isbn) == 13:\n terms.extend('({} OR {}-{})'.format(isbn, isbn[:3], isbn[3:]).split())\n else:\n terms.append(isbn)\n else:\n # Only return book results\n q['search-alias'] = {'br': 'digital-text',\n 'nl': 'aps'}.get(domain, 'stripbooks')\n if title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q['field-title'] = ' '.join(title_tokens)\n terms.extend(title_tokens)\n if authors:\n author_tokens = list(self.get_author_tokens(authors,\n only_first_author=True))\n if author_tokens:\n q['field-author'] = ' '.join(author_tokens)\n terms.extend(author_tokens)\n\n if not ('field-keywords' in q or 'field-isbn' in q or\n ('field-title' in q)):\n # Insufficient metadata to make an identify query\n log.error('Insufficient metadata to construct query, none of title, ISBN or ASIN supplied')\n raise SearchFailed()\n\n if not for_amazon:\n return terms, domain\n\n if domain == 'nl':\n q['__mk_nl_NL'] = 'ÅMÅŽÕÑ'\n if 'field-keywords' not in q:\n q['field-keywords'] = ''\n for f in 'field-isbn field-title field-author'.split():\n q['field-keywords'] += ' ' + q.pop(f, '')\n q['field-keywords'] = q['field-keywords'].strip()\n\n encoded_q = dict([(x.encode('utf-8', 'ignore'), y.encode(\n 'utf-8', 'ignore')) for x, y in q.items()])\n url_query = urlencode(encoded_q)\n # amazon's servers want IRIs with unicode characters not percent esaped\n parts = []\n for x in url_query.split(b'&' if isinstance(url_query, bytes) else '&'):\n k, v = x.split(b'=' if isinstance(x, bytes) else '=', 1)\n parts.append('{}={}'.format(iri_quote_plus(unquote_plus(k)), iri_quote_plus(unquote_plus(v))))\n url_query = '&'.join(parts)\n url = 'https://www.amazon.%s/s/?' % self.get_website_domain(\n domain) + url_query\n return url, domain\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n domain, asin = self.get_domain_and_asin(identifiers)\n if asin is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n asin = self.cached_isbn_to_identifier(isbn)\n if asin is not None:\n url = self.cached_identifier_to_cover_url(asin)\n\n return url\n # }}}\n\n def parse_results_page(self, root, domain): # {{{\n from lxml.html import tostring\n\n matches = []\n\n def title_ok(title):\n title = title.lower()\n bad = ['bulk pack', '[audiobook]', '[audio cd]',\n '(a book companion)', '( slipcase with door )', ': free sampler']\n if self.domain == 'com':\n bad.extend(['(%s edition)' % x for x in ('spanish', 'german')])\n for x in bad:\n if x in title:\n return False\n if title and title[0] in '[{' and re.search(r'\\(\\s*author\\s*\\)', title) is not None:\n # Bad entries in the catalog\n return False\n return True\n\n for query in (\n '//div[contains(@class, \"s-result-list\")]//h2/a[@href]',\n '//div[contains(@class, \"s-result-list\")]//div[@data-index]//h5//a[@href]',\n r'//li[starts-with(@id, \"result_\")]//a[@href and contains(@class, \"s-access-detail-page\")]',\n ):\n result_links = root.xpath(query)\n if result_links:\n break\n for a in result_links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n\n if not matches:\n # Previous generation of results page markup\n for div in root.xpath(r'//div[starts-with(@id, \"result_\")]'):\n links = div.xpath(r'descendant::a[@class=\"title\" and @href]')\n if not links:\n # New amazon markup\n links = div.xpath('descendant::h3/a[@href]')\n for a in links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n\n if not matches:\n # This can happen for some user agents that Amazon thinks are\n # mobile/less capable\n for td in root.xpath(\n r'//div[@id=\"Results\"]/descendant::td[starts-with(@id, \"search:Td:\")]'):\n for a in td.xpath(r'descendant::td[@class=\"dataColumn\"]/descendant::a[@href]/span[@class=\"srTitle\"]/..'):\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n if not matches and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError('Amazon returned a CAPTCHA page. Recently Amazon has begun using statistical'\n ' profiling to block access to its website. As such this metadata plugin is'\n ' unlikely to ever work reliably.')\n\n # Keep only the top 3 matches as the matches are sorted by relevance by\n # Amazon so lower matches are not likely to be very relevant\n return matches[:3]\n # }}}\n\n def search_amazon(self, br, testing, log, abort, title, authors, identifiers, timeout): # {{{\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n matches = []\n query, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n time.sleep(1)\n try:\n raw = br.open_novisit(query, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('Query malformed: %r' % query)\n raise SearchFailed()\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = _('Amazon timed out. Try again later.')\n log.error(msg)\n else:\n msg = 'Failed to make identify query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n raw = clean_ascii_chars(xml_to_unicode(raw,\n strip_encoding_pats=True, resolve_entities=True)[0])\n\n if testing:\n import tempfile\n with tempfile.NamedTemporaryFile(prefix='amazon_results_',\n suffix='.html', delete=False) as f:\n f.write(raw.encode('utf-8'))\n print('Downloaded html for results page saved in', f.name)\n\n matches = []\n found = '404 - ' not in raw\n\n if found:\n try:\n root = parse_html(raw)\n except Exception:\n msg = 'Failed to parse amazon page for query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n matches = self.parse_results_page(root, domain)\n\n return matches, query, domain, None\n # }}}\n\n def search_search_engine(self, br, testing, log, abort, title, authors, identifiers, timeout, override_server=None): # {{{\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n terms, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers, for_amazon=False)\n site = self.referrer_for_domain(\n domain)[len('https://'):].partition('/')[0]\n matches = []\n server = override_server or self.server\n urlproc, sfunc = se.google_url_processor, se.google_search\n if server == 'bing':\n urlproc, sfunc = se.bing_url_processor, se.bing_search\n elif server == 'wayback':\n urlproc, sfunc = se.wayback_url_processor, se.ddg_search\n elif server == 'ddg':\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n try:\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n except HTTPError as err:\n if err.code == 429 and sfunc is se.google_search:\n log('Got too many requests error from Google, trying via DuckDuckGo')\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n else:\n raise\n\n br.set_current_header('Referer', qurl)\n for result in results:\n if abort.is_set():\n return matches, terms, domain, None\n\n purl = urlparse(result.url)\n if '/dp/' in purl.path and site in purl.netloc:\n url = result.cached_url\n if url is None:\n url = se.get_cached_url(result.url, br, timeout=timeout)\n if url is None:\n log('Failed to find cached page for:', result.url)\n continue\n if url not in matches:\n matches.append(url)\n if len(matches) >= 3:\n break\n else:\n log('Skipping non-book result:', result)\n if not matches:\n log('No search engine results for terms:', ' '.join(terms))\n if urlproc is se.google_url_processor:\n # Google does not cache adult titles\n log('Trying the bing search engine instead')\n return self.search_search_engine(br, testing, log, abort, title, authors, identifiers, timeout, 'bing')\n return matches, terms, domain, urlproc\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=60):\n '''\n Note this method will retry without identifiers automatically if no\n match is found with identifiers.\n '''\n\n testing = getattr(self, 'running_a_test', False)\n\n udata = self._get_book_url(identifiers)\n br = self.browser\n log('User-agent:', br.current_user_agent())\n log('Server:', self.server)\n if testing:\n print('User-agent:', br.current_user_agent())\n if udata is not None and not self.use_search_engine:\n # Try to directly get details page instead of running a search\n # Cannot use search engine as the directly constructed URL is\n # usually redirected to a full URL by amazon, and is therefore\n # not cached\n domain, idtype, asin, durl = udata\n if durl is not None:\n preparsed_root = parse_details_page(\n durl, log, timeout, br, domain)\n if preparsed_root is not None:\n qasin = parse_asin(preparsed_root[1], log, durl)\n if qasin == asin:\n w = Worker(durl, result_queue, br, log, 0, domain,\n self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)\n try:\n w.get_details()\n return\n except Exception:\n log.exception(\n 'get_details failed for url: %r' % durl)\n func = self.search_search_engine if self.use_search_engine else self.search_amazon\n try:\n matches, query, domain, cover_url_processor = func(\n br, testing, log, abort, title, authors, identifiers, timeout)\n except SearchFailed:\n return\n\n if abort.is_set():\n return\n\n if not matches:\n if identifiers and title and authors:\n log('No matches found with identifiers, retrying using only'\n ' title and authors. Query: %r' % query)\n time.sleep(1)\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n log.error('No matches found with query: %r' % query)\n return\n\n if self.prefs['prefer_kindle_edition']:\n matches = sort_matches_preferring_kindle_editions(matches)\n\n workers = [Worker(\n url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout,\n cover_url_processor=cover_url_processor, filter_result=partial(\n self.filter_result, title, authors, identifiers)) for i, url in enumerate(matches)]\n\n for w in workers:\n # Don't send all requests at the same time\n time.sleep(1)\n w.start()\n if abort.is_set():\n return\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n return None\n # }}}\n\n def filter_result(self, title, authors, identifiers, mi, log): # {{{\n if not self.use_search_engine:\n return True\n if title is not None:\n\n def tokenize_title(x):\n return icu_lower(x).replace(\"'\", '').replace('\"', '').rstrip(':')\n\n tokens = {tokenize_title(x) for x in title.split() if len(x) > 3}\n if tokens:\n result_tokens = {tokenize_title(x) for x in mi.title.split()}\n if not tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'as its title does not match')\n return False\n if authors:\n author_tokens = set()\n for author in authors:\n author_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n result_tokens = set()\n for author in mi.authors:\n result_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n if author_tokens and not author_tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'by', ' & '.join(mi.authors), 'as its author does not match')\n return False\n return True\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=60, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n log('Downloading cover from:', cached_url)\n br = self.browser\n if self.use_search_engine:\n br = br.clone_browser()\n br.set_current_header('Referer', self.referrer_for_domain(self.domain))\n try:\n time.sleep(1)\n cdata = br.open_novisit(\n cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\ndef manual_tests(domain, **kw): # {{{\n # To run these test use:\n # calibre-debug -c \"from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')\"\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, isbn_test, series_test, test_identify_plugin, title_test\n all_tests = {}\n all_tests['com'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon': '1423146786'}},\n [title_test('Heroes of Olympus', exact=False), series_test('The Heroes of Olympus', 5)]\n ),\n\n ( # Kindle edition with series\n {'identifiers': {'amazon': 'B0085UEQDO'}},\n [title_test('Three Parts Dead', exact=True),\n series_test('Craft Sequence', 1)]\n ),\n\n ( # + in title and uses id=\"main-image\" for cover\n {'identifiers': {'amazon': '1933988770'}},\n [title_test(\n 'C++ Concurrency in Action: Practical Multithreading', exact=True)]\n ),\n\n\n ( # Different comments markup, using Book Description section\n {'identifiers': {'amazon': '0982514506'}},\n [title_test(\n \"Griffin's Destiny\",\n exact=True),\n comments_test('Jelena'), comments_test('Ashinji'),\n ]\n ),\n\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C#'),\n authors_test(['Rockford Lhotka'])\n ]\n ),\n\n ( # No specific problems\n {'identifiers': {'isbn': '0743273567'}},\n [title_test('the great gatsby'),\n authors_test(['f. Scott Fitzgerald'])]\n ),\n\n ]\n\n # }}}\n\n all_tests['de'] = [ # {{{\n # series\n (\n {'identifiers': {'isbn': '3499275120'}},\n [title_test('Vespasian: Das Schwert des Tribuns: Historischer Roman',\n exact=False), authors_test(['Robert Fabbri']), series_test('Die Vespasian-Reihe', 1)\n ]\n\n ),\n\n ( # umlaut in title/authors\n {'title': 'Flüsternde Wälder',\n 'authors': ['Nicola Förg']},\n [title_test('Flüsternde Wälder'),\n authors_test(['Nicola Förg'], subset=True)\n ]\n ),\n\n (\n {'identifiers': {'isbn': '9783453314979'}},\n [title_test('Die letzten Wächter: Roman',\n exact=False), authors_test(['Sergej Lukianenko'])\n ]\n\n ),\n\n (\n {'identifiers': {'isbn': '3548283519'}},\n [title_test('Wer Wind Sät: Der Fünfte Fall Für Bodenstein Und Kirchhoff',\n exact=False), authors_test(['Nele Neuhaus'])\n ]\n\n ),\n ] # }}}\n\n all_tests['it'] = [ # {{{\n (\n {'identifiers': {'isbn': '8838922195'}},\n [title_test('La briscola in cinque',\n exact=True), authors_test(['Marco Malvaldi'])\n ]\n\n ),\n ] # }}}\n\n all_tests['fr'] = [ # {{{\n (\n {'identifiers': {'amazon_fr': 'B07L7ST4RS'}},\n [title_test('Le secret de Lola', exact=True),\n authors_test(['Amélie BRIZIO'])\n ]\n ),\n (\n {'identifiers': {'isbn': '2221116798'}},\n [title_test('L\\'étrange voyage de Monsieur Daldry',\n exact=True), authors_test(['Marc Levy'])\n ]\n\n ),\n ] # }}}\n\n all_tests['es'] = [ # {{{\n (\n {'identifiers': {'isbn': '8483460831'}},\n [title_test('Tiempos Interesantes',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['se'] = [ # {{{\n (\n {'identifiers': {'isbn': '9780552140287'}},\n [title_test('Men At Arms: A Discworld Novel: 14',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['jp'] = [ # {{{\n ( # Adult filtering test\n {'identifiers': {'isbn': '4799500066'}},\n [title_test('Bitch Trap'), ]\n ),\n\n ( # isbn -> title, authors\n {'identifiers': {'isbn': '9784101302720'}},\n [title_test('精霊の守り人',\n exact=True), authors_test(['上橋 菜穂子'])\n ]\n ),\n ( # title, authors -> isbn (will use Shift_JIS encoding in query.)\n {'title': '考えない練習',\n 'authors': ['小池 龍之介']},\n [isbn_test('9784093881067'), ]\n ),\n ] # }}}\n\n all_tests['br'] = [ # {{{\n (\n {'title': 'A Ascensão da Sombra'},\n [title_test('A Ascensão da Sombra'), authors_test(['Robert Jordan'])]\n ),\n\n (\n {'title': 'Guerra dos Tronos'},\n [title_test('A Guerra dos Tronos. As Crônicas de Gelo e Fogo - Livro 1'), authors_test(['George R. R. Martin'])\n ]\n\n ),\n ] # }}}\n\n all_tests['nl'] = [ # {{{\n (\n {'title': 'Freakonomics'},\n [title_test('Freakonomics',\n exact=True), authors_test(['Steven Levitt & Stephen Dubner & R. Kuitenbrouwer & O. Brenninkmeijer & A. van Den Berg'])\n ]\n\n ),\n ] # }}}\n\n all_tests['cn'] = [ # {{{\n (\n {'identifiers': {'isbn': '9787115369512'}},\n [title_test('若为自由故 自由软件之父理查德斯托曼传', exact=True),\n authors_test(['[美]sam Williams', '邓楠,李凡希'])]\n ),\n (\n {'title': '爱上Raspberry Pi'},\n [title_test('爱上Raspberry Pi',\n exact=True), authors_test(['Matt Richardson', 'Shawn Wallace', '李凡希'])\n ]\n\n ),\n ] # }}}\n\n all_tests['ca'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'isbn': '9781623808747'}},\n [title_test('Parting Shot', exact=True),\n authors_test(['Mary Calmes'])]\n ),\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C# 2008 Business Objects'),\n authors_test(['Rockford Lhotka'])]\n ),\n ( # noscript description\n {'identifiers': {'amazon_ca': '162380874X'}},\n [title_test('Parting Shot', exact=True), authors_test(['Mary Calmes'])\n ]\n ),\n ] # }}}\n\n all_tests['in'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon_in': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus', exact=True)]\n ),\n ] # }}}\n\n def do_test(domain, start=0, stop=None, server='auto'):\n tests = all_tests[domain]\n if stop is None:\n stop = len(tests)\n tests = tests[start:stop]\n test_identify_plugin(Amazon.name, tests, modify_plugin=lambda p: (\n setattr(p, 'testing_domain', domain),\n setattr(p, 'touched_fields', p.touched_fields - {'tags'}),\n setattr(p, 'testing_server', server),\n ))\n\n do_test(domain, **kw)\n# }}}\n",
+ "big_book_search": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef get_urls(br, tokens):\n from urllib.parse import quote_plus\n\n from html5_parser import parse\n escaped = (quote_plus(x) for x in tokens if x and x.strip())\n q = '+'.join(escaped)\n url = 'https://bigbooksearch.com/please-dont-scrape-my-site-you-will-put-my-api-key-over-the-usage-limit-and-the-site-will-break/books/'+q\n raw = br.open(url).read()\n root = parse(raw.decode('utf-8'))\n urls = [i.get('src') for i in root.xpath('//img[@src]')]\n return urls\n\n\nclass BigBookSearch(Source):\n\n name = 'Big Book Search'\n version = (1, 0, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads multiple book covers from Amazon. Useful to find alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the search result')),\n )\n supports_gzip_transfer_encoding = True\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n br = self.browser\n tokens = tuple(self.get_title_tokens(title)) + tuple(self.get_author_tokens(authors))\n urls = get_urls(br, tokens)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n\ndef test():\n import pprint\n\n from calibre import browser\n br = browser()\n urls = get_urls(br, ['consider', 'phlebas', 'banks'])\n pprint.pprint(urls)\n\n\nif __name__ == '__main__':\n test()\n",
+ "edelweiss": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nimport re\nimport time\nfrom threading import Thread\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, random_user_agent\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\ndef clean_html(raw):\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n return clean_ascii_chars(xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True, assume_utf8=True)[0])\n\n\ndef parse_html(raw):\n raw = clean_html(raw)\n from html5_parser import parse\n return parse(raw)\n\n\ndef astext(node):\n from lxml import etree\n return etree.tostring(node, method='text', encoding='unicode',\n with_tail=False).strip()\n\n\nclass Worker(Thread): # {{{\n\n def __init__(self, basic_data, relevance, result_queue, br, timeout, log, plugin):\n Thread.__init__(self)\n self.daemon = True\n self.basic_data = basic_data\n self.br, self.log, self.timeout = br, log, timeout\n self.result_queue, self.plugin, self.sku = result_queue, plugin, self.basic_data['sku']\n self.relevance = relevance\n\n def run(self):\n url = ('https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/product/two_Enhanced.ascx&'\n 'sku={0}&idPrefix=content_1_{0}&mode=0'.format(self.sku))\n try:\n raw = self.br.open_novisit(url, timeout=self.timeout).read()\n except:\n self.log.exception('Failed to load comments page: %r'%url)\n return\n\n try:\n mi = self.parse(raw)\n mi.source_relevance = self.relevance\n self.plugin.clean_downloaded_metadata(mi)\n self.result_queue.put(mi)\n except:\n self.log.exception('Failed to parse details for sku: %s'%self.sku)\n\n def parse(self, raw):\n from calibre.ebooks.metadata.book.base import Metadata\n from calibre.utils.date import UNDEFINED_DATE\n root = parse_html(raw)\n mi = Metadata(self.basic_data['title'], self.basic_data['authors'])\n\n # Identifiers\n if self.basic_data['isbns']:\n mi.isbn = self.basic_data['isbns'][0]\n mi.set_identifier('edelweiss', self.sku)\n\n # Tags\n if self.basic_data['tags']:\n mi.tags = self.basic_data['tags']\n mi.tags = [t[1:].strip() if t.startswith('&') else t for t in mi.tags]\n\n # Publisher\n mi.publisher = self.basic_data['publisher']\n\n # Pubdate\n if self.basic_data['pubdate'] and self.basic_data['pubdate'].year != UNDEFINED_DATE:\n mi.pubdate = self.basic_data['pubdate']\n\n # Rating\n if self.basic_data['rating']:\n mi.rating = self.basic_data['rating']\n\n # Comments\n comments = ''\n for cid in ('summary', 'contributorbio', 'quotes_reviews'):\n cid = 'desc_{}{}-content'.format(cid, self.sku)\n div = root.xpath('//*[@id=\"{}\"]'.format(cid))\n if div:\n comments += self.render_comments(div[0])\n if comments:\n mi.comments = comments\n\n mi.has_cover = self.plugin.cached_identifier_to_cover_url(self.sku) is not None\n return mi\n\n def render_comments(self, desc):\n from lxml import etree\n\n from calibre.library.comments import sanitize_comments_html\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = etree.tostring(desc, method='html', encoding='unicode').strip()\n\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove comments\n desc = re.sub(r'(?s)', '', desc)\n return sanitize_comments_html(desc)\n# }}}\n\n\ndef get_basic_data(browser, log, *skus):\n from mechanize import Request\n\n from calibre.utils.date import parse_only_date\n zeroes = ','.join('0' for sku in skus)\n data = {\n 'skus': ','.join(skus),\n 'drc': zeroes,\n 'startPosition': '0',\n 'sequence': '1',\n 'selected': zeroes,\n 'itemID': '0',\n 'orderID': '0',\n 'mailingID': '',\n 'tContentWidth': '926',\n 'originalOrder': ','.join(type('')(i) for i in range(len(skus))),\n 'selectedOrderID': '0',\n 'selectedSortColumn': '0',\n 'listType': '1',\n 'resultType': '32',\n 'blockView': '1',\n }\n items_data_url = 'https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/listviews/ListView_Title_Multi.ascx'\n req = Request(items_data_url, data)\n response = browser.open_novisit(req)\n raw = response.read()\n root = parse_html(raw)\n for item in root.xpath('//div[@data-priority]'):\n row = item.getparent().getparent()\n sku = item.get('id').split('-')[-1]\n isbns = [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_sku\")]/text()')[0].split(',') if check_isbn(x.strip())]\n isbns.sort(key=len, reverse=True)\n try:\n tags = [x.strip() for x in astext(row.xpath('descendant::*[contains(@class, \"pev_categories\")]')[0]).split('/')]\n except IndexError:\n tags = []\n rating = 0\n for bar in row.xpath('descendant::*[contains(@class, \"bgdColorCommunity\")]/@style'):\n m = re.search(r'width: (\\d+)px;.*max-width: (\\d+)px', bar)\n if m is not None:\n rating = float(m.group(1)) / float(m.group(2))\n break\n try:\n pubdate = parse_only_date(astext(row.xpath('descendant::*[contains(@class, \"pev_shipDate\")]')[0]\n ).split(':')[-1].split(u'\\xa0')[-1].strip(), assume_utc=True)\n except Exception:\n log.exception('Error parsing published date')\n pubdate = None\n authors = []\n for x in [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_contributor\")]/@title')]:\n authors.extend(a.strip() for a in x.split(','))\n entry = {\n 'sku': sku,\n 'cover': row.xpath('descendant::img/@src')[0].split('?')[0],\n 'publisher': astext(row.xpath('descendant::*[contains(@class, \"headerPublisher\")]')[0]),\n 'title': astext(row.xpath('descendant::*[@id=\"title_{}\"]'.format(sku))[0]),\n 'authors': authors,\n 'isbns': isbns,\n 'tags': tags,\n 'pubdate': pubdate,\n 'format': ' '.join(row.xpath('descendant::*[contains(@class, \"pev_format\")]/text()')).strip(),\n 'rating': rating,\n }\n if entry['cover'].startswith('/'):\n entry['cover'] = None\n yield entry\n\n\nclass Edelweiss(Source):\n\n name = 'Edelweiss'\n version = (2, 0, 1)\n minimum_calibre_version = (3, 6, 0)\n description = _('Downloads metadata and covers from Edelweiss - A catalog updated by book publishers')\n\n capabilities = frozenset(['identify', 'cover'])\n touched_fields = frozenset([\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:edelweiss', 'rating'])\n supports_gzip_transfer_encoding = True\n has_html_comments = True\n\n @property\n def user_agent(self):\n # Pass in an index to random_user_agent() to test with a particular\n # user agent\n return random_user_agent(allow_ie=False)\n\n def _get_book_url(self, sku):\n if sku:\n return 'https://www.edelweiss.plus/#sku={}&page=1'.format(sku)\n\n def get_book_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if sku:\n return 'edelweiss', sku, self._get_book_url(sku)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if not sku:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n sku = self.cached_isbn_to_identifier(isbn)\n return self.cached_identifier_to_cover_url(sku)\n # }}}\n\n def create_query(self, log, title=None, authors=None, identifiers={}):\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n import time\n BASE_URL = ('https://www.edelweiss.plus/GetTreelineControl.aspx?'\n 'controlName=/uc/listviews/controls/ListView_data.ascx&itemID=0&resultType=32&dashboardType=8&itemType=1&dataType=products&keywordSearch&')\n keywords = []\n isbn = check_isbn(identifiers.get('isbn', None))\n if isbn is not None:\n keywords.append(isbn)\n elif title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n keywords.extend(title_tokens)\n author_tokens = self.get_author_tokens(authors, only_first_author=True)\n if author_tokens:\n keywords.extend(author_tokens)\n if not keywords:\n return None\n params = {\n 'q': (' '.join(keywords)).encode('utf-8'),\n '_': type('')(int(time.time()))\n }\n return BASE_URL+urlencode(params)\n\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=30):\n import json\n\n br = self.browser\n br.addheaders = [\n ('Referer', 'https://www.edelweiss.plus/'),\n ('X-Requested-With', 'XMLHttpRequest'),\n ('Cache-Control', 'no-cache'),\n ('Pragma', 'no-cache'),\n ]\n if 'edelweiss' in identifiers:\n items = [identifiers['edelweiss']]\n else:\n log.error('Currently Edelweiss returns random books for search queries')\n return\n query = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n log('Using query URL:', query)\n try:\n raw = br.open(query, timeout=timeout).read().decode('utf-8')\n except Exception as e:\n log.exception('Failed to make identify query: %r'%query)\n return as_unicode(e)\n items = re.search(r'window[.]items\\s*=\\s*(.+?);', raw)\n if items is None:\n log.error('Failed to get list of matching items')\n log.debug('Response text:')\n log.debug(raw)\n return\n items = json.loads(items.group(1))\n\n if (not items and identifiers and title and authors and\n not abort.is_set()):\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n\n if not items:\n return\n\n workers = []\n items = items[:5]\n for i, item in enumerate(get_basic_data(self.browser, log, *items)):\n sku = item['sku']\n for isbn in item['isbns']:\n self.cache_isbn_to_identifier(isbn, sku)\n if item['cover']:\n self.cache_identifier_to_cover_url(sku, item['cover'])\n fmt = item['format'].lower()\n if 'audio' in fmt or 'mp3' in fmt:\n continue # Audio-book, ignore\n workers.append(Worker(item, i, result_queue, br.clone_browser(), timeout, log, self))\n\n if not workers:\n return\n\n for w in workers:\n w.start()\n # Don't send all requests at the same time\n time.sleep(0.1)\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n br = self.browser\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\nif __name__ == '__main__':\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, pubdate_test, test_identify_plugin, title_test\n tests = [\n ( # A title and author search\n {'title': 'The Husband\\'s Secret', 'authors':['Liane Moriarty']},\n [title_test('The Husband\\'s Secret', exact=True),\n authors_test(['Liane Moriarty'])]\n ),\n\n ( # An isbn present in edelweiss\n {'identifiers':{'isbn': '9780312621360'}, },\n [title_test('Flame: A Sky Chasers Novel', exact=True),\n authors_test(['Amy Kathleen Ryan'])]\n ),\n\n # Multiple authors and two part title and no general description\n ({'identifiers':{'edelweiss':'0321180607'}},\n [title_test(\n \"XQuery From the Experts: A Guide to the W3C XML Query Language\"\n , exact=True), authors_test([\n 'Howard Katz', 'Don Chamberlin', 'Denise Draper', 'Mary Fernandez',\n 'Michael Kay', 'Jonathan Robie', 'Michael Rys', 'Jerome Simeon',\n 'Jim Tivy', 'Philip Wadler']), pubdate_test(2003, 8, 22),\n comments_test('Jérôme Siméon'), lambda mi: bool(mi.comments and 'No title summary' not in mi.comments)\n ]),\n ]\n start, stop = 0, len(tests)\n\n tests = tests[start:stop]\n test_identify_plugin(Edelweiss.name, tests)\n",
+ "google": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal \nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport hashlib\nimport os\nimport re\nimport sys\nimport tempfile\nimport time\n\nimport regex\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, prepare_string_for_xml, replace_entities\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.ebooks.metadata import authors_to_string, check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Source\nfrom calibre.utils.cleantext import clean_ascii_chars\nfrom calibre.utils.localization import canonicalize_lang\n\nNAMESPACES = {\n 'openSearch': 'http://a9.com/-/spec/opensearchrss/1.0/',\n 'atom': 'http://www.w3.org/2005/Atom',\n 'dc': 'http://purl.org/dc/terms',\n 'gd': 'http://schemas.google.com/g/2005'\n}\n\n\ndef pretty_google_books_comments(raw):\n raw = replace_entities(raw)\n # Paragraphs in the comments are removed but whatever software googl uses\n # to do this does not insert a space so we often find the pattern\n # word.Capital in the comments which can be used to find paragraph markers.\n parts = []\n for x in re.split(r'([a-z)\"”])(\\.)([A-Z(\"“])', raw):\n if x == '.':\n parts.append('.\\n\\n')\n else:\n parts.append(prepare_string_for_xml(x))\n raw = '
' + ''.join(parts) + '
'\n return raw\n\n\ndef get_details(browser, url, timeout): # {{{\n try:\n raw = browser.open_novisit(url, timeout=timeout).read()\n except Exception as e:\n gc = getattr(e, 'getcode', lambda: -1)\n if gc() != 403:\n raise\n # Google is throttling us, wait a little\n time.sleep(2)\n raw = browser.open_novisit(url, timeout=timeout).read()\n\n return raw\n\n\n# }}}\n\nxpath_cache = {}\n\n\ndef XPath(x):\n ans = xpath_cache.get(x)\n if ans is None:\n from lxml import etree\n ans = xpath_cache[x] = etree.XPath(x, namespaces=NAMESPACES)\n return ans\n\n\ndef to_metadata(browser, log, entry_, timeout, running_a_test=False): # {{{\n from lxml import etree\n\n # total_results = XPath('//openSearch:totalResults')\n # start_index = XPath('//openSearch:startIndex')\n # items_per_page = XPath('//openSearch:itemsPerPage')\n entry = XPath('//atom:entry')\n entry_id = XPath('descendant::atom:id')\n url = XPath('descendant::atom:link[@rel=\"self\"]/@href')\n creator = XPath('descendant::dc:creator')\n identifier = XPath('descendant::dc:identifier')\n title = XPath('descendant::dc:title')\n date = XPath('descendant::dc:date')\n publisher = XPath('descendant::dc:publisher')\n subject = XPath('descendant::dc:subject')\n description = XPath('descendant::dc:description')\n language = XPath('descendant::dc:language')\n\n # print(etree.tostring(entry_, pretty_print=True))\n\n def get_text(extra, x):\n try:\n ans = x(extra)\n if ans:\n ans = ans[0].text\n if ans and ans.strip():\n return ans.strip()\n except:\n log.exception('Programming error:')\n return None\n\n def get_extra_details():\n raw = get_details(browser, details_url, timeout)\n if running_a_test:\n with open(os.path.join(tempfile.gettempdir(), 'Google-' + details_url.split('/')[-1] + '.xml'), 'wb') as f:\n f.write(raw)\n print('Book details saved to:', f.name, file=sys.stderr)\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return entry(feed)[0]\n\n if isinstance(entry_, str):\n google_id = entry_\n details_url = 'https://www.google.com/books/feeds/volumes/' + google_id\n extra = get_extra_details()\n title_ = ': '.join([x.text for x in title(extra)]).strip()\n authors = [x.text.strip() for x in creator(extra) if x.text]\n else:\n id_url = entry_id(entry_)[0].text\n google_id = id_url.split('/')[-1]\n details_url = url(entry_)[0]\n title_ = ': '.join([x.text for x in title(entry_)]).strip()\n authors = [x.text.strip() for x in creator(entry_) if x.text]\n if not id_url or not title:\n # Silently discard this entry\n return None\n extra = None\n\n if not authors:\n authors = [_('Unknown')]\n if not title:\n return None\n if extra is None:\n extra = get_extra_details()\n mi = Metadata(title_, authors)\n mi.identifiers = {'google': google_id}\n mi.comments = get_text(extra, description)\n lang = canonicalize_lang(get_text(extra, language))\n if lang:\n mi.language = lang\n mi.publisher = get_text(extra, publisher)\n\n # ISBN\n isbns = []\n for x in identifier(extra):\n t = type('')(x.text).strip()\n if t[:5].upper() in ('ISBN:', 'LCCN:', 'OCLC:'):\n if t[:5].upper() == 'ISBN:':\n t = check_isbn(t[5:])\n if t:\n isbns.append(t)\n if isbns:\n mi.isbn = sorted(isbns, key=len)[-1]\n mi.all_isbns = isbns\n\n # Tags\n try:\n btags = [x.text for x in subject(extra) if x.text]\n tags = []\n for t in btags:\n atags = [y.strip() for y in t.split('/')]\n for tag in atags:\n if tag not in tags:\n tags.append(tag)\n except:\n log.exception('Failed to parse tags:')\n tags = []\n if tags:\n mi.tags = [x.replace(',', ';') for x in tags]\n\n # pubdate\n pubdate = get_text(extra, date)\n if pubdate:\n from calibre.utils.date import parse_date, utcnow\n try:\n default = utcnow().replace(day=15)\n mi.pubdate = parse_date(pubdate, assume_utc=True, default=default)\n except:\n log.error('Failed to parse pubdate %r' % pubdate)\n\n # Cover\n mi.has_google_cover = None\n for x in extra.xpath(\n '//*[@href and @rel=\"http://schemas.google.com/books/2008/thumbnail\"]'\n ):\n mi.has_google_cover = x.get('href')\n break\n\n return mi\n\n\n# }}}\n\n\nclass GoogleBooks(Source):\n\n name = 'Google'\n version = (1, 1, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads metadata and covers from Google Books')\n\n capabilities = frozenset({'identify'})\n touched_fields = frozenset({\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:google', 'languages'\n })\n supports_gzip_transfer_encoding = True\n cached_cover_url_is_reliable = False\n\n GOOGLE_COVER = 'https://books.google.com/books?id=%s&printsec=frontcover&img=1'\n\n DUMMY_IMAGE_MD5 = frozenset(\n ('0de4383ebad0adad5eeb8975cd796657', 'a64fa89d7ebc97075c1d363fc5fea71f')\n )\n\n def get_book_url(self, identifiers): # {{{\n goog = identifiers.get('google', None)\n if goog is not None:\n return ('google', goog, 'https://books.google.com/books?id=%s' % goog)\n # }}}\n\n def id_from_url(self, url): # {{{\n from polyglot.urllib import parse_qs, urlparse\n purl = urlparse(url)\n if purl.netloc == 'books.google.com':\n q = parse_qs(purl.query)\n gid = q.get('id')\n if gid:\n return 'google', gid[0]\n # }}}\n\n def create_query(self, title=None, authors=None, identifiers={}, capitalize_isbn=False): # {{{\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n BASE_URL = 'https://books.google.com/books/feeds/volumes?'\n isbn = check_isbn(identifiers.get('isbn', None))\n q = ''\n if isbn is not None:\n q += ('ISBN:' if capitalize_isbn else 'isbn:') + isbn\n elif title or authors:\n\n def build_term(prefix, parts):\n return ' '.join('in' + prefix + ':' + x for x in parts)\n\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += build_term('title', title_tokens)\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += ('+' if q else '') + build_term('author', author_tokens)\n\n if not q:\n return None\n if not isinstance(q, bytes):\n q = q.encode('utf-8')\n return BASE_URL + urlencode({\n 'q': q,\n 'max-results': 20,\n 'start-index': 1,\n 'min-viewability': 'none',\n })\n\n # }}}\n\n def download_cover( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30,\n get_best_cover=False\n ):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(\n log,\n rq,\n abort,\n title=title,\n authors=authors,\n identifiers=identifiers\n )\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(\n key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers\n )\n )\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n br = self.browser\n for candidate in (0, 1):\n if abort.is_set():\n return\n url = cached_url + '&zoom={}'.format(candidate)\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(url, timeout=timeout).read()\n if cdata:\n if hashlib.md5(cdata).hexdigest() in self.DUMMY_IMAGE_MD5:\n log.warning('Google returned a dummy image, ignoring')\n else:\n result_queue.put((self, cdata))\n break\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n goog = identifiers.get('google', None)\n if goog is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n goog = self.cached_isbn_to_identifier(isbn)\n if goog is not None:\n url = self.cached_identifier_to_cover_url(goog)\n\n return url\n\n # }}}\n\n def postprocess_downloaded_google_metadata(self, ans, relevance=0): # {{{\n if not isinstance(ans, Metadata):\n return ans\n ans.source_relevance = relevance\n goog = ans.identifiers['google']\n for isbn in getattr(ans, 'all_isbns', []):\n self.cache_isbn_to_identifier(isbn, goog)\n if getattr(ans, 'has_google_cover', False):\n self.cache_identifier_to_cover_url(goog, self.GOOGLE_COVER % goog)\n if ans.comments:\n ans.comments = pretty_google_books_comments(ans.comments)\n self.clean_downloaded_metadata(ans)\n return ans\n # }}}\n\n def get_all_details( # {{{\n self,\n br,\n log,\n entries,\n abort,\n result_queue,\n timeout\n ):\n from lxml import etree\n for relevance, i in enumerate(entries):\n try:\n ans = self.postprocess_downloaded_google_metadata(to_metadata(br, log, i, timeout, self.running_a_test), relevance)\n if isinstance(ans, Metadata):\n result_queue.put(ans)\n except Exception:\n log.exception(\n 'Failed to get metadata for identify entry:', etree.tostring(i)\n )\n if abort.is_set():\n break\n\n # }}}\n\n def identify_via_web_search( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from calibre.utils.filenames import ascii_text\n isbn = check_isbn(identifiers.get('isbn', None))\n q = []\n strip_punc_pat = regex.compile(r'[\\p{C}|\\p{M}|\\p{P}|\\p{S}|\\p{Z}]+', regex.UNICODE)\n google_ids = []\n check_tokens = set()\n has_google_id = 'google' in identifiers\n\n def to_check_tokens(*tokens):\n for t in tokens:\n if len(t) < 3:\n continue\n t = t.lower()\n if t in ('and', 'not', 'the'):\n continue\n yield ascii_text(strip_punc_pat.sub('', t))\n\n if has_google_id:\n google_ids.append(identifiers['google'])\n elif isbn is not None:\n q.append(isbn)\n elif title or authors:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += title_tokens\n check_tokens |= set(to_check_tokens(*title_tokens))\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += author_tokens\n check_tokens |= set(to_check_tokens(*author_tokens))\n if not q and not google_ids:\n return None\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n br = se.google_specialize_browser(se.browser())\n if not has_google_id:\n url = se.google_format_query(q, tbm='bks')\n log('Making query:', url)\n r = []\n root = se.query(br, url, 'google', timeout=timeout, save_raw=r.append)\n pat = re.compile(r'id=([^&]+)')\n for q in se.google_parse_results(root, r[0], log=log, ignore_uncached=False):\n m = pat.search(q.url)\n if m is None or not q.url.startswith('https://books.google'):\n continue\n google_ids.append(m.group(1))\n\n if not google_ids and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n found = False\n seen = set()\n for relevance, gid in enumerate(google_ids):\n if gid in seen:\n continue\n seen.add(gid)\n try:\n ans = to_metadata(br, log, gid, timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n if isbn:\n if isbn not in ans.all_isbns:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the ISBN:', isbn,\n 'not in', ' '.join(ans.all_isbns))\n continue\n elif check_tokens:\n candidate = set(to_check_tokens(*self.get_title_tokens(ans.title)))\n candidate |= set(to_check_tokens(*self.get_author_tokens(ans.authors)))\n if candidate.intersection(check_tokens) != check_tokens:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the query')\n continue\n ans = self.postprocess_downloaded_google_metadata(ans, relevance)\n result_queue.put(ans)\n found = True\n except:\n log.exception('Failed to get metadata for google books id:', gid)\n if abort.is_set():\n break\n if not found and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n # }}}\n\n def identify( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from lxml import etree\n entry = XPath('//atom:entry')\n identifiers = identifiers.copy()\n br = self.browser\n if 'google' in identifiers:\n try:\n ans = to_metadata(br, log, identifiers['google'], timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n self.postprocess_downloaded_google_metadata(ans)\n result_queue.put(ans)\n return\n except Exception:\n log.exception('Failed to get metadata for Google identifier:', identifiers['google'])\n del identifiers['google']\n\n query = self.create_query(\n title=title, authors=authors, identifiers=identifiers\n )\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n\n def make_query(query):\n log('Making query:', query)\n try:\n raw = br.open_novisit(query, timeout=timeout).read()\n except Exception as e:\n log.exception('Failed to make identify query: %r' % query)\n return False, as_unicode(e)\n\n try:\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return True, entry(feed)\n except Exception as e:\n log.exception('Failed to parse identify results')\n return False, as_unicode(e)\n ok, entries = make_query(query)\n if not ok:\n return entries\n if not entries and not abort.is_set():\n log('No results found, doing a web search instead')\n return self.identify_via_web_search(log, result_queue, abort, title, authors, identifiers, timeout)\n\n # There is no point running these queries in threads as google\n # throttles requests returning 403 Forbidden errors\n self.get_all_details(br, log, entries, abort, result_queue, timeout)\n\n # }}}\n\n\nif __name__ == '__main__': # tests {{{\n # To run these test use:\n # calibre-debug src/calibre/ebooks/metadata/sources/google.py\n from calibre.ebooks.metadata.sources.test import authors_test, test_identify_plugin, title_test\n tests = [\n ({\n 'identifiers': {'google': 's7NIrgEACAAJ'},\n }, [title_test('Ride Every Stride', exact=False)]),\n\n ({\n 'identifiers': {'isbn': '0743273567'},\n 'title': 'Great Gatsby',\n 'authors': ['Fitzgerald']\n }, [\n title_test('The great gatsby', exact=True),\n authors_test(['F. Scott Fitzgerald'])\n ]),\n\n ({\n 'title': 'Flatland',\n 'authors': ['Abbott']\n }, [title_test('Flatland', exact=False)]),\n\n ({\n 'title': 'The Blood Red Indian Summer: A Berger and Mitry Mystery',\n 'authors': ['David Handler'],\n }, [title_test('The Blood Red Indian Summer: A Berger and Mitry Mystery')\n ]),\n\n ({\n # requires using web search to find the book\n 'title': 'Dragon Done It',\n 'authors': ['Eric Flint'],\n }, [\n title_test('The dragon done it', exact=True),\n authors_test(['Eric Flint', 'Mike Resnick'])\n ]),\n\n ]\n test_identify_plugin(GoogleBooks.name, tests[:])\n\n# }}}\n",
+ "google_images": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nfrom collections import OrderedDict\n\nfrom calibre import random_user_agent\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef imgurl_from_id(raw, tbnid):\n from json import JSONDecoder\n q = '\"{}\",['.format(tbnid)\n start_pos = raw.index(q)\n if start_pos < 100:\n return\n jd = JSONDecoder()\n data = jd.raw_decode('[' + raw[start_pos:])[0]\n # from pprint import pprint\n # pprint(data)\n url_num = 0\n for x in data:\n if isinstance(x, list) and len(x) == 3:\n q = x[0]\n if hasattr(q, 'lower') and q.lower().startswith('http'):\n url_num += 1\n if url_num > 1:\n return q\n\n\nclass GoogleImages(Source):\n\n name = 'Google Images'\n version = (1, 0, 5)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from a Google Image search. Useful to find larger/alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n supports_gzip_transfer_encoding = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the Google search result')),\n Option('size', 'choices', 'svga', _('Cover size'),\n _('Search for covers larger than the specified size'),\n choices=OrderedDict((\n ('any', _('Any size'),),\n ('l', _('Large'),),\n ('qsvga', _('Larger than %s')%'400x300',),\n ('vga', _('Larger than %s')%'640x480',),\n ('svga', _('Larger than %s')%'600x800',),\n ('xga', _('Larger than %s')%'1024x768',),\n ('2mp', _('Larger than %s')%'2 MP',),\n ('4mp', _('Larger than %s')%'4 MP',),\n ))),\n )\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n timeout = max(60, timeout) # Needs at least a minute\n title = ' '.join(self.get_title_tokens(title))\n author = ' '.join(self.get_author_tokens(authors))\n urls = self.get_image_urls(title, author, log, abort, timeout)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n @property\n def user_agent(self):\n return random_user_agent(allow_ie=False)\n\n def get_image_urls(self, title, author, log, abort, timeout):\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n from collections import OrderedDict\n ans = OrderedDict()\n br = self.browser\n q = urlencode({'as_q': ('%s %s'%(title, author)).encode('utf-8')})\n if isinstance(q, bytes):\n q = q.decode('utf-8')\n sz = self.prefs['size']\n if sz == 'any':\n sz = ''\n elif sz == 'l':\n sz = 'isz:l,'\n else:\n sz = 'isz:lt,islt:%s,' % sz\n # See https://www.google.com/advanced_image_search to understand this\n # URL scheme\n url = 'https://www.google.com/search?as_st=y&tbm=isch&{}&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs={}iar:t,ift:jpg'.format(q, sz)\n log('Search URL: ' + url)\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n br.set_simple_cookie('CONSENT', 'PENDING+987', '.google.com', path='/')\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n from base64 import standard_b64encode\n from datetime import date\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n br.set_simple_cookie('SOCS', standard_b64encode(template).decode('ascii').rstrip('='), '.google.com', path='/')\n # br.set_debug_http(True)\n raw = clean_ascii_chars(br.open(url).read().decode('utf-8'))\n # with open('/t/raw.html', 'w') as f:\n # f.write(raw)\n root = parse_html(raw)\n results = root.xpath('//div/@data-tbnid') # could also use data-id\n # from calibre.utils.ipython import ipython\n # ipython({'root': root, 'raw': raw, 'url': url, 'results': results})\n for tbnid in results:\n try:\n imgurl = imgurl_from_id(raw, tbnid)\n except Exception:\n continue\n if imgurl:\n ans[imgurl] = True\n return list(ans)\n\n\ndef test():\n try:\n from queue import Queue\n except ImportError:\n from Queue import Queue\n from threading import Event\n\n from calibre.utils.logging import default_log\n p = GoogleImages(None)\n p.log = default_log\n rq = Queue()\n p.download_cover(default_log, rq, Event(), title='The Heroes',\n authors=('Joe Abercrombie',))\n print('Downloaded', rq.qsize(), 'covers')\n\nif __name__ == '__main__':\n test()\n",
"hashes": {
- "amazon": "e2dc988ace313e5689de47912c4c1446e2311868",
- "big_book_search": "9b468ff223b7ddbf6bbd26e58194c0fa8fbbfb69",
- "edelweiss": "efd8f281a56435895b7916f85598d469bb53bb02",
- "google": "bfe34ba5e1be36511f2228a350bd91c676724aac",
- "google_images": "3323061049afe11a42422f325783de220991149d",
+ "amazon": "5562fc28b52557096628c7c1b8e21bb5de6e8c2d",
+ "big_book_search": "7a8b67c0f19ecbfe8a9d28b961aab1119f31c3e3",
+ "edelweiss": "a8ec3d6919265c52d896d4688e366302495cc525",
+ "google": "dd793082f1ba0aba3157197487aae8f147cf05cf",
+ "google_images": "d1caecef58d7198d8bd5620e27ea53c7ae167e40",
"openlibrary": "8707d3b3161de476b46ed967dea1116707dcfb0a",
- "search_engines": "52a24c5004033fc9f393a260a09e6f8afb80b0ba"
+ "search_engines": "63d2c158b5e9bd108c94773b68c784b05895b5f6"
},
"openlibrary": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2011, Kovid Goyal '\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\nclass OpenLibrary(Source):\n\n name = 'Open Library'\n version = (1, 0, 0)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from The Open Library')\n\n capabilities = frozenset(['cover'])\n\n OPENLIBRARY = 'https://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false'\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if 'isbn' not in identifiers:\n return\n isbn = identifiers['isbn']\n br = self.browser\n try:\n ans = br.open_novisit(self.OPENLIBRARY%isbn, timeout=timeout).read()\n result_queue.put((self, ans))\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('No cover for ISBN: %r found'%isbn)\n else:\n log.exception('Failed to download cover for ISBN:', isbn)\n",
- "search_engines": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: GPLv3 Copyright: 2017, Kovid Goyal \n\nfrom __future__ import absolute_import, division, print_function, unicode_literals\nimport json\nimport os\nimport re\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\nfrom threading import Lock\n\ntry:\n from urllib.parse import parse_qs, quote_plus, unquote, urlencode, quote\nexcept ImportError:\n from urlparse import parse_qs\n from urllib import quote_plus, urlencode, unquote, quote\n\nfrom lxml import etree\n\nfrom calibre import browser as _browser, prints, random_user_agent\nfrom calibre.constants import cache_dir\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.utils.lock import ExclusiveFile\nfrom calibre.utils.random_ua import accept_header_for_ua\n\ncurrent_version = (1, 2, 0)\nminimum_calibre_version = (2, 80, 0)\nwebcache = {}\nwebcache_lock = Lock()\n\n\nResult = namedtuple('Result', 'url title cached_url')\n\n\n@contextmanager\ndef rate_limit(name='test', time_between_visits=2, max_wait_seconds=5 * 60, sleep_time=0.2):\n lock_file = os.path.join(cache_dir(), 'search-engine.' + name + '.lock')\n with ExclusiveFile(lock_file, timeout=max_wait_seconds, sleep_time=sleep_time) as f:\n try:\n lv = float(f.read().decode('utf-8').strip())\n except Exception:\n lv = 0\n # we cannot use monotonic() as this is cross process and historical\n # data as well\n delta = time.time() - lv\n if delta < time_between_visits:\n time.sleep(time_between_visits - delta)\n try:\n yield\n finally:\n f.seek(0)\n f.truncate()\n f.write(repr(time.time()).encode('utf-8'))\n\n\ndef tostring(elem):\n return etree.tostring(elem, encoding='unicode', method='text', with_tail=False)\n\n\ndef browser():\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n br = _browser(user_agent=ua)\n br.set_handle_gzip(True)\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n return br\n\n\ndef encode_query(**query):\n q = {k.encode('utf-8'): v.encode('utf-8') for k, v in query.items()}\n return urlencode(q).decode('utf-8')\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef query(br, url, key, dump_raw=None, limit=1, parser=parse_html, timeout=60, save_raw=None, simple_scraper=None):\n with rate_limit(key):\n if simple_scraper is None:\n raw = br.open_novisit(url, timeout=timeout).read()\n raw = xml_to_unicode(raw, strip_encoding_pats=True)[0]\n else:\n raw = simple_scraper(url, timeout=timeout)\n if dump_raw is not None:\n with open(dump_raw, 'w') as f:\n f.write(raw)\n if save_raw is not None:\n save_raw(raw)\n return parser(raw)\n\n\ndef quote_term(x):\n ans = quote_plus(x.encode('utf-8'))\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans\n\n\n# DDG + Wayback machine {{{\n\n\ndef ddg_url_processor(url):\n return url\n\n\ndef ddg_term(t):\n t = t.replace('\"', '')\n if t.lower() in {'map', 'news'}:\n t = '\"' + t + '\"'\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef ddg_href(url):\n if url.startswith('/'):\n q = url.partition('?')[2]\n url = parse_qs(q.encode('utf-8'))['uddg'][0].decode('utf-8')\n return url\n\n\ndef wayback_machine_cached_url(url, br=None, log=prints, timeout=60):\n q = quote_term(url)\n br = br or browser()\n data = query(br, 'https://archive.org/wayback/available?url=' +\n q, 'wayback', parser=json.loads, limit=0.25, timeout=timeout)\n try:\n closest = data['archived_snapshots']['closest']\n if closest['available']:\n return closest['url'].replace('http:', 'https:')\n except Exception:\n pass\n from pprint import pformat\n log('Response from wayback machine:', pformat(data))\n\n\ndef wayback_url_processor(url):\n if url.startswith('/'):\n # Use original URL instead of absolutizing to wayback URL as wayback is\n # slow\n m = re.search('https?:', url)\n if m is None:\n url = 'https://web.archive.org' + url\n else:\n url = url[m.start():]\n return url\n\n\ndef ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n # https://duck.co/help/results/syntax\n terms = [quote_term(ddg_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://duckduckgo.com/html/?q={q}&kp={kp}'.format(\n q=q, kp=1 if safe_search else -1)\n log('Making ddg query: ' + url)\n br = br or browser()\n root = query(br, url, 'ddg', dump_raw, timeout=timeout)\n ans = []\n for a in root.xpath('//*[@class=\"results\"]//*[@class=\"result__title\"]/a[@href and @class=\"result__a\"]'):\n try:\n ans.append(Result(ddg_href(a.get('href')), tostring(a), None))\n except KeyError:\n log('Failed to find ddg href in:', a.get('href'))\n return ans, url\n\n\ndef ddg_develop():\n br = browser()\n for result in ddg_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', get_cached_url(result.url, br))\n print()\n# }}}\n\n# Bing {{{\n\n\ndef bing_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef bing_url_processor(url):\n return url\n\n\ndef bing_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60, show_user_agent=False):\n # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm\n terms = [quote_term(bing_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.bing.com/search?q={q}'.format(q=q)\n log('Making bing query: ' + url)\n br = br or browser()\n br.addheaders = [x for x in br.addheaders if x[0].lower() != 'user-agent']\n ua = ''\n from calibre.utils.random_ua import random_common_chrome_user_agent\n while not ua or 'Edg/' in ua:\n ua = random_common_chrome_user_agent()\n if show_user_agent:\n print('User-agent:', ua)\n br.addheaders.append(('User-agent', ua))\n\n root = query(br, url, 'bing', dump_raw, timeout=timeout)\n ans = []\n for li in root.xpath('//*[@id=\"b_results\"]/li[@class=\"b_algo\"]'):\n a = li.xpath('descendant::h2/a[@href]') or li.xpath('descendant::div[@class=\"b_algoheader\"]/a[@href]')\n a = a[0]\n title = tostring(a)\n try:\n div = li.xpath('descendant::div[@class=\"b_attribution\" and @u]')[0]\n except IndexError:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n d, w = div.get('u').split('|')[-2:]\n cached_url = 'https://cc.bingj.com/cache.aspx?q={q}&d={d}&mkt=en-US&setlang=en-US&w={w}'.format(\n q=q, d=d, w=w)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans, url\n\n\ndef bing_develop():\n for result in bing_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', show_user_agent=True)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n# Google {{{\n\n\ndef google_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef google_url_processor(url):\n return url\n\n\ndef google_get_cached_url(url, br=None, log=prints, timeout=60):\n ourl = url\n if not isinstance(url, bytes):\n url = url.encode('utf-8')\n cu = quote(url, safe='')\n if isinstance(cu, bytes):\n cu = cu.decode('utf-8')\n cached_url = 'https://webcache.googleusercontent.com/search?q=cache:' + cu\n br = google_specialize_browser(br or browser())\n try:\n raw = query(br, cached_url, 'google-cache', parser=lambda x: x.encode('utf-8'), timeout=timeout)\n except Exception as err:\n log('Failed to get cached URL from google for URL: {} with error: {}'.format(ourl, err))\n else:\n with webcache_lock:\n webcache[cached_url] = raw\n return cached_url\n\n\ndef google_extract_cache_urls(raw):\n if isinstance(raw, bytes):\n raw = raw.decode('utf-8', 'replace')\n pat = re.compile(r'\\\\x22(https://webcache\\.googleusercontent\\.com/.+?)\\\\x22')\n upat = re.compile(r'\\\\\\\\u([0-9a-fA-F]{4})')\n cache_pat = re.compile('cache:([^:]+):(.+)')\n\n def urepl(m):\n return chr(int(m.group(1), 16))\n\n seen = set()\n ans = {}\n for m in pat.finditer(raw):\n cache_url = upat.sub(urepl, m.group(1))\n m = cache_pat.search(cache_url)\n cache_id, src_url = m.group(1), m.group(2)\n if cache_id in seen:\n continue\n seen.add(cache_id)\n src_url = src_url.split('+')[0]\n src_url = unquote(src_url)\n ans[src_url] = cache_url\n return ans\n\n\ndef google_parse_results(root, raw, log=prints, ignore_uncached=True):\n cache_url_map = google_extract_cache_urls(raw)\n # print('\\n'.join(cache_url_map))\n ans = []\n for div in root.xpath('//*[@id=\"search\"]//*[@id=\"rso\"]//div[descendant::h3]'):\n try:\n a = div.xpath('descendant::a[@href]')[0]\n except IndexError:\n log('Ignoring div with no main result link')\n continue\n title = tostring(a)\n src_url = a.get('href')\n if src_url in cache_url_map:\n cached_url = cache_url_map[src_url]\n else:\n try:\n c = div.xpath('descendant::*[@role=\"menuitem\"]//a[@class=\"fl\"]')[0]\n except IndexError:\n if ignore_uncached:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n c = {'href': ''}\n cached_url = c.get('href')\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans\n\n\ndef google_specialize_browser(br):\n with webcache_lock:\n if not hasattr(br, 'google_consent_cookie_added'):\n br.set_simple_cookie('CONSENT', 'YES+', '.google.com', path='/')\n br.google_consent_cookie_added = True\n return br\n\n\ndef google_format_query(terms, site=None, tbm=None):\n terms = [quote_term(google_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.google.com/search?q={q}'.format(q=q)\n if tbm:\n url += '&tbm=' + tbm\n return url\n\n\ndef google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n url = google_format_query(terms, site)\n log('Making google query: ' + url)\n br = google_specialize_browser(br or browser())\n r = []\n root = query(br, url, 'google', dump_raw, timeout=timeout, save_raw=r.append)\n return google_parse_results(root, r[0], log=log), url\n\n\ndef google_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = google_parse_results(parse_html(raw), raw)\n else:\n br = browser()\n results = google_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\ndef get_cached_url(url, br=None, log=prints, timeout=60):\n return google_get_cached_url(url, br, log, timeout) or wayback_machine_cached_url(url, br, log, timeout)\n\n\ndef get_data_for_cached_url(url):\n with webcache_lock:\n return webcache.get(url)\n\n\ndef resolve_url(url):\n prefix, rest = url.partition(':')[::2]\n if prefix == 'bing':\n return bing_url_processor(rest)\n if prefix == 'wayback':\n return wayback_url_processor(rest)\n return url\n\n\n# if __name__ == '__main__':\n# import sys\n# func = sys.argv[-1]\n# globals()[func]()\n"
+ "search_engines": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: GPLv3 Copyright: 2017, Kovid Goyal \n\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport json\nimport os\nimport re\nimport sys\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\nfrom functools import partial\nfrom threading import Lock\n\ntry:\n from urllib.parse import parse_qs, quote, quote_plus, urlencode, urlparse\nexcept ImportError:\n from urllib import quote, quote_plus, urlencode\n\n from urlparse import parse_qs, urlparse\n\nfrom lxml import etree\n\nfrom calibre import browser as _browser\nfrom calibre import prints as safe_print\nfrom calibre import random_user_agent\nfrom calibre.constants import cache_dir\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.utils.lock import ExclusiveFile\nfrom calibre.utils.random_ua import accept_header_for_ua\n\ncurrent_version = (1, 2, 5)\nminimum_calibre_version = (2, 80, 0)\nwebcache = {}\nwebcache_lock = Lock()\nprints = partial(safe_print, file=sys.stderr)\n\n\nResult = namedtuple('Result', 'url title cached_url')\n\n\n@contextmanager\ndef rate_limit(name='test', time_between_visits=2, max_wait_seconds=5 * 60, sleep_time=0.2):\n lock_file = os.path.join(cache_dir(), 'search-engine.' + name + '.lock')\n with ExclusiveFile(lock_file, timeout=max_wait_seconds, sleep_time=sleep_time) as f:\n try:\n lv = float(f.read().decode('utf-8').strip())\n except Exception:\n lv = 0\n # we cannot use monotonic() as this is cross process and historical\n # data as well\n delta = time.time() - lv\n if delta < time_between_visits:\n time.sleep(time_between_visits - delta)\n try:\n yield\n finally:\n f.seek(0)\n f.truncate()\n f.write(repr(time.time()).encode('utf-8'))\n\n\ndef tostring(elem):\n return etree.tostring(elem, encoding='unicode', method='text', with_tail=False)\n\n\ndef browser():\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n br = _browser(user_agent=ua)\n br.set_handle_gzip(True)\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n return br\n\n\ndef encode_query(**query):\n q = {k.encode('utf-8'): v.encode('utf-8') for k, v in query.items()}\n return urlencode(q).decode('utf-8')\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef query(br, url, key, dump_raw=None, limit=1, parser=parse_html, timeout=60, save_raw=None, simple_scraper=None):\n with rate_limit(key):\n if simple_scraper is None:\n raw = br.open_novisit(url, timeout=timeout).read()\n raw = xml_to_unicode(raw, strip_encoding_pats=True)[0]\n else:\n raw = simple_scraper(url, timeout=timeout)\n if dump_raw is not None:\n with open(dump_raw, 'w') as f:\n f.write(raw)\n if save_raw is not None:\n save_raw(raw)\n return parser(raw)\n\n\ndef quote_term(x):\n ans = quote_plus(x.encode('utf-8'))\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans\n\n\n# DDG + Wayback machine {{{\n\n\ndef ddg_url_processor(url):\n return url\n\n\ndef ddg_term(t):\n t = t.replace('\"', '')\n if t.lower() in {'map', 'news'}:\n t = '\"' + t + '\"'\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef ddg_href(url):\n if url.startswith('/'):\n q = url.partition('?')[2]\n url = parse_qs(q.encode('utf-8'))['uddg'][0].decode('utf-8')\n return url\n\n\ndef wayback_machine_cached_url(url, br=None, log=prints, timeout=60):\n q = quote_term(url)\n br = br or browser()\n data = query(br, 'https://archive.org/wayback/available?url=' +\n q, 'wayback', parser=json.loads, limit=0.25, timeout=timeout)\n try:\n closest = data['archived_snapshots']['closest']\n if closest['available']:\n ans = closest['url'].replace('http:', 'https:', 1)\n # get unmodified HTML\n ans = ans.replace(closest['timestamp'], closest['timestamp'] + 'id_', 1)\n return ans\n except Exception:\n pass\n from pprint import pformat\n log('Response from wayback machine:', pformat(data))\n\n\ndef wayback_url_processor(url):\n if url.startswith('/'):\n # Use original URL instead of absolutizing to wayback URL as wayback is\n # slow\n m = re.search('https?:', url)\n if m is None:\n url = 'https://web.archive.org' + url\n else:\n url = url[m.start():]\n return url\n\n\nddg_scraper_storage = []\n\n\ndef ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n # https://duck.co/help/results/syntax\n terms = [quote_term(ddg_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://duckduckgo.com/html/?q={q}&kp={kp}'.format(\n q=q, kp=1 if safe_search else -1)\n log('Making ddg query: ' + url)\n from calibre.scraper.simple import read_url\n br = br or browser()\n root = query(br, url, 'ddg', dump_raw, timeout=timeout, simple_scraper=partial(read_url, ddg_scraper_storage))\n ans = []\n for a in root.xpath('//*[@class=\"results\"]//*[@class=\"result__title\"]/a[@href and @class=\"result__a\"]'):\n try:\n ans.append(Result(ddg_href(a.get('href')), tostring(a), None))\n except KeyError:\n log('Failed to find ddg href in:', a.get('href'))\n return ans, url\n\n\ndef ddg_develop():\n br = browser()\n for result in ddg_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', get_cached_url(result.url, br))\n print()\n# }}}\n\n# Bing {{{\n\n\ndef bing_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef bing_url_processor(url):\n return url\n\n\ndef bing_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60, show_user_agent=False):\n # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm\n terms = [quote_term(bing_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.bing.com/search?q={q}'.format(q=q)\n log('Making bing query: ' + url)\n br = br or browser()\n br.addheaders = [x for x in br.addheaders if x[0].lower() != 'user-agent']\n ua = ''\n from calibre.utils.random_ua import random_common_chrome_user_agent\n while not ua or 'Edg/' in ua:\n ua = random_common_chrome_user_agent()\n if show_user_agent:\n print('User-agent:', ua)\n br.addheaders.append(('User-agent', ua))\n\n root = query(br, url, 'bing', dump_raw, timeout=timeout)\n ans = []\n for li in root.xpath('//*[@id=\"b_results\"]/li[@class=\"b_algo\"]'):\n a = li.xpath('descendant::h2/a[@href]') or li.xpath('descendant::div[@class=\"b_algoheader\"]/a[@href]')\n a = a[0]\n title = tostring(a)\n try:\n div = li.xpath('descendant::div[@class=\"b_attribution\" and @u]')[0]\n except IndexError:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n d, w = div.get('u').split('|')[-2:]\n cached_url = 'https://cc.bingj.com/cache.aspx?q={q}&d={d}&mkt=en-US&setlang=en-US&w={w}'.format(\n q=q, d=d, w=w)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans, url\n\n\ndef bing_develop():\n for result in bing_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', show_user_agent=True)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n# Google {{{\n\n\ndef google_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef google_url_processor(url):\n return url\n\n\ndef google_cache_url_for_url(url):\n if not isinstance(url, bytes):\n url = url.encode('utf-8')\n cu = quote(url, safe='')\n if isinstance(cu, bytes):\n cu = cu.decode('utf-8')\n return 'https://webcache.googleusercontent.com/search?q=cache:' + cu\n\n\ndef google_get_cached_url(url, br=None, log=prints, timeout=60):\n cached_url = google_cache_url_for_url(url)\n br = google_specialize_browser(br or browser())\n try:\n raw = query(br, cached_url, 'google-cache', parser=lambda x: x.encode('utf-8'), timeout=timeout)\n except Exception as err:\n log('Failed to get cached URL from google for URL: {} with error: {}'.format(url, err))\n else:\n with webcache_lock:\n webcache[cached_url] = raw\n return cached_url\n\n\ndef canonicalize_url_for_cache_map(url):\n try:\n purl = urlparse(url)\n except Exception:\n return url\n if '.amazon.' in purl.netloc:\n url = url.split('&', 1)[0]\n return url\n\n\ndef google_parse_results(root, raw, log=prints, ignore_uncached=True):\n ans = []\n seen = set()\n for div in root.xpath('//*[@id=\"search\"]//*[@id=\"rso\"]//div[descendant::h3]'):\n try:\n a = div.xpath('descendant::a[@href]')[0]\n except IndexError:\n log('Ignoring div with no main result link')\n continue\n title = tostring(a)\n src_url = a.get('href')\n # print(f'{src_url=}')\n curl = canonicalize_url_for_cache_map(src_url)\n if curl in seen:\n continue\n seen.add(curl)\n cached_url = google_cache_url_for_url(curl)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans\n\n\ndef google_consent_cookies():\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n from base64 import standard_b64encode\n from datetime import date\n base = {'domain': '.google.com', 'path': '/'}\n b = base.copy()\n b['name'], b['value'] = 'CONSENT', 'PENDING+987'\n yield b\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n b = base.copy()\n b['name'], b['value'] = 'SOCS', standard_b64encode(template).decode('ascii').rstrip('=')\n yield b\n\n\ndef google_specialize_browser(br):\n with webcache_lock:\n if not hasattr(br, 'google_consent_cookie_added'):\n for c in google_consent_cookies():\n br.set_simple_cookie(c['name'], c['value'], c['domain'], path=c['path'])\n br.google_consent_cookie_added = True\n return br\n\n\ndef is_probably_book_asin(t):\n return t and len(t) == 10 and t.startswith('B') and t.upper() == t\n\n\ndef is_asin_or_isbn(t):\n from calibre.ebooks.metadata import check_isbn\n return bool(check_isbn(t) or is_probably_book_asin(t))\n\n\ndef google_format_query(terms, site=None, tbm=None):\n prevent_spelling_correction = False\n for t in terms:\n if is_asin_or_isbn(t):\n prevent_spelling_correction = True\n break\n terms = [quote_term(google_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.google.com/search?q={q}'.format(q=q)\n if tbm:\n url += '&tbm=' + tbm\n if prevent_spelling_correction:\n url += '&nfpr=1'\n return url\n\n\ndef google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n url = google_format_query(terms, site)\n log('Making google query: ' + url)\n br = google_specialize_browser(br or browser())\n r = []\n root = query(br, url, 'google', dump_raw, timeout=timeout, save_raw=r.append)\n return google_parse_results(root, r[0], log=log), url\n\n\ndef google_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = google_parse_results(parse_html(raw), raw)\n else:\n br = browser()\n results = google_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\ndef get_cached_url(url, br=None, log=prints, timeout=60):\n return google_get_cached_url(url, br, log, timeout) or wayback_machine_cached_url(url, br, log, timeout)\n\n\ndef get_data_for_cached_url(url):\n with webcache_lock:\n return webcache.get(url)\n\n\ndef resolve_url(url):\n prefix, rest = url.partition(':')[::2]\n if prefix == 'bing':\n return bing_url_processor(rest)\n if prefix == 'wayback':\n return wayback_url_processor(rest)\n return url\n\n\n# if __name__ == '__main__':\n# import sys\n# func = sys.argv[-1]\n# globals()[func]()\n"
}
\ No newline at end of file
diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/__init__.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/__init__.cpython-311.pyc
index 4e68432a38fda12fb9e13685c3c4334ab212391f..f9a61551ba1e8a4e2bf9877455da3c3fed971ca2 100644
GIT binary patch
delta 21
bcmZ1#wJM5dIWI340}y;p=S227>?q
delta 23
dcmZqcW@_tZ;#tni%f$c$pXU^$Zse(I1prSs2OaPDV+PXJP72NwVU
diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_rand.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_rand.cpython-311.pyc
index 06ea41a46752abe529710f1e02c68b81f631b6ad..799852ffe9c9965ba51b182d8bfead61c687987c 100644
GIT binary patch
delta 21
bcmcc1bC-u_IWI340}y;p=S
diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/keys.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/keys.cpython-311.pyc
index f9cf06e30ee39e225b038623df59601d50d7d5cb..1e101d5327b8c5a50f1e867edda2b850592b2137 100644
GIT binary patch
delta 21
bcmey!_K}TeIWI340}y;p=Syh4~~IWI340}y;p=Syh4~~IWI340}yIWI340}y;p=S-W(vjYG(2L*rt
delta 20
acmX@Yc!ZH>IWI340}yP8;1Yye*62W$WU
diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/util.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/util.cpython-311.pyc
index 37d4c4c58076d7f472590a0614d7f5f357a40425..5ceda6b3f9572e4a58eb34e0430700a5e352fbde 100644
GIT binary patch
delta 20
acmeBi=yBj#&dbZi00f`YInx&MC;$LAD+LAs
delta 20
acmeBi=yBj#&dbZi00f`s6r?WXQ2+osXa%7F
diff --git a/arch-config/.config/calibre/plugins/KFX Input.zip b/arch-config/.config/calibre/plugins/KFX Input.zip
index 450f49c1b3588a528dfbb63043881f350ddafbdb..7ad1f36874893931bc0157ceb4baa1c6376d876f 100644
GIT binary patch
delta 242928
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