summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FILES.byname569
-rw-r--r--FILES.byname.gzbin2559770 -> 2560107 bytes
-rw-r--r--FILES.last07days371
-rw-r--r--biblio/ctan-bibdata/ctan.bib71
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3729762 -> 3728095 bytes
-rw-r--r--dviware/dvisvgm/Makefile.in2
-rw-r--r--dviware/dvisvgm/NEWS16
-rw-r--r--dviware/dvisvgm/aminclude_static.am2
-rwxr-xr-xdviware/dvisvgm/configure22
-rw-r--r--dviware/dvisvgm/configure.ac4
-rw-r--r--dviware/dvisvgm/doc/conf-dblatex-man.xsl26
-rw-r--r--dviware/dvisvgm/doc/conf-dblatex-pdf.xsl112
-rw-r--r--dviware/dvisvgm/doc/dvisvgm.152
-rw-r--r--dviware/dvisvgm/doc/dvisvgm.txt.in26
-rw-r--r--dviware/dvisvgm/doc/tweak-db-refentry.xsl84
-rw-r--r--dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl42
-rw-r--r--dviware/dvisvgm/libs/brotli/Makefile.am5
-rw-r--r--dviware/dvisvgm/libs/brotli/Makefile.in41
-rw-r--r--dviware/dvisvgm/libs/brotli/common/constants.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/common/constants.h3
-rw-r--r--dviware/dvisvgm/libs/brotli/common/context.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/common/dictionary.c8
-rw-r--r--dviware/dvisvgm/libs/brotli/common/platform.c3
-rw-r--r--dviware/dvisvgm/libs/brotli/common/platform.h173
-rw-r--r--dviware/dvisvgm/libs/brotli/common/shared_dictionary_internal.h75
-rw-r--r--dviware/dvisvgm/libs/brotli/common/transform.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/common/version.h37
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/backward_references.c100
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/backward_references.h9
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c200
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h11
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h36
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/bit_cost.c15
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/bit_cost.h9
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/block_splitter.c51
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/block_splitter.h9
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h131
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c242
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h17
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/cluster.c19
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/cluster.h13
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/cluster_inc.h45
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/command.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/command.h9
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compound_dictionary.c207
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compound_dictionary.h74
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compress_fragment.c176
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compress_fragment.h39
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c186
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h24
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c4
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/encode.c875
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/encoder_dict.c615
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/encoder_dict.h120
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/entropy_encode.c5
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/entropy_encode.h3
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h7
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/fast_log.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/fast_log.h3
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/find_match_length.h37
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash.h330
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h37
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h38
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h73
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h16
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h8
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h8
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h11
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/histogram.c8
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/histogram.h13
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/literal_cost.c35
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/literal_cost.h6
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/memory.c34
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/memory.h21
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/metablock.c130
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/metablock.h17
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/metablock_inc.h14
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/params.h7
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/prefix.h5
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/quality.h43
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/ringbuffer.h7
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/state.h104
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/static_dict.c64
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/static_dict.h5
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h2
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/utf8_util.c2
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/utf8_util.h3
-rw-r--r--dviware/dvisvgm/libs/brotli/enc/write_bits.h3
-rw-r--r--dviware/dvisvgm/libs/brotli/include/brotli/decode.h69
-rw-r--r--dviware/dvisvgm/libs/brotli/include/brotli/encode.h57
-rw-r--r--dviware/dvisvgm/libs/brotli/include/brotli/port.h39
-rw-r--r--dviware/dvisvgm/libs/brotli/include/brotli/shared_dictionary.h100
-rw-r--r--dviware/dvisvgm/libs/xxHash/xxh3.h2
-rw-r--r--dviware/dvisvgm/libs/xxHash/xxhash.c2
-rw-r--r--dviware/dvisvgm/libs/xxHash/xxhash.h2960
-rw-r--r--dviware/dvisvgm/src/Font.cpp15
-rw-r--r--dviware/dvisvgm/src/Makefile.am3
-rw-r--r--dviware/dvisvgm/src/Makefile.in13
-rw-r--r--dviware/dvisvgm/src/PSFilter.hpp41
-rw-r--r--dviware/dvisvgm/src/PSInterpreter.cpp23
-rw-r--r--dviware/dvisvgm/src/PSInterpreter.hpp2
-rw-r--r--dviware/dvisvgm/src/PSPreviewHandler.cpp (renamed from dviware/dvisvgm/src/PSPreviewFilter.cpp)85
-rw-r--r--dviware/dvisvgm/src/PSPreviewHandler.hpp (renamed from dviware/dvisvgm/src/PSPreviewFilter.hpp)25
-rw-r--r--dviware/dvisvgm/src/PsSpecialHandler.cpp22
-rw-r--r--dviware/dvisvgm/src/PsSpecialHandler.hpp6
-rw-r--r--dviware/dvisvgm/src/SVGCharPathHandler.cpp4
-rw-r--r--dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp1
-rw-r--r--dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp56
-rw-r--r--dviware/dvisvgm/src/options.xml386
-rw-r--r--dviware/dvisvgm/src/psdefs.cpp253
-rw-r--r--dviware/dvisvgm/src/utility.cpp7
-rw-r--r--dviware/dvisvgm/src/utility.hpp2
-rw-r--r--dviware/dvisvgm/tests/UtilityTest.cpp3
-rw-r--r--dviware/dvisvgm/tests/normalize.xsl220
-rw-r--r--fonts/newtx/README6
-rw-r--r--fonts/newtx/afm/TeXGyreTermesX-Slanted.afm10311
-rw-r--r--fonts/newtx/afm/ztmrsl.afm36
-rw-r--r--fonts/newtx/opentype/TeXGyreTermesX-Slanted.otfbin237316 -> 240740 bytes
-rw-r--r--fonts/newtx/tex/newtxtext.sty4
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfmbin7480 -> 1716 bytes
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfmbin3272 -> 1176 bytes
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfmbin11592 -> 1708 bytes
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfmbin7448 -> 1688 bytes
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfmbin3240 -> 1144 bytes
-rw-r--r--fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfmbin11564 -> 1680 bytes
-rw-r--r--fonts/newtx/type1/ztmrsl.pfbbin299848 -> 303768 bytes
-rw-r--r--macros/generic/tex-ini-files/README.md3
-rw-r--r--macros/generic/tex-ini-files/latex.ini24
-rw-r--r--macros/generic/tex-ini-files/mllatex.ini5
-rw-r--r--macros/generic/tex-ini-files/pdflatex.ini6
-rw-r--r--macros/generic/tex-ini-files/pdfxmltex.ini10
-rw-r--r--macros/generic/tex-ini-files/xmltex.ini9
-rw-r--r--macros/latex/contrib/expex-glossonly/README.md2
-rw-r--r--macros/latex/contrib/expex-glossonly/expex-glossonly.pdfbin39048 -> 52949 bytes
-rw-r--r--macros/latex/contrib/expex-glossonly/expex-glossonly.sty16
-rw-r--r--macros/latex/contrib/expex-glossonly/expex-glossonly.tex26
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdfbin7800 -> 7800 bytes
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex3
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdfbin5519 -> 5519 bytes
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex4
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdfbin4720 -> 5438 bytes
-rw-r--r--macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex28
-rw-r--r--macros/latex/contrib/ipsum/doc/ipsum-doc.pdfbin169604 -> 171078 bytes
-rw-r--r--macros/latex/contrib/ipsum/doc/ipsum-doc.tex12
-rw-r--r--macros/latex/contrib/ipsum/tex/ipsum.sty5
-rw-r--r--macros/latex/contrib/ukbill/immigration-bill.pdfbin85008 -> 85004 bytes
-rw-r--r--macros/latex/contrib/ukbill/ukbill-documentation.pdfbin98445 -> 98484 bytes
-rw-r--r--macros/latex/contrib/ukbill/ukbill-documentation.tex30
-rw-r--r--macros/latex/contrib/ukbill/ukbill.cls7
-rw-r--r--macros/latex/contrib/unbtex/README.md12
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example.pdfbin995822 -> 592016 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example.tex34
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex2
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex6
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex6
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex6
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex281
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex39
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex24
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdfbin5714 -> 12666 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.epsbin0 -> 81892 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdfbin13087 -> 38806 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdfbin6905 -> 17972 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/curva_diodo.pdfbin7406 -> 0 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdfbin0 -> 17610 bytes
-rw-r--r--macros/latex/contrib/unbtex/unbtex-example/references.bib2
-rw-r--r--macros/latex/contrib/unbtex/unbtex.cls166
-rw-r--r--macros/latex/contrib/unbtex/unbtexcite-en.bst13
-rw-r--r--macros/latex/contrib/unbtex/unbtexcite-pt.bst10
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdfbin0 -> 95511 bytes
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex27
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdfbin0 -> 94207 bytes
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex27
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdfbin0 -> 87323 bytes
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex27
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdfbin492397 -> 465893 bytes
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex8
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdfbin606805 -> 607723 bytes
-rw-r--r--macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex93
-rw-r--r--macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty261
-rw-r--r--macros/latex/contrib/xcolor/ChangeLog5
-rw-r--r--macros/latex/contrib/xcolor/README.md2
-rw-r--r--macros/latex/contrib/xcolor/xcolor.dtx45
-rw-r--r--macros/latex/contrib/xcolor/xcolor.pdfbin863950 -> 864842 bytes
-rw-r--r--macros/latex/contrib/xcolor/xcolor2.pdfbin91691 -> 91845 bytes
-rw-r--r--support/texshop/README.txt2
-rw-r--r--support/texshop/texshop521.html32
-rw-r--r--support/texshop/texshop522.html51
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl6
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb505
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc16
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2487400 -> 2487400 bytes
-rw-r--r--timestamp2
195 files changed, 13498 insertions, 9248 deletions
diff --git a/FILES.byname b/FILES.byname
index 5ca9c8a016..dc79de75eb 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -2063,12 +2063,12 @@
2023/10/05 | 1710 | biblio/citation-style-language/README.md
2023/10/05 | 12878 | biblio/citation-style-language/vancouver.csl
2023/10/05 | 4531754 | biblio/citation-style-language.zip
-2023/11/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/11/15 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2023/11/14 | 2828497 | biblio/ctan-bibdata/ctan.bib
-2023/11/14 | 3729762 | biblio/ctan-bibdata/ctan.pdf
+2023/11/15 | 2828646 | biblio/ctan-bibdata/ctan.bib
+2023/11/15 | 3728095 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2023/11/14 | 4134851 | biblio/ctan-bibdata.zip
+2023/11/15 | 4133286 | biblio/ctan-bibdata.zip
2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk
2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -3889,125 +3889,130 @@
1990/10/02 | 159 | dviware/dvisun/makefile
1990/10/02 | 280 | dviware/dvisun/README
2019/06/09 | 55720 | dviware/dvisun.zip
-2023/07/05 | 61535 | dviware/dvisvgm/aclocal.m4
-2023/07/05 | 6749 | dviware/dvisvgm/aminclude_static.am
+2023/10/12 | 61535 | dviware/dvisvgm/aclocal.m4
+2023/10/12 | 6749 | dviware/dvisvgm/aminclude_static.am
2023/02/24 | 5875 | dviware/dvisvgm/ar-lib
2022/10/13 | 576 | dviware/dvisvgm/AUTHORS
2023/02/24 | 7400 | dviware/dvisvgm/compile
2023/02/24 | 49797 | dviware/dvisvgm/config.guess
-2023/07/05 | 4521 | dviware/dvisvgm/config.h.in
+2023/10/12 | 4521 | dviware/dvisvgm/config.h.in
2023/02/24 | 35409 | dviware/dvisvgm/config.sub
-2023/07/05 | 704223 | dviware/dvisvgm/configure
-2023/07/05 | 8307 | dviware/dvisvgm/configure.ac
+2023/10/12 | 704246 | dviware/dvisvgm/configure
+2023/10/12 | 8312 | dviware/dvisvgm/configure.ac
2022/10/13 | 35147 | dviware/dvisvgm/COPYING
2023/02/24 | 23568 | dviware/dvisvgm/depcomp
-2023/01/17 | 718 | dviware/dvisvgm/doc/conf-dblatex-man.xsl
-2023/01/17 | 2618 | dviware/dvisvgm/doc/conf-dblatex-pdf.xsl
-2023/07/06 | 73654 | dviware/dvisvgm/doc/dvisvgm.1
-2023/07/05 | 66640 | dviware/dvisvgm/doc/dvisvgm.txt.in
+2023/08/14 | 738 | dviware/dvisvgm/doc/conf-dblatex-man.xsl
+2023/08/14 | 2711 | dviware/dvisvgm/doc/conf-dblatex-pdf.xsl
+2023/10/12 | 74048 | dviware/dvisvgm/doc/dvisvgm.1
+2023/10/12 | 67008 | dviware/dvisvgm/doc/dvisvgm.txt.in
2022/10/13 | 840 | dviware/dvisvgm/doc/generate-dvisvgm-sty.xsl
2023/01/17 | 3692 | dviware/dvisvgm/doc/Makefile.am
-2023/07/05 | 21501 | dviware/dvisvgm/doc/Makefile.in
-2023/01/17 | 1041 | dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl
+2023/10/12 | 21501 | dviware/dvisvgm/doc/Makefile.in
+2023/08/14 | 1078 | dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl
2022/10/13 | 717 | dviware/dvisvgm/doc/tweak-dblatex-tex.py
-2023/01/17 | 1698 | dviware/dvisvgm/doc/tweak-db-refentry.xsl
+2023/08/14 | 1783 | dviware/dvisvgm/doc/tweak-db-refentry.xsl
2022/10/13 | 9236 | dviware/dvisvgm/INSTALL
2023/02/24 | 15358 | dviware/dvisvgm/install-sh
2023/01/10 | 25426 | dviware/dvisvgm/libs/boost/boost-vectorstream.hpp
2023/01/10 | 1338 | dviware/dvisvgm/libs/boost/LICENSE.txt
2023/01/10 | 89 | dviware/dvisvgm/libs/boost/Makefile.am
-2023/07/05 | 15731 | dviware/dvisvgm/libs/boost/Makefile.in
+2023/10/12 | 15731 | dviware/dvisvgm/libs/boost/Makefile.in
2023/01/10 | 479 | dviware/dvisvgm/libs/boost/vectorstream.hpp
-2022/10/13 | 623 | dviware/dvisvgm/libs/brotli/common/constants.c
-2022/10/13 | 8012 | dviware/dvisvgm/libs/brotli/common/constants.h
-2022/10/13 | 7967 | dviware/dvisvgm/libs/brotli/common/context.c
+2023/08/31 | 621 | dviware/dvisvgm/libs/brotli/common/constants.c
+2023/08/31 | 8011 | dviware/dvisvgm/libs/brotli/common/constants.h
+2023/08/31 | 7965 | dviware/dvisvgm/libs/brotli/common/context.c
2022/10/13 | 4666 | dviware/dvisvgm/libs/brotli/common/context.h
-2022/10/13 | 471957 | dviware/dvisvgm/libs/brotli/common/dictionary.c
+2023/08/31 | 472009 | dviware/dvisvgm/libs/brotli/common/dictionary.c
2022/10/13 | 1951 | dviware/dvisvgm/libs/brotli/common/dictionary.h
-2022/10/13 | 514 | dviware/dvisvgm/libs/brotli/common/platform.c
-2022/10/13 | 21522 | dviware/dvisvgm/libs/brotli/common/platform.h
-2022/10/13 | 10679 | dviware/dvisvgm/libs/brotli/common/transform.c
+2023/08/31 | 513 | dviware/dvisvgm/libs/brotli/common/platform.c
+2023/08/31 | 18811 | dviware/dvisvgm/libs/brotli/common/platform.h
+2023/08/31 | 2413 | dviware/dvisvgm/libs/brotli/common/shared_dictionary_internal.h
+2023/08/31 | 10677 | dviware/dvisvgm/libs/brotli/common/transform.c
2022/10/13 | 3209 | dviware/dvisvgm/libs/brotli/common/transform.h
-2022/10/13 | 871 | dviware/dvisvgm/libs/brotli/common/version.h
-2022/10/13 | 4001 | dviware/dvisvgm/libs/brotli/enc/backward_references.c
-2022/10/13 | 1306 | dviware/dvisvgm/libs/brotli/enc/backward_references.h
-2022/10/13 | 32486 | dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c
-2022/10/13 | 3875 | dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h
-2022/10/13 | 6914 | dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h
-2022/10/13 | 824 | dviware/dvisvgm/libs/brotli/enc/bit_cost.c
-2022/10/13 | 1680 | dviware/dvisvgm/libs/brotli/enc/bit_cost.h
+2023/08/31 | 1723 | dviware/dvisvgm/libs/brotli/common/version.h
+2023/08/31 | 5673 | dviware/dvisvgm/libs/brotli/enc/backward_references.c
+2023/08/31 | 1301 | dviware/dvisvgm/libs/brotli/enc/backward_references.h
+2023/08/31 | 36639 | dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c
+2023/08/31 | 3868 | dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h
+2023/08/31 | 8181 | dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h
+2023/08/31 | 813 | dviware/dvisvgm/libs/brotli/enc/bit_cost.c
+2023/08/31 | 1685 | dviware/dvisvgm/libs/brotli/enc/bit_cost.h
2022/10/13 | 4109 | dviware/dvisvgm/libs/brotli/enc/bit_cost_inc.h
2022/10/13 | 1137 | dviware/dvisvgm/libs/brotli/enc/block_encoder_inc.h
-2022/10/13 | 6260 | dviware/dvisvgm/libs/brotli/enc/block_splitter.c
-2022/10/13 | 1679 | dviware/dvisvgm/libs/brotli/enc/block_splitter.h
-2022/10/13 | 16811 | dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h
-2022/10/13 | 49657 | dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c
-2022/10/13 | 3371 | dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h
-2022/10/13 | 1500 | dviware/dvisvgm/libs/brotli/enc/cluster.c
-2022/10/13 | 1033 | dviware/dvisvgm/libs/brotli/enc/cluster.h
-2022/10/13 | 11560 | dviware/dvisvgm/libs/brotli/enc/cluster_inc.h
-2022/10/13 | 1021 | dviware/dvisvgm/libs/brotli/enc/command.c
-2022/10/13 | 6897 | dviware/dvisvgm/libs/brotli/enc/command.h
-2022/10/13 | 32374 | dviware/dvisvgm/libs/brotli/enc/compress_fragment.c
-2022/10/13 | 2825 | dviware/dvisvgm/libs/brotli/enc/compress_fragment.h
-2022/10/13 | 25772 | dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c
-2022/10/13 | 2407 | dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h
-2022/10/13 | 147104 | dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c
+2023/08/31 | 7395 | dviware/dvisvgm/libs/brotli/enc/block_splitter.c
+2023/08/31 | 1674 | dviware/dvisvgm/libs/brotli/enc/block_splitter.h
+2023/08/31 | 18673 | dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h
+2023/08/31 | 50750 | dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c
+2023/08/31 | 3477 | dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h
+2023/08/31 | 1485 | dviware/dvisvgm/libs/brotli/enc/cluster.c
+2023/08/31 | 1024 | dviware/dvisvgm/libs/brotli/enc/cluster.h
+2023/08/31 | 11826 | dviware/dvisvgm/libs/brotli/enc/cluster_inc.h
+2023/08/31 | 1019 | dviware/dvisvgm/libs/brotli/enc/command.c
+2023/08/31 | 6892 | dviware/dvisvgm/libs/brotli/enc/command.h
+2023/08/31 | 6645 | dviware/dvisvgm/libs/brotli/enc/compound_dictionary.c
+2023/08/31 | 2493 | dviware/dvisvgm/libs/brotli/enc/compound_dictionary.h
+2023/08/31 | 33255 | dviware/dvisvgm/libs/brotli/enc/compress_fragment.c
+2023/08/31 | 3598 | dviware/dvisvgm/libs/brotli/enc/compress_fragment.h
+2023/08/31 | 27182 | dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c
+2023/08/31 | 2879 | dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h
+2023/08/31 | 147154 | dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c
2022/10/13 | 646 | dviware/dvisvgm/libs/brotli/enc/dictionary_hash.h
-2022/10/13 | 73998 | dviware/dvisvgm/libs/brotli/enc/encode.c
-2022/10/13 | 949 | dviware/dvisvgm/libs/brotli/enc/encoder_dict.c
-2022/10/13 | 1155 | dviware/dvisvgm/libs/brotli/enc/encoder_dict.h
-2022/10/13 | 14585 | dviware/dvisvgm/libs/brotli/enc/entropy_encode.c
-2022/10/13 | 4056 | dviware/dvisvgm/libs/brotli/enc/entropy_encode.h
-2022/10/13 | 32900 | dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h
-2022/10/13 | 6026 | dviware/dvisvgm/libs/brotli/enc/fast_log.c
-2022/10/13 | 1649 | dviware/dvisvgm/libs/brotli/enc/fast_log.h
-2022/10/13 | 2533 | dviware/dvisvgm/libs/brotli/enc/find_match_length.h
-2022/10/13 | 4415 | dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h
-2022/10/13 | 10861 | dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h
-2022/10/13 | 14944 | dviware/dvisvgm/libs/brotli/enc/hash.h
-2022/10/13 | 10481 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h
-2022/10/13 | 10054 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h
-2022/10/13 | 9310 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h
-2022/10/13 | 7196 | dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h
-2022/10/13 | 13035 | dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h
-2022/10/13 | 3227 | dviware/dvisvgm/libs/brotli/enc/histogram.c
-2022/10/13 | 1884 | dviware/dvisvgm/libs/brotli/enc/histogram.h
+2023/08/31 | 77437 | dviware/dvisvgm/libs/brotli/enc/encode.c
+2023/08/31 | 23281 | dviware/dvisvgm/libs/brotli/enc/encoder_dict.c
+2023/08/31 | 5046 | dviware/dvisvgm/libs/brotli/enc/encoder_dict.h
+2023/08/31 | 14584 | dviware/dvisvgm/libs/brotli/enc/entropy_encode.c
+2023/08/31 | 4057 | dviware/dvisvgm/libs/brotli/enc/entropy_encode.h
+2023/08/31 | 32951 | dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h
+2023/08/31 | 6024 | dviware/dvisvgm/libs/brotli/enc/fast_log.c
+2023/08/31 | 1650 | dviware/dvisvgm/libs/brotli/enc/fast_log.h
+2023/08/31 | 2194 | dviware/dvisvgm/libs/brotli/enc/find_match_length.h
+2023/08/31 | 5097 | dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h
+2023/08/31 | 10971 | dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h
+2023/08/31 | 24214 | dviware/dvisvgm/libs/brotli/enc/hash.h
+2023/08/31 | 10134 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h
+2023/08/31 | 9991 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h
+2023/08/31 | 9340 | dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h
+2023/08/31 | 7226 | dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h
+2023/08/31 | 13081 | dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h
+2023/08/31 | 3229 | dviware/dvisvgm/libs/brotli/enc/histogram.c
+2023/08/31 | 1875 | dviware/dvisvgm/libs/brotli/enc/histogram.h
2022/10/13 | 1401 | dviware/dvisvgm/libs/brotli/enc/histogram_inc.h
-2022/10/13 | 5614 | dviware/dvisvgm/libs/brotli/enc/literal_cost.c
-2022/10/13 | 892 | dviware/dvisvgm/libs/brotli/enc/literal_cost.h
-2022/10/13 | 4887 | dviware/dvisvgm/libs/brotli/enc/memory.c
-2022/10/13 | 3595 | dviware/dvisvgm/libs/brotli/enc/memory.h
-2022/10/13 | 26199 | dviware/dvisvgm/libs/brotli/enc/metablock.c
-2022/10/13 | 3994 | dviware/dvisvgm/libs/brotli/enc/metablock.h
-2022/10/13 | 7557 | dviware/dvisvgm/libs/brotli/enc/metablock_inc.h
-2022/10/13 | 1138 | dviware/dvisvgm/libs/brotli/enc/params.h
-2022/10/13 | 1970 | dviware/dvisvgm/libs/brotli/enc/prefix.h
-2022/10/13 | 6165 | dviware/dvisvgm/libs/brotli/enc/quality.h
-2022/10/13 | 6012 | dviware/dvisvgm/libs/brotli/enc/ringbuffer.h
-2022/10/13 | 19012 | dviware/dvisvgm/libs/brotli/enc/static_dict.c
-2022/10/13 | 1276 | dviware/dvisvgm/libs/brotli/enc/static_dict.h
-2022/10/13 | 469658 | dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h
-2022/10/13 | 2271 | dviware/dvisvgm/libs/brotli/enc/utf8_util.c
-2022/10/13 | 904 | dviware/dvisvgm/libs/brotli/enc/utf8_util.h
-2022/10/13 | 2861 | dviware/dvisvgm/libs/brotli/enc/write_bits.h
-2022/10/13 | 14323 | dviware/dvisvgm/libs/brotli/include/brotli/decode.h
-2022/10/13 | 17361 | dviware/dvisvgm/libs/brotli/include/brotli/encode.h
-2022/10/13 | 10712 | dviware/dvisvgm/libs/brotli/include/brotli/port.h
+2023/08/31 | 5839 | dviware/dvisvgm/libs/brotli/enc/literal_cost.c
+2023/08/31 | 916 | dviware/dvisvgm/libs/brotli/enc/literal_cost.h
+2023/08/31 | 5630 | dviware/dvisvgm/libs/brotli/enc/memory.c
+2023/08/31 | 4358 | dviware/dvisvgm/libs/brotli/enc/memory.h
+2023/08/31 | 26698 | dviware/dvisvgm/libs/brotli/enc/metablock.c
+2023/08/31 | 4012 | dviware/dvisvgm/libs/brotli/enc/metablock.h
+2023/08/31 | 7642 | dviware/dvisvgm/libs/brotli/enc/metablock_inc.h
+2023/08/31 | 1169 | dviware/dvisvgm/libs/brotli/enc/params.h
+2023/08/31 | 1969 | dviware/dvisvgm/libs/brotli/enc/prefix.h
+2023/08/31 | 7592 | dviware/dvisvgm/libs/brotli/enc/quality.h
+2023/08/31 | 6009 | dviware/dvisvgm/libs/brotli/enc/ringbuffer.h
+2023/08/31 | 3040 | dviware/dvisvgm/libs/brotli/enc/state.h
+2023/08/31 | 21117 | dviware/dvisvgm/libs/brotli/enc/static_dict.c
+2023/08/31 | 1275 | dviware/dvisvgm/libs/brotli/enc/static_dict.h
+2023/08/31 | 469710 | dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h
+2023/08/31 | 2269 | dviware/dvisvgm/libs/brotli/enc/utf8_util.c
+2023/08/31 | 905 | dviware/dvisvgm/libs/brotli/enc/utf8_util.h
+2023/08/31 | 2862 | dviware/dvisvgm/libs/brotli/enc/write_bits.h
+2023/08/31 | 16886 | dviware/dvisvgm/libs/brotli/include/brotli/decode.h
+2023/08/31 | 19841 | dviware/dvisvgm/libs/brotli/include/brotli/encode.h
+2023/08/31 | 11439 | dviware/dvisvgm/libs/brotli/include/brotli/port.h
+2023/08/31 | 3535 | dviware/dvisvgm/libs/brotli/include/brotli/shared_dictionary.h
2022/10/13 | 2615 | dviware/dvisvgm/libs/brotli/include/brotli/types.h
2022/10/13 | 1084 | dviware/dvisvgm/libs/brotli/LICENSE
-2022/12/14 | 1975 | dviware/dvisvgm/libs/brotli/Makefile.am
-2023/07/05 | 33459 | dviware/dvisvgm/libs/brotli/Makefile.in
+2023/08/31 | 2125 | dviware/dvisvgm/libs/brotli/Makefile.am
+2023/10/12 | 34222 | dviware/dvisvgm/libs/brotli/Makefile.in
2022/10/13 | 132235 | dviware/dvisvgm/libs/clipper/clipper.cpp
2022/10/13 | 15879 | dviware/dvisvgm/libs/clipper/clipper.hpp
2022/10/13 | 1374 | dviware/dvisvgm/libs/clipper/License.txt
2022/12/14 | 179 | dviware/dvisvgm/libs/clipper/Makefile.am
-2023/07/05 | 20441 | dviware/dvisvgm/libs/clipper/Makefile.in
+2023/10/12 | 20441 | dviware/dvisvgm/libs/clipper/Makefile.in
2023/02/24 | 570 | dviware/dvisvgm/libs/defs.am
2023/01/17 | 239 | dviware/dvisvgm/libs/Makefile.am
-2023/07/05 | 20058 | dviware/dvisvgm/libs/Makefile.in
+2023/10/12 | 20058 | dviware/dvisvgm/libs/Makefile.in
2023/02/24 | 123 | dviware/dvisvgm/libs/md5/Makefile.am
-2023/07/05 | 19467 | dviware/dvisvgm/libs/md5/Makefile.in
+2023/10/12 | 19467 | dviware/dvisvgm/libs/md5/Makefile.in
2022/10/13 | 8743 | dviware/dvisvgm/libs/md5/md5.c
2022/10/13 | 1426 | dviware/dvisvgm/libs/md5/md5.h
2022/10/13 | 2146 | dviware/dvisvgm/libs/potrace/auxiliary.h
@@ -4019,7 +4024,7 @@
2022/10/13 | 442 | dviware/dvisvgm/libs/potrace/decompose.h
2022/10/13 | 11118 | dviware/dvisvgm/libs/potrace/lists.h
2022/12/14 | 308 | dviware/dvisvgm/libs/potrace/Makefile.am
-2023/07/05 | 20887 | dviware/dvisvgm/libs/potrace/Makefile.in
+2023/10/12 | 20887 | dviware/dvisvgm/libs/potrace/Makefile.in
2022/10/13 | 3122 | dviware/dvisvgm/libs/potrace/potracelib.c
2022/10/13 | 4573 | dviware/dvisvgm/libs/potrace/potracelib.h
2022/10/13 | 2654 | dviware/dvisvgm/libs/potrace/progress.h
@@ -4028,14 +4033,14 @@
2022/10/13 | 102582 | dviware/dvisvgm/libs/variant/include/mpark/variant.hpp
2022/10/13 | 1338 | dviware/dvisvgm/libs/variant/LICENSE.md
2022/10/13 | 71 | dviware/dvisvgm/libs/variant/Makefile.am
-2023/07/05 | 15719 | dviware/dvisvgm/libs/variant/Makefile.in
+2023/10/12 | 15719 | dviware/dvisvgm/libs/variant/Makefile.in
2022/10/13 | 1171 | dviware/dvisvgm/libs/woff2/include/woff2/decode.h
2022/10/13 | 1434 | dviware/dvisvgm/libs/woff2/include/woff2/encode.h
2022/10/13 | 2304 | dviware/dvisvgm/libs/woff2/include/woff2/output.h
2022/10/13 | 131 | dviware/dvisvgm/libs/woff2/include/woff2/version.h
2022/10/13 | 11358 | dviware/dvisvgm/libs/woff2/LICENSE
2022/12/14 | 679 | dviware/dvisvgm/libs/woff2/Makefile.am
-2023/07/05 | 24766 | dviware/dvisvgm/libs/woff2/Makefile.in
+2023/10/12 | 24766 | dviware/dvisvgm/libs/woff2/Makefile.in
2022/10/13 | 4185 | dviware/dvisvgm/libs/woff2/src/buffer.h
2022/10/13 | 12155 | dviware/dvisvgm/libs/woff2/src/font.cc
2022/10/13 | 3509 | dviware/dvisvgm/libs/woff2/src/font.h
@@ -4057,10 +4062,10 @@
2022/10/13 | 15414 | dviware/dvisvgm/libs/woff2/src/woff2_enc.cc
2022/10/13 | 1543 | dviware/dvisvgm/libs/woff2/src/woff2_out.cc
2022/12/14 | 178 | dviware/dvisvgm/libs/xxHash/Makefile.am
-2023/07/05 | 19734 | dviware/dvisvgm/libs/xxHash/Makefile.in
-2022/10/13 | 2394 | dviware/dvisvgm/libs/xxHash/xxh3.h
-2022/10/13 | 1855 | dviware/dvisvgm/libs/xxHash/xxhash.c
-2022/10/13 | 209623 | dviware/dvisvgm/libs/xxHash/xxhash.h
+2023/10/12 | 19734 | dviware/dvisvgm/libs/xxHash/Makefile.in
+2023/08/14 | 2394 | dviware/dvisvgm/libs/xxHash/xxh3.h
+2023/08/14 | 1855 | dviware/dvisvgm/libs/xxHash/xxhash.c
+2023/08/14 | 253096 | dviware/dvisvgm/libs/xxHash/xxhash.h
2023/02/24 | 332808 | dviware/dvisvgm/ltmain.sh
2022/12/14 | 914 | dviware/dvisvgm/m4/ax_ac_append_to_file.m4
2022/12/14 | 905 | dviware/dvisvgm/m4/ax_ac_print_to_file.m4
@@ -4077,9 +4082,9 @@
2023/02/24 | 4395 | dviware/dvisvgm/m4/ltsugar.m4
2023/02/24 | 714 | dviware/dvisvgm/m4/ltversion.m4
2023/01/17 | 784 | dviware/dvisvgm/Makefile.am
-2023/07/05 | 36476 | dviware/dvisvgm/Makefile.in
+2023/10/12 | 36476 | dviware/dvisvgm/Makefile.in
2023/02/24 | 6878 | dviware/dvisvgm/missing
-2023/07/06 | 43187 | dviware/dvisvgm/NEWS
+2023/10/12 | 43936 | dviware/dvisvgm/NEWS
2023/03/07 | 5454 | dviware/dvisvgm/README
2023/01/17 | 158418 | dviware/dvisvgm/src/AGLTable.hpp
2023/01/17 | 15777 | dviware/dvisvgm/src/BasicDVIReader.cpp
@@ -4110,7 +4115,7 @@
2023/07/05 | 4845 | dviware/dvisvgm/src/Color.hpp
2023/04/25 | 4119 | dviware/dvisvgm/src/ColorSpecialHandler.cpp
2023/04/25 | 2180 | dviware/dvisvgm/src/ColorSpecialHandler.hpp
-2023/07/05 | 8100 | dviware/dvisvgm/src/CommandLine.hpp
+2023/08/29 | 8100 | dviware/dvisvgm/src/CommandLine.hpp
2023/01/17 | 3410 | dviware/dvisvgm/src/Directory.cpp
2023/01/17 | 2053 | dviware/dvisvgm/src/Directory.hpp
2023/01/17 | 2290 | dviware/dvisvgm/src/DLLoader.cpp
@@ -4143,7 +4148,7 @@
2023/01/17 | 1821 | dviware/dvisvgm/src/FixWord.hpp
2023/05/03 | 12509 | dviware/dvisvgm/src/FontCache.cpp
2023/01/17 | 2857 | dviware/dvisvgm/src/FontCache.hpp
-2023/05/10 | 23539 | dviware/dvisvgm/src/Font.cpp
+2023/10/12 | 23526 | dviware/dvisvgm/src/Font.cpp
2023/01/17 | 3488 | dviware/dvisvgm/src/FontEncoding.cpp
2023/01/17 | 2795 | dviware/dvisvgm/src/FontEncoding.hpp
2023/01/17 | 15229 | dviware/dvisvgm/src/FontEngine.cpp
@@ -4159,7 +4164,7 @@
2023/01/17 | 1633 | dviware/dvisvgm/src/fonts/Base14Fonts.hpp
2023/01/10 | 102294 | dviware/dvisvgm/src/fonts/Dingbats.cff.cpp
2023/01/10 | 524 | dviware/dvisvgm/src/fonts/Makefile.am
-2023/07/05 | 24613 | dviware/dvisvgm/src/fonts/Makefile.in
+2023/10/12 | 24613 | dviware/dvisvgm/src/fonts/Makefile.in
2023/01/10 | 213800 | dviware/dvisvgm/src/fonts/NimbusMonoPS-Bold.cff.cpp
2023/01/10 | 242499 | dviware/dvisvgm/src/fonts/NimbusMonoPS-BoldItalic.cff.cpp
2023/01/10 | 214886 | dviware/dvisvgm/src/fonts/NimbusMonoPS-Italic.cff.cpp
@@ -4207,8 +4212,8 @@
2023/01/17 | 4728 | dviware/dvisvgm/src/Length.cpp
2023/01/17 | 4138 | dviware/dvisvgm/src/Length.hpp
2023/01/17 | 2014 | dviware/dvisvgm/src/macros.hpp
-2023/05/10 | 7473 | dviware/dvisvgm/src/Makefile.am
-2023/07/05 | 56817 | dviware/dvisvgm/src/Makefile.in
+2023/08/30 | 7458 | dviware/dvisvgm/src/Makefile.am
+2023/10/12 | 56807 | dviware/dvisvgm/src/Makefile.in
2023/01/17 | 8515 | dviware/dvisvgm/src/MapLine.cpp
2023/01/17 | 3089 | dviware/dvisvgm/src/MapLine.hpp
2023/01/17 | 17194 | dviware/dvisvgm/src/Matrix.cpp
@@ -4230,17 +4235,17 @@
2023/01/17 | 3832 | dviware/dvisvgm/src/Opacity.hpp
2023/01/17 | 6685 | dviware/dvisvgm/src/optimizer/AttributeExtractor.cpp
2023/01/17 | 2656 | dviware/dvisvgm/src/optimizer/AttributeExtractor.hpp
-2023/01/17 | 3970 | dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp
+2023/08/14 | 4028 | dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp
2023/01/17 | 1979 | dviware/dvisvgm/src/optimizer/ClipPathReassigner.hpp
2023/01/17 | 4213 | dviware/dvisvgm/src/optimizer/DependencyGraph.hpp
2023/01/17 | 6760 | dviware/dvisvgm/src/optimizer/GroupCollapser.cpp
2023/01/17 | 2181 | dviware/dvisvgm/src/optimizer/GroupCollapser.hpp
2022/10/13 | 632 | dviware/dvisvgm/src/optimizer/Makefile.am
-2023/07/05 | 23307 | dviware/dvisvgm/src/optimizer/Makefile.in
+2023/10/12 | 23307 | dviware/dvisvgm/src/optimizer/Makefile.in
2023/01/17 | 1642 | dviware/dvisvgm/src/optimizer/OptimizerModule.hpp
2023/01/17 | 3192 | dviware/dvisvgm/src/optimizer/RedundantElementRemover.cpp
2023/01/17 | 1644 | dviware/dvisvgm/src/optimizer/RedundantElementRemover.hpp
-2023/05/19 | 4660 | dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp
+2023/10/12 | 5199 | dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp
2023/01/17 | 2297 | dviware/dvisvgm/src/optimizer/SVGOptimizer.hpp
2023/01/17 | 4160 | dviware/dvisvgm/src/optimizer/TextSimplifier.cpp
2023/01/17 | 1699 | dviware/dvisvgm/src/optimizer/TextSimplifier.hpp
@@ -4249,7 +4254,7 @@
2023/01/17 | 2013 | dviware/dvisvgm/src/optimizer/WSNodeRemover.cpp
2023/01/17 | 1687 | dviware/dvisvgm/src/optimizer/WSNodeRemover.hpp
2023/07/05 | 2065 | dviware/dvisvgm/src/options.dtd
-2023/07/05 | 9438 | dviware/dvisvgm/src/options.xml
+2023/08/14 | 10072 | dviware/dvisvgm/src/options.xml
2023/01/17 | 3731 | dviware/dvisvgm/src/PageRanges.cpp
2023/01/17 | 1729 | dviware/dvisvgm/src/PageRanges.hpp
2023/01/17 | 5330 | dviware/dvisvgm/src/PageSize.cpp
@@ -4271,16 +4276,15 @@
2023/01/17 | 1886 | dviware/dvisvgm/src/PreScanDVIReader.hpp
2023/06/19 | 13015 | dviware/dvisvgm/src/Process.cpp
2023/01/17 | 2324 | dviware/dvisvgm/src/Process.hpp
-2023/01/17 | 12876 | dviware/dvisvgm/src/psdefs.cpp
-2023/01/17 | 1806 | dviware/dvisvgm/src/PSFilter.hpp
-2023/01/17 | 17947 | dviware/dvisvgm/src/PSInterpreter.cpp
-2023/01/17 | 7111 | dviware/dvisvgm/src/PSInterpreter.hpp
+2023/08/29 | 12829 | dviware/dvisvgm/src/psdefs.cpp
+2023/08/30 | 17436 | dviware/dvisvgm/src/PSInterpreter.cpp
+2023/08/30 | 6989 | dviware/dvisvgm/src/PSInterpreter.hpp
2023/01/17 | 6500 | dviware/dvisvgm/src/PSPattern.cpp
2023/01/17 | 4059 | dviware/dvisvgm/src/PSPattern.hpp
-2023/01/17 | 4494 | dviware/dvisvgm/src/PSPreviewFilter.cpp
-2023/01/17 | 2605 | dviware/dvisvgm/src/PSPreviewFilter.hpp
-2023/05/19 | 52344 | dviware/dvisvgm/src/PsSpecialHandler.cpp
-2023/04/25 | 10905 | dviware/dvisvgm/src/PsSpecialHandler.hpp
+2023/08/30 | 4094 | dviware/dvisvgm/src/PSPreviewHandler.cpp
+2023/08/30 | 2353 | dviware/dvisvgm/src/PSPreviewHandler.hpp
+2023/08/30 | 52247 | dviware/dvisvgm/src/PsSpecialHandler.cpp
+2023/08/30 | 10898 | dviware/dvisvgm/src/PsSpecialHandler.hpp
2023/01/30 | 7061 | dviware/dvisvgm/src/RangeMap.cpp
2023/02/24 | 5199 | dviware/dvisvgm/src/RangeMap.hpp
2023/01/17 | 2871 | dviware/dvisvgm/src/ShadingPatch.cpp
@@ -4303,7 +4307,7 @@
2023/01/17 | 2024 | dviware/dvisvgm/src/SVGCharHandlerFactory.cpp
2023/01/17 | 1645 | dviware/dvisvgm/src/SVGCharHandlerFactory.hpp
2023/01/17 | 4533 | dviware/dvisvgm/src/SVGCharHandler.hpp
-2023/07/05 | 5972 | dviware/dvisvgm/src/SVGCharPathHandler.cpp
+2023/10/12 | 6019 | dviware/dvisvgm/src/SVGCharPathHandler.cpp
2023/01/17 | 2455 | dviware/dvisvgm/src/SVGCharPathHandler.hpp
2023/07/05 | 3993 | dviware/dvisvgm/src/SVGCharTspanTextHandler.cpp
2023/01/17 | 2041 | dviware/dvisvgm/src/SVGCharTspanTextHandler.hpp
@@ -4341,7 +4345,7 @@
2023/01/17 | 2367 | dviware/dvisvgm/src/ttf/HmtxTable.hpp
2023/01/17 | 2200 | dviware/dvisvgm/src/ttf/LocaTable.hpp
2023/01/10 | 688 | dviware/dvisvgm/src/ttf/Makefile.am
-2023/07/05 | 24195 | dviware/dvisvgm/src/ttf/Makefile.in
+2023/10/12 | 24195 | dviware/dvisvgm/src/ttf/Makefile.in
2023/01/17 | 2502 | dviware/dvisvgm/src/ttf/MaxpTable.cpp
2023/01/17 | 2086 | dviware/dvisvgm/src/ttf/MaxpTable.hpp
2023/01/17 | 3674 | dviware/dvisvgm/src/ttf/NameTable.cpp
@@ -4362,8 +4366,8 @@
2023/01/17 | 2278 | dviware/dvisvgm/src/ttf/VmtxTable.hpp
2023/01/17 | 10002 | dviware/dvisvgm/src/Unicode.cpp
2023/02/24 | 2020 | dviware/dvisvgm/src/Unicode.hpp
-2023/05/03 | 11456 | dviware/dvisvgm/src/utility.cpp
-2023/05/03 | 8387 | dviware/dvisvgm/src/utility.hpp
+2023/08/14 | 11643 | dviware/dvisvgm/src/utility.cpp
+2023/08/14 | 8416 | dviware/dvisvgm/src/utility.hpp
2023/01/17 | 3439 | dviware/dvisvgm/src/VectorIterator.hpp
2023/01/17 | 2949 | dviware/dvisvgm/src/VectorStream.hpp
2023/01/17 | 1577 | dviware/dvisvgm/src/version.hpp.in
@@ -4404,7 +4408,7 @@
2022/10/13 | 163979 | dviware/dvisvgm/tests/data/frktest-wf-cmp.svg
2022/10/13 | 63012 | dviware/dvisvgm/tests/data/lmmono12-regular.otf
2023/07/05 | 480 | dviware/dvisvgm/tests/data/Makefile.am
-2023/07/05 | 13894 | dviware/dvisvgm/tests/data/Makefile.in
+2023/10/12 | 13894 | dviware/dvisvgm/tests/data/Makefile.in
2023/05/10 | 12576 | dviware/dvisvgm/tests/data/omarab.ofm
2022/10/13 | 1207 | dviware/dvisvgm/tests/data/ot1.cmap
2022/10/13 | 1320 | dviware/dvisvgm/tests/data/sample.dvi
@@ -4473,11 +4477,11 @@
2023/05/10 | 4052 | dviware/dvisvgm/tests/JFMReaderTest.cpp
2023/01/17 | 7803 | dviware/dvisvgm/tests/LengthTest.cpp
2023/05/10 | 15928 | dviware/dvisvgm/tests/Makefile.am
-2023/07/05 | 263204 | dviware/dvisvgm/tests/Makefile.in
+2023/10/12 | 263204 | dviware/dvisvgm/tests/Makefile.in
2023/01/17 | 5795 | dviware/dvisvgm/tests/MapLineTest.cpp
2023/01/17 | 8332 | dviware/dvisvgm/tests/MatrixTest.cpp
2023/01/17 | 2315 | dviware/dvisvgm/tests/MessageExceptionTest.cpp
-2023/01/17 | 4799 | dviware/dvisvgm/tests/normalize.xsl
+2023/08/14 | 4987 | dviware/dvisvgm/tests/normalize.xsl
2023/05/10 | 4653 | dviware/dvisvgm/tests/OFMReaderTest.cpp
2023/01/17 | 5297 | dviware/dvisvgm/tests/PageRagesTest.cpp
2023/01/17 | 2398 | dviware/dvisvgm/tests/PageSizeTest.cpp
@@ -4503,12 +4507,12 @@
2023/01/17 | 13772 | dviware/dvisvgm/tests/TpicSpecialTest.cpp
2023/01/17 | 7066 | dviware/dvisvgm/tests/TriangularPatchTest.cpp
2023/01/17 | 6084 | dviware/dvisvgm/tests/UnicodeTest.cpp
-2023/05/03 | 7991 | dviware/dvisvgm/tests/UtilityTest.cpp
+2023/08/14 | 8053 | dviware/dvisvgm/tests/UtilityTest.cpp
2023/01/17 | 3785 | dviware/dvisvgm/tests/VectorIteratorTest.cpp
2023/01/17 | 2276 | dviware/dvisvgm/tests/VectorStreamTest.cpp
2023/01/17 | 15061 | dviware/dvisvgm/tests/XMLNodeTest.cpp
2023/01/17 | 3034 | dviware/dvisvgm/tests/XMLStringTest.cpp
-2023/07/07 | 3322263 | dviware/dvisvgm.zip
+2023/11/15 | 3354100 | dviware/dvisvgm.zip
1991/04/12 | 1728 | dviware/dvitops/aftopl.1
1991/04/12 | 12075 | dviware/dvitops/aftopl.c
1991/01/25 | 837 | dviware/dvitops/cms.h
@@ -5425,7 +5429,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2023/11/14 | 169412 | FILES.last07days
+2023/11/15 | 178830 | FILES.last07days
2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs
2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf
2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf
@@ -84978,7 +84982,7 @@
2018/10/20 | 4368 | fonts/newtx/afm/rtxbmi7.afm
2019/08/27 | 11387 | fonts/newtx/afm/stxscr.afm
2023/10/03 | 635532 | fonts/newtx/afm/TeXGyreTermesX-Regular.afm
-2022/01/08 | 623388 | fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
+2023/11/15 | 637754 | fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
2017/02/11 | 5019 | fonts/newtx/afm/txbexas.afm
2023/11/07 | 5909 | fonts/newtx/afm/txbex-bar.afm
2021/03/21 | 10301 | fonts/newtx/afm/txbexs.afm
@@ -85000,7 +85004,7 @@
2021/05/07 | 2313 | fonts/newtx/afm/ztmfigs-sl.afm
2023/09/20 | 635532 | fonts/newtx/afm/ztmr.afm
2023/09/26 | 499173 | fonts/newtx/afm/ztmri.afm
-2023/09/20 | 636149 | fonts/newtx/afm/ztmrsl.afm
+2023/11/15 | 637754 | fonts/newtx/afm/ztmrsl.afm
2016/10/07 | 3633 | fonts/newtx/afm/zxxbl7z.afm
2014/03/17 | 76404 | fonts/newtx/doc/implementation.pdf
2014/03/17 | 22096 | fonts/newtx/doc/implementation.tex
@@ -85092,8 +85096,8 @@
2023/09/20 | 219548 | fonts/newtx/opentype/TeXGyreTermesX-BoldSlanted.otf
2023/09/20 | 217888 | fonts/newtx/opentype/TeXGyreTermesX-Italic.otf
2023/10/29 | 226088 | fonts/newtx/opentype/TeXGyreTermesX-Regular.otf
-2023/09/20 | 237316 | fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
-2023/11/08 | 46702 | fonts/newtx/README
+2023/11/15 | 240740 | fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
+2023/11/15 | 46871 | fonts/newtx/README
2023/05/07 | 245268 | fonts/newtxsf/doc/newtxsf-doc.pdf
2023/05/07 | 6715 | fonts/newtxsf/doc/newtxsf-doc.tex
2014/09/30 | 43780 | fonts/newtxsf/doc/OFL-FAQ.txt
@@ -85147,7 +85151,7 @@
2023/11/06 | 141080 | fonts/newtx/tex/newtxmath.sty
2023/11/05 | 27779 | fonts/newtx/tex/newtx.sty
2020/12/19 | 144 | fonts/newtx/tex/newtx-subs.tex
-2023/11/08 | 29280 | fonts/newtx/tex/newtxtext.sty
+2023/11/15 | 29280 | fonts/newtx/tex/newtxtext.sty
2019/10/23 | 818 | fonts/newtx/tex/omlntxebgmi.fd
2016/10/07 | 1919 | fonts/newtx/tex/omlntxmi.fd
2018/04/27 | 781 | fonts/newtx/tex/omlntxstx2mi.fd
@@ -85694,12 +85698,12 @@
2022/05/19 | 7164 | fonts/newtx/tfm/ntxth-Italic-tlf-ly1.tfm
2022/05/19 | 3088 | fonts/newtx/tfm/ntxth-Italic-tlf-ot1.tfm
2022/05/19 | 11268 | fonts/newtx/tfm/ntxth-Italic-tlf-t1.tfm
-2022/05/19 | 7480 | fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
-2022/05/19 | 3272 | fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
-2022/05/19 | 11592 | fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
-2022/05/19 | 7448 | fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
-2022/05/19 | 3240 | fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
-2022/05/19 | 11564 | fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
+2023/11/15 | 1716 | fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
+2023/11/15 | 1176 | fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
+2023/11/15 | 1708 | fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
+2023/11/15 | 1688 | fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
+2023/11/15 | 1144 | fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
+2023/11/15 | 1680 | fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
2019/12/01 | 3340 | fonts/newtx/tfm/nxlbmi015.tfm
2019/12/01 | 3304 | fonts/newtx/tfm/nxlbmi017.tfm
2019/12/01 | 3344 | fonts/newtx/tfm/nxlbmi01.tfm
@@ -86076,7 +86080,7 @@
2021/05/07 | 8300 | fonts/newtx/type1/ztmfigs-sl.pfb
2023/10/04 | 248316 | fonts/newtx/type1/ztmri.pfb
2023/10/04 | 286816 | fonts/newtx/type1/ztmr.pfb
-2023/10/04 | 299848 | fonts/newtx/type1/ztmrsl.pfb
+2023/11/15 | 303768 | fonts/newtx/type1/ztmrsl.pfb
2012/10/07 | 9120 | fonts/newtx/type1/zxlr-5nums.pfb
2012/10/07 | 9095 | fonts/newtx/type1/zxlr-7nums.pfb
2016/07/03 | 40013 | fonts/newtx/type1/zxlri.pfb
@@ -86207,7 +86211,7 @@
2019/11/02 | 2656 | fonts/newtx/vf/zutbmi.vf
2021/03/22 | 2176 | fonts/newtx/vf/zutmia.vf
2019/11/02 | 2552 | fonts/newtx/vf/zutmi.vf
-2023/11/08 | 9655420 | fonts/newtx.zip
+2023/11/15 | 9648826 | fonts/newtx.zip
2005/10/24 | 6224 | fonts/niceframe/afm/bbding10.afm
2005/10/24 | 2299 | fonts/niceframe/afm/dingbat.afm
2005/10/24 | 9099 | fonts/niceframe/afm/karta15.afm
@@ -203745,16 +203749,21 @@
2008/11/11 | 892 | macros/generic/tex-ewd/README
2008/11/11 | 2266 | macros/generic/tex-ewd/t1.tex
2008/11/11 | 11709 | macros/generic/tex-ewd.zip
-2016/04/15 | 84 | macros/generic/tex-ini-files/dvilualatex.ini
-2016/04/15 | 82 | macros/generic/tex-ini-files/dviluatex.ini
-2016/04/15 | 667 | macros/generic/tex-ini-files/lualatex.ini
-2016/04/15 | 2036 | macros/generic/tex-ini-files/luatexconfig.tex
-2016/04/15 | 289 | macros/generic/tex-ini-files/luatex.ini
-2016/04/15 | 549 | macros/generic/tex-ini-files/pdftexconfig.tex
-2016/04/15 | 2034 | macros/generic/tex-ini-files/README.md
-2016/04/15 | 486 | macros/generic/tex-ini-files/xelatex.ini
-2016/04/15 | 3428 | macros/generic/tex-ini-files/xetex.ini
-2016/04/15 | 5783 | macros/generic/tex-ini-files.zip
+2023/11/15 | 84 | macros/generic/tex-ini-files/dvilualatex.ini
+2023/11/15 | 82 | macros/generic/tex-ini-files/dviluatex.ini
+2023/11/15 | 620 | macros/generic/tex-ini-files/latex.ini
+2023/11/15 | 667 | macros/generic/tex-ini-files/lualatex.ini
+2023/11/15 | 2036 | macros/generic/tex-ini-files/luatexconfig.tex
+2023/11/15 | 289 | macros/generic/tex-ini-files/luatex.ini
+2023/11/15 | 107 | macros/generic/tex-ini-files/mllatex.ini
+2023/11/15 | 130 | macros/generic/tex-ini-files/pdflatex.ini
+2023/11/15 | 549 | macros/generic/tex-ini-files/pdftexconfig.tex
+2023/11/15 | 243 | macros/generic/tex-ini-files/pdfxmltex.ini
+2023/11/15 | 2099 | macros/generic/tex-ini-files/README.md
+2023/11/15 | 486 | macros/generic/tex-ini-files/xelatex.ini
+2023/11/15 | 3428 | macros/generic/tex-ini-files/xetex.ini
+2023/11/15 | 160 | macros/generic/tex-ini-files/xmltex.ini
+2023/11/15 | 7283 | macros/generic/tex-ini-files.zip
2018/08/26 | 38 | macros/generic/tex-locale/CHANGES
2018/08/26 | 1109 | macros/generic/tex-locale/README
2018/08/26 | 91386 | macros/generic/tex-locale/samples/sample-locale2.pdf
@@ -221794,17 +221803,17 @@
2008/06/21 | 103808 | macros/latex/contrib/expdlist/expdlist.pdf
1999/09/23 | 2919 | macros/latex/contrib/expdlist/readme.txt
2008/06/23 | 157269 | macros/latex/contrib/expdlist.zip
-2023/08/17 | 39048 | macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
-2023/08/17 | 4393 | macros/latex/contrib/expex-glossonly/expex-glossonly.sty
-2023/08/17 | 7424 | macros/latex/contrib/expex-glossonly/expex-glossonly.tex
-2023/08/17 | 1107 | macros/latex/contrib/expex-glossonly/README.md
-2023/08/17 | 7800 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
-2023/08/17 | 420 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
-2023/08/17 | 5519 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
-2023/08/17 | 456 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
-2023/08/17 | 4720 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
-2023/08/17 | 316 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
-2023/08/17 | 60974 | macros/latex/contrib/expex-glossonly.zip
+2023/11/15 | 52949 | macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
+2023/11/15 | 4569 | macros/latex/contrib/expex-glossonly/expex-glossonly.sty
+2023/11/15 | 7510 | macros/latex/contrib/expex-glossonly/expex-glossonly.tex
+2023/11/15 | 1107 | macros/latex/contrib/expex-glossonly/README.md
+2023/11/15 | 7800 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
+2023/11/15 | 535 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
+2023/11/15 | 5519 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
+2023/11/15 | 567 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
+2023/11/15 | 5438 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
+2023/11/15 | 767 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
+2023/11/15 | 75830 | macros/latex/contrib/expex-glossonly.zip
2000/10/16 | 1067 | macros/latex/contrib/export/00readme
2000/10/16 | 14070 | macros/latex/contrib/export/dvipaste.sty
2000/10/16 | 28622 | macros/latex/contrib/export/export.dtx
@@ -226716,11 +226725,11 @@
2012/08/16 | 2265 | macros/latex/contrib/ionumbers/Makefile
2011/06/12 | 4247 | macros/latex/contrib/ionumbers/README
2014/04/15 | 497195 | macros/latex/contrib/ionumbers.zip
-2023/11/09 | 169604 | macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
-2023/11/09 | 5529 | macros/latex/contrib/ipsum/doc/ipsum-doc.tex
+2023/11/15 | 171078 | macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
+2023/11/15 | 5529 | macros/latex/contrib/ipsum/doc/ipsum-doc.tex
2023/11/07 | 461 | macros/latex/contrib/ipsum/README.md
-2023/11/09 | 50826 | macros/latex/contrib/ipsum/tex/ipsum.sty
-2023/11/09 | 183862 | macros/latex/contrib/ipsum.zip
+2023/11/15 | 50852 | macros/latex/contrib/ipsum/tex/ipsum.sty
+2023/11/15 | 185964 | macros/latex/contrib/ipsum.zip
2017/11/14 | 5128 | macros/latex/contrib/iscram/HMI.pdf
2017/11/14 | 3861 | macros/latex/contrib/iscram/iscram-class-doc.bib
2017/11/14 | 262899 | macros/latex/contrib/iscram/iscram-class-doc.pdf
@@ -242771,13 +242780,13 @@
2005/05/16 | 199744 | macros/latex/contrib/uiucthesis/uiucthesis.pdf
2005/05/16 | 17493 | macros/latex/contrib/uiucthesis/uiucthesis.sty
2005/05/17 | 256539 | macros/latex/contrib/uiucthesis.zip
-2022/12/13 | 85008 | macros/latex/contrib/ukbill/immigration-bill.pdf
+2023/11/15 | 85004 | macros/latex/contrib/ukbill/immigration-bill.pdf
2022/12/12 | 20454 | macros/latex/contrib/ukbill/immigration-bill.tex
2022/12/13 | 700 | macros/latex/contrib/ukbill/README
-2022/12/13 | 19557 | macros/latex/contrib/ukbill/ukbill.cls
-2022/12/13 | 98445 | macros/latex/contrib/ukbill/ukbill-documentation.pdf
-2022/12/13 | 26516 | macros/latex/contrib/ukbill/ukbill-documentation.tex
-2022/12/13 | 197186 | macros/latex/contrib/ukbill.zip
+2023/11/15 | 19586 | macros/latex/contrib/ukbill/ukbill.cls
+2023/11/15 | 98484 | macros/latex/contrib/ukbill/ukbill-documentation.pdf
+2023/11/15 | 26612 | macros/latex/contrib/ukbill/ukbill-documentation.tex
+2023/11/15 | 197151 | macros/latex/contrib/ukbill.zip
2020/01/10 | 546 | macros/latex/contrib/ulem/README
2020/01/10 | 13726 | macros/latex/contrib/ulem/ulem.ltx
2020/01/10 | 160373 | macros/latex/contrib/ulem/ulem.pdf
@@ -242882,33 +242891,35 @@
2014/04/21 | 351465 | macros/latex/contrib/unamth-template/tesis.pdf
2014/04/21 | 5583 | macros/latex/contrib/unamth-template/tesis.tex
2023/10/27 | 5389101 | macros/latex/contrib/unamth-template.zip
-2023/11/02 | 3530 | macros/latex/contrib/unbtex/README.md
-2023/11/02 | 60488 | macros/latex/contrib/unbtex/unbtexcite-en.bst
-2023/11/02 | 60291 | macros/latex/contrib/unbtex/unbtexcite-pt.bst
-2023/11/02 | 18241 | macros/latex/contrib/unbtex/unbtex.cls
-2023/11/02 | 558 | macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
-2023/11/02 | 424 | macros/latex/contrib/unbtex/unbtex-example/anexo-b.tex
-2023/11/02 | 2824 | macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
-2023/11/02 | 624 | macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
-2023/11/02 | 1802 | macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
-2023/11/02 | 29187 | macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
-2023/11/02 | 3461 | macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
-2023/11/02 | 1739 | macros/latex/contrib/unbtex/unbtex-example/capitulo4.tex
-2023/11/02 | 215 | macros/latex/contrib/unbtex/unbtex-example/capitulo5.tex
-2023/11/02 | 373 | macros/latex/contrib/unbtex/unbtex-example/codigos/controle.m
-2023/11/02 | 1671 | macros/latex/contrib/unbtex/unbtex-example/codigos/controleSmithPredictor.py
-2023/11/02 | 972 | macros/latex/contrib/unbtex/unbtex-example/codigos/ModalReduction.jl
-2023/11/02 | 19971 | macros/latex/contrib/unbtex/unbtex-example/figuras/1280px-LaTeX-logo.png
-2023/11/02 | 5714 | macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
-2023/11/02 | 13087 | macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
-2023/11/02 | 1356 | macros/latex/contrib/unbtex/unbtex-example/figuras/capa_fundo.pdf
-2023/11/02 | 6905 | macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
-2023/11/02 | 7406 | macros/latex/contrib/unbtex/unbtex-example/figuras/curva_diodo.pdf
-2023/11/02 | 995822 | macros/latex/contrib/unbtex/unbtex-example.pdf
-2023/11/02 | 5059 | macros/latex/contrib/unbtex/unbtex-example/references.bib
-2023/11/02 | 14391 | macros/latex/contrib/unbtex/unbtex-example/referencias.bib
-2023/11/02 | 16227 | macros/latex/contrib/unbtex/unbtex-example.tex
-2023/11/03 | 1079715 | macros/latex/contrib/unbtex.zip
+2023/11/14 | 4121 | macros/latex/contrib/unbtex/README.md
+2023/11/14 | 60538 | macros/latex/contrib/unbtex/unbtexcite-en.bst
+2023/11/14 | 60344 | macros/latex/contrib/unbtex/unbtexcite-pt.bst
+2023/11/14 | 18352 | macros/latex/contrib/unbtex/unbtex.cls
+2023/11/14 | 557 | macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
+2023/11/14 | 424 | macros/latex/contrib/unbtex/unbtex-example/anexo-b.tex
+2023/11/14 | 2714 | macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
+2023/11/14 | 686 | macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
+2023/11/14 | 1769 | macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
+2023/11/14 | 30265 | macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
+2023/11/14 | 3678 | macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
+2023/11/14 | 1739 | macros/latex/contrib/unbtex/unbtex-example/capitulo4.tex
+2023/11/14 | 215 | macros/latex/contrib/unbtex/unbtex-example/capitulo5.tex
+2023/11/14 | 616 | macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex
+2023/11/14 | 373 | macros/latex/contrib/unbtex/unbtex-example/codigos/controle.m
+2023/11/14 | 1671 | macros/latex/contrib/unbtex/unbtex-example/codigos/controleSmithPredictor.py
+2023/11/14 | 972 | macros/latex/contrib/unbtex/unbtex-example/codigos/ModalReduction.jl
+2023/11/14 | 19971 | macros/latex/contrib/unbtex/unbtex-example/figuras/1280px-LaTeX-logo.png
+2023/11/14 | 81892 | macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.eps
+2023/11/14 | 12666 | macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
+2023/11/14 | 38806 | macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
+2023/11/14 | 1356 | macros/latex/contrib/unbtex/unbtex-example/figuras/capa_fundo.pdf
+2023/11/14 | 17972 | macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
+2023/11/14 | 17610 | macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdf
+2023/11/14 | 592016 | macros/latex/contrib/unbtex/unbtex-example.pdf
+2023/11/14 | 5059 | macros/latex/contrib/unbtex/unbtex-example/references.bib
+2023/11/14 | 14391 | macros/latex/contrib/unbtex/unbtex-example/referencias.bib
+2023/11/14 | 15916 | macros/latex/contrib/unbtex/unbtex-example.tex
+2023/11/15 | 728128 | macros/latex/contrib/unbtex.zip
2006/09/09 | 3917 | macros/latex/contrib/underlin/underlin.dtx
1997/02/17 | 111 | macros/latex/contrib/underlin/underlin.ins
2006/09/09 | 83139 | macros/latex/contrib/underlin/underlin.pdf
@@ -243899,13 +243910,19 @@
2022/08/05 | 96536 | macros/latex/contrib/wrapstuff/wrapstuff.dtx
2022/08/05 | 451989 | macros/latex/contrib/wrapstuff/wrapstuff.pdf
2022/08/05 | 454990 | macros/latex/contrib/wrapstuff.zip
-2023/08/09 | 492397 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
-2023/08/09 | 17451 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
-2023/08/09 | 606805 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
-2023/08/09 | 31338 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
+2023/11/15 | 95511 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdf
+2023/11/15 | 1020 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex
+2023/11/15 | 465893 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
+2023/11/15 | 17562 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
+2023/11/15 | 607723 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
+2023/11/15 | 33502 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
+2023/11/15 | 94207 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdf
+2023/11/15 | 997 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex
+2023/11/15 | 87323 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdf
+2023/11/14 | 951 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex
2023/01/17 | 457 | macros/latex/contrib/writeongrid/README.md
-2023/08/09 | 23685 | macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
-2023/08/09 | 1082208 | macros/latex/contrib/writeongrid.zip
+2023/11/15 | 28988 | macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
+2023/11/15 | 1335660 | macros/latex/contrib/writeongrid.zip
2013/08/27 | 1511 | macros/latex/contrib/wsemclassic/LICENSE
2013/08/27 | 2275 | macros/latex/contrib/wsemclassic/Makefile
2013/08/27 | 2394 | macros/latex/contrib/wsemclassic/README
@@ -243994,25 +244011,25 @@
2018/01/05 | 1923 | macros/latex/contrib/xcntperchap/xcntperchap_labelusage.tex
2018/01/05 | 10505 | macros/latex/contrib/xcntperchap/xcntperchap.sty
2018/01/05 | 372146 | macros/latex/contrib/xcntperchap.zip
-2023/11/13 | 15844 | macros/latex/contrib/xcolor/ChangeLog
+2023/11/15 | 15936 | macros/latex/contrib/xcolor/ChangeLog
2016/10/15 | 998 | macros/latex/contrib/xcolor-material/README.md
2016/10/15 | 46397 | macros/latex/contrib/xcolor-material/xcolor-material.dtx
2016/06/01 | 1917 | macros/latex/contrib/xcolor-material/xcolor-material.ins
2016/10/15 | 632607 | macros/latex/contrib/xcolor-material/xcolor-material.pdf
2016/10/16 | 592161 | macros/latex/contrib/xcolor-material.zip
-2023/11/13 | 2007 | macros/latex/contrib/xcolor/README.md
+2023/11/15 | 2007 | macros/latex/contrib/xcolor/README.md
2016/08/05 | 618 | macros/latex/contrib/xcolor-solarized/makefile
2016/08/05 | 356 | macros/latex/contrib/xcolor-solarized/README
2016/08/05 | 11317 | macros/latex/contrib/xcolor-solarized/xcolor-solarized.dtx
2016/08/05 | 2156 | macros/latex/contrib/xcolor-solarized/xcolor-solarized.ins
2016/08/05 | 468876 | macros/latex/contrib/xcolor-solarized/xcolor-solarized.pdf
2016/08/05 | 473080 | macros/latex/contrib/xcolor-solarized.zip
-2023/11/13 | 56154 | macros/latex/contrib/xcolor/xcolor-2022-06-12.sty
-2023/11/13 | 91691 | macros/latex/contrib/xcolor/xcolor2.pdf
-2023/11/13 | 340791 | macros/latex/contrib/xcolor/xcolor.dtx
-2023/11/13 | 703 | macros/latex/contrib/xcolor/xcolor.ins
-2023/11/13 | 863950 | macros/latex/contrib/xcolor/xcolor.pdf
-2023/11/13 | 1029419 | macros/latex/contrib/xcolor.zip
+2023/11/15 | 56154 | macros/latex/contrib/xcolor/xcolor-2022-06-12.sty
+2023/11/15 | 91845 | macros/latex/contrib/xcolor/xcolor2.pdf
+2023/11/15 | 341385 | macros/latex/contrib/xcolor/xcolor.dtx
+2023/11/15 | 703 | macros/latex/contrib/xcolor/xcolor.ins
+2023/11/15 | 864842 | macros/latex/contrib/xcolor/xcolor.pdf
+2023/11/15 | 1030516 | macros/latex/contrib/xcolor.zip
2015/03/03 | 421916 | macros/latex/contrib/xcookybooky/example/example.pdf
2015/03/03 | 2562 | macros/latex/contrib/xcookybooky/example/example.tex
2014/12/28 | 88981 | macros/latex/contrib/xcookybooky/example/pic/background.pdf
@@ -288173,9 +288190,9 @@
1999/09/13 | 17553 | support/texref/texref
1999/09/14 | 10702 | support/texref/texref.1
2006/03/12 | 12757 | support/texref.zip
-2023/10/20 | 752 | support/texshop/README.txt
-2023/10/20 | 1817 | support/texshop/texshop521.html
-2023/10/20 | 71221321 | support/texshop/texshop521.zip
+2023/11/15 | 753 | support/texshop/README.txt
+2023/11/15 | 3859 | support/texshop/texshop522.html
+2023/11/15 | 71307390 | support/texshop/texshop522.zip
1994/11/10 | 411107 | support/texspell/texspell.zip
1994/11/10 | 42315 | support/texspell/texspsrc.zip
1994/11/10 | 411107 | support/texspell.zip
@@ -291380,8 +291397,8 @@
2020/06/08 | 120320 | systems/texlive/tlnet/archive/abnt.doc.r55471.tar.xz
2019/02/28 | 4585444 | systems/texlive/tlnet/archive/abntex2.doc.r49248.tar.xz
2019/02/28 | 29920 | systems/texlive/tlnet/archive/abntex2.r49248.tar.xz
-2023/10/16 | 170064 | systems/texlive/tlnet/archive/abntexto.doc.r68554.tar.xz
-2023/10/16 | 7776 | systems/texlive/tlnet/archive/abntexto.r68554.tar.xz
+2023/11/15 | 203316 | systems/texlive/tlnet/archive/abntexto.doc.r68837.tar.xz
+2023/11/15 | 8164 | systems/texlive/tlnet/archive/abntexto.r68837.tar.xz
2020/06/08 | 2800 | systems/texlive/tlnet/archive/abnt.r55471.tar.xz
2022/04/08 | 35013704 | systems/texlive/tlnet/archive/aboensis.doc.r62977.tar.xz
2022/04/08 | 96600 | systems/texlive/tlnet/archive/aboensis.r62977.tar.xz
@@ -293620,8 +293637,8 @@
2019/02/28 | 2688 | systems/texlive/tlnet/archive/cntformats.r34668.tar.xz
2019/02/28 | 271048 | systems/texlive/tlnet/archive/cntperchap.doc.r37572.tar.xz
2019/02/28 | 3964 | systems/texlive/tlnet/archive/cntperchap.r37572.tar.xz
-2022/02/18 | 577192 | systems/texlive/tlnet/archive/cochineal.doc.r62063.tar.xz
-2022/02/18 | 2864036 | systems/texlive/tlnet/archive/cochineal.r62063.tar.xz
+2023/11/15 | 598104 | systems/texlive/tlnet/archive/cochineal.doc.r68834.tar.xz
+2023/11/15 | 2584896 | systems/texlive/tlnet/archive/cochineal.r68834.tar.xz
2023/01/28 | 296484 | systems/texlive/tlnet/archive/codeanatomy.doc.r65648.tar.xz
2023/01/28 | 1844 | systems/texlive/tlnet/archive/codeanatomy.r65648.tar.xz
2023/01/28 | 4844 | systems/texlive/tlnet/archive/codeanatomy.source.r65648.tar.xz
@@ -293682,7 +293699,7 @@
2020/03/04 | 408 | systems/texlive/tlnet/archive/collection-langpolish.r54074.tar.xz
2023/05/16 | 400 | systems/texlive/tlnet/archive/collection-langportuguese.r67125.tar.xz
2023/06/09 | 396 | systems/texlive/tlnet/archive/collection-langspanish.r67307.tar.xz
-2023/11/14 | 7032 | systems/texlive/tlnet/archive/collection-latexextra.r68830.tar.xz
+2023/11/15 | 7040 | systems/texlive/tlnet/archive/collection-latexextra.r68839.tar.xz
2022/06/10 | 700 | systems/texlive/tlnet/archive/collection-latex.r63515.tar.xz
2023/01/11 | 744 | systems/texlive/tlnet/archive/collection-latexrecommended.r65512.tar.xz
2023/11/11 | 1016 | systems/texlive/tlnet/archive/collection-luatex.r68808.tar.xz
@@ -294547,8 +294564,8 @@
2019/02/28 | 768 | systems/texlive/tlnet/archive/dickimaw.r32925.tar.xz
2019/02/28 | 19784 | systems/texlive/tlnet/archive/dictsym.doc.r20031.tar.xz
2019/02/28 | 31568 | systems/texlive/tlnet/archive/dictsym.r20031.tar.xz
-2023/04/13 | 1335424 | systems/texlive/tlnet/archive/diffcoeff.doc.r66834.tar.xz
-2023/04/13 | 11336 | systems/texlive/tlnet/archive/diffcoeff.r66834.tar.xz
+2023/11/15 | 1346876 | systems/texlive/tlnet/archive/diffcoeff.doc.r68838.tar.xz
+2023/11/15 | 11436 | systems/texlive/tlnet/archive/diffcoeff.r68838.tar.xz
2022/12/06 | 340 | systems/texlive/tlnet/archive/digestif.aarch64-linux.r65210.tar.xz
2022/12/06 | 344 | systems/texlive/tlnet/archive/digestif.amd64-freebsd.r65210.tar.xz
2022/12/06 | 344 | systems/texlive/tlnet/archive/digestif.amd64-netbsd.r65210.tar.xz
@@ -294735,8 +294752,8 @@
2021/10/31 | 1000 | systems/texlive/tlnet/archive/dsserif.source.r60898.tar.xz
2023/06/24 | 278920 | systems/texlive/tlnet/archive/dtk-bibliography.doc.r67454.tar.xz
2023/06/24 | 53304 | systems/texlive/tlnet/archive/dtk-bibliography.r67454.tar.xz
-2023/08/01 | 79072 | systems/texlive/tlnet/archive/dtk.doc.r67781.tar.xz
-2023/08/01 | 14620 | systems/texlive/tlnet/archive/dtk.r67781.tar.xz
+2023/11/15 | 78848 | systems/texlive/tlnet/archive/dtk.doc.r68849.tar.xz
+2023/11/15 | 14632 | systems/texlive/tlnet/archive/dtk.r68849.tar.xz
2023/02/20 | 20520 | systems/texlive/tlnet/archive/dtl.aarch64-linux.r65927.tar.xz
2023/02/18 | 21928 | systems/texlive/tlnet/archive/dtl.amd64-freebsd.r65877.tar.xz
2023/02/20 | 19268 | systems/texlive/tlnet/archive/dtl.amd64-netbsd.r65923.tar.xz
@@ -298287,6 +298304,8 @@
2019/02/28 | 50936 | systems/texlive/tlnet/archive/listofsymbols.doc.r16134.tar.xz
2019/02/28 | 2552 | systems/texlive/tlnet/archive/listofsymbols.r16134.tar.xz
2019/02/28 | 6188 | systems/texlive/tlnet/archive/listofsymbols.source.r16134.tar.xz
+2023/11/15 | 703852 | systems/texlive/tlnet/archive/litesolution.doc.r68839.tar.xz
+2023/11/15 | 5220 | systems/texlive/tlnet/archive/litesolution.r68839.tar.xz
2023/11/10 | 94672 | systems/texlive/tlnet/archive/litetable.doc.r68782.tar.xz
2023/11/10 | 3072 | systems/texlive/tlnet/archive/litetable.r68782.tar.xz
2023/03/08 | 56116 | systems/texlive/tlnet/archive/lithuanian.doc.r66461.tar.xz
@@ -298653,8 +298672,8 @@
2023/05/25 | 33884 | systems/texlive/tlnet/archive/luapstricks.r67207.tar.xz
2023/01/28 | 65436 | systems/texlive/tlnet/archive/luaquotes.doc.r65652.tar.xz
2023/01/28 | 3384 | systems/texlive/tlnet/archive/luaquotes.r65652.tar.xz
-2019/02/28 | 50272 | systems/texlive/tlnet/archive/luarandom.doc.r49419.tar.xz
-2019/02/28 | 1392 | systems/texlive/tlnet/archive/luarandom.r49419.tar.xz
+2023/11/15 | 70264 | systems/texlive/tlnet/archive/luarandom.doc.r68847.tar.xz
+2023/11/15 | 1416 | systems/texlive/tlnet/archive/luarandom.r68847.tar.xz
2022/12/28 | 115012 | systems/texlive/tlnet/archive/luaset.doc.r65376.tar.xz
2022/12/28 | 1544 | systems/texlive/tlnet/archive/luaset.r65376.tar.xz
2023/01/11 | 146972 | systems/texlive/tlnet/archive/luasseq.doc.r65511.tar.xz
@@ -299804,9 +299823,9 @@
2023/11/10 | 70240 | systems/texlive/tlnet/archive/newpax.doc.r68762.tar.xz
2023/11/10 | 9480 | systems/texlive/tlnet/archive/newpax.r68762.tar.xz
2023/11/10 | 11020 | systems/texlive/tlnet/archive/newpax.source.r68762.tar.xz
-2023/11/11 | 476656 | systems/texlive/tlnet/archive/newpx.doc.r68798.tar.xz
-2023/11/11 | 4743784 | systems/texlive/tlnet/archive/newpx.r68798.tar.xz
-2023/11/11 | 392 | systems/texlive/tlnet/archive/newpx.source.r68798.tar.xz
+2023/11/15 | 476872 | systems/texlive/tlnet/archive/newpx.doc.r68835.tar.xz
+2023/11/15 | 4743888 | systems/texlive/tlnet/archive/newpx.r68835.tar.xz
+2023/11/15 | 392 | systems/texlive/tlnet/archive/newpx.source.r68835.tar.xz
2019/02/28 | 137580 | systems/texlive/tlnet/archive/newsletr.doc.r15878.tar.xz
2019/02/28 | 16788 | systems/texlive/tlnet/archive/newsletr.r15878.tar.xz
2019/02/28 | 196212 | systems/texlive/tlnet/archive/newspaper.doc.r15878.tar.xz
@@ -299864,9 +299883,9 @@
2022/03/06 | 210180 | systems/texlive/tlnet/archive/njustthesis.doc.r62451.tar.xz
2022/03/06 | 4484 | systems/texlive/tlnet/archive/njustthesis.r62451.tar.xz
2022/03/06 | 4832 | systems/texlive/tlnet/archive/njustthesis.source.r62451.tar.xz
-2023/06/09 | 1244196 | systems/texlive/tlnet/archive/njuthesis.doc.r67309.tar.xz
-2023/06/09 | 22476 | systems/texlive/tlnet/archive/njuthesis.r67309.tar.xz
-2023/06/09 | 67840 | systems/texlive/tlnet/archive/njuthesis.source.r67309.tar.xz
+2023/11/15 | 1243316 | systems/texlive/tlnet/archive/njuthesis.doc.r68848.tar.xz
+2023/11/15 | 22628 | systems/texlive/tlnet/archive/njuthesis.r68848.tar.xz
+2023/11/15 | 68208 | systems/texlive/tlnet/archive/njuthesis.source.r68848.tar.xz
2022/12/14 | 666060 | systems/texlive/tlnet/archive/njuvisual.doc.r65261.tar.xz
2022/12/14 | 211156 | systems/texlive/tlnet/archive/njuvisual.r65261.tar.xz
2022/12/14 | 219728 | systems/texlive/tlnet/archive/njuvisual.source.r65261.tar.xz
@@ -300903,8 +300922,8 @@
2019/12/07 | 594984 | systems/texlive/tlnet/archive/pmboxdraw.doc.r53046.tar.xz
2019/12/07 | 7216 | systems/texlive/tlnet/archive/pmboxdraw.r53046.tar.xz
2019/12/07 | 14376 | systems/texlive/tlnet/archive/pmboxdraw.source.r53046.tar.xz
-2023/11/10 | 377412 | systems/texlive/tlnet/archive/pmdraw.doc.r68766.tar.xz
-2023/11/10 | 6348 | systems/texlive/tlnet/archive/pmdraw.r68766.tar.xz
+2023/11/15 | 379264 | systems/texlive/tlnet/archive/pmdraw.doc.r68836.tar.xz
+2023/11/15 | 6396 | systems/texlive/tlnet/archive/pmdraw.r68836.tar.xz
2019/02/28 | 129312 | systems/texlive/tlnet/archive/pmgraph.doc.r15878.tar.xz
2019/02/28 | 10064 | systems/texlive/tlnet/archive/pmgraph.r15878.tar.xz
2023/03/05 | 967940 | systems/texlive/tlnet/archive/pmhanguljamo.doc.r66361.tar.xz
@@ -300990,9 +301009,9 @@
2019/02/28 | 3152 | systems/texlive/tlnet/archive/poster-mac.r18305.tar.xz
2023/06/13 | 873692 | systems/texlive/tlnet/archive/postit.doc.r67344.tar.xz
2023/06/13 | 4552 | systems/texlive/tlnet/archive/postit.r67344.tar.xz
-2023/08/22 | 1007300 | systems/texlive/tlnet/archive/postnotes.doc.r68006.tar.xz
-2023/08/22 | 7372 | systems/texlive/tlnet/archive/postnotes.r68006.tar.xz
-2023/08/22 | 22436 | systems/texlive/tlnet/archive/postnotes.source.r68006.tar.xz
+2023/11/15 | 1004116 | systems/texlive/tlnet/archive/postnotes.doc.r68840.tar.xz
+2023/11/15 | 7396 | systems/texlive/tlnet/archive/postnotes.r68840.tar.xz
+2023/11/15 | 22524 | systems/texlive/tlnet/archive/postnotes.source.r68840.tar.xz
2021/05/20 | 948160 | systems/texlive/tlnet/archive/powerdot.doc.r59272.tar.xz
2019/11/26 | 280080 | systems/texlive/tlnet/archive/powerdot-fuberlin.doc.r52922.tar.xz
2019/11/26 | 2704 | systems/texlive/tlnet/archive/powerdot-fuberlin.r52922.tar.xz
@@ -301053,8 +301072,8 @@
2019/02/28 | 378272 | systems/texlive/tlnet/archive/productbox.doc.r20886.tar.xz
2019/02/28 | 4944 | systems/texlive/tlnet/archive/productbox.r20886.tar.xz
2019/02/28 | 15512 | systems/texlive/tlnet/archive/productbox.source.r20886.tar.xz
-2023/10/16 | 14515396 | systems/texlive/tlnet/archive/profcollege.doc.r68558.tar.xz
-2023/10/16 | 1319080 | systems/texlive/tlnet/archive/profcollege.r68558.tar.xz
+2023/11/15 | 14981936 | systems/texlive/tlnet/archive/profcollege.doc.r68841.tar.xz
+2023/11/15 | 1333464 | systems/texlive/tlnet/archive/profcollege.r68841.tar.xz
2022/04/27 | 134096 | systems/texlive/tlnet/archive/proflabo.doc.r63147.tar.xz
2022/04/27 | 2748 | systems/texlive/tlnet/archive/proflabo.r63147.tar.xz
2023/11/11 | 1707220 | systems/texlive/tlnet/archive/proflycee.doc.r68802.tar.xz
@@ -301849,8 +301868,8 @@
2019/02/28 | 57844 | systems/texlive/tlnet/archive/robustcommand.doc.r15878.tar.xz
2019/02/28 | 1176 | systems/texlive/tlnet/archive/robustcommand.r15878.tar.xz
2019/02/28 | 2852 | systems/texlive/tlnet/archive/robustcommand.source.r15878.tar.xz
-2023/11/10 | 666716 | systems/texlive/tlnet/archive/robust-externalize.doc.r68757.tar.xz
-2023/11/10 | 26548 | systems/texlive/tlnet/archive/robust-externalize.r68757.tar.xz
+2023/11/15 | 691812 | systems/texlive/tlnet/archive/robust-externalize.doc.r68842.tar.xz
+2023/11/15 | 27184 | systems/texlive/tlnet/archive/robust-externalize.r68842.tar.xz
2019/02/28 | 420516 | systems/texlive/tlnet/archive/robustindex.doc.r49877.tar.xz
2019/02/28 | 5032 | systems/texlive/tlnet/archive/robustindex.r49877.tar.xz
2019/02/28 | 19996 | systems/texlive/tlnet/archive/roex.r45818.tar.xz
@@ -302295,8 +302314,8 @@
2023/03/05 | 291288 | systems/texlive/tlnet/archive/sillypage.doc.r66349.tar.xz
2023/03/05 | 16588 | systems/texlive/tlnet/archive/sillypage.r66349.tar.xz
2023/03/05 | 4624 | systems/texlive/tlnet/archive/sillypage.source.r66349.tar.xz
-2023/11/14 | 392852 | systems/texlive/tlnet/archive/sim-os-menus.doc.r68830.tar.xz
-2023/11/14 | 4248 | systems/texlive/tlnet/archive/sim-os-menus.r68830.tar.xz
+2023/11/15 | 563656 | systems/texlive/tlnet/archive/sim-os-menus.doc.r68843.tar.xz
+2023/11/15 | 4820 | systems/texlive/tlnet/archive/sim-os-menus.r68843.tar.xz
2023/01/08 | 154692 | systems/texlive/tlnet/archive/simplebnf.doc.r65485.tar.xz
2023/01/08 | 2656 | systems/texlive/tlnet/archive/simplebnf.r65485.tar.xz
2019/02/28 | 915604 | systems/texlive/tlnet/archive/simplecd.doc.r29260.tar.xz
@@ -302342,9 +302361,9 @@
2021/06/26 | 250232 | systems/texlive/tlnet/archive/siunits.doc.r59702.tar.xz
2021/06/26 | 6040 | systems/texlive/tlnet/archive/siunits.r59702.tar.xz
2021/06/26 | 34532 | systems/texlive/tlnet/archive/siunits.source.r59702.tar.xz
-2023/11/10 | 1288648 | systems/texlive/tlnet/archive/siunitx.doc.r68775.tar.xz
-2023/11/10 | 67728 | systems/texlive/tlnet/archive/siunitx.r68775.tar.xz
-2023/11/10 | 122932 | systems/texlive/tlnet/archive/siunitx.source.r68775.tar.xz
+2023/11/15 | 1288056 | systems/texlive/tlnet/archive/siunitx.doc.r68844.tar.xz
+2023/11/15 | 67724 | systems/texlive/tlnet/archive/siunitx.r68844.tar.xz
+2023/11/15 | 122968 | systems/texlive/tlnet/archive/siunitx.source.r68844.tar.xz
2022/01/24 | 200108 | systems/texlive/tlnet/archive/skak.doc.r61719.tar.xz
2019/02/28 | 316212 | systems/texlive/tlnet/archive/skaknew.doc.r20031.tar.xz
2019/02/28 | 160064 | systems/texlive/tlnet/archive/skaknew.r20031.tar.xz
@@ -302881,9 +302900,9 @@
2019/09/11 | 1292 | systems/texlive/tlnet/archive/tagging.r52064.tar.xz
2019/02/28 | 68912 | systems/texlive/tlnet/archive/tagpair.doc.r42138.tar.xz
2019/02/28 | 1244 | systems/texlive/tlnet/archive/tagpair.r42138.tar.xz
-2023/11/11 | 2143960 | systems/texlive/tlnet/archive/tagpdf.doc.r68805.tar.xz
-2023/11/11 | 35932 | systems/texlive/tlnet/archive/tagpdf.r68805.tar.xz
-2023/11/11 | 66476 | systems/texlive/tlnet/archive/tagpdf.source.r68805.tar.xz
+2023/11/15 | 2143932 | systems/texlive/tlnet/archive/tagpdf.doc.r68845.tar.xz
+2023/11/15 | 35920 | systems/texlive/tlnet/archive/tagpdf.r68845.tar.xz
+2023/11/15 | 66528 | systems/texlive/tlnet/archive/tagpdf.source.r68845.tar.xz
2019/02/28 | 131060 | systems/texlive/tlnet/archive/talk.doc.r42428.tar.xz
2019/02/28 | 4676 | systems/texlive/tlnet/archive/talk.r42428.tar.xz
2019/02/28 | 556 | systems/texlive/tlnet/archive/talk.source.r42428.tar.xz
@@ -303258,7 +303277,7 @@
2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz
-2023/11/14 | 429896 | systems/texlive/tlnet/archive/texlive-scripts.doc.r68825.tar.xz
+2023/11/15 | 430052 | systems/texlive/tlnet/archive/texlive-scripts.doc.r68833.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz
2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz
2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz
@@ -303280,7 +303299,7 @@
2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz
-2023/11/14 | 114228 | systems/texlive/tlnet/archive/texlive-scripts.r68825.tar.xz
+2023/11/15 | 114224 | systems/texlive/tlnet/archive/texlive-scripts.r68833.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2023/05/14 | 60312 | systems/texlive/tlnet/archive/texlive-scripts.windows.r67095.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -305135,18 +305154,18 @@
2022/08/09 | 3304 | systems/texlive/tlnet/archive/zlmtt.r64076.tar.xz
2019/03/28 | 135268 | systems/texlive/tlnet/archive/zootaxa-bst.doc.r50619.tar.xz
2019/03/28 | 6228 | systems/texlive/tlnet/archive/zootaxa-bst.r50619.tar.xz
-2023/08/16 | 1059472 | systems/texlive/tlnet/archive/zref-check.doc.r67939.tar.xz
-2023/08/16 | 5600 | systems/texlive/tlnet/archive/zref-check.r67939.tar.xz
-2023/08/16 | 13940 | systems/texlive/tlnet/archive/zref-check.source.r67939.tar.xz
-2023/08/16 | 1567496 | systems/texlive/tlnet/archive/zref-clever.doc.r67937.tar.xz
-2023/08/16 | 23308 | systems/texlive/tlnet/archive/zref-clever.r67937.tar.xz
-2023/08/16 | 52896 | systems/texlive/tlnet/archive/zref-clever.source.r67937.tar.xz
+2023/11/15 | 1015828 | systems/texlive/tlnet/archive/zref-check.doc.r68846.tar.xz
+2023/11/15 | 5612 | systems/texlive/tlnet/archive/zref-check.r68846.tar.xz
+2023/11/15 | 14048 | systems/texlive/tlnet/archive/zref-check.source.r68846.tar.xz
+2023/11/15 | 1515088 | systems/texlive/tlnet/archive/zref-clever.doc.r68846.tar.xz
+2023/11/15 | 23304 | systems/texlive/tlnet/archive/zref-clever.r68846.tar.xz
+2023/11/15 | 52876 | systems/texlive/tlnet/archive/zref-clever.source.r68846.tar.xz
2023/09/15 | 668780 | systems/texlive/tlnet/archive/zref.doc.r68278.tar.xz
2023/09/15 | 14528 | systems/texlive/tlnet/archive/zref.r68278.tar.xz
2023/09/15 | 37528 | systems/texlive/tlnet/archive/zref.source.r68278.tar.xz
-2023/08/17 | 781408 | systems/texlive/tlnet/archive/zref-vario.doc.r67949.tar.xz
-2023/08/17 | 4536 | systems/texlive/tlnet/archive/zref-vario.r67949.tar.xz
-2023/08/17 | 8112 | systems/texlive/tlnet/archive/zref-vario.source.r67949.tar.xz
+2023/11/15 | 725800 | systems/texlive/tlnet/archive/zref-vario.doc.r68846.tar.xz
+2023/11/15 | 4644 | systems/texlive/tlnet/archive/zref-vario.r68846.tar.xz
+2023/11/15 | 8220 | systems/texlive/tlnet/archive/zref-vario.source.r68846.tar.xz
2019/02/28 | 246032 | systems/texlive/tlnet/archive/zwgetfdate.doc.r15878.tar.xz
2019/02/28 | 1384 | systems/texlive/tlnet/archive/zwgetfdate.r15878.tar.xz
2022/04/19 | 646716 | systems/texlive/tlnet/archive/zwpagelayout.doc.r63074.tar.xz
@@ -305162,16 +305181,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2023/08/07 | 125713 | systems/texlive/tlnet/install-tl
-2023/11/14 | 5743159 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2023/11/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/11/15 | 5741057 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/11/15 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/05/13 | 5083 | systems/texlive/tlnet/install-tl-windows.bat
-2023/11/14 | 21034586 | systems/texlive/tlnet/install-tl-windows.exe
-2023/11/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/11/14 | 26029568 | systems/texlive/tlnet/install-tl.zip
-2023/11/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/11/15 | 21033851 | systems/texlive/tlnet/install-tl-windows.exe
+2023/11/15 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/11/15 | 26029566 | systems/texlive/tlnet/install-tl.zip
+2023/11/15 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2023/03/19 | 1229 | systems/texlive/tlnet/README.md
2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023
2023/01/17 | 8401 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -305181,7 +305200,7 @@
2023/01/17 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2023/09/20 | 50622 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2023/11/13 | 7380 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2023/11/14 | 7408 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/08/23 | 221470 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt
2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe
2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt
@@ -305223,12 +305242,12 @@
2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2023/11/14 | 18347741 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2023/11/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/11/15 | 18350075 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/11/15 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2023/10/16 | 87924 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2023/11/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2023/11/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/11/14 | 2487400 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/11/15 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/11/15 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/11/15 | 2487400 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2023/06/11 | 42749 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -316127,7 +316146,7 @@
2014/07/05 | 611 | systems/win32/yandy/README
2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz
2014/07/05 | 1012416 | systems/win32/yandy.zip
-2023/11/15 | 186 | timestamp
+2023/11/16 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 99f46b37cf..f426aa7821 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 72db43cf43..1680076263 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,7 +1,146 @@
+2023/11/15 | 997 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex
2023/11/15 | 997 | macros/latex/contrib/litesolution/doc/litesolution.tex
+2023/11/15 | 98484 | macros/latex/contrib/ukbill/ukbill-documentation.pdf
+2023/11/15 | 9648826 | fonts/newtx.zip
+2023/11/15 | 95511 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdf
+2023/11/15 | 94207 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdf
+2023/11/15 | 91845 | macros/latex/contrib/xcolor/xcolor2.pdf
+2023/11/15 | 87323 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdf
+2023/11/15 | 864842 | macros/latex/contrib/xcolor/xcolor.pdf
+2023/11/15 | 85004 | macros/latex/contrib/ukbill/immigration-bill.pdf
+2023/11/15 | 84 | macros/generic/tex-ini-files/dvilualatex.ini
+2023/11/15 | 82 | macros/generic/tex-ini-files/dviluatex.ini
+2023/11/15 | 8220 | systems/texlive/tlnet/archive/zref-vario.source.r68846.tar.xz
+2023/11/15 | 8164 | systems/texlive/tlnet/archive/abntexto.r68837.tar.xz
+2023/11/15 | 78848 | systems/texlive/tlnet/archive/dtk.doc.r68849.tar.xz
+2023/11/15 | 7800 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
+2023/11/15 | 767 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
+2023/11/15 | 75830 | macros/latex/contrib/expex-glossonly.zip
+2023/11/15 | 753 | support/texshop/README.txt
+2023/11/15 | 7510 | macros/latex/contrib/expex-glossonly/expex-glossonly.tex
+2023/11/15 | 7396 | systems/texlive/tlnet/archive/postnotes.r68840.tar.xz
+2023/11/15 | 7283 | macros/generic/tex-ini-files.zip
+2023/11/15 | 728128 | macros/latex/contrib/unbtex.zip
+2023/11/15 | 725800 | systems/texlive/tlnet/archive/zref-vario.doc.r68846.tar.xz
+2023/11/15 | 71307390 | support/texshop/texshop522.zip
+2023/11/15 | 7040 | systems/texlive/tlnet/archive/collection-latexextra.r68839.tar.xz
+2023/11/15 | 703 | macros/latex/contrib/xcolor/xcolor.ins
+2023/11/15 | 703852 | systems/texlive/tlnet/archive/litesolution.doc.r68839.tar.xz
+2023/11/15 | 70264 | systems/texlive/tlnet/archive/luarandom.doc.r68847.tar.xz
2023/11/15 | 699357 | macros/latex/contrib/litesolution/doc/litesolution.pdf
+2023/11/15 | 691812 | systems/texlive/tlnet/archive/robust-externalize.doc.r68842.tar.xz
+2023/11/15 | 68208 | systems/texlive/tlnet/archive/njuthesis.source.r68848.tar.xz
+2023/11/15 | 67724 | systems/texlive/tlnet/archive/siunitx.r68844.tar.xz
+2023/11/15 | 667 | macros/generic/tex-ini-files/lualatex.ini
+2023/11/15 | 66528 | systems/texlive/tlnet/archive/tagpdf.source.r68845.tar.xz
+2023/11/15 | 6396 | systems/texlive/tlnet/archive/pmdraw.r68836.tar.xz
+2023/11/15 | 637754 | fonts/newtx/afm/ztmrsl.afm
+2023/11/15 | 637754 | fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
+2023/11/15 | 620 | macros/generic/tex-ini-files/latex.ini
+2023/11/15 | 607723 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
+2023/11/15 | 598104 | systems/texlive/tlnet/archive/cochineal.doc.r68834.tar.xz
+2023/11/15 | 5741057 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/11/15 | 567 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
+2023/11/15 | 563656 | systems/texlive/tlnet/archive/sim-os-menus.doc.r68843.tar.xz
+2023/11/15 | 56154 | macros/latex/contrib/xcolor/xcolor-2022-06-12.sty
+2023/11/15 | 5612 | systems/texlive/tlnet/archive/zref-check.r68846.tar.xz
+2023/11/15 | 5529 | macros/latex/contrib/ipsum/doc/ipsum-doc.tex
+2023/11/15 | 5519 | macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
+2023/11/15 | 549 | macros/generic/tex-ini-files/pdftexconfig.tex
+2023/11/15 | 5438 | macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
+2023/11/15 | 535 | macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
+2023/11/15 | 52949 | macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
+2023/11/15 | 52876 | systems/texlive/tlnet/archive/zref-clever.source.r68846.tar.xz
+2023/11/15 | 5220 | systems/texlive/tlnet/archive/litesolution.r68839.tar.xz
+2023/11/15 | 50852 | macros/latex/contrib/ipsum/tex/ipsum.sty
+2023/11/15 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/11/15 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/11/15 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/11/15 | 486 | macros/generic/tex-ini-files/xelatex.ini
+2023/11/15 | 4820 | systems/texlive/tlnet/archive/sim-os-menus.r68843.tar.xz
+2023/11/15 | 476872 | systems/texlive/tlnet/archive/newpx.doc.r68835.tar.xz
+2023/11/15 | 4743888 | systems/texlive/tlnet/archive/newpx.r68835.tar.xz
+2023/11/15 | 46871 | fonts/newtx/README
+2023/11/15 | 465893 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
+2023/11/15 | 4644 | systems/texlive/tlnet/archive/zref-vario.r68846.tar.xz
+2023/11/15 | 4569 | macros/latex/contrib/expex-glossonly/expex-glossonly.sty
+2023/11/15 | 430052 | systems/texlive/tlnet/archive/texlive-scripts.doc.r68833.tar.xz
+2023/11/15 | 4133286 | biblio/ctan-bibdata.zip
+2023/11/15 | 392 | systems/texlive/tlnet/archive/newpx.source.r68835.tar.xz
+2023/11/15 | 3859 | support/texshop/texshop522.html
+2023/11/15 | 379264 | systems/texlive/tlnet/archive/pmdraw.doc.r68836.tar.xz
+2023/11/15 | 3728095 | biblio/ctan-bibdata/ctan.pdf
+2023/11/15 | 35920 | systems/texlive/tlnet/archive/tagpdf.r68845.tar.xz
+2023/11/15 | 3428 | macros/generic/tex-ini-files/xetex.ini
+2023/11/15 | 341385 | macros/latex/contrib/xcolor/xcolor.dtx
+2023/11/15 | 3354100 | dviware/dvisvgm.zip
+2023/11/15 | 33502 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
+2023/11/15 | 303768 | fonts/newtx/type1/ztmrsl.pfb
+2023/11/15 | 29280 | fonts/newtx/tex/newtxtext.sty
+2023/11/15 | 289 | macros/generic/tex-ini-files/luatex.ini
+2023/11/15 | 28988 | macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
+2023/11/15 | 2828646 | biblio/ctan-bibdata/ctan.bib
+2023/11/15 | 27184 | systems/texlive/tlnet/archive/robust-externalize.r68842.tar.xz
+2023/11/15 | 26612 | macros/latex/contrib/ukbill/ukbill-documentation.tex
+2023/11/15 | 26029566 | systems/texlive/tlnet/install-tl.zip
+2023/11/15 | 2584896 | systems/texlive/tlnet/archive/cochineal.r68834.tar.xz
+2023/11/15 | 2487400 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/11/15 | 243 | macros/generic/tex-ini-files/pdfxmltex.ini
+2023/11/15 | 240740 | fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
+2023/11/15 | 23304 | systems/texlive/tlnet/archive/zref-clever.r68846.tar.xz
+2023/11/15 | 22628 | systems/texlive/tlnet/archive/njuthesis.r68848.tar.xz
+2023/11/15 | 22524 | systems/texlive/tlnet/archive/postnotes.source.r68840.tar.xz
+2023/11/15 | 2143932 | systems/texlive/tlnet/archive/tagpdf.doc.r68845.tar.xz
+2023/11/15 | 21033851 | systems/texlive/tlnet/install-tl-windows.exe
+2023/11/15 | 2099 | macros/generic/tex-ini-files/README.md
+2023/11/15 | 2036 | macros/generic/tex-ini-files/luatexconfig.tex
+2023/11/15 | 203316 | systems/texlive/tlnet/archive/abntexto.doc.r68837.tar.xz
+2023/11/15 | 2007 | macros/latex/contrib/xcolor/README.md
+2023/11/15 | 197151 | macros/latex/contrib/ukbill.zip
+2023/11/15 | 19586 | macros/latex/contrib/ukbill/ukbill.cls
+2023/11/15 | 185964 | macros/latex/contrib/ipsum.zip
+2023/11/15 | 18350075 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/11/15 | 17562 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
+2023/11/15 | 1716 | fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
+2023/11/15 | 171078 | macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
+2023/11/15 | 1708 | fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
+2023/11/15 | 1688 | fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
+2023/11/15 | 1680 | fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
+2023/11/15 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/11/15 | 160 | macros/generic/tex-ini-files/xmltex.ini
+2023/11/15 | 15936 | macros/latex/contrib/xcolor/ChangeLog
+2023/11/15 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/11/15 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/11/15 | 1515088 | systems/texlive/tlnet/archive/zref-clever.doc.r68846.tar.xz
+2023/11/15 | 14981936 | systems/texlive/tlnet/archive/profcollege.doc.r68841.tar.xz
+2023/11/15 | 14632 | systems/texlive/tlnet/archive/dtk.r68849.tar.xz
+2023/11/15 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/11/15 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/11/15 | 1416 | systems/texlive/tlnet/archive/luarandom.r68847.tar.xz
+2023/11/15 | 14048 | systems/texlive/tlnet/archive/zref-check.source.r68846.tar.xz
+2023/11/15 | 1346876 | systems/texlive/tlnet/archive/diffcoeff.doc.r68838.tar.xz
+2023/11/15 | 1335660 | macros/latex/contrib/writeongrid.zip
+2023/11/15 | 1333464 | systems/texlive/tlnet/archive/profcollege.r68841.tar.xz
+2023/11/15 | 130 | macros/generic/tex-ini-files/pdflatex.ini
+2023/11/15 | 1288056 | systems/texlive/tlnet/archive/siunitx.doc.r68844.tar.xz
+2023/11/15 | 1243316 | systems/texlive/tlnet/archive/njuthesis.doc.r68848.tar.xz
+2023/11/15 | 122968 | systems/texlive/tlnet/archive/siunitx.source.r68844.tar.xz
+2023/11/15 | 1176 | fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
+2023/11/15 | 1144 | fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
+2023/11/15 | 11436 | systems/texlive/tlnet/archive/diffcoeff.r68838.tar.xz
+2023/11/15 | 114224 | systems/texlive/tlnet/archive/texlive-scripts.r68833.tar.xz
+2023/11/15 | 1107 | macros/latex/contrib/expex-glossonly/README.md
+2023/11/15 | 107 | macros/generic/tex-ini-files/mllatex.ini
+2023/11/15 | 1030516 | macros/latex/contrib/xcolor.zip
+2023/11/15 | 1020 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex
+2023/11/15 | 1015828 | systems/texlive/tlnet/archive/zref-check.doc.r68846.tar.xz
+2023/11/15 | 1004116 | systems/texlive/tlnet/archive/postnotes.doc.r68840.tar.xz
2023/11/14 | 986 | macros/latex/contrib/zref-check/README.md
2023/11/14 | 98324 | usergrps/dante/dtk.zip
+2023/11/14 | 972 | macros/latex/contrib/unbtex/unbtex-example/codigos/ModalReduction.jl
+2023/11/14 | 951 | macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex
2023/11/14 | 929640 | systems/texlive/tlnet/archive/xcolor.doc.r68831.tar.xz
2023/11/14 | 9239 | macros/latex/contrib/siunitx/siunitx-symbol.dtx
2023/11/14 | 8866 | macros/latex/contrib/siunitx/siunitx-command.dtx
@@ -9,6 +148,7 @@
2023/11/14 | 837996 | macros/latex/contrib/diffcoeff/diffcoeff.pdf
2023/11/14 | 8225 | macros/latex/contrib/zref-clever/CHANGELOG.md
2023/11/14 | 819390 | macros/latex/contrib/postnotes/postnotes-code.pdf
+2023/11/14 | 81892 | macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.eps
2023/11/14 | 807 | macros/latex/contrib/zref-clever/README.md
2023/11/14 | 795881 | macros/latex/contrib/sim-os-menus.zip
2023/11/14 | 78857 | graphics/pmdraw/pmdraw.tex
@@ -18,25 +158,26 @@
2023/11/14 | 7536861 | fonts/newpx.zip
2023/11/14 | 75358 | usergrps/dante/dtk/doc/beispiel.pdf
2023/11/14 | 746124 | macros/latex/contrib/robust-externalize.zip
+2023/11/14 | 7408 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/11/14 | 735823 | macros/latex/contrib/zref-vario.zip
2023/11/14 | 71004 | fonts/newpx/doc/newpxdoc.tex
2023/11/14 | 70 | macros/latex/contrib/zref-clever/DEPENDS.txt
2023/11/14 | 705523 | macros/latex/contrib/siunitx/siunitx.pdf
-2023/11/14 | 7032 | systems/texlive/tlnet/archive/collection-latexextra.r68830.tar.xz
2023/11/14 | 699477 | macros/latex/contrib/zref-check/zref-check-code.pdf
+2023/11/14 | 686 | macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
2023/11/14 | 67307 | macros/latex/contrib/zref-check/zref-check.dtx
2023/11/14 | 647774 | macros/latex/contrib/siunitx/siunitx-code.pdf
+2023/11/14 | 616 | macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex
+2023/11/14 | 60538 | macros/latex/contrib/unbtex/unbtexcite-en.bst
+2023/11/14 | 60344 | macros/latex/contrib/unbtex/unbtexcite-pt.bst
2023/11/14 | 594590 | macros/latex/contrib/zref-vario/zref-vario-code.pdf
+2023/11/14 | 592016 | macros/latex/contrib/unbtex/unbtex-example.pdf
2023/11/14 | 5831 | macros/latex/contrib/siunitx/siunitx-locale.dtx
-2023/11/14 | 5743159 | systems/texlive/tlnet/install-tl-unx.tar.gz
2023/11/14 | 562 | macros/latex/contrib/zref-vario/README.md
+2023/11/14 | 557 | macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
2023/11/14 | 55728 | macros/latex/contrib/siunitx/siunitx-table.dtx
2023/11/14 | 535232 | systems/texlive/tlnet/archive/hfutexam.doc.r68829.tar.xz
-2023/11/14 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2023/11/14 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/11/14 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/11/14 | 5059 | macros/latex/contrib/unbtex/unbtex-example/references.bib
2023/11/14 | 4843176 | systems/texlive/tlnet/archive/worldflags.doc.r68827.tar.xz
2023/11/14 | 4776 | macros/latex/contrib/litesolution/doc/litesolution-demo.tex
2023/11/14 | 4748 | macros/latex/contrib/siunitx/siunitx-abbreviations.cfg
@@ -48,22 +189,22 @@
2023/11/14 | 442660 | fonts/newpx/doc/newpxdoc.pdf
2023/11/14 | 4388 | systems/texlive/tlnet/archive/hfutexam.r68829.tar.xz
2023/11/14 | 43807 | macros/latex/contrib/siunitx/siunitx-compound.dtx
-2023/11/14 | 429896 | systems/texlive/tlnet/archive/texlive-scripts.doc.r68825.tar.xz
-2023/11/14 | 4248 | systems/texlive/tlnet/archive/sim-os-menus.r68830.tar.xz
+2023/11/14 | 424 | macros/latex/contrib/unbtex/unbtex-example/anexo-b.tex
2023/11/14 | 4221 | macros/latex/contrib/postnotes/CHANGELOG.md
2023/11/14 | 419021 | macros/latex/contrib/zref-check/zref-check-doc.pdf
-2023/11/14 | 4134851 | biblio/ctan-bibdata.zip
+2023/11/14 | 4121 | macros/latex/contrib/unbtex/README.md
2023/11/14 | 408693 | macros/latex/contrib/sim-os-menus/doc/sim-os-menus-doc-fr.pdf
2023/11/14 | 399623 | macros/latex/contrib/sim-os-menus/doc/sim-os-menus-doc.pdf
2023/11/14 | 397026 | graphics/pmdraw.zip
2023/11/14 | 39328 | macros/latex/contrib/siunitx/siunitx-complex.dtx
-2023/11/14 | 392852 | systems/texlive/tlnet/archive/sim-os-menus.doc.r68830.tar.xz
2023/11/14 | 38 | macros/latex/contrib/zref-check/DEPENDS.txt
+2023/11/14 | 38806 | macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
2023/11/14 | 38035 | macros/latex/contrib/zref-vario/zref-vario.dtx
2023/11/14 | 377485 | graphics/pmdraw/pmdraw.pdf
2023/11/14 | 37724 | macros/latex/contrib/siunitx/siunitx-print.dtx
-2023/11/14 | 3729762 | biblio/ctan-bibdata/ctan.pdf
+2023/11/14 | 373 | macros/latex/contrib/unbtex/unbtex-example/codigos/controle.m
2023/11/14 | 3687 | macros/latex/contrib/siunitx/siunitx.ins
+2023/11/14 | 3678 | macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
2023/11/14 | 36489 | macros/latex/contrib/diffcoeff/diffcoeff.sty
2023/11/14 | 347034 | macros/latex/contrib/zref-clever/zref-clever.dtx
2023/11/14 | 344423 | macros/latex/contrib/zref-clever/zref-clever-doc.pdf
@@ -73,29 +214,29 @@
2023/11/14 | 31738 | macros/latex/contrib/siunitx/siunitx-version-1.cfg
2023/11/14 | 315956 | macros/unicodetex/latex/njuthesis/njuthesis.dtx
2023/11/14 | 3151 | macros/latex/contrib/zref-clever/zref-clever.ins
+2023/11/14 | 30265 | macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
2023/11/14 | 30237 | macros/latex/contrib/sim-os-menus/tex/sim-os-menus.sty
2023/11/14 | 2951 | macros/latex/contrib/siunitx/siunitx-binary.dtx
-2023/11/14 | 2828497 | biblio/ctan-bibdata/ctan.bib
2023/11/14 | 273398 | macros/latex/contrib/siunitx/siunitx-v2.sty
+2023/11/14 | 2714 | macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
2023/11/14 | 2636 | macros/latex/contrib/siunitx/siunitx-code.tex
2023/11/14 | 2610 | macros/latex/contrib/zref-vario/CHANGELOG.md
-2023/11/14 | 26029568 | systems/texlive/tlnet/install-tl.zip
2023/11/14 | 25884 | systems/texlive/tlnet/archive/bfh-ci.r68828.tar.xz
2023/11/14 | 2571 | macros/latex/contrib/zref-vario/zref-vario.ins
2023/11/14 | 2571 | macros/latex/contrib/zref-check/zref-check.ins
2023/11/14 | 2556 | macros/latex/contrib/postnotes/postnotes.ins
2023/11/14 | 25235 | fonts/newpx/README
2023/11/14 | 24966 | fonts/newpx/tex/newpxtext.sty
-2023/11/14 | 2487400 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/11/14 | 238708 | systems/texlive/tlnet/archive/bfh-ci.doc.r68828.tar.xz
2023/11/14 | 22750 | macros/latex/contrib/zref-check/zref-check-doc.tex
2023/11/14 | 2265 | macros/latex/contrib/zref-check/zref-check-code.tex
2023/11/14 | 22231 | macros/latex/contrib/siunitx/siunitx.dtx
2023/11/14 | 221797 | macros/latex/contrib/robust-externalize/robust-externalize.tex
-2023/11/14 | 21034586 | systems/texlive/tlnet/install-tl-windows.exe
+2023/11/14 | 215 | macros/latex/contrib/unbtex/unbtex-example/capitulo5.tex
2023/11/14 | 2074768 | systems/texlive/tlnet/archive/worldflags.r68827.tar.xz
2023/11/14 | 203205 | macros/latex/contrib/postnotes/postnotes-doc.pdf
2023/11/14 | 2016 | fonts/newpx/tex/t1zpllf.fd
+2023/11/14 | 19971 | macros/latex/contrib/unbtex/unbtex-example/figuras/1280px-LaTeX-logo.png
2023/11/14 | 1918 | fonts/newpx/tex/t1zplsups.fd
2023/11/14 | 19105 | macros/unicodetex/latex/njuthesis/LICENSE
2023/11/14 | 1894 | fonts/newpx/tex/t1zplsubs.fd
@@ -103,32 +244,35 @@
2023/11/14 | 1857 | fonts/newpx/tex/t1zpldnom.fd
2023/11/14 | 1855 | fonts/newpx/tex/t1zplinf.fd
2023/11/14 | 18441 | macros/latex/contrib/siunitx/siunitx-angle.dtx
-2023/11/14 | 18347741 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/11/14 | 18352 | macros/latex/contrib/unbtex/unbtex.cls
2023/11/14 | 1831 | graphics/pmdraw/README.md
2023/11/14 | 18184 | systems/texlive/tlnet/archive/xcolor.r68831.tar.xz
+2023/11/14 | 17972 | macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
+2023/11/14 | 1769 | macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
+2023/11/14 | 17610 | macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdf
+2023/11/14 | 1739 | macros/latex/contrib/unbtex/unbtex-example/capitulo4.tex
2023/11/14 | 1729 | macros/latex/contrib/siunitx/siunitx-binary.cfg
2023/11/14 | 17066 | usergrps/dante/dtk/dtk.cls
2023/11/14 | 168644 | macros/latex/contrib/siunitx/siunitx.tex
-2023/11/14 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/11/14 | 1671 | macros/latex/contrib/unbtex/unbtex-example/codigos/controleSmithPredictor.py
2023/11/14 | 162450 | macros/latex/contrib/siunitx/siunitx-number.dtx
2023/11/14 | 1622886 | install/macros/latex/contrib/zref-clever.tds.zip
2023/11/14 | 1594153 | install/macros/latex/contrib/siunitx.tds.zip
+2023/11/14 | 15916 | macros/latex/contrib/unbtex/unbtex-example.tex
2023/11/14 | 1586063 | macros/latex/contrib/zref-clever.zip
2023/11/14 | 1546847 | macros/latex/contrib/siunitx.zip
-2023/11/14 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2023/11/14 | 15349 | macros/latex/contrib/litesolution/tex/litesolution.cls
2023/11/14 | 15311 | macros/latex/contrib/siunitx/siunitx-quantity.dtx
-2023/11/14 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2023/11/14 | 1525 | macros/latex/contrib/zref-clever/zref-clever-code.tex
2023/11/14 | 151294 | macros/latex/contrib/diffcoeff/diffcoeff.tex
2023/11/14 | 14 | macros/latex/contrib/postnotes/DEPENDS.txt
2023/11/14 | 148094 | macros/latex/contrib/zref-vario/zref-vario-doc.pdf
-2023/11/14 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/11/14 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2023/11/14 | 14409 | macros/latex/contrib/zref-vario/zref-vario-doc.tex
+2023/11/14 | 14391 | macros/latex/contrib/unbtex/unbtex-example/referencias.bib
2023/11/14 | 1425 | macros/latex/contrib/postnotes/postnotes-code.tex
2023/11/14 | 141859 | macros/latex/contrib/robust-externalize/robust-externalize.sty
2023/11/14 | 1402 | macros/latex/contrib/zref-vario/zref-vario-code.tex
+2023/11/14 | 1356 | macros/latex/contrib/unbtex/unbtex-example/figuras/capa_fundo.pdf
2023/11/14 | 1339 | fonts/newpx/tex/ts1zpltosf.fd
2023/11/14 | 1324126 | macros/unicodetex/latex/njuthesis.zip
2023/11/14 | 13096 | macros/latex/contrib/litesolution/doc/litesolution-doc.tex
@@ -136,12 +280,12 @@
2023/11/14 | 1306 | fonts/newpx/tex/ts1zpltlf.fd
2023/11/14 | 129429 | macros/latex/contrib/zref-clever/zref-clever-doc.tex
2023/11/14 | 1273 | fonts/newpx/tex/ts1zpllf.fd
+2023/11/14 | 12666 | macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
2023/11/14 | 1249527 | macros/unicodetex/latex/njuthesis/njuthesis.pdf
2023/11/14 | 1218402 | macros/latex/contrib/zref-clever/zref-clever-code.pdf
2023/11/14 | 12141 | macros/latex/contrib/sim-os-menus/doc/sim-os-menus-doc-fr.tex
2023/11/14 | 1205922 | macros/latex/contrib/litesolution.zip
2023/11/14 | 1179 | macros/latex/contrib/siunitx/README.md
-2023/11/14 | 114228 | systems/texlive/tlnet/archive/texlive-scripts.r68825.tar.xz
2023/11/14 | 11266 | macros/latex/contrib/siunitx/siunitx-abbreviation.dtx
2023/11/14 | 11093 | macros/latex/contrib/sim-os-menus/doc/sim-os-menus-doc.tex
2023/11/14 | 1107847 | macros/latex/contrib/zref-check.zip
@@ -161,14 +305,12 @@
2023/11/13 | 9404 | macros/latex/contrib/profcollege/latex/PfCPyramideCalculs.tex
2023/11/13 | 9396 | macros/latex/contrib/profcollege/latex/PfCOperationsTrou.tex
2023/11/13 | 92276 | macros/latex/contrib/bfh-ci/doc/DEMO-BFHPub.pdf
-2023/11/13 | 91691 | macros/latex/contrib/xcolor/xcolor2.pdf
2023/11/13 | 8956 | macros/latex/contrib/profcollege/latex/PfCBillard.tex
2023/11/13 | 889196 | systems/texlive/tlnet/archive/l3backend.doc.r68821.tar.xz
2023/11/13 | 8870 | macros/latex/contrib/profcollege/latex/PfCCalisson.tex
2023/11/13 | 8842 | macros/latex/contrib/bfh-ci/tex/bfh-projectproposal.cfg
2023/11/13 | 8711 | macros/latex/contrib/profcollege/latex/PfCShikaku.tex
2023/11/13 | 8676 | macros/latex/contrib/profcollege/latex/PfCYohaku.tex
-2023/11/13 | 863950 | macros/latex/contrib/xcolor/xcolor.pdf
2023/11/13 | 8486 | macros/latex/contrib/bfh-ci/tex/bfhhkb-doc.cfg
2023/11/13 | 83285 | macros/latex/contrib/profcollege/latex/PfCStatistiques.tex
2023/11/13 | 831 | macros/latex/contrib/profcollege/latex/PfCDobble.tex
@@ -186,7 +328,6 @@
2023/11/13 | 7650 | macros/latex/contrib/profcollege/latex/PfCRangementNombres.tex
2023/11/13 | 75344 | macros/latex/contrib/profcollege/latex/PfCReperage.tex
2023/11/13 | 7497 | macros/latex/contrib/profcollege/latex/PfCCible.tex
-2023/11/13 | 7380 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/11/13 | 7341 | macros/latex/contrib/profcollege/latex/PfCCalculsFractionsoldv1.tex
2023/11/13 | 7305 | macros/latex/contrib/profcollege/latex/PfCNombreAstral.tex
2023/11/13 | 7244 | macros/latex/contrib/profcollege/latex/PfCFrise.tex
@@ -195,7 +336,6 @@
2023/11/13 | 7105 | macros/latex/contrib/profcollege/latex/PfCHorloge.tex
2023/11/13 | 7102 | macros/latex/contrib/profcollege/latex/PfCPuzzleSommePyramide.tex
2023/11/13 | 7088 | macros/latex/contrib/profcollege/latex/PfCColorilude.tex
-2023/11/13 | 703 | macros/latex/contrib/xcolor/xcolor.ins
2023/11/13 | 700 | macros/latex/contrib/tagpdf/ex-spaceglyph-listings.tex
2023/11/13 | 70042 | macros/luatex/latex/luarandom/doc/luarandom-doc.pdf
2023/11/13 | 69916 | macros/latex/contrib/tagpdf/tagpdf-struct.dtx
@@ -218,7 +358,6 @@
2023/11/13 | 5798 | macros/latex/contrib/bfh-ci/tex/bfhletter.sty
2023/11/13 | 57401 | macros/latex/contrib/bfh-ci/doc/DEMO-BFHProjektProposal.pdf
2023/11/13 | 56982 | macros/latex/contrib/profcollege/latex/PfCThales.tex
-2023/11/13 | 56154 | macros/latex/contrib/xcolor/xcolor-2022-06-12.sty
2023/11/13 | 5528 | systems/texlive/tlnet/archive/quizztex.r68823.tar.xz
2023/11/13 | 54466 | macros/latex/contrib/profcollege/latex/PfCLogoNumberHive.png
2023/11/13 | 536884 | systems/texlive/tlnet/archive/quizztex.doc.r68823.tar.xz
@@ -273,7 +412,6 @@
2023/11/13 | 3431 | macros/latex/contrib/profcollege/latex/PfCBarresCalculs.tex
2023/11/13 | 3429 | macros/latex/contrib/bfh-ci/tex/bfhtranslations-german.trsl
2023/11/13 | 34295 | macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
-2023/11/13 | 340791 | macros/latex/contrib/xcolor/xcolor.dtx
2023/11/13 | 34000 | systems/texlive/tlnet/archive/l3backend.source.r68821.tar.xz
2023/11/13 | 33684 | macros/latex/contrib/tagpdf/tagpdf-checks.dtx
2023/11/13 | 3286 | macros/latex/contrib/bfh-ci/tex/bfhpub.cls
@@ -335,7 +473,6 @@
2023/11/13 | 2055 | macros/latex/contrib/bfh-ci/tex/bfhmodule.sty
2023/11/13 | 2022 | macros/latex/contrib/tagpdf/link-figure-input.tex
2023/11/13 | 2013 | macros/latex/contrib/profcollege/latex/PfCEngrenagesBase.tex
-2023/11/13 | 2007 | macros/latex/contrib/xcolor/README.md
2023/11/13 | 20066 | macros/latex/contrib/tagpdf/ex-formula-problem.pdf
2023/11/13 | 19900 | macros/latex/contrib/profcollege/latex/PfCTrio.tex
2023/11/13 | 19749 | macros/latex/contrib/profcollege/latex/PfCRose.tex
@@ -372,7 +509,6 @@
2023/11/13 | 15925 | macros/latex/contrib/profcollege/latex/PfCPropor.tex
2023/11/13 | 15900 | macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx
2023/11/13 | 15861 | macros/latex/contrib/profcollege/latex/PfCFonctionAffine.tex
-2023/11/13 | 15844 | macros/latex/contrib/xcolor/ChangeLog
2023/11/13 | 1583 | macros/latex/contrib/bfh-ci/example/DEMO-BFHLetter.tex
2023/11/13 | 15728 | macros/latex/contrib/abntexto/abntexto.tex
2023/11/13 | 15355 | macros/latex/contrib/profcollege/latex/PfCRepresentationGraphique.tex
@@ -425,7 +561,6 @@
2023/11/13 | 10548 | macros/latex/contrib/profcollege/latex/PfCModeleBarre.tex
2023/11/13 | 1053 | macros/latex/contrib/profcollege/latex/PfCBonbon.tex
2023/11/13 | 10322 | macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex
-2023/11/13 | 1029419 | macros/latex/contrib/xcolor.zip
2023/11/13 | 10241 | macros/latex/contrib/profcollege/latex/PfCProgrammeCalcul.tex
2023/11/13 | 10168 | macros/latex/contrib/profcollege/latex/PfCPapiers.tex
2023/11/13 | 10148 | fonts/cochineal/README
@@ -516,7 +651,6 @@
2023/11/11 | 7476 | fonts/cochineal/tfm/Cochineal-Italic-osf-lgr.tfm
2023/11/11 | 7464 | fonts/cochineal/tfm/Cochineal-Italic-tosf-lgr.tfm
2023/11/11 | 66876 | macros/latex/contrib/crefthe/crefthe-doc.pdf
-2023/11/11 | 66476 | systems/texlive/tlnet/archive/tagpdf.source.r68805.tar.xz
2023/11/11 | 641895 | macros/latex/required/babel/base/babel-code.pdf
2023/11/11 | 64180 | fonts/cochineal/tfm/Cochineal-Bold-lf-t1.tfm
2023/11/11 | 64156 | fonts/cochineal/tfm/Cochineal-Bold-tlf-t1.tfm
@@ -570,8 +704,6 @@
2023/11/11 | 48284 | fonts/cochineal/tfm/Cochineal-Italic-tlf-th-t1.tfm
2023/11/11 | 481466 | macros/latex/contrib/litesolution/doc/figures/cover1.png
2023/11/11 | 4768 | macros/latex/contrib/crefthe/README.md
-2023/11/11 | 476656 | systems/texlive/tlnet/archive/newpx.doc.r68798.tar.xz
-2023/11/11 | 4743784 | systems/texlive/tlnet/archive/newpx.r68798.tar.xz
2023/11/11 | 4729932 | systems/texlive/tlnet/archive/novel.doc.r68807.tar.xz
2023/11/11 | 4684 | fonts/cochineal/tfm/Cochineal-BoldItalic-lf-sc-ot1.tfm
2023/11/11 | 4656 | fonts/cochineal/tfm/Cochineal-BoldItalic-osf-sc-ot1.tfm
@@ -599,7 +731,6 @@
2023/11/11 | 414540 | systems/texlive/tlnet/archive/hyperref.source.r68800.tar.xz
2023/11/11 | 40964 | fonts/cochineal/tfm/Cochineal-Bold-osf-swash-ly1.tfm
2023/11/11 | 40912 | fonts/cochineal/tfm/Cochineal-Bold-tosf-swash-ly1.tfm
-2023/11/11 | 392 | systems/texlive/tlnet/archive/newpx.source.r68798.tar.xz
2023/11/11 | 38720 | macros/latex/contrib/q-and-a/Q-and-A.cls
2023/11/11 | 3841 | fonts/cochineal/enc/coch_uxmidq.enc
2023/11/11 | 3814 | fonts/cochineal/enc/coch_3zrls4.enc
@@ -650,7 +781,6 @@
2023/11/11 | 3633 | fonts/cochineal/enc/coch_2buzhw.enc
2023/11/11 | 3629 | fonts/cochineal/enc/coch_irebs3.enc
2023/11/11 | 3603428 | install/macros/latex/required/babel-base.tds.zip
-2023/11/11 | 35932 | systems/texlive/tlnet/archive/tagpdf.r68805.tar.xz
2023/11/11 | 3578 | fonts/cochineal/enc/coch_6cgo7o.enc
2023/11/11 | 3570 | fonts/cochineal/enc/coch_t6r2tr.enc
2023/11/11 | 3570 | fonts/cochineal/enc/coch_k4d3tq.enc
@@ -858,7 +988,6 @@
2023/11/11 | 2168 | fonts/cochineal/tfm/Cochineal-Italic-sup-ly1.tfm
2023/11/11 | 2164 | fonts/cochineal/tfm/Cochineal-Italic-sup-ly1--base.tfm
2023/11/11 | 2164 | fonts/cochineal/tfm/Cochineal-BoldItalic-sup-t1--base.tfm
-2023/11/11 | 2143960 | systems/texlive/tlnet/archive/tagpdf.doc.r68805.tar.xz
2023/11/11 | 2136 | fonts/cochineal/tfm/Cochineal-BoldItalic-lf-sc-ly1--base.tfm
2023/11/11 | 2132 | fonts/cochineal/tfm/Cochineal-Italic-sup-t1.tfm
2023/11/11 | 2128 | fonts/cochineal/tfm/Cochineal-BoldItalic-osf-sc-ly1--base.tfm
@@ -1232,12 +1361,9 @@
2023/11/10 | 7738 | macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-main.tex
2023/11/10 | 7657460 | systems/texlive/tlnet/archive/pstricks.doc.r68767.tar.xz
2023/11/10 | 70240 | systems/texlive/tlnet/archive/newpax.doc.r68762.tar.xz
-2023/11/10 | 67728 | systems/texlive/tlnet/archive/siunitx.r68775.tar.xz
-2023/11/10 | 666716 | systems/texlive/tlnet/archive/robust-externalize.doc.r68757.tar.xz
2023/11/10 | 6516 | systems/texlive/tlnet/archive/ppt-slides.source.r68764.tar.xz
2023/11/10 | 645532 | systems/texlive/tlnet/archive/fenetrecas.doc.r68779.tar.xz
2023/11/10 | 6454 | macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_intersections.lua
-2023/11/10 | 6348 | systems/texlive/tlnet/archive/pmdraw.r68766.tar.xz
2023/11/10 | 62132 | systems/texlive/tlnet/archive/acmart.source.r68754.tar.xz
2023/11/10 | 6068524 | systems/texlive/tlnet/archive/newtx.r68752.tar.xz
2023/11/10 | 5751600 | systems/texlive/tlnet/archive/pst-solides3d.doc.r68786.tar.xz
@@ -1269,7 +1395,6 @@
2023/11/10 | 3956 | systems/texlive/tlnet/archive/fenetrecas.r68779.tar.xz
2023/11/10 | 3948 | systems/texlive/tlnet/archive/jwjournal.r68788.tar.xz
2023/11/10 | 3784 | macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_ellipses.lua
-2023/11/10 | 377412 | systems/texlive/tlnet/archive/pmdraw.doc.r68766.tar.xz
2023/11/10 | 365464 | systems/texlive/tlnet/archive/sansmathfonts.doc.r68777.tar.xz
2023/11/10 | 3600 | systems/texlive/tlnet/archive/homework.r68773.tar.xz
2023/11/10 | 351436 | systems/texlive/tlnet/archive/homework.doc.r68773.tar.xz
@@ -1295,7 +1420,6 @@
2023/11/10 | 2664 | systems/texlive/tlnet/archive/highlightx.r68756.tar.xz
2023/11/10 | 2662 | fonts/simpleicons/enc/simpleiconssix.enc
2023/11/10 | 2660 | fonts/simpleicons/enc/simpleiconstwo.enc
-2023/11/10 | 26548 | systems/texlive/tlnet/archive/robust-externalize.r68757.tar.xz
2023/11/10 | 264 | fonts/simpleicons/tex/usimpleiconsthree.fd
2023/11/10 | 264 | fonts/simpleicons/tex/usimpleiconsseven.fd
2023/11/10 | 264 | fonts/simpleicons/tex/usimpleiconseight.fd
@@ -1358,7 +1482,6 @@
2023/11/10 | 1413877 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
2023/11/10 | 138384 | systems/texlive/tlnet/archive/pdfmanagement-testphase.source.r68774.tar.xz
2023/11/10 | 12904 | macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-ellipse.tex
-2023/11/10 | 1288648 | systems/texlive/tlnet/archive/siunitx.doc.r68775.tar.xz
2023/11/10 | 126618 | macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-examples.tex
2023/11/10 | 12584 | macros/latex/contrib/tkz/tkz-elements/doc/latex/TKZdoc-elements-classes-circle.tex
2023/11/10 | 1251668 | systems/texlive/tlnet/archive/ucs.doc.r68759.tar.xz
@@ -1374,7 +1497,6 @@
2023/11/10 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsnine.tfm
2023/11/10 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfour.tfm
2023/11/10 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsfive.tfm
-2023/11/10 | 122932 | systems/texlive/tlnet/archive/siunitx.source.r68775.tar.xz
2023/11/10 | 12236 | systems/texlive/tlnet/archive/innerscript.source.r68776.tar.xz
2023/11/10 | 1207 | fonts/simpleicons/README.md
2023/11/10 | 11964 | systems/texlive/tlnet/archive/dsptricks.r68753.tar.xz
@@ -1518,7 +1640,6 @@
2023/11/09 | 555 | macros/latex/contrib/ucs/data/uni-42.def
2023/11/09 | 5551 | macros/latex/contrib/ucs/config/braille.ucf
2023/11/09 | 5538 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_M042.pdf
-2023/11/09 | 5529 | macros/latex/contrib/ipsum/doc/ipsum-doc.tex
2023/11/09 | 5523 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_W049.pdf
2023/11/09 | 5518 | macros/latex/contrib/ucs/data/uni-497.def
2023/11/09 | 549 | macros/latex/contrib/l3backend/README.md
@@ -1539,7 +1660,6 @@
2023/11/09 | 5112 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_M034.pdf
2023/11/09 | 51081 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
2023/11/09 | 50952 | macros/latex/contrib/l3backend/l3backend-pdf.dtx
-2023/11/09 | 50826 | macros/latex/contrib/ipsum/tex/ipsum.sty
2023/11/09 | 50695 | macros/latex/contrib/hyperref/hluatex.dtx
2023/11/09 | 5066471 | macros/luatex/latex/novel.zip
2023/11/09 | 5035 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_W063.pdf
@@ -1887,7 +2007,6 @@
2023/11/09 | 1849 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_M013.pdf
2023/11/09 | 1847 | macros/latex/contrib/ucs/config/ctrlglyphs.ucf
2023/11/09 | 1844 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_P072.pdf
-2023/11/09 | 183862 | macros/latex/contrib/ipsum.zip
2023/11/09 | 1834 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_P008.pdf
2023/11/09 | 1828 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_E001.pdf
2023/11/09 | 1825 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_P069.pdf
@@ -1935,7 +2054,6 @@
2023/11/09 | 1702 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_P075.pdf
2023/11/09 | 170102 | macros/latex/contrib/l3kernel/l3news11.pdf
2023/11/09 | 1698 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_P002.pdf
-2023/11/09 | 169604 | macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
2023/11/09 | 1691 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_W064.pdf
2023/11/09 | 16911 | macros/luatex/latex/novel/lualatex/novel-pdfx.sty
2023/11/09 | 1690 | macros/latex/contrib/isosafety/isosafety-pdfs/ISO_7010_W039.pdf
@@ -2156,7 +2274,6 @@
2023/11/09 | 10889 | macros/latex/contrib/ucs/data/uni-34.def
2023/11/09 | 108537 | macros/latex/contrib/profmaquette/latex/ProfMaquette.sty
2023/11/09 | 10852 | macros/latex/contrib/ucs/data/uni-153.def
-2023/11/09 | 1075706 | macros/latex/contrib/notebeamer/doc/images/newnote4sdemo.pdf
2023/11/09 | 1073 | macros/latex/contrib/ucs/data/uni-762.def
2023/11/09 | 107383 | macros/latex/contrib/l3kernel/l3news09.tex
2023/11/09 | 10695 | macros/latex/contrib/ucs/data/uni-157.def
@@ -2176,157 +2293,3 @@
2023/11/09 | 10122 | macros/latex/contrib/ucs/data/uni-147.def
2023/11/09 | 10028 | macros/latex/contrib/ucs/data/uni-48.def
2023/11/09 | 10001 | macros/latex/contrib/ucs/data/uni-146.def
-2023/11/08 | 9655420 | fonts/newtx.zip
-2023/11/08 | 94352 | macros/latex/contrib/ppt-slides/socrates.jpg
-2023/11/08 | 937 | graphics/pmdraw/examples/example-2.tex
-2023/11/08 | 934686 | macros/latex/contrib/ppt-slides/ppt-slides.pdf
-2023/11/08 | 915 | macros/latex/contrib/newpax/doc-use-pax.tex
-2023/11/08 | 905160 | macros/latex/contrib/acmart/acmart.pdf
-2023/11/08 | 896 | macros/latex/contrib/newpax/doc-input2.tex
-2023/11/08 | 875 | graphics/pmdraw/examples/example-1.tex
-2023/11/08 | 85929 | biblio/bibtex/contrib/econ-bst/econ-econometrica.bst
-2023/11/08 | 855 | macros/latex/contrib/newpax/README.md
-2023/11/08 | 84836 | biblio/bibtex/contrib/econ-bst/econ-aea.bst
-2023/11/08 | 84648 | biblio/bibtex/contrib/econ-bst/econ-b.bst
-2023/11/08 | 84514 | biblio/bibtex/contrib/econ-bst/econ-a.bst
-2023/11/08 | 84328 | biblio/bibtex/contrib/econ-bst/econ-no-sort.bst
-2023/11/08 | 84327 | biblio/bibtex/contrib/econ-bst/econ.bst
-2023/11/08 | 84263 | biblio/bibtex/contrib/econ-bst/econ-jie.bst
-2023/11/08 | 84123 | biblio/bibtex/contrib/econ-bst/econ-te.bst
-2023/11/08 | 82697 | biblio/bibtex/contrib/econ-bst/econ-old.bst
-2023/11/08 | 81041 | macros/latex/contrib/newpax/doc-use-newpax.pdf
-2023/11/08 | 795308 | systems/texlive/tlnet/archive/quran-id.r68747.tar.xz
-2023/11/08 | 783335 | macros/latex/contrib/acmart/samples/sample-lualatex.pdf
-2023/11/08 | 728728 | systems/texlive/tlnet/archive/coloredbelts.doc.r68747.tar.xz
-2023/11/08 | 659280 | macros/latex/contrib/acmart/samples/sample-xelatex.pdf
-2023/11/08 | 654 | macros/latex/contrib/ppt-slides/DEPENDS.txt
-2023/11/08 | 629654 | macros/latex/contrib/acmart/samples/sample-acmsmall-biblatex.pdf
-2023/11/08 | 619465 | macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdf
-2023/11/08 | 619322 | macros/latex/contrib/acmart/samples/sample-manuscript.pdf
-2023/11/08 | 616959 | macros/latex/contrib/acmart/samples/sample-acmsmall.pdf
-2023/11/08 | 616653 | macros/latex/contrib/acmart/samples/sample-sigconf-biblatex.pdf
-2023/11/08 | 615 | graphics/pstricks/contrib/dsptricks/README
-2023/11/08 | 607035 | macros/latex/contrib/acmart/samples/sample-acmlarge.pdf
-2023/11/08 | 564521 | macros/latex/contrib/acmart/samples/sample-acmtog.pdf
-2023/11/08 | 55194 | macros/latex/contrib/acmart/samples/samples.dtx
-2023/11/08 | 53988 | systems/texlive/tlnet/archive/selnolig.r68747.tar.xz
-2023/11/08 | 509908 | systems/texlive/tlnet/archive/selnolig.doc.r68747.tar.xz
-2023/11/08 | 46702 | fonts/newtx/README
-2023/11/08 | 465927 | info/biblio/texbook2.bib
-2023/11/08 | 46533 | macros/latex/contrib/newpax/newpax.dtx
-2023/11/08 | 4591 | graphics/pmdraw/examples/example-23.tex
-2023/11/08 | 4583 | graphics/pmdraw/examples/example-22.tex
-2023/11/08 | 4525 | graphics/pmdraw/examples/example-21.tex
-2023/11/08 | 44968 | macros/latex/contrib/newpax/doc-use-pax.pdf
-2023/11/08 | 4403 | graphics/pmdraw/examples/example-20.tex
-2023/11/08 | 433431 | macros/latex/contrib/acmart/acmguide.pdf
-2023/11/08 | 42807 | macros/latex/contrib/newpax/doc-input1.pdf
-2023/11/08 | 42796 | graphics/pstricks/contrib/dsptricks/dspTricksManual.tex
-2023/11/08 | 42518 | macros/latex/contrib/newpax/doc-input2.pdf
-2023/11/08 | 41924 | systems/texlive/tlnet/archive/tkz-euclide.r68747.tar.xz
-2023/11/08 | 41362 | biblio/bibtex/contrib/econ-bst/econ-example.bib
-2023/11/08 | 4089 | graphics/pstricks/contrib/dsptricks/dspblocks.sty
-2023/11/08 | 3989 | macros/latex/contrib/ppt-slides/ppt-templates/ppt-9x6.tex
-2023/11/08 | 3969 | fonts/newpx/tex/newpx.sty
-2023/11/08 | 395887 | macros/latex/contrib/acmart/samples/sample-acmengage.pdf
-2023/11/08 | 3884 | graphics/pmdraw/examples/example-24.tex
-2023/11/08 | 36140 | graphics/pstricks/contrib/dsptricks/dsptricks.sty
-2023/11/08 | 3543 | info/biblio/gutenberg.ltx
-2023/11/08 | 3451 | graphics/pmdraw/examples/example-12.tex
-2023/11/08 | 34120 | biblio/bibtex/contrib/econ-bst/econ-example.tex
-2023/11/08 | 3137 | biblio/bibtex/contrib/econ-bst/customization/README.md
-2023/11/08 | 31176 | systems/texlive/tlnet/archive/coloredbelts.r68747.tar.xz
-2023/11/08 | 311010 | macros/latex/contrib/notebeamer/doc/images/newnote3sdemo.pdf
-2023/11/08 | 3049 | graphics/pmdraw/examples/example-16.tex
-2023/11/08 | 3018 | graphics/pmdraw/examples/example-13.tex
-2023/11/08 | 294 | macros/latex/contrib/isosafety/README.md
-2023/11/08 | 29280 | fonts/newtx/tex/newtxtext.sty
-2023/11/08 | 2884 | info/biblio/texbook2.ltx
-2023/11/08 | 287314 | macros/latex/contrib/acmart/acmart.dtx
-2023/11/08 | 286314 | macros/latex/contrib/notebeamer/doc/images/titlepage1.pdf
-2023/11/08 | 2854 | info/biblio/typeset.ltx
-2023/11/08 | 2854 | graphics/pmdraw/examples/example-5.tex
-2023/11/08 | 2640 | macros/latex/contrib/ppt-slides/ppt-slides.ins
-2023/11/08 | 262222 | biblio/bibtex/contrib/econ-bst/econ-example.pdf
-2023/11/08 | 2609 | biblio/bibtex/contrib/econ-bst/customization/cited-part.tex
-2023/11/08 | 236 | macros/latex/contrib/newpax/doc-extract-newpax.tex
-2023/11/08 | 2365198 | biblio/bibtex/contrib/econ-bst.zip
-2023/11/08 | 231 | macros/latex/contrib/newpax/doc-extract-pax.tex
-2023/11/08 | 2200 | biblio/bibtex/contrib/econ-bst/customization/econ-numbers.tex
-2023/11/08 | 216129 | macros/latex/contrib/newpax/newpax.pdf
-2023/11/08 | 215120 | macros/latex/contrib/acmart/samples/sample-acmcp.pdf
-2023/11/08 | 2050 | biblio/bibtex/contrib/econ-bst/README.md
-2023/11/08 | 202907 | graphics/pstricks/contrib/dsptricks/dspTricksManual.pdf
-2023/11/08 | 19254 | macros/latex/contrib/ppt-slides/ppt-slides.dtx
-2023/11/08 | 1901 | graphics/pmdraw/examples/example-4.tex
-2023/11/08 | 1839 | graphics/pmdraw/examples/example-14.tex
-2023/11/08 | 1826 | graphics/pmdraw/examples/example-15.tex
-2023/11/08 | 1796 | fonts/newpx/tfm/zplbexx.tfm
-2023/11/08 | 1788 | fonts/newpx/tfm/zplexx.tfm
-2023/11/08 | 1787 | graphics/pmdraw/examples/example-17.tex
-2023/11/08 | 1745 | macros/latex/contrib/newpax/newpax.ins
-2023/11/08 | 1741 | biblio/bibtex/contrib/econ-bst/customization/econ-te.tex
-2023/11/08 | 16853 | macros/latex/contrib/newpax/newpax.tex
-2023/11/08 | 1620 | macros/latex/contrib/ppt-slides/README.md
-2023/11/08 | 1606 | biblio/bibtex/contrib/econ-bst/customization/econ-aea.tex
-2023/11/08 | 160261 | biblio/bibtex/contrib/econ-bst/customization/econ-b.pdf
-2023/11/08 | 1587 | graphics/pmdraw/examples/example-7.tex
-2023/11/08 | 1584 | graphics/pmdraw/examples/example-8.tex
-2023/11/08 | 158458 | biblio/bibtex/contrib/econ-bst/customization/econ-aea.pdf
-2023/11/08 | 157921 | macros/latex/contrib/newpax.zip
-2023/11/08 | 154679 | biblio/bibtex/contrib/econ-bst/customization/econ-econometrica.pdf
-2023/11/08 | 1529 | graphics/pmdraw/examples/example-25.tex
-2023/11/08 | 1524 | biblio/bibtex/contrib/econ-bst/customization/econ-abbr.tex
-2023/11/08 | 1512 | biblio/bibtex/contrib/econ-bst/customization/econ-no-sort.tex
-2023/11/08 | 150567 | biblio/bibtex/contrib/econ-bst/customization/econ-te.pdf
-2023/11/08 | 149898 | biblio/bibtex/contrib/econ-bst/customization/econ-numbers.pdf
-2023/11/08 | 149206 | biblio/bibtex/contrib/econ-bst/customization/econ-old.pdf
-2023/11/08 | 148436 | biblio/bibtex/contrib/econ-bst/customization/econ-default.pdf
-2023/11/08 | 147640 | biblio/bibtex/contrib/econ-bst/customization/econ-no-sort.pdf
-2023/11/08 | 1475 | biblio/bibtex/contrib/econ-bst/customization/econ-jet.tex
-2023/11/08 | 147589 | biblio/bibtex/contrib/econ-bst/customization/econ-abbr.pdf
-2023/11/08 | 1472 | biblio/bibtex/contrib/econ-bst/customization/econ-econometrica.tex
-2023/11/08 | 147022 | biblio/bibtex/contrib/econ-bst/customization/econ-jpe.pdf
-2023/11/08 | 1469 | biblio/bibtex/contrib/econ-bst/customization/econ-jie.tex
-2023/11/08 | 1462 | biblio/bibtex/contrib/econ-bst/customization/econ-jpe.tex
-2023/11/08 | 1452 | graphics/pmdraw/examples/example-19.tex
-2023/11/08 | 1444 | biblio/bibtex/contrib/econ-bst/customization/econ-old.tex
-2023/11/08 | 1441 | biblio/bibtex/contrib/econ-bst/customization/econ-default.tex
-2023/11/08 | 1420 | macros/latex/contrib/ppt-slides/ppt-schemes/ppt-light.tex
-2023/11/08 | 1420 | macros/latex/contrib/ppt-slides/ppt-schemes/ppt-light-mono.tex
-2023/11/08 | 1420 | macros/latex/contrib/ppt-slides/ppt-schemes/ppt-dark.tex
-2023/11/08 | 1420 | macros/latex/contrib/ppt-slides/ppt-schemes/ppt-dark-mono.tex
-2023/11/08 | 1413 | graphics/pmdraw/examples/example-18.tex
-2023/11/08 | 1399 | biblio/bibtex/contrib/econ-bst/customization/econ-b.tex
-2023/11/08 | 1399 | biblio/bibtex/contrib/econ-bst/customization/econ-a.tex
-2023/11/08 | 138365 | biblio/bibtex/contrib/econ-bst/customization/econ-jet.pdf
-2023/11/08 | 1376 | fonts/newpx/vf/zplexx.vf
-2023/11/08 | 1366 | graphics/pmdraw/examples/example-6.tex
-2023/11/08 | 136354 | biblio/bibtex/contrib/econ-bst/customization/econ-jie.pdf
-2023/11/08 | 1352 | fonts/newpx/vf/zplbexx.vf
-2023/11/08 | 1348 | graphics/pmdraw/examples/example-3.tex
-2023/11/08 | 13030 | macros/latex/contrib/acmart/README
-2023/11/08 | 13008986 | macros/latex/contrib/acmart.zip
-2023/11/08 | 124824 | systems/texlive/tlnet/archive/quran-id.doc.r68747.tar.xz
-2023/11/08 | 12385 | biblio/bibtex/contrib/econ-bst/CHANGES.md
-2023/11/08 | 1200459 | info/biblio/typeset.bib
-2023/11/08 | 117624 | biblio/bibtex/contrib/econ-bst/econ-jpe.bst
-2023/11/08 | 1175256 | systems/texlive/tlnet/archive/tkz-euclide.doc.r68747.tar.xz
-2023/11/08 | 115639 | biblio/bibtex/contrib/econ-bst/econ-abbr.bst
-2023/11/08 | 115519 | biblio/bibtex/contrib/econ-bst/econ-jet.bst
-2023/11/08 | 115374 | fonts/newpx/tex/newpxmath.sty
-2023/11/08 | 1124664 | info/biblio/gutenberg.bib
-2023/11/08 | 1093 | macros/latex/contrib/newpax/doc-use-newpax.tex
-2023/11/08 | 1083 | macros/latex/contrib/ppt-slides/LICENSE.txt
-2023/11/08 | 10796 | graphics/pstricks/contrib/dsptricks/dspfunctions.sty
-2023/11/08 | 1055579 | macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdf
-2023/11/08 | 1051033 | macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdf
-2023/11/08 | 1048761 | macros/latex/contrib/acmart/samples/sample-sigplan.pdf
-2023/11/08 | 1044077 | macros/latex/contrib/acmart/samples/sample-authordraft.pdf
-2023/11/08 | 104118 | biblio/bibtex/contrib/econ-bst/customization/econ-a.pdf
-2023/11/08 | 1040300 | macros/latex/contrib/acmart/samples/sample-sigconf.pdf
-2023/11/08 | 1025 | graphics/pmdraw/examples/example-9.tex
-2023/11/08 | 1025 | graphics/pmdraw/examples/example-11.tex
-2023/11/08 | 1025 | graphics/pmdraw/examples/example-10.tex
-2023/11/08 | 1020932 | macros/latex/contrib/ppt-slides.zip
-2023/11/08 | 1007 | macros/latex/contrib/newpax/doc-input1.tex
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index ddfb0b4505..500079154d 100644
--- a/biblio/ctan-bibdata/ctan.bib
+++ b/biblio/ctan-bibdata/ctan.bib
@@ -1,7 +1,7 @@
%% bib file of all CTAN packages
%% (C) Herbert Voß
%%
-%% created at 14-11-2023, 02:05:19
+%% created at 15-11-2023, 02:01:00
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -19822,8 +19822,8 @@
title = {The \texttt{dtk} package},
subtitle = {Document class for the journal of DANTE},
author = {Herbert Voß and Rolf Niepraschk},
- date = {2023-07-31},
- version = {},
+ date = {2023-11-14},
+ version = {2.10b},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/usergrps/dante/dtk},
url = {https://ctan.org/pkg/dtk},
@@ -40105,6 +40105,17 @@
url = {https://ctan.org/pkg/literaturnaya},
}
+@manual{ctan-litesolution,
+ title = {The \texttt{LiteSolution} package},
+ subtitle = {A template providing a light design for solutions of test papers},
+ author = {Mingyu Xia},
+ date = {2023-11-14},
+ version = {1.0a},
+ license = {lppl1.3c},
+ mirror = {https://mirror.ctan.org/macros/latex/contrib/litesolution},
+ url = {https://ctan.org/pkg/litesolution},
+}
+
@manual{ctan-litetable,
title = {The \texttt{LiteTable} package},
subtitle = {A template provides a beautiful design of class schedule with colorful course blocks},
@@ -48543,9 +48554,9 @@
title = {The \texttt{newpx} package},
subtitle = {Alternative uses of the PX fonts, with improved metrics},
author = {Michael Sharpe},
- date = {2023-11-10},
- version = {1.533},
- license = {lppl,ofl},
+ date = {2023-11-14},
+ version = {1.534},
+ license = {lppl,gfl},
mirror = {https://mirror.ctan.org/fonts/newpx},
url = {https://ctan.org/pkg/newpx},
}
@@ -48907,7 +48918,7 @@
subtitle = {\LaTeX{} thesis template for Nanjing University},
author = {Yichen Zhao and Yu Xiong},
date = {2019-01-01},
- version = {1.3.0},
+ version = {1.3.1},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/unicodetex/latex/njuthesis},
url = {https://ctan.org/pkg/njuthesis},
@@ -54275,17 +54286,13 @@
@manual{ctan-pmdraw,
title = {The \texttt{pmdraw} package},
- subtitle = {Draw elements of the partition monoids},
+ subtitle = {Draw elements of partition monoids},
author = {Matthias Fresacher},
- date = {2023-11-10},
- version = {1.0},
+ date = {2023-11-14},
+ version = {1.1},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/graphics/pmdraw},
url = {https://ctan.org/pkg/pmdraw},
- annotation = {The package allows you to draw elements of the
- Partition Monoids, commonly referred to as diagrams.
- The package provides a lot of flexibility to draw most diagrams
- and can be customised as needed.},
}
@manual{ctan-pmgraph,
@@ -54713,9 +54720,9 @@
@manual{ctan-postnotes,
title = {The \texttt{postnotes} package},
subtitle = {Endnotes for \LaTeX{}},
- author = {Gustavo Barros},
- date = {2023-08-21},
- version = {0.2.6},
+ author = {{Unknown}},
+ date = {2023-11-14},
+ version = {0.2.7},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/postnotes},
url = {https://ctan.org/pkg/postnotes},
@@ -59768,8 +59775,8 @@
title = {The \texttt{robust-externalize} package},
subtitle = {Cache anything (TikZ, python, ...) in a robust, efficient and pure way},
author = {Léo Colisson},
- date = {2023-11-09},
- version = {2.1},
+ date = {2023-11-14},
+ version = {2.2},
license = {mit},
mirror = {https://mirror.ctan.org/macros/latex/contrib/robust-externalize},
url = {https://ctan.org/pkg/robust-externalize},
@@ -63015,8 +63022,8 @@
title = {The \texttt{sim-os-menus} package},
subtitle = {Insert 'terminal' or 'context menu' or 'viewers' like in an OS},
author = {Cédric Pierquet},
- date = {2023-11-13},
- version = {0.1.0},
+ date = {2023-11-14},
+ version = {0.1.1},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/sim-os-menus},
url = {https://ctan.org/pkg/sim-os-menus},
@@ -63301,8 +63308,8 @@
title = {The \texttt{siunitx} package},
subtitle = {A comprehensive (SI) units package},
author = {Joseph Wright},
- date = {2023-11-06},
- version = {3.3.8},
+ date = {2023-11-14},
+ version = {3.3.9},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/siunitx},
url = {https://ctan.org/pkg/siunitx},
@@ -79154,9 +79161,9 @@
@manual{ctan-zref-check,
title = {The \texttt{zref-check} package},
subtitle = {Flexible cross-references with contextual checks based on zref},
- author = {Gustavo Barros},
- date = {2023-08-14},
- version = {0.3.4},
+ author = {{Unknown}},
+ date = {2023-11-14},
+ version = {0.3.5},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/zref-check},
url = {https://ctan.org/pkg/zref-check},
@@ -79181,9 +79188,9 @@
@manual{ctan-zref-clever,
title = {The \texttt{zref-clever} package},
subtitle = {Clever \LaTeX{} cross-references based on zref},
- author = {Gustavo Barros},
- date = {2023-08-14},
- version = {0.4.2},
+ author = {{Unknown}},
+ date = {2023-11-14},
+ version = {0.4.3},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/zref-clever},
url = {https://ctan.org/pkg/zref-clever},
@@ -79203,9 +79210,9 @@
@manual{ctan-zref-vario,
title = {The \texttt{zref-vario} package},
subtitle = {Extended \LaTeX{} page cross-references with varioref and zref-clever},
- author = {Gustavo Barros},
- date = {2023-08-15},
- version = {0.1.9},
+ author = {{Unknown}},
+ date = {2023-11-14},
+ version = {0.1.10},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/zref-vario},
url = {https://ctan.org/pkg/zref-vario},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 63c733a204..f1ce3bb18a 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ
diff --git a/dviware/dvisvgm/Makefile.in b/dviware/dvisvgm/Makefile.in
index 4096c579b8..215bcf3963 100644
--- a/dviware/dvisvgm/Makefile.in
+++ b/dviware/dvisvgm/Makefile.in
@@ -15,7 +15,7 @@
@SET_MAKE@
# aminclude_static.am generated automatically by Autoconf
-# from AX_AM_MACROS_STATIC on Wed Jul 5 12:26:42 CEST 2023
+# from AX_AM_MACROS_STATIC on Thu Oct 12 14:50:13 CEST 2023
VPATH = @srcdir@
am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \
diff --git a/dviware/dvisvgm/NEWS b/dviware/dvisvgm/NEWS
index cf7a347f47..0e996e2a74 100644
--- a/dviware/dvisvgm/NEWS
+++ b/dviware/dvisvgm/NEWS
@@ -1,3 +1,19 @@
+dvisvgm-3.1.2 (2023-10-12)
+- improved evaluation of graphic extents created by the 'preview' package
+ (GH issue #246)
+- fixed computation of character boxes when using --exact-bbox (GH issue #248)
+- fixed memory error in optimizer module (GH issue #250)
+- updated bundled brotli library to version 1.1.0
+
+dvisvgm-3.1.1 (2023-08-29)
+- added evaluation of optional dash prefixes to command-line option --optimize
+ to exclude selected optimizer modules
+- fixed invalid removal of clipping paths referenced in 'defs' section
+- fixed automatic calls of optimizer module 'remove-clippaths'
+- suppress Ghostscript warning about deprecated option -dNEWPDF (GH issue #245)
+- updated bundled xxHash library to version 0.8.2
+- few fixes in the manual page
+
dvisvgm-3.1 (2023-07-06)
- added command-line option --currentcolor to replace a given color with
CSS variable 'currentColor' (GH issue #214)
diff --git a/dviware/dvisvgm/aminclude_static.am b/dviware/dvisvgm/aminclude_static.am
index 51bd6c838b..b13d91489c 100644
--- a/dviware/dvisvgm/aminclude_static.am
+++ b/dviware/dvisvgm/aminclude_static.am
@@ -1,6 +1,6 @@
# aminclude_static.am generated automatically by Autoconf
-# from AX_AM_MACROS_STATIC on Wed Jul 5 12:26:42 CEST 2023
+# from AX_AM_MACROS_STATIC on Thu Oct 12 14:50:13 CEST 2023
# Code coverage
diff --git a/dviware/dvisvgm/configure b/dviware/dvisvgm/configure
index 470bf23060..c878cdc515 100755
--- a/dviware/dvisvgm/configure
+++ b/dviware/dvisvgm/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for dvisvgm 3.1.
+# Generated by GNU Autoconf 2.71 for dvisvgm 3.1.2.
#
# Report bugs to <martin.gieseking@uos.de>.
#
@@ -621,8 +621,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='dvisvgm'
PACKAGE_TARNAME='dvisvgm'
-PACKAGE_VERSION='3.1'
-PACKAGE_STRING='dvisvgm 3.1'
+PACKAGE_VERSION='3.1.2'
+PACKAGE_STRING='dvisvgm 3.1.2'
PACKAGE_BUGREPORT='martin.gieseking@uos.de'
PACKAGE_URL=''
@@ -1437,7 +1437,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures dvisvgm 3.1 to adapt to many kinds of systems.
+\`configure' configures dvisvgm 3.1.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1508,7 +1508,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of dvisvgm 3.1:";;
+ short | recursive ) echo "Configuration of dvisvgm 3.1.2:";;
esac
cat <<\_ACEOF
@@ -1653,7 +1653,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-dvisvgm configure 3.1
+dvisvgm configure 3.1.2
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2133,7 +2133,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by dvisvgm $as_me 3.1, which was
+It was created by dvisvgm $as_me 3.1.2, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3110,7 +3110,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DATE="June 2023"
+DATE="October 2023"
ac_config_headers="$ac_config_headers config.h"
@@ -3704,7 +3704,7 @@ fi
# Define the identity of the package.
PACKAGE='dvisvgm'
- VERSION='3.1'
+ VERSION='3.1.2'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -21279,7 +21279,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by dvisvgm $as_me 3.1, which was
+This file was extended by dvisvgm $as_me 3.1.2, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21347,7 +21347,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-dvisvgm config.status 3.1
+dvisvgm config.status 3.1.2
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff --git a/dviware/dvisvgm/configure.ac b/dviware/dvisvgm/configure.ac
index 4d4432a3ce..9338a0c87b 100644
--- a/dviware/dvisvgm/configure.ac
+++ b/dviware/dvisvgm/configure.ac
@@ -4,8 +4,8 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([dvisvgm],[3.1],[martin.gieseking@uos.de])
-DATE="June 2023"
+AC_INIT([dvisvgm],[3.1.2],[martin.gieseking@uos.de])
+DATE="October 2023"
AC_CONFIG_SRCDIR(src)
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
diff --git a/dviware/dvisvgm/doc/conf-dblatex-man.xsl b/dviware/dvisvgm/doc/conf-dblatex-man.xsl
index 23fb9ff2c4..a1e336376c 100644
--- a/dviware/dvisvgm/doc/conf-dblatex-man.xsl
+++ b/dviware/dvisvgm/doc/conf-dblatex-man.xsl
@@ -2,18 +2,18 @@
<!-- This file is part of dvisvgm -->
<!-- Copyright (C) 2015-2023 Martin Gieseking <martin.gieseking@uos.de> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <!-- output monospaced text in bold -->
- <xsl:template match="literal">
- <xsl:text>\fB</xsl:text>
- <xsl:apply-templates/>
- <xsl:text>\fR</xsl:text>
- </xsl:template>
+ <!-- output monospaced text in bold -->
+ <xsl:template match="literal">
+ <xsl:text>\fB</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>\fR</xsl:text>
+ </xsl:template>
- <!-- append URL to hyperlinked text pointing to external targets -->
- <xsl:template match="ulink[not(contains(., '://')) and not(contains(@url, 'mailto:'))]">
- <xsl:apply-templates/>
- <xsl:text> (\m[blue]</xsl:text>
- <xsl:value-of select="@url"/>
- <xsl:text>\m[])</xsl:text>
- </xsl:template>
+ <!-- append URL to hyperlinked text pointing to external targets -->
+ <xsl:template match="ulink[not(contains(., '://')) and not(contains(@url, 'mailto:'))]">
+ <xsl:apply-templates/>
+ <xsl:text> (\m[blue]</xsl:text>
+ <xsl:value-of select="@url"/>
+ <xsl:text>\m[])</xsl:text>
+ </xsl:template>
</xsl:stylesheet>
diff --git a/dviware/dvisvgm/doc/conf-dblatex-pdf.xsl b/dviware/dvisvgm/doc/conf-dblatex-pdf.xsl
index d39e03c3a3..98a630d849 100644
--- a/dviware/dvisvgm/doc/conf-dblatex-pdf.xsl
+++ b/dviware/dvisvgm/doc/conf-dblatex-pdf.xsl
@@ -2,67 +2,67 @@
<!-- This file is part of dvisvgm -->
<!-- Copyright (C) 2015-2023 Martin Gieseking <martin.gieseking@uos.de> -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:param name="xetex.font">
- <xsl:text>\setmainfont{Source Serif Pro}&#10;</xsl:text>
- <xsl:text>\setsansfont{Source Sans Pro}&#10;</xsl:text>
- <xsl:text>\setmonofont[Scale=0.9]{Source Code Pro}&#10;</xsl:text>
- </xsl:param>
+ <xsl:param name="xetex.font">
+ <xsl:text>\setmainfont{Source Serif 4}&#10;</xsl:text>
+ <xsl:text>\setsansfont{Source Sans 3}&#10;</xsl:text>
+ <xsl:text>\setmonofont[Scale=0.9]{Source Code Pro}&#10;</xsl:text>
+ </xsl:param>
- <xsl:param name="doc.toc.show">0</xsl:param>
- <xsl:param name="refentry.numbered">0</xsl:param>
- <xsl:param name="figure.caution">caution</xsl:param>
- <xsl:param name="figure.note">note</xsl:param>
- <xsl:param name="literal.layout.options"/>
- <xsl:param name="table.default.tabstyle">tabular</xsl:param>
- <xsl:param name="table.in.float">0</xsl:param>
- <xsl:param name="term.breakline">1</xsl:param>
+ <xsl:param name="doc.toc.show">0</xsl:param>
+ <xsl:param name="refentry.numbered">0</xsl:param>
+ <xsl:param name="figure.caution">caution</xsl:param>
+ <xsl:param name="figure.note">note</xsl:param>
+ <xsl:param name="literal.layout.options"/>
+ <xsl:param name="table.default.tabstyle">tabular</xsl:param>
+ <xsl:param name="table.in.float">0</xsl:param>
+ <xsl:param name="term.breakline">1</xsl:param>
- <xsl:param name="literal.layout.options">
- <xsl:text>basicstyle=\ttfamily\small,backgroundcolor=\color[gray]{0.9},columns=fullflexible,frame=single</xsl:text>
- </xsl:param>
+ <xsl:param name="literal.layout.options">
+ <xsl:text>basicstyle=\ttfamily\small,backgroundcolor=\color[gray]{0.9},columns=fullflexible,frame=single</xsl:text>
+ </xsl:param>
- <!-- ensure processing of refmiscinfo elements -->
- <xsl:template match="refentry">
- <xsl:apply-templates select="refmeta/refmiscinfo"/>
- <xsl:apply-imports/>
- </xsl:template>
+ <!-- ensure processing of refmiscinfo elements -->
+ <xsl:template match="refentry">
+ <xsl:apply-templates select="refmeta/refmiscinfo"/>
+ <xsl:apply-imports/>
+ </xsl:template>
- <!-- put refmiscinfo data into the TeX file -->
- <xsl:template match="refmiscinfo[@class]">
- <xsl:value-of select="concat('\def\refmiscinfo', @class, '{', ., '}&#10;')"/>
- </xsl:template>
+ <!-- put refmiscinfo data into the TeX file -->
+ <xsl:template match="refmiscinfo[@class]">
+ <xsl:value-of select="concat('\def\refmiscinfo', @class, '{', ., '}&#10;')"/>
+ </xsl:template>
- <!-- output TOC before synopsis section -->
- <xsl:template match="refsynopsisdiv">
- <xsl:text>\tableofcontents&#10;</xsl:text>
- <xsl:call-template name="makeheading">
- <xsl:with-param name="level">2</xsl:with-param>
- <xsl:with-param name="num">1</xsl:with-param>
- </xsl:call-template>
- <xsl:apply-templates/>
- </xsl:template>
+ <!-- output TOC before synopsis section -->
+ <xsl:template match="refsynopsisdiv">
+ <xsl:text>\tableofcontents&#10;</xsl:text>
+ <xsl:call-template name="makeheading">
+ <xsl:with-param name="level">2</xsl:with-param>
+ <xsl:with-param name="num">1</xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:template>
- <!-- force non-star \subsection commands -->
- <xsl:template match="refsect1">
- <xsl:call-template name="makeheading">
- <xsl:with-param name="level">2</xsl:with-param>
- <xsl:with-param name="num">1</xsl:with-param>
- </xsl:call-template>
- <xsl:apply-templates/>
- </xsl:template>
+ <!-- force non-star \subsection commands -->
+ <xsl:template match="refsect1">
+ <xsl:call-template name="makeheading">
+ <xsl:with-param name="level">2</xsl:with-param>
+ <xsl:with-param name="num">1</xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:template>
- <!-- add named list items (e.g. command-line options, specials) to PDF bookmarks -->
- <xsl:template match="refsect1/variablelist/varlistentry/term[emphasis]">
- <xsl:text>\phantomsection\pdfbookmark[3]{</xsl:text>
- <xsl:choose>
- <xsl:when test="contains(emphasis, '--')">
- <xsl:value-of select="substring-after(emphasis, '--')"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="emphasis"/>
- </xsl:otherwise>
- </xsl:choose>
- <xsl:value-of select="concat('}{', generate-id(emphasis), '}&#10;')"/>
- <xsl:apply-imports/>
- </xsl:template>
+ <!-- add named list items (e.g. command-line options, specials) to PDF bookmarks -->
+ <xsl:template match="refsect1/variablelist/varlistentry/term[emphasis]">
+ <xsl:text>\phantomsection\pdfbookmark[3]{</xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains(emphasis, '--')">
+ <xsl:value-of select="substring-after(emphasis, '--')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="emphasis"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="concat('}{', generate-id(emphasis), '}&#10;')"/>
+ <xsl:apply-imports/>
+ </xsl:template>
</xsl:stylesheet>
diff --git a/dviware/dvisvgm/doc/dvisvgm.1 b/dviware/dvisvgm/doc/dvisvgm.1
index b4bb1cb3c8..430a1de890 100644
--- a/dviware/dvisvgm/doc/dvisvgm.1
+++ b/dviware/dvisvgm/doc/dvisvgm.1
@@ -1,13 +1,13 @@
'\" t
-.\" Title: dvisvgm Manual
+.\" Title: dvisvgm
.\" Author: Martin Gieseking <martin.gieseking@uos.de>
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\" Date: 2023-07-05
+.\" Date: 2023-09-12
.\" Manual: dvisvgm Manual
-.\" Source: dvisvgm 3.1
+.\" Source: dvisvgm 3.1.2
.\" Language: English
.\"
-.TH "DVISVGM MANUAL" "1" "2023\-07\-05" "dvisvgm 3\&.1" "dvisvgm Manual"
+.TH "DVISVGM" "1" "2023\-09\-12" "dvisvgm 3\&.1\&.2" "dvisvgm Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -309,7 +309,7 @@ which holds the current foreground color set by CSS property
The optional argument of
\fB\-\-currentcolor\fR
specifies the RGB color value to be replaced and must be given as either
-three or six digit hex color value (\m[blue]https://www.w3.org/TR/css-color/#typedef-hex-color\m[])
+six or three digit hex color value (\m[blue]https://www.w3.org/TR/css-color/#typedef-hex-color\m[])
preceded by character
\fB#\fR, e\&.g\&.
\fB#0000ff\fR
@@ -619,7 +619,15 @@ By default, dvisvgm creates CSS styles and class attributes to reference fonts\&
\fB\-O, \-\-optimize\fR[=\fImodules\fR]
.RS 4
Applies several optimizations on the generated SVG tree to reduce the file size\&. The optimizations are performed by running separate optimizer modules specified by optional argument
-\fImodules\fR\&. It may consist of a single module name or a comma\-separated list of several module names\&. The corresponding modules are executed one by one in the given order and thus transform the XML tree gradually\&.
+\fImodules\fR\&. It may consist of a single module name or a comma\-separated list of several module names\&. The corresponding modules are executed one by one in the given order and thus transform the XML tree gradually\&. A leading hyphen (\fB\-\fR) can be used to exclude a module from processing\&. For example
+\fB\-Oall,\-collapse\-groups\fR
+performs all optimizations except
+\fBcollapse\-groups\fR\&. If the first module name in the list starts with a hyphen, dvisvgm automatically inserts
+\fBall\fR
+at the beginning, i\&.e\&.
+\fB\-O\-collapse\-groups\fR
+is identical to
+\fB\-Oall,\-collapse\-groups\fR\&.
.sp
The following list describes the currently available optimizer modules\&.
.PP
@@ -639,9 +647,9 @@ can\(cqt be combined with other module names\&.
.RS 4
Performs all optimizations listed below\&. This is also the default if option
\fB\-\-optimize\fR
-is used without argument\&. The modules are executed in a predefined order that usually leads to the best results\&.
+is used without any arguments\&. The modules are executed in a predefined order that usually leads to the best results\&.
\fBall\fR
-can\(cqt be combined with other module names\&.
+must be the only or the first entry in the list of module names\&.
.RE
.PP
\fBcollapse\-groups\fR
@@ -879,7 +887,9 @@ special command which is forwarded to dvisvgm\(cqs PostScript special handler\&.
for further information\&.
.sp
As of Ghostscript 10\&.01\&.0, this will no longer work due to the introduction of a new PDF interpreter\&. Therefore, an alternative conversion module based on
-\fImutool\fR, a utility which is part of the [MuPDF](\m[blue]\fBhttps://mupdf\&.com\fR\m[]) package, has been introduced\&. It\(cqs automatically invoked if Ghostscript can\(cqt be used and if a working
+\fImutool\fR, a utility which is part of the
+MuPDF (\m[blue]https://mupdf.com\m[])
+package, has been introduced\&. It\(cqs automatically invoked if Ghostscript can\(cqt be used and if a working
\fBmutool\fR
executable is present in a directory which is part of the system\(cqs search path\&.
.sp
@@ -1251,7 +1261,7 @@ attributes are omitted\&.
.sp
dvisvgm supports several \fIspecial commands\fR that enrich the DVI command set with additional instructions for features, like color, graphics, and hyperlinks\&. The term \fIspecial command\fR, or just \fIspecial\fR, originates from the TeX command \fB\especial{\&...}\fR which does almost nothing\&. TeX only forwards the whole command to the DVI file and delegates its execution to the DVI driver\&. The DVI driver can then decide to either process or ignore it, depending on the supported statements\&. The parameter of TeX\(cqs \fB\especial\fR command is given in curly braces and may consist of an arbitrary character sequence representing the actual instruction, for example \fBcolor Red\fR\&.
.sp
-+ dvisvgm delegates the evaluation of special commands to dedicated handlers\&. Each handler is responsible for all special statements of the same command set, i\&.e\&. commands usually \(en but not necessarily \(en beginning with a common prefix\&. For example, all PDF specials start with the prefix \fBpdf:\fR, while the TPIC special set consists of 13 different commands without common identifier\&. The PDF specials are processed by dvisvgm\(cqs \fIpdf\fR handler, the TPIC ones by the \fItpic\fR handler\&. To get a list of the actually provided special handlers, use option \fB\-\-list\-specials\fR (see above)\&. The following list gives an overview of the special sets currently supported\&. The names of the handlers can also be used to disable the processing of individual sets of specials\&. For further information on this, see option \fB\-\-no\-specials\fR\&.
+dvisvgm delegates the evaluation of special commands to dedicated handlers\&. Each handler is responsible for all special statements of the same command set, i\&.e\&. commands usually \(en but not necessarily \(en beginning with a common prefix\&. For example, all PDF specials start with the prefix \fBpdf:\fR, while the TPIC special set consists of 13 different commands without common identifier\&. The PDF specials are processed by dvisvgm\(cqs \fIpdf\fR handler, the TPIC ones by the \fItpic\fR handler\&. To get a list of the actually provided special handlers, use option \fB\-\-list\-specials\fR (see above)\&. The following list gives an overview of the special sets currently supported\&. The names of the handlers can also be used to disable the processing of individual sets of specials\&. For further information on this, see option \fB\-\-no\-specials\fR\&.
.PP
\fBbgcolor\fR
.RS 4
@@ -1423,16 +1433,6 @@ allows for applying the current transformation matrix to the bounding box\&.
This variant of the bbox special assigns an absolute (final) bounding box to the resulting SVG\&. After executing this command, dvisvgm doesn\(cqt further alter the bounding box coordinates, except this special is called again later\&. The points (\fIx1\fR,\fIy1\fR) and (\fIx2\fR,\fIy2\fR) denote the absolute coordinates of two diagonal corners of the rectangle\&. As with the relative special variant described above, the optional modifier
\fBtransform\fR
allows for applying the current transformation matrix to the bounding box\&.
-.RE
-.PP
-\fBdvisvgm:message\fR \fImsg\fR
-.RS 4
-Prints the given text
-\fImsg\fR
-to the console\&. It may also contain the macros
-\fI{?\&...}\fR
-mentioned above (see
-\fBdvisvgm:raw\fR)\&.
.sp
The following TeX snippet adds two raw SVG elements to the output and updates the bounding box accordingly:
.sp
@@ -1464,6 +1464,16 @@ but doesn\(cqt require an explicit color argument\&. Instead, it takes the curre
functionality \(en can be omitted\&. When called with argument
\fBoff\fR, the functionality is deactivated again\&.
.RE
+.PP
+\fBdvisvgm:message\fR \fImsg\fR
+.RS 4
+Prints the given text
+\fImsg\fR
+to the console\&. It may also contain the macros
+\fI{?\&...}\fR
+mentioned above (see
+\fBdvisvgm:raw\fR)\&.
+.RE
.RE
.PP
\fBem\fR
@@ -1502,7 +1512,7 @@ pdfTeX and dvipdfmx introduced several special commands related to the generatio
\fIpdf:pagesize\fR
is similar to the
\fIpapersize\fR
-special (see above) which specifies the size of the current and all folowing pages\&. In order to actually apply the extents to the generated SVG files, option
+special (see above) which specifies the size of the current and all following pages\&. In order to actually apply the extents to the generated SVG files, option
\fB\-\-bbox=papersize\fR
must be given\&.
.sp
diff --git a/dviware/dvisvgm/doc/dvisvgm.txt.in b/dviware/dvisvgm/doc/dvisvgm.txt.in
index 5b31c8d092..8060b53aa9 100644
--- a/dviware/dvisvgm/doc/dvisvgm.txt.in
+++ b/dviware/dvisvgm/doc/dvisvgm.txt.in
@@ -22,7 +22,7 @@ Martin Gieseking <@PACKAGE_BUGREPORT@>
:man source: dvisvgm
:man version: @VERSION@
:man manual: dvisvgm Manual
-:revdate: 2023-07-05 10:37 +0200
+:revdate: 2023-09-12 16:36 +0200
Name
----
@@ -212,7 +212,7 @@ holds the current foreground color set by CSS property `color`. This way an appl
can change the color via CSS without the need to modify the SVG code.
+
The optional argument of `--currentcolor` specifies the RGB color value to be replaced and must
-be given as either https://www.w3.org/TR/css-color/#typedef-hex-color[three or six digit hex color value]
+be given as either https://www.w3.org/TR/css-color/#typedef-hex-color[six or three digit hex color value]
preceded by character `#`, e.g. `#0000ff` or `#00f` for blue. If the optional argument is omitted, black
is assumed.
@@ -430,6 +430,10 @@ are performed by running separate optimizer modules specified by optional argume
It may consist of a single module name or a comma-separated list of several module names.
The corresponding modules are executed one by one in the given order and thus transform the
XML tree gradually.
+A leading hyphen (+-+) can be used to exclude a module from processing. For example
++-Oall,-collapse-groups+ performs all optimizations except +collapse-groups+. If the first
+module name in the list starts with a hyphen, dvisvgm automatically inserts +all+ at the
+beginning, i.e. +-O-collapse-groups+ is identical to +-Oall,-collapse-groups+.
+
The following list describes the currently available optimizer modules.
@@ -442,8 +446,8 @@ The following list describes the currently available optimizer modules.
*all*;;
Performs all optimizations listed below. This is also the default if option *--optimize* is
- used without argument. The modules are executed in a predefined order that usually leads to the
- best results. *all* can't be combined with other module names.
+ used without any arguments. The modules are executed in a predefined order that usually leads
+ to the best results. *all* must be the only or the first entry in the list of module names.
*collapse-groups*;;
Combines nested group elements (+<g>+...+</g>+) that contain only a single group each. If possible,
@@ -590,7 +594,7 @@ See option *--libgs* for further information.
+
As of Ghostscript 10.01.0, this will no longer work due to the introduction of a new PDF interpreter.
Therefore, an alternative conversion module based on _mutool_, a utility which is part of the
-[MuPDF](https://mupdf.com) package, has been introduced. It's automatically invoked if Ghostscript
+https://mupdf.com[MuPDF] package, has been introduced. It's automatically invoked if Ghostscript
can't be used and if a working +mutool+ executable is present in a directory which is part of the
system's search path.
+
@@ -773,7 +777,7 @@ DVI file and delegates its execution to the DVI driver. The DVI driver can then
ignore it, depending on the supported statements. The parameter of TeX's +\special+ command is given in curly
braces and may consist of an arbitrary character sequence representing the actual instruction, for example
+color Red+.
-+
+
dvisvgm delegates the evaluation of special commands to dedicated handlers. Each handler is responsible for
all special statements of the same command set, i.e. commands usually &#x2013; but not necessarily &#x2013;
beginning with a common prefix. For example, all PDF specials start with the prefix +pdf:+, while the TPIC
@@ -880,10 +884,6 @@ dvisvgm offers its own small set of specials. The following list gives a brief o
The points ('x1','y1') and ('x2','y2') denote the absolute coordinates of two diagonal corners of the rectangle.
As with the relative special variant described above, the optional modifier +transform+ allows for applying the
current transformation matrix to the bounding box.
-
- *dvisvgm:message* 'msg';;
- Prints the given text 'msg' to the console. It may also contain the macros '{?...}' mentioned above
- (see *dvisvgm:raw*).
+
The following TeX snippet adds two raw SVG elements to the output and updates the bounding box accordingly:
+
@@ -903,6 +903,10 @@ The following TeX snippet adds two raw SVG elements to the output and updates th
placement of the special and the preceding color changes. Argument `on` &#x2013; which activates the 'currentColor'
functionality &#x2013; can be omitted. When called with argument `off`, the functionality is deactivated again.
+ *dvisvgm:message* 'msg';;
+ Prints the given text 'msg' to the console. It may also contain the macros '{?...}' mentioned above
+ (see *dvisvgm:raw*).
+
*em*::
These specials were introduced with the 'emTeX' distribution by Eberhard Mattes. They provide line drawing
statements, instructions for embedding MSP, PCX, and BMP image files, as well as two PCL commands.
@@ -931,7 +935,7 @@ only 'pdf:mapfile', 'pdf:mapline', 'pdf:pagesize', and PDF hyperlink specials ar
The latter are the PDF pendants to the HTML HyperTeX specials generated by the hyperref package in PDF mode.
+
'pdf:pagesize' is similar to the 'papersize' special (see above) which specifies the size of the current
-and all folowing pages. In order to actually apply the extents to the generated SVG files,
+and all following pages. In order to actually apply the extents to the generated SVG files,
option *--bbox=papersize* must be given.
+
'pdf:mapfile' and 'pdf:mapline' allow for modifying the font map tree while processing the DVI file.
diff --git a/dviware/dvisvgm/doc/tweak-db-refentry.xsl b/dviware/dvisvgm/doc/tweak-db-refentry.xsl
index f47e18d93d..24e4343f14 100644
--- a/dviware/dvisvgm/doc/tweak-db-refentry.xsl
+++ b/dviware/dvisvgm/doc/tweak-db-refentry.xsl
@@ -2,51 +2,51 @@
<!-- This file is part of dvisvgm -->
<!-- Copyright (C) 2015-2023 Martin Gieseking <martin.gieseking@uos.de> -->
<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:date="http://exslt.org/dates-and-times"
- xmlns:func="http://exslt.org/functions"
- xmlns:my="my-namespace"
- exclude-result-prefixes="my"
- extension-element-prefixes="date func">
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:date="http://exslt.org/dates-and-times"
+ xmlns:func="http://exslt.org/functions"
+ xmlns:my="my-namespace"
+ exclude-result-prefixes="my"
+ extension-element-prefixes="date func">
- <xsl:output doctype-public="-//OASIS//DTD DocBook XML V4.5//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
+ <xsl:output doctype-public="-//OASIS//DTD DocBook XML V4.5//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
- <!-- adapt ISO date created by keyword expansion -->
- <xsl:template match="refentryinfo/date | revision[1]/date">
- <date>
- <xsl:value-of select="my:extract-date(.)"/>
- </date>
- </xsl:template>
+ <!-- adapt ISO date created by keyword expansion -->
+ <xsl:template match="refentryinfo/date | revision[1]/date">
+ <date>
+ <xsl:value-of select="my:extract-date(.)"/>
+ </date>
+ </xsl:template>
- <!-- add date to refmeta element -->
- <xsl:template match="refmeta">
- <xsl:copy>
- <xsl:copy-of select="*"/>
- <refmiscinfo class="date">
- <xsl:value-of select="my:extract-date(../refentryinfo/date)"/>
- </refmiscinfo>
- </xsl:copy>
- </xsl:template>
+ <!-- add date to refmeta element -->
+ <xsl:template match="refmeta">
+ <xsl:copy>
+ <xsl:copy-of select="*"/>
+ <refmiscinfo class="date">
+ <xsl:value-of select="my:extract-date(../refentryinfo/date)"/>
+ </refmiscinfo>
+ </xsl:copy>
+ </xsl:template>
- <func:function name="my:extract-date">
- <xsl:param name="isodate"/>
- <xsl:variable name="shortdate" select="substring($isodate, 1, 10)"/>
- <xsl:choose>
- <xsl:when test="translate($shortdate, '0123456789', '##########') = '####-##-##'">
- <!-- use date part of expanded keyword -->
- <func:result select="$shortdate"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- use current date as fallback -->
- <func:result select="substring(date:date(), 1, 10)"/>
- </xsl:otherwise>
- </xsl:choose>
- </func:function>
+ <func:function name="my:extract-date">
+ <xsl:param name="isodate"/>
+ <xsl:variable name="shortdate" select="substring($isodate, 1, 10)"/>
+ <xsl:choose>
+ <xsl:when test="translate($shortdate, '0123456789', '##########') = '####-##-##'">
+ <!-- use date part of expanded keyword -->
+ <func:result select="$shortdate"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- use current date as fallback -->
+ <func:result select="substring(date:date(), 1, 10)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </func:function>
- <!-- copy everything else unchanged -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
+ <!-- copy everything else unchanged -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
</xsl:stylesheet>
diff --git a/dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl b/dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl
index 15523e3a20..406d771ca2 100644
--- a/dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl
+++ b/dviware/dvisvgm/doc/tweak-dblatex-pdf.xsl
@@ -2,28 +2,28 @@
<!-- This file is part of dvisvgm -->
<!-- Copyright (C) 2015-2023 Martin Gieseking <martin.gieseking@uos.de> -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <xsl:output doctype-public="-//OASIS//DTD DocBook XML V4.5//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
+ <xsl:output doctype-public="-//OASIS//DTD DocBook XML V4.5//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
- <!-- replace default document title -->
- <xsl:template match="refentrytitle[. != ../refmiscinfo[@class='manual']]">
- <xsl:copy>
- <xsl:value-of select="../refmiscinfo[@class='manual']"/>
- </xsl:copy>
- </xsl:template>
+ <!-- replace default document title -->
+ <xsl:template match="refentrytitle[. != ../refmiscinfo[@class='manual']]">
+ <xsl:copy>
+ <xsl:value-of select="../refmiscinfo[@class='manual']"/>
+ </xsl:copy>
+ </xsl:template>
- <!-- add static title to the synopsis section to prevent creating a dynamic one -->
- <xsl:template match="refsynopsisdiv[not(title)]">
- <xsl:copy>
- <xsl:copy-of select="@*"/>
- <title>Synopsis</title>
- <xsl:apply-templates/>
- </xsl:copy>
- </xsl:template>
+ <!-- add static title to the synopsis section to prevent creating a dynamic one -->
+ <xsl:template match="refsynopsisdiv[not(title)]">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <title>Synopsis</title>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
- <!-- copy everything else unchanged -->
- <xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
+ <!-- copy everything else unchanged -->
+ <xsl:template match="@*|node()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
</xsl:stylesheet>
diff --git a/dviware/dvisvgm/libs/brotli/Makefile.am b/dviware/dvisvgm/libs/brotli/Makefile.am
index 64ad12e6aa..7d7bf1db32 100644
--- a/dviware/dvisvgm/libs/brotli/Makefile.am
+++ b/dviware/dvisvgm/libs/brotli/Makefile.am
@@ -9,6 +9,7 @@ libbrotli_a_SOURCES = \
common/dictionary.h \
common/platform.c \
common/platform.h \
+ common/shared_dictionary_internal.h \
common/transform.c \
common/transform.h \
common/version.h \
@@ -31,6 +32,8 @@ libbrotli_a_SOURCES = \
enc/cluster_inc.h \
enc/command.c \
enc/command.h \
+ enc/compound_dictionary.c \
+ enc/compound_dictionary.h \
enc/compress_fragment.c \
enc/compress_fragment.h \
enc/compress_fragment_two_pass.c \
@@ -68,6 +71,7 @@ libbrotli_a_SOURCES = \
enc/prefix.h \
enc/quality.h \
enc/ringbuffer.h \
+ enc/state.h \
enc/static_dict.c \
enc/static_dict.h \
enc/static_dict_lut.h \
@@ -77,6 +81,7 @@ libbrotli_a_SOURCES = \
include/brotli/decode.h \
include/brotli/encode.h \
include/brotli/port.h \
+ include/brotli/shared_dictionary.h \
include/brotli/types.h
AM_CFLAGS = -Wall -I$(srcdir)/include
diff --git a/dviware/dvisvgm/libs/brotli/Makefile.in b/dviware/dvisvgm/libs/brotli/Makefile.in
index 6518869128..075a208efb 100644
--- a/dviware/dvisvgm/libs/brotli/Makefile.in
+++ b/dviware/dvisvgm/libs/brotli/Makefile.in
@@ -120,15 +120,16 @@ libbrotli_a_LIBADD =
am__libbrotli_a_SOURCES_DIST = common/constants.c common/constants.h \
common/context.c common/context.h common/dictionary.c \
common/dictionary.h common/platform.c common/platform.h \
- common/transform.c common/transform.h common/version.h \
- enc/backward_references.c enc/backward_references.h \
- enc/backward_references_hq.c enc/backward_references_hq.h \
- enc/backward_references_inc.h enc/bit_cost.c enc/bit_cost.h \
- enc/bit_cost_inc.h enc/block_encoder_inc.h \
- enc/block_splitter.c enc/block_splitter.h \
- enc/block_splitter_inc.h enc/brotli_bit_stream.c \
- enc/brotli_bit_stream.h enc/cluster.c enc/cluster.h \
- enc/cluster_inc.h enc/command.c enc/command.h \
+ common/shared_dictionary_internal.h common/transform.c \
+ common/transform.h common/version.h enc/backward_references.c \
+ enc/backward_references.h enc/backward_references_hq.c \
+ enc/backward_references_hq.h enc/backward_references_inc.h \
+ enc/bit_cost.c enc/bit_cost.h enc/bit_cost_inc.h \
+ enc/block_encoder_inc.h enc/block_splitter.c \
+ enc/block_splitter.h enc/block_splitter_inc.h \
+ enc/brotli_bit_stream.c enc/brotli_bit_stream.h enc/cluster.c \
+ enc/cluster.h enc/cluster_inc.h enc/command.c enc/command.h \
+ enc/compound_dictionary.c enc/compound_dictionary.h \
enc/compress_fragment.c enc/compress_fragment.h \
enc/compress_fragment_two_pass.c \
enc/compress_fragment_two_pass.h enc/dictionary_hash.c \
@@ -143,11 +144,11 @@ am__libbrotli_a_SOURCES_DIST = common/constants.c common/constants.h \
enc/histogram_inc.h enc/literal_cost.c enc/literal_cost.h \
enc/memory.c enc/memory.h enc/metablock.c enc/metablock.h \
enc/metablock_inc.h enc/params.h enc/prefix.h enc/quality.h \
- enc/ringbuffer.h enc/static_dict.c enc/static_dict.h \
- enc/static_dict_lut.h enc/utf8_util.c enc/utf8_util.h \
- enc/write_bits.h include/brotli/decode.h \
+ enc/ringbuffer.h enc/state.h enc/static_dict.c \
+ enc/static_dict.h enc/static_dict_lut.h enc/utf8_util.c \
+ enc/utf8_util.h enc/write_bits.h include/brotli/decode.h \
include/brotli/encode.h include/brotli/port.h \
- include/brotli/types.h
+ include/brotli/shared_dictionary.h include/brotli/types.h
am__dirstamp = $(am__leading_dot)dirstamp
@HAVE_BROTLI_FALSE@am_libbrotli_a_OBJECTS = \
@HAVE_BROTLI_FALSE@ common/constants.$(OBJEXT) \
@@ -161,6 +162,7 @@ am__dirstamp = $(am__leading_dot)dirstamp
@HAVE_BROTLI_FALSE@ enc/block_splitter.$(OBJEXT) \
@HAVE_BROTLI_FALSE@ enc/brotli_bit_stream.$(OBJEXT) \
@HAVE_BROTLI_FALSE@ enc/cluster.$(OBJEXT) enc/command.$(OBJEXT) \
+@HAVE_BROTLI_FALSE@ enc/compound_dictionary.$(OBJEXT) \
@HAVE_BROTLI_FALSE@ enc/compress_fragment.$(OBJEXT) \
@HAVE_BROTLI_FALSE@ enc/compress_fragment_two_pass.$(OBJEXT) \
@HAVE_BROTLI_FALSE@ enc/dictionary_hash.$(OBJEXT) \
@@ -197,7 +199,8 @@ am__depfiles_remade = common/$(DEPDIR)/constants.Po \
enc/$(DEPDIR)/backward_references_hq.Po \
enc/$(DEPDIR)/bit_cost.Po enc/$(DEPDIR)/block_splitter.Po \
enc/$(DEPDIR)/brotli_bit_stream.Po enc/$(DEPDIR)/cluster.Po \
- enc/$(DEPDIR)/command.Po enc/$(DEPDIR)/compress_fragment.Po \
+ enc/$(DEPDIR)/command.Po enc/$(DEPDIR)/compound_dictionary.Po \
+ enc/$(DEPDIR)/compress_fragment.Po \
enc/$(DEPDIR)/compress_fragment_two_pass.Po \
enc/$(DEPDIR)/dictionary_hash.Po enc/$(DEPDIR)/encode.Po \
enc/$(DEPDIR)/encoder_dict.Po enc/$(DEPDIR)/entropy_encode.Po \
@@ -422,6 +425,7 @@ top_srcdir = @top_srcdir@
@HAVE_BROTLI_FALSE@ common/dictionary.h \
@HAVE_BROTLI_FALSE@ common/platform.c \
@HAVE_BROTLI_FALSE@ common/platform.h \
+@HAVE_BROTLI_FALSE@ common/shared_dictionary_internal.h \
@HAVE_BROTLI_FALSE@ common/transform.c \
@HAVE_BROTLI_FALSE@ common/transform.h \
@HAVE_BROTLI_FALSE@ common/version.h \
@@ -444,6 +448,8 @@ top_srcdir = @top_srcdir@
@HAVE_BROTLI_FALSE@ enc/cluster_inc.h \
@HAVE_BROTLI_FALSE@ enc/command.c \
@HAVE_BROTLI_FALSE@ enc/command.h \
+@HAVE_BROTLI_FALSE@ enc/compound_dictionary.c \
+@HAVE_BROTLI_FALSE@ enc/compound_dictionary.h \
@HAVE_BROTLI_FALSE@ enc/compress_fragment.c \
@HAVE_BROTLI_FALSE@ enc/compress_fragment.h \
@HAVE_BROTLI_FALSE@ enc/compress_fragment_two_pass.c \
@@ -481,6 +487,7 @@ top_srcdir = @top_srcdir@
@HAVE_BROTLI_FALSE@ enc/prefix.h \
@HAVE_BROTLI_FALSE@ enc/quality.h \
@HAVE_BROTLI_FALSE@ enc/ringbuffer.h \
+@HAVE_BROTLI_FALSE@ enc/state.h \
@HAVE_BROTLI_FALSE@ enc/static_dict.c \
@HAVE_BROTLI_FALSE@ enc/static_dict.h \
@HAVE_BROTLI_FALSE@ enc/static_dict_lut.h \
@@ -490,6 +497,7 @@ top_srcdir = @top_srcdir@
@HAVE_BROTLI_FALSE@ include/brotli/decode.h \
@HAVE_BROTLI_FALSE@ include/brotli/encode.h \
@HAVE_BROTLI_FALSE@ include/brotli/port.h \
+@HAVE_BROTLI_FALSE@ include/brotli/shared_dictionary.h \
@HAVE_BROTLI_FALSE@ include/brotli/types.h
@HAVE_BROTLI_FALSE@AM_CFLAGS = -Wall -I$(srcdir)/include
@@ -567,6 +575,8 @@ enc/cluster.$(OBJEXT): enc/$(am__dirstamp) \
enc/$(DEPDIR)/$(am__dirstamp)
enc/command.$(OBJEXT): enc/$(am__dirstamp) \
enc/$(DEPDIR)/$(am__dirstamp)
+enc/compound_dictionary.$(OBJEXT): enc/$(am__dirstamp) \
+ enc/$(DEPDIR)/$(am__dirstamp)
enc/compress_fragment.$(OBJEXT): enc/$(am__dirstamp) \
enc/$(DEPDIR)/$(am__dirstamp)
enc/compress_fragment_two_pass.$(OBJEXT): enc/$(am__dirstamp) \
@@ -619,6 +629,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/brotli_bit_stream.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/cluster.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/command.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/compound_dictionary.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/compress_fragment.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/compress_fragment_two_pass.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@enc/$(DEPDIR)/dictionary_hash.Po@am__quote@ # am--include-marker
@@ -810,6 +821,7 @@ distclean: distclean-am
-rm -f enc/$(DEPDIR)/brotli_bit_stream.Po
-rm -f enc/$(DEPDIR)/cluster.Po
-rm -f enc/$(DEPDIR)/command.Po
+ -rm -f enc/$(DEPDIR)/compound_dictionary.Po
-rm -f enc/$(DEPDIR)/compress_fragment.Po
-rm -f enc/$(DEPDIR)/compress_fragment_two_pass.Po
-rm -f enc/$(DEPDIR)/dictionary_hash.Po
@@ -880,6 +892,7 @@ maintainer-clean: maintainer-clean-am
-rm -f enc/$(DEPDIR)/brotli_bit_stream.Po
-rm -f enc/$(DEPDIR)/cluster.Po
-rm -f enc/$(DEPDIR)/command.Po
+ -rm -f enc/$(DEPDIR)/compound_dictionary.Po
-rm -f enc/$(DEPDIR)/compress_fragment.Po
-rm -f enc/$(DEPDIR)/compress_fragment_two_pass.Po
-rm -f enc/$(DEPDIR)/dictionary_hash.Po
diff --git a/dviware/dvisvgm/libs/brotli/common/constants.c b/dviware/dvisvgm/libs/brotli/common/constants.c
index 6bad9f613c..89866b1505 100644
--- a/dviware/dvisvgm/libs/brotli/common/constants.c
+++ b/dviware/dvisvgm/libs/brotli/common/constants.c
@@ -4,7 +4,7 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./constants.h"
+#include "constants.h"
const BrotliPrefixCodeRange
_kBrotliPrefixCodeRanges[BROTLI_NUM_BLOCK_LEN_SYMBOLS] = {
diff --git a/dviware/dvisvgm/libs/brotli/common/constants.h b/dviware/dvisvgm/libs/brotli/common/constants.h
index e848195a0d..31e5bd376e 100644
--- a/dviware/dvisvgm/libs/brotli/common/constants.h
+++ b/dviware/dvisvgm/libs/brotli/common/constants.h
@@ -12,10 +12,11 @@
#ifndef BROTLI_COMMON_CONSTANTS_H_
#define BROTLI_COMMON_CONSTANTS_H_
-#include "./platform.h"
#include <brotli/port.h>
#include <brotli/types.h>
+#include "platform.h"
+
/* Specification: 7.3. Encoding of the context map */
#define BROTLI_CONTEXT_MAP_MAX_RLE 16
diff --git a/dviware/dvisvgm/libs/brotli/common/context.c b/dviware/dvisvgm/libs/brotli/common/context.c
index 2c2dceba9b..7f9c958699 100644
--- a/dviware/dvisvgm/libs/brotli/common/context.c
+++ b/dviware/dvisvgm/libs/brotli/common/context.c
@@ -1,4 +1,4 @@
-#include "./context.h"
+#include "context.h"
#include <brotli/types.h>
diff --git a/dviware/dvisvgm/libs/brotli/common/dictionary.c b/dviware/dvisvgm/libs/brotli/common/dictionary.c
index f9e30417c0..7c015ab0ba 100644
--- a/dviware/dvisvgm/libs/brotli/common/dictionary.c
+++ b/dviware/dvisvgm/libs/brotli/common/dictionary.c
@@ -4,8 +4,8 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./dictionary.h"
-#include "./platform.h"
+#include "dictionary.h"
+#include "platform.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -13,6 +13,7 @@ extern "C" {
#if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA)
static const uint8_t kBrotliDictionaryData[] =
+/* GENERATED CODE START */
{
116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99,
111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105
@@ -5860,6 +5861,7 @@ static const uint8_t kBrotliDictionaryData[] =
,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176
,224,164,191,224,164,175,224,164,164,224,164,190
}
+/* GENERATED CODE END */
;
#endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */
@@ -5895,7 +5897,7 @@ static BrotliDictionary kBrotliDictionary = {
#endif
};
-const BrotliDictionary* BrotliGetDictionary() {
+const BrotliDictionary* BrotliGetDictionary(void) {
return &kBrotliDictionary;
}
diff --git a/dviware/dvisvgm/libs/brotli/common/platform.c b/dviware/dvisvgm/libs/brotli/common/platform.c
index aef39e93c4..25d84a9467 100644
--- a/dviware/dvisvgm/libs/brotli/common/platform.c
+++ b/dviware/dvisvgm/libs/brotli/common/platform.c
@@ -6,9 +6,10 @@
#include <stdlib.h>
-#include "./platform.h"
#include <brotli/types.h>
+#include "platform.h"
+
/* Default brotli_alloc_func */
void* BrotliDefaultAllocFunc(void* opaque, size_t size) {
BROTLI_UNUSED(opaque);
diff --git a/dviware/dvisvgm/libs/brotli/common/platform.h b/dviware/dvisvgm/libs/brotli/common/platform.h
index f5ca4435bc..7406f3fe69 100644
--- a/dviware/dvisvgm/libs/brotli/common/platform.h
+++ b/dviware/dvisvgm/libs/brotli/common/platform.h
@@ -12,12 +12,13 @@
* BROTLI_BUILD_BIG_ENDIAN forces to use big-endian optimizations
* BROTLI_BUILD_ENDIAN_NEUTRAL disables endian-aware optimizations
* BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
- * BROTLI_BUILD_PORTABLE disables dangerous optimizations, like unaligned
- read and overlapping memcpy; this reduces decompression speed by 5%
* BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
+ * BROTLI_BUILD_NO_UNALIGNED_READ_FAST forces off the fast-unaligned-read
+ optimizations (mainly for testing purposes)
* BROTLI_DEBUG dumps file name and line number when decoder detects stream
or memory error
* BROTLI_ENABLE_LOG enables asserts and dumps various state information
+ * BROTLI_ENABLE_DUMP overrides default "dump" behaviour
*/
#ifndef BROTLI_COMMON_PLATFORM_H_
@@ -40,7 +41,7 @@
#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN
#endif
-#if BROTLI_MSVC_VERSION_CHECK(12, 0, 0)
+#if BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
#include <intrin.h>
#endif
@@ -156,24 +157,6 @@ OR:
#define BROTLI_NOINLINE
#endif
-/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */
-#if !defined(BROTLI_INTERNAL)
-#if defined(_WIN32) || defined(__CYGWIN__)
-#define BROTLI_INTERNAL
-#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
- BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
- BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
- BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
- BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \
- BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
- (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \
- defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__))
-#define BROTLI_INTERNAL __attribute__ ((visibility ("hidden")))
-#else
-#define BROTLI_INTERNAL
-#endif
-#endif
-
/* <<< <<< <<< end of hedley macros. */
#if BROTLI_GNUC_HAS_ATTRIBUTE(unused, 2, 7, 0) || \
@@ -226,15 +209,24 @@ OR:
#define BROTLI_TARGET_RISCV64
#endif
+#if defined(__loongarch_lp64)
+#define BROTLI_TARGET_LOONGARCH64
+#endif
+
+#if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
+ defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \
+ defined(BROTLI_TARGET_LOONGARCH64)
+#define BROTLI_TARGET_64_BITS 1
+#else
+#define BROTLI_TARGET_64_BITS 0
+#endif
+
#if defined(BROTLI_BUILD_64_BIT)
#define BROTLI_64_BITS 1
#elif defined(BROTLI_BUILD_32_BIT)
#define BROTLI_64_BITS 0
-#elif defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
- defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64)
-#define BROTLI_64_BITS 1
#else
-#define BROTLI_64_BITS 0
+#define BROTLI_64_BITS BROTLI_TARGET_64_BITS
#endif
#if (BROTLI_64_BITS)
@@ -278,18 +270,19 @@ OR:
#undef BROTLI_X_BIG_ENDIAN
#endif
-#if defined(BROTLI_BUILD_PORTABLE)
-#define BROTLI_ALIGNED_READ (!!1)
-#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
+#if defined(BROTLI_BUILD_NO_UNALIGNED_READ_FAST)
+#define BROTLI_UNALIGNED_READ_FAST (!!0)
+#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \
- defined(BROTLI_TARGET_RISCV64)
-/* Allow unaligned read only for white-listed CPUs. */
-#define BROTLI_ALIGNED_READ (!!0)
+ defined(BROTLI_TARGET_RISCV64) || defined(BROTLI_TARGET_LOONGARCH64)
+/* These targets are known to generate efficient code for unaligned reads
+ * (e.g. a single instruction, not multiple 1-byte loads, shifted and or'd
+ * together). */
+#define BROTLI_UNALIGNED_READ_FAST (!!1)
#else
-#define BROTLI_ALIGNED_READ (!!1)
+#define BROTLI_UNALIGNED_READ_FAST (!!0)
#endif
-#if BROTLI_ALIGNED_READ
/* Portable unaligned memory access: read / write values via memcpy. */
static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
uint16_t t;
@@ -309,75 +302,6 @@ static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
memcpy(p, &v, sizeof v);
}
-#else /* BROTLI_ALIGNED_READ */
-/* Unaligned memory access is allowed: just cast pointer to requested type. */
-#if BROTLI_SANITIZED
-/* Consider we have an unaligned load/store of 4 bytes from address 0x...05.
- AddressSanitizer will treat it as a 3-byte access to the range 05:07 and
- will miss a bug if 08 is the first unaddressable byte.
- ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will
- miss a race between this access and some other accesses to 08.
- MemorySanitizer will correctly propagate the shadow on unaligned stores
- and correctly report bugs on unaligned loads, but it may not properly
- update and report the origin of the uninitialized memory.
- For all three tools, replacing an unaligned access with a tool-specific
- callback solves the problem. */
-#if defined(__cplusplus)
-extern "C" {
-#endif /* __cplusplus */
- uint16_t __sanitizer_unaligned_load16(const void* p);
- uint32_t __sanitizer_unaligned_load32(const void* p);
- uint64_t __sanitizer_unaligned_load64(const void* p);
- void __sanitizer_unaligned_store64(void* p, uint64_t v);
-#if defined(__cplusplus)
-} /* extern "C" */
-#endif /* __cplusplus */
-#define BrotliUnalignedRead16 __sanitizer_unaligned_load16
-#define BrotliUnalignedRead32 __sanitizer_unaligned_load32
-#define BrotliUnalignedRead64 __sanitizer_unaligned_load64
-#define BrotliUnalignedWrite64 __sanitizer_unaligned_store64
-#else /* BROTLI_SANITIZED */
-static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
- return *(const uint16_t*)p;
-}
-static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) {
- return *(const uint32_t*)p;
-}
-#if (BROTLI_64_BITS)
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- return *(const uint64_t*)p;
-}
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- *(uint64_t*)p = v;
-}
-#else /* BROTLI_64_BITS */
-/* Avoid emitting LDRD / STRD, which require properly aligned address. */
-/* If __attribute__(aligned) is available, use that. Otherwise, memcpy. */
-
-#if BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0)
-typedef BROTLI_ALIGNED(1) uint64_t brotli_unaligned_uint64_t;
-
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- return (uint64_t) ((const brotli_unaligned_uint64_t*) p)[0];
-}
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- brotli_unaligned_uint64_t* dwords = (brotli_unaligned_uint64_t*) p;
- dwords[0] = (brotli_unaligned_uint64_t) v;
-}
-#else /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */
-static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
- uint64_t v;
- memcpy(&v, p, sizeof(uint64_t));
- return v;
-}
-
-static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
- memcpy(p, &v, sizeof(uint64_t));
-}
-#endif /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */
-#endif /* BROTLI_64_BITS */
-#endif /* BROTLI_SANITIZED */
-#endif /* BROTLI_ALIGNED_READ */
#if BROTLI_LITTLE_ENDIAN
/* Straight endianness. Just read / write values. */
@@ -453,6 +377,16 @@ static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
}
#endif /* BROTLI_LITTLE_ENDIAN */
+static BROTLI_INLINE void* BROTLI_UNALIGNED_LOAD_PTR(const void* p) {
+ void* v;
+ memcpy(&v, p, sizeof(void*));
+ return v;
+}
+
+static BROTLI_INLINE void BROTLI_UNALIGNED_STORE_PTR(void* p, const void* v) {
+ memcpy(p, &v, sizeof(void*));
+}
+
/* BROTLI_IS_CONSTANT macros returns true for compile-time constants. */
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_constant_p, 3, 0, 1) || \
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
@@ -474,22 +408,34 @@ static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
#endif
#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
+#define BROTLI_ENABLE_DUMP_DEFAULT 1
#define BROTLI_DCHECK(x) assert(x)
+#else
+#define BROTLI_ENABLE_DUMP_DEFAULT 0
+#define BROTLI_DCHECK(x)
+#endif
+
+#if !defined(BROTLI_ENABLE_DUMP)
+#define BROTLI_ENABLE_DUMP BROTLI_ENABLE_DUMP_DEFAULT
+#endif
+
+#if BROTLI_ENABLE_DUMP
static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
fflush(stderr);
}
#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
#else
-#define BROTLI_DCHECK(x)
#define BROTLI_DUMP() (void)(0)
#endif
-/* TODO: add appropriate icc/sunpro/arm/ibm/ti checks. */
+/* BrotliRBit assumes brotli_reg_t fits native CPU register type. */
+#if (BROTLI_64_BITS == BROTLI_TARGET_64_BITS)
+/* TODO(eustas): add appropriate icc/sunpro/arm/ibm/ti checks. */
#if (BROTLI_GNUC_VERSION_CHECK(3, 0, 0) || defined(__llvm__)) && \
!defined(BROTLI_BUILD_NO_RBIT)
#if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY)
-/* TODO: detect ARMv6T2 and enable this code for it. */
+/* TODO(eustas): detect ARMv6T2 and enable this code for it. */
static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) {
brotli_reg_t output;
__asm__("rbit %0, %1\n" : "=r"(output) : "r"(input));
@@ -498,15 +444,14 @@ static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) {
#define BROTLI_RBIT(x) BrotliRBit(x)
#endif /* armv7 / armv8 */
#endif /* gcc || clang */
+#endif /* brotli_reg_t is native */
#if !defined(BROTLI_RBIT)
static BROTLI_INLINE void BrotliRBit(void) { /* Should break build if used. */ }
#endif /* BROTLI_RBIT */
-#define BROTLI_REPEAT(N, X) { \
- if ((N & 1) != 0) {X;} \
- if ((N & 2) != 0) {X; X;} \
- if ((N & 4) != 0) {X; X; X; X;} \
-}
+#define BROTLI_REPEAT_4(X) {X; X; X; X;}
+#define BROTLI_REPEAT_5(X) {X; X; X; X; X;}
+#define BROTLI_REPEAT_6(X) {X; X; X; X; X; X;}
#define BROTLI_UNUSED(X) (void)(X)
@@ -529,7 +474,7 @@ BROTLI_MIN_MAX(size_t) BROTLI_MIN_MAX(uint32_t) BROTLI_MIN_MAX(uint8_t)
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_ctzll, 3, 4, 0) || \
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
#define BROTLI_TZCNT64 __builtin_ctzll
-#elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0)
+#elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
#if defined(BROTLI_TARGET_X64)
#define BROTLI_TZCNT64 _tzcnt_u64
#else /* BROTLI_TARGET_X64 */
@@ -546,7 +491,7 @@ static BROTLI_INLINE uint32_t BrotliBsf64Msvc(uint64_t x) {
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_clz, 3, 4, 0) || \
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
#define BROTLI_BSR32(x) (31u ^ (uint32_t)__builtin_clz(x))
-#elif BROTLI_MSVC_VERSION_CHECK(12, 0, 0)
+#elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
static BROTLI_INLINE uint32_t BrotliBsr32Msvc(uint32_t x) {
unsigned long msb;
_BitScanReverse(&msb, x);
@@ -571,6 +516,8 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE);
BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD64LE);
BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE64LE);
+ BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD_PTR);
+ BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE_PTR);
BROTLI_UNUSED(&BrotliRBit);
BROTLI_UNUSED(&brotli_min_double);
BROTLI_UNUSED(&brotli_max_double);
@@ -586,7 +533,7 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
BROTLI_UNUSED(&brotli_max_uint8_t);
BROTLI_UNUSED(&BrotliDefaultAllocFunc);
BROTLI_UNUSED(&BrotliDefaultFreeFunc);
-#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
+#if BROTLI_ENABLE_DUMP
BROTLI_UNUSED(&BrotliDump);
#endif
}
diff --git a/dviware/dvisvgm/libs/brotli/common/shared_dictionary_internal.h b/dviware/dvisvgm/libs/brotli/common/shared_dictionary_internal.h
new file mode 100644
index 0000000000..963762e432
--- /dev/null
+++ b/dviware/dvisvgm/libs/brotli/common/shared_dictionary_internal.h
@@ -0,0 +1,75 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* (Transparent) Shared Dictionary definition. */
+
+#ifndef BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_
+#define BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_
+
+#include <brotli/shared_dictionary.h>
+#include <brotli/types.h>
+
+#include "dictionary.h"
+#include "transform.h"
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+struct BrotliSharedDictionaryStruct {
+ /* LZ77 prefixes (compound dictionary). */
+ uint32_t num_prefix; /* max SHARED_BROTLI_MAX_COMPOUND_DICTS */
+ size_t prefix_size[SHARED_BROTLI_MAX_COMPOUND_DICTS];
+ const uint8_t* prefix[SHARED_BROTLI_MAX_COMPOUND_DICTS];
+
+ /* If set, the context map is used to select word and transform list from 64
+ contexts, if not set, the context map is not used and only words[0] and
+ transforms[0] are to be used. */
+ BROTLI_BOOL context_based;
+
+ uint8_t context_map[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS];
+
+ /* Amount of word_list+transform_list combinations. */
+ uint8_t num_dictionaries;
+
+ /* Must use num_dictionaries values. */
+ const BrotliDictionary* words[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS];
+
+ /* Must use num_dictionaries values. */
+ const BrotliTransforms* transforms[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS];
+
+ /* Amount of custom word lists. May be 0 if only Brotli's built-in is used */
+ uint8_t num_word_lists;
+
+ /* Contents of the custom words lists. Must be NULL if num_word_lists is 0. */
+ BrotliDictionary* words_instances;
+
+ /* Amount of custom transform lists. May be 0 if only Brotli's built-in is
+ used */
+ uint8_t num_transform_lists;
+
+ /* Contents of the custom transform lists. Must be NULL if num_transform_lists
+ is 0. */
+ BrotliTransforms* transforms_instances;
+
+ /* Concatenated prefix_suffix_maps of the custom transform lists. Must be NULL
+ if num_transform_lists is 0. */
+ uint16_t* prefix_suffix_maps;
+
+ /* Memory management */
+ brotli_alloc_func alloc_func;
+ brotli_free_func free_func;
+ void* memory_manager_opaque;
+};
+
+typedef struct BrotliSharedDictionaryStruct BrotliSharedDictionaryInternal;
+#define BrotliSharedDictionary BrotliSharedDictionaryInternal
+
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* extern "C" */
+#endif
+
+#endif /* BROTLI_COMMON_SHARED_DICTIONARY_INTERNAL_H_ */
diff --git a/dviware/dvisvgm/libs/brotli/common/transform.c b/dviware/dvisvgm/libs/brotli/common/transform.c
index f8fa4335e1..49455fc496 100644
--- a/dviware/dvisvgm/libs/brotli/common/transform.c
+++ b/dviware/dvisvgm/libs/brotli/common/transform.c
@@ -4,7 +4,7 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./transform.h"
+#include "transform.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/common/version.h b/dviware/dvisvgm/libs/brotli/common/version.h
index 01b2998e25..8098040f64 100644
--- a/dviware/dvisvgm/libs/brotli/common/version.h
+++ b/dviware/dvisvgm/libs/brotli/common/version.h
@@ -9,18 +9,43 @@
#ifndef BROTLI_COMMON_VERSION_H_
#define BROTLI_COMMON_VERSION_H_
-/* This macro should only be used when library is compiled together with client.
- If library is dynamically linked, use BrotliDecoderVersion and
+/* Compose 3 components into a single number. In a hexadecimal representation
+ B and C components occupy exactly 3 digits. */
+#define BROTLI_MAKE_HEX_VERSION(A, B, C) ((A << 24) | (B << 12) | C)
+
+/* Those macros should only be used when library is compiled together with
+ the client. If library is dynamically linked, use BrotliDecoderVersion and
BrotliEncoderVersion methods. */
-/* Semantic version, calculated as (MAJOR << 24) | (MINOR << 12) | PATCH */
-#define BROTLI_VERSION 0x1000009
+#define BROTLI_VERSION_MAJOR 1
+#define BROTLI_VERSION_MINOR 1
+#define BROTLI_VERSION_PATCH 0
+
+#define BROTLI_VERSION BROTLI_MAKE_HEX_VERSION( \
+ BROTLI_VERSION_MAJOR, BROTLI_VERSION_MINOR, BROTLI_VERSION_PATCH)
/* This macro is used by build system to produce Libtool-friendly soname. See
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
+ Version evolution rules:
+ - interfaces added (or change is compatible) -> current+1:0:age+1
+ - interfaces removed (or changed is incompatible) -> current+1:0:0
+ - interfaces not changed -> current:revision+1:age
*/
-/* ABI version, calculated as (CURRENT << 24) | (REVISION << 12) | AGE */
-#define BROTLI_ABI_VERSION 0x1009000
+#define BROTLI_ABI_CURRENT 2
+#define BROTLI_ABI_REVISION 0
+#define BROTLI_ABI_AGE 1
+
+#if BROTLI_VERSION_MAJOR != (BROTLI_ABI_CURRENT - BROTLI_ABI_AGE)
+#error ABI/API version inconsistency
+#endif
+
+#if BROTLI_VERSION_MINOR != BROTLI_ABI_AGE
+#error ABI/API version inconsistency
+#endif
+
+#if BROTLI_VERSION_PATCH != BROTLI_ABI_REVISION
+#error ABI/API version inconsistency
+#endif
#endif /* BROTLI_COMMON_VERSION_H_ */
diff --git a/dviware/dvisvgm/libs/brotli/enc/backward_references.c b/dviware/dvisvgm/libs/brotli/enc/backward_references.c
index a07a617a09..f600e6452f 100644
--- a/dviware/dvisvgm/libs/brotli/enc/backward_references.c
+++ b/dviware/dvisvgm/libs/brotli/enc/backward_references.c
@@ -6,17 +6,19 @@
/* Function to find backward reference copies. */
-#include "./backward_references.h"
+#include "backward_references.h"
+
+#include <brotli/types.h>
#include "../common/constants.h"
-#include "../common/context.h"
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./command.h"
-#include "./dictionary_hash.h"
-#include "./memory.h"
-#include "./quality.h"
+#include "command.h"
+#include "compound_dictionary.h"
+#include "dictionary_hash.h"
+#include "encoder_dict.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -52,67 +54,103 @@ static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
#define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
#define PREFIX() N
+#define ENABLE_COMPOUND_DICTIONARY 0
#define HASHER() H2
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H3
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H4
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H5
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H6
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H40
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H41
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H42
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H54
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H35
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H55
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
#define HASHER() H65
/* NOLINTNEXTLINE(build/include) */
-#include "./backward_references_inc.h"
+#include "backward_references_inc.h"
#undef HASHER
+#undef ENABLE_COMPOUND_DICTIONARY
+#undef PREFIX
+#define PREFIX() D
+#define ENABLE_COMPOUND_DICTIONARY 1
+
+#define HASHER() H5
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H6
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H40
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H41
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H42
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H55
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+#define HASHER() H65
+/* NOLINTNEXTLINE(build/include) */
+#include "backward_references_inc.h"
+#undef HASHER
+
+#undef ENABLE_COMPOUND_DICTIONARY
#undef PREFIX
#undef EXPORT_FN
@@ -125,6 +163,29 @@ void BrotliCreateBackwardReferences(size_t num_bytes,
ContextLut literal_context_lut, const BrotliEncoderParams* params,
Hasher* hasher, int* dist_cache, size_t* last_insert_len,
Command* commands, size_t* num_commands, size_t* num_literals) {
+ if (params->dictionary.compound.num_chunks != 0) {
+ switch (params->hasher.type) {
+#define CASE_(N) \
+ case N: \
+ CreateBackwardReferencesDH ## N(num_bytes, \
+ position, ringbuffer, ringbuffer_mask, \
+ literal_context_lut, params, hasher, dist_cache, \
+ last_insert_len, commands, num_commands, num_literals); \
+ return;
+ CASE_(5)
+ CASE_(6)
+ CASE_(40)
+ CASE_(41)
+ CASE_(42)
+ CASE_(55)
+ CASE_(65)
+#undef CASE_
+ default:
+ BROTLI_DCHECK(false);
+ break;
+ }
+ }
+
switch (params->hasher.type) {
#define CASE_(N) \
case N: \
@@ -136,6 +197,7 @@ void BrotliCreateBackwardReferences(size_t num_bytes,
FOR_GENERIC_HASHERS(CASE_)
#undef CASE_
default:
+ BROTLI_DCHECK(false);
break;
}
}
diff --git a/dviware/dvisvgm/libs/brotli/enc/backward_references.h b/dviware/dvisvgm/libs/brotli/enc/backward_references.h
index 9589cc1541..20fb98a4d8 100644
--- a/dviware/dvisvgm/libs/brotli/enc/backward_references.h
+++ b/dviware/dvisvgm/libs/brotli/enc/backward_references.h
@@ -9,14 +9,15 @@
#ifndef BROTLI_ENC_BACKWARD_REFERENCES_H_
#define BROTLI_ENC_BACKWARD_REFERENCES_H_
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/context.h"
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./command.h"
-#include "./hash.h"
-#include "./quality.h"
+#include "command.h"
+#include "hash.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c b/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c
index 5651caeb7a..6325032e1c 100644
--- a/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c
+++ b/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.c
@@ -6,22 +6,24 @@
/* Function to find backward reference copies. */
-#include "./backward_references_hq.h"
+#include "backward_references_hq.h"
#include <string.h> /* memcpy, memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
-#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./command.h"
-#include "./fast_log.h"
-#include "./find_match_length.h"
-#include "./literal_cost.h"
-#include "./memory.h"
-#include "./params.h"
-#include "./prefix.h"
-#include "./quality.h"
+#include "command.h"
+#include "compound_dictionary.h"
+#include "encoder_dict.h"
+#include "fast_log.h"
+#include "find_match_length.h"
+#include "literal_cost.h"
+#include "memory.h"
+#include "params.h"
+#include "prefix.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -73,6 +75,14 @@ static BROTLI_INLINE uint32_t ZopfliNodeCommandLength(const ZopfliNode* self) {
return ZopfliNodeCopyLength(self) + (self->dcode_insert_length & 0x7FFFFFF);
}
+/* Temporary data for ZopfliCostModelSetFromCommands. */
+typedef struct ZopfliCostModelArena {
+ uint32_t histogram_literal[BROTLI_NUM_LITERAL_SYMBOLS];
+ uint32_t histogram_cmd[BROTLI_NUM_COMMAND_SYMBOLS];
+ uint32_t histogram_dist[BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE];
+ float cost_literal[BROTLI_NUM_LITERAL_SYMBOLS];
+} ZopfliCostModelArena;
+
/* Histogram based cost model for zopflification. */
typedef struct ZopfliCostModel {
/* The insert and copy length symbols. */
@@ -83,6 +93,12 @@ typedef struct ZopfliCostModel {
float* literal_costs_;
float min_cost_cmd_;
size_t num_bytes_;
+
+ /* Temporary data. */
+ union {
+ size_t literal_histograms[3 * 256];
+ ZopfliCostModelArena arena;
+ };
} ZopfliCostModel;
static void InitZopfliCostModel(
@@ -139,18 +155,15 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
const Command* commands,
size_t num_commands,
size_t last_insert_len) {
- uint32_t histogram_literal[BROTLI_NUM_LITERAL_SYMBOLS];
- uint32_t histogram_cmd[BROTLI_NUM_COMMAND_SYMBOLS];
- uint32_t histogram_dist[BROTLI_MAX_EFFECTIVE_DISTANCE_ALPHABET_SIZE];
- float cost_literal[BROTLI_NUM_LITERAL_SYMBOLS];
+ ZopfliCostModelArena* arena = &self->arena;
size_t pos = position - last_insert_len;
float min_cost_cmd = kInfinity;
size_t i;
float* cost_cmd = self->cost_cmd_;
- memset(histogram_literal, 0, sizeof(histogram_literal));
- memset(histogram_cmd, 0, sizeof(histogram_cmd));
- memset(histogram_dist, 0, sizeof(histogram_dist));
+ memset(arena->histogram_literal, 0, sizeof(arena->histogram_literal));
+ memset(arena->histogram_cmd, 0, sizeof(arena->histogram_cmd));
+ memset(arena->histogram_dist, 0, sizeof(arena->histogram_dist));
for (i = 0; i < num_commands; i++) {
size_t inslength = commands[i].insert_len_;
@@ -159,21 +172,21 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
size_t cmdcode = commands[i].cmd_prefix_;
size_t j;
- histogram_cmd[cmdcode]++;
- if (cmdcode >= 128) histogram_dist[distcode]++;
+ arena->histogram_cmd[cmdcode]++;
+ if (cmdcode >= 128) arena->histogram_dist[distcode]++;
for (j = 0; j < inslength; j++) {
- histogram_literal[ringbuffer[(pos + j) & ringbuffer_mask]]++;
+ arena->histogram_literal[ringbuffer[(pos + j) & ringbuffer_mask]]++;
}
pos += inslength + copylength;
}
- SetCost(histogram_literal, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_TRUE,
- cost_literal);
- SetCost(histogram_cmd, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_FALSE,
+ SetCost(arena->histogram_literal, BROTLI_NUM_LITERAL_SYMBOLS, BROTLI_TRUE,
+ arena->cost_literal);
+ SetCost(arena->histogram_cmd, BROTLI_NUM_COMMAND_SYMBOLS, BROTLI_FALSE,
cost_cmd);
- SetCost(histogram_dist, self->distance_histogram_size, BROTLI_FALSE,
+ SetCost(arena->histogram_dist, self->distance_histogram_size, BROTLI_FALSE,
self->cost_dist_);
for (i = 0; i < BROTLI_NUM_COMMAND_SYMBOLS; ++i) {
@@ -188,7 +201,7 @@ static void ZopfliCostModelSetFromCommands(ZopfliCostModel* self,
literal_costs[0] = 0.0;
for (i = 0; i < num_bytes; ++i) {
literal_carry +=
- cost_literal[ringbuffer[(position + i) & ringbuffer_mask]];
+ arena->cost_literal[ringbuffer[(position + i) & ringbuffer_mask]];
literal_costs[i + 1] = literal_costs[i] + literal_carry;
literal_carry -= literal_costs[i + 1] - literal_costs[i];
}
@@ -206,7 +219,8 @@ static void ZopfliCostModelSetFromLiteralCosts(ZopfliCostModel* self,
size_t num_bytes = self->num_bytes_;
size_t i;
BrotliEstimateBitCostsForLiterals(position, num_bytes, ringbuffer_mask,
- ringbuffer, &literal_costs[1]);
+ ringbuffer, self->literal_histograms,
+ &literal_costs[1]);
literal_costs[0] = 0.0;
for (i = 0; i < num_bytes; ++i) {
literal_carry += literal_costs[i + 1];
@@ -418,7 +432,8 @@ static size_t UpdateNodes(
size_t min_len;
size_t result = 0;
size_t k;
- size_t gap = 0;
+ const CompoundDictionary* addon = &params->dictionary.compound;
+ size_t gap = addon->total_size;
EvaluateNode(block_start + stream_offset, pos, max_backward_limit, gap,
starting_dist_cache, model, queue, nodes);
@@ -472,6 +487,24 @@ static size_t UpdateNodes(
len = FindMatchLengthWithLimit(&ringbuffer[prev_ix],
&ringbuffer[cur_ix_masked],
max_len);
+ } else if (backward > dictionary_start) {
+ size_t d = 0;
+ size_t offset;
+ size_t limit;
+ const uint8_t* source;
+ offset = dictionary_start + 1 + addon->total_size - 1;
+ while (offset >= backward + addon->chunk_offsets[d + 1]) d++;
+ source = addon->chunk_source[d];
+ offset = offset - addon->chunk_offsets[d] - backward;
+ limit = addon->chunk_offsets[d + 1] - addon->chunk_offsets[d] - offset;
+ limit = limit > max_len ? max_len : limit;
+ if (best_len >= limit ||
+ continuation != source[offset + best_len]) {
+ continue;
+ }
+ len = FindMatchLengthWithLimit(&source[offset],
+ &ringbuffer[cur_ix_masked],
+ limit);
} else {
/* "Gray" area. It is addressable by decoder, but this encoder
instance does not have that data -> should not touch it. */
@@ -577,7 +610,7 @@ void BrotliZopfliCreateCommands(const size_t num_bytes,
size_t pos = 0;
uint32_t offset = nodes[0].u.next;
size_t i;
- size_t gap = 0;
+ size_t gap = params->dictionary.compound.total_size;
for (i = 0; offset != BROTLI_UINT32_MAX; i++) {
const ZopfliNode* next = &nodes[pos + offset];
size_t copy_length = ZopfliNodeCopyLength(next);
@@ -653,6 +686,23 @@ static size_t ZopfliIterate(size_t num_bytes, size_t position,
return ComputeShortestPathFromNodes(num_bytes, nodes);
}
+static void MergeMatches(BackwardMatch* dst,
+ BackwardMatch* src1, size_t len1, BackwardMatch* src2, size_t len2) {
+ while (len1 > 0 && len2 > 0) {
+ size_t l1 = BackwardMatchLength(src1);
+ size_t l2 = BackwardMatchLength(src2);
+ if (l1 < l2 || ((l1 == l2) && (src1->distance < src2->distance))) {
+ *dst++ = *src1++;
+ len1--;
+ } else {
+ *dst++ = *src2++;
+ len2--;
+ }
+ }
+ while (len1-- > 0) *dst++ = *src1++;
+ while (len2-- > 0) *dst++ = *src2++;
+}
+
/* REQUIRES: nodes != NULL and len(nodes) >= num_bytes + 1 */
size_t BrotliZopfliComputeShortestPath(MemoryManager* m, size_t num_bytes,
size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
@@ -661,21 +711,26 @@ size_t BrotliZopfliComputeShortestPath(MemoryManager* m, size_t num_bytes,
const size_t stream_offset = params->stream_offset;
const size_t max_backward_limit = BROTLI_MAX_BACKWARD_LIMIT(params->lgwin);
const size_t max_zopfli_len = MaxZopfliLen(params);
- ZopfliCostModel model;
StartPosQueue queue;
- BackwardMatch matches[2 * (MAX_NUM_MATCHES_H10 + 64)];
+ BackwardMatch* BROTLI_RESTRICT matches =
+ BROTLI_ALLOC(m, BackwardMatch, 2 * (MAX_NUM_MATCHES_H10 + 64));
const size_t store_end = num_bytes >= StoreLookaheadH10() ?
position + num_bytes - StoreLookaheadH10() + 1 : position;
size_t i;
- size_t gap = 0;
- size_t lz_matches_offset = 0;
- BROTLI_UNUSED(literal_context_lut);
+ const CompoundDictionary* addon = &params->dictionary.compound;
+ size_t gap = addon->total_size;
+ size_t lz_matches_offset =
+ (addon->num_chunks != 0) ? (MAX_NUM_MATCHES_H10 + 128) : 0;
+ ZopfliCostModel* model = BROTLI_ALLOC(m, ZopfliCostModel, 1);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(model) || BROTLI_IS_NULL(matches)) {
+ return 0;
+ }
nodes[0].length = 0;
nodes[0].u.cost = 0;
- InitZopfliCostModel(m, &model, &params->dist, num_bytes);
+ InitZopfliCostModel(m, model, &params->dist, num_bytes);
if (BROTLI_IS_OOM(m)) return 0;
ZopfliCostModelSetFromLiteralCosts(
- &model, position, ringbuffer, ringbuffer_mask);
+ model, position, ringbuffer, ringbuffer_mask);
InitStartPosQueue(&queue);
for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; i++) {
const size_t pos = position + i;
@@ -684,17 +739,35 @@ size_t BrotliZopfliComputeShortestPath(MemoryManager* m, size_t num_bytes,
pos + stream_offset, max_backward_limit);
size_t skip;
size_t num_matches;
+ int dict_id = 0;
+ if (params->dictionary.contextual.context_based) {
+ uint8_t p1 = pos >= 1 ?
+ ringbuffer[(size_t)(pos - 1) & ringbuffer_mask] : 0;
+ uint8_t p2 = pos >= 2 ?
+ ringbuffer[(size_t)(pos - 2) & ringbuffer_mask] : 0;
+ dict_id = params->dictionary.contextual.context_map[
+ BROTLI_CONTEXT(p1, p2, literal_context_lut)];
+ }
num_matches = FindAllMatchesH10(&hasher->privat._H10,
- &params->dictionary,
+ params->dictionary.contextual.dict[dict_id],
ringbuffer, ringbuffer_mask, pos, num_bytes - i, max_distance,
dictionary_start + gap, params, &matches[lz_matches_offset]);
+ if (addon->num_chunks != 0) {
+ size_t cd_matches = LookupAllCompoundDictionaryMatches(addon,
+ ringbuffer, ringbuffer_mask, pos, 3, num_bytes - i,
+ dictionary_start, params->dist.max_distance,
+ &matches[lz_matches_offset - 64], 64);
+ MergeMatches(matches, &matches[lz_matches_offset - 64], cd_matches,
+ &matches[lz_matches_offset], num_matches);
+ num_matches += cd_matches;
+ }
if (num_matches > 0 &&
BackwardMatchLength(&matches[num_matches - 1]) > max_zopfli_len) {
matches[0] = matches[num_matches - 1];
num_matches = 1;
}
skip = UpdateNodes(num_bytes, position, i, ringbuffer, ringbuffer_mask,
- params, max_backward_limit, dist_cache, num_matches, matches, &model,
+ params, max_backward_limit, dist_cache, num_matches, matches, model,
&queue, nodes);
if (skip < BROTLI_LONG_COPY_QUICK_STEP) skip = 0;
if (num_matches == 1 && BackwardMatchLength(&matches[0]) > max_zopfli_len) {
@@ -710,12 +783,14 @@ size_t BrotliZopfliComputeShortestPath(MemoryManager* m, size_t num_bytes,
i++;
if (i + HashTypeLengthH10() - 1 >= num_bytes) break;
EvaluateNode(position + stream_offset, i, max_backward_limit, gap,
- dist_cache, &model, &queue, nodes);
+ dist_cache, model, &queue, nodes);
skip--;
}
}
}
- CleanupZopfliCostModel(m, &model);
+ CleanupZopfliCostModel(m, model);
+ BROTLI_FREE(m, model);
+ BROTLI_FREE(m, matches);
return ComputeShortestPathFromNodes(num_bytes, nodes);
}
@@ -753,14 +828,15 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes,
size_t orig_last_insert_len;
int orig_dist_cache[4];
size_t orig_num_commands;
- ZopfliCostModel model;
+ ZopfliCostModel* model = BROTLI_ALLOC(m, ZopfliCostModel, 1);
ZopfliNode* nodes;
BackwardMatch* matches = BROTLI_ALLOC(m, BackwardMatch, matches_size);
- size_t gap = 0;
- size_t shadow_matches = 0;
- BROTLI_UNUSED(literal_context_lut);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(num_matches) ||
- BROTLI_IS_NULL(matches)) {
+ const CompoundDictionary* addon = &params->dictionary.compound;
+ size_t gap = addon->total_size;
+ size_t shadow_matches =
+ (addon->num_chunks != 0) ? (MAX_NUM_MATCHES_H10 + 128) : 0;
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(model) ||
+ BROTLI_IS_NULL(num_matches) || BROTLI_IS_NULL(matches)) {
return;
}
for (i = 0; i + HashTypeLengthH10() - 1 < num_bytes; ++i) {
@@ -772,15 +848,34 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes,
size_t num_found_matches;
size_t cur_match_end;
size_t j;
+ int dict_id = 0;
+ if (params->dictionary.contextual.context_based) {
+ uint8_t p1 = pos >= 1 ?
+ ringbuffer[(size_t)(pos - 1) & ringbuffer_mask] : 0;
+ uint8_t p2 = pos >= 2 ?
+ ringbuffer[(size_t)(pos - 2) & ringbuffer_mask] : 0;
+ dict_id = params->dictionary.contextual.context_map[
+ BROTLI_CONTEXT(p1, p2, literal_context_lut)];
+ }
/* Ensure that we have enough free slots. */
BROTLI_ENSURE_CAPACITY(m, BackwardMatch, matches, matches_size,
cur_match_pos + MAX_NUM_MATCHES_H10 + shadow_matches);
if (BROTLI_IS_OOM(m)) return;
num_found_matches = FindAllMatchesH10(&hasher->privat._H10,
- &params->dictionary,
+ params->dictionary.contextual.dict[dict_id],
ringbuffer, ringbuffer_mask, pos, max_length,
max_distance, dictionary_start + gap, params,
&matches[cur_match_pos + shadow_matches]);
+ if (addon->num_chunks != 0) {
+ size_t cd_matches = LookupAllCompoundDictionaryMatches(addon,
+ ringbuffer, ringbuffer_mask, pos, 3, max_length,
+ dictionary_start, params->dist.max_distance,
+ &matches[cur_match_pos + shadow_matches - 64], 64);
+ MergeMatches(&matches[cur_match_pos],
+ &matches[cur_match_pos + shadow_matches - 64], cd_matches,
+ &matches[cur_match_pos + shadow_matches], num_found_matches);
+ num_found_matches += cd_matches;
+ }
cur_match_end = cur_match_pos + num_found_matches;
for (j = cur_match_pos; j + 1 < cur_match_end; ++j) {
BROTLI_DCHECK(BackwardMatchLength(&matches[j]) <=
@@ -810,15 +905,15 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes,
orig_num_commands = *num_commands;
nodes = BROTLI_ALLOC(m, ZopfliNode, num_bytes + 1);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(nodes)) return;
- InitZopfliCostModel(m, &model, &params->dist, num_bytes);
+ InitZopfliCostModel(m, model, &params->dist, num_bytes);
if (BROTLI_IS_OOM(m)) return;
for (i = 0; i < 2; i++) {
BrotliInitZopfliNodes(nodes, num_bytes + 1);
if (i == 0) {
ZopfliCostModelSetFromLiteralCosts(
- &model, position, ringbuffer, ringbuffer_mask);
+ model, position, ringbuffer, ringbuffer_mask);
} else {
- ZopfliCostModelSetFromCommands(&model, position, ringbuffer,
+ ZopfliCostModelSetFromCommands(model, position, ringbuffer,
ringbuffer_mask, commands, *num_commands - orig_num_commands,
orig_last_insert_len);
}
@@ -827,12 +922,13 @@ void BrotliCreateHqZopfliBackwardReferences(MemoryManager* m, size_t num_bytes,
*last_insert_len = orig_last_insert_len;
memcpy(dist_cache, orig_dist_cache, 4 * sizeof(dist_cache[0]));
*num_commands += ZopfliIterate(num_bytes, position, ringbuffer,
- ringbuffer_mask, params, gap, dist_cache, &model, num_matches, matches,
+ ringbuffer_mask, params, gap, dist_cache, model, num_matches, matches,
nodes);
BrotliZopfliCreateCommands(num_bytes, position, nodes, dist_cache,
last_insert_len, params, commands, num_literals);
}
- CleanupZopfliCostModel(m, &model);
+ CleanupZopfliCostModel(m, model);
+ BROTLI_FREE(m, model);
BROTLI_FREE(m, nodes);
BROTLI_FREE(m, matches);
BROTLI_FREE(m, num_matches);
diff --git a/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h b/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h
index 36b75f250d..8acf975ab9 100644
--- a/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h
+++ b/dviware/dvisvgm/libs/brotli/enc/backward_references_hq.h
@@ -9,15 +9,16 @@
#ifndef BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_
#define BROTLI_ENC_BACKWARD_REFERENCES_HQ_H_
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/context.h"
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./command.h"
-#include "./hash.h"
-#include "./memory.h"
-#include "./quality.h"
+#include "command.h"
+#include "hash.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h b/dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h
index 766bf91ffd..752c12e9fd 100644
--- a/dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/backward_references_inc.h
@@ -28,13 +28,11 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
const size_t random_heuristics_window_size =
LiteralSpreeLengthForSparseSearch(params);
size_t apply_random_heuristics = position + random_heuristics_window_size;
- const size_t gap = 0;
+ const size_t gap = params->dictionary.compound.total_size;
/* Minimum score to accept a backward reference. */
const score_t kMinScore = BROTLI_SCORE_BASE + 100;
- BROTLI_UNUSED(literal_context_lut);
-
FN(PrepareDistanceCache)(privat, dist_cache);
while (position + FN(HashTypeLength)() < pos_end) {
@@ -43,13 +41,29 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
size_t dictionary_start = BROTLI_MIN(size_t,
position + position_offset, max_backward_limit);
HasherSearchResult sr;
+ int dict_id = 0;
+ uint8_t p1 = 0;
+ uint8_t p2 = 0;
+ if (params->dictionary.contextual.context_based) {
+ p1 = position >= 1 ?
+ ringbuffer[(size_t)(position - 1) & ringbuffer_mask] : 0;
+ p2 = position >= 2 ?
+ ringbuffer[(size_t)(position - 2) & ringbuffer_mask] : 0;
+ dict_id = params->dictionary.contextual.context_map[
+ BROTLI_CONTEXT(p1, p2, literal_context_lut)];
+ }
sr.len = 0;
sr.len_code_delta = 0;
sr.distance = 0;
sr.score = kMinScore;
- FN(FindLongestMatch)(privat, &params->dictionary,
+ FN(FindLongestMatch)(privat, params->dictionary.contextual.dict[dict_id],
ringbuffer, ringbuffer_mask, dist_cache, position, max_length,
max_distance, dictionary_start + gap, params->dist.max_distance, &sr);
+ if (ENABLE_COMPOUND_DICTIONARY) {
+ LookupCompoundDictionaryMatch(&params->dictionary.compound, ringbuffer,
+ ringbuffer_mask, dist_cache, position, max_length,
+ dictionary_start, params->dist.max_distance, &sr);
+ }
if (sr.score > kMinScore) {
/* Found a match. Let's look for something even better ahead. */
int delayed_backward_references_in_row = 0;
@@ -65,11 +79,23 @@ static BROTLI_NOINLINE void EXPORT_FN(CreateBackwardReferences)(
max_distance = BROTLI_MIN(size_t, position + 1, max_backward_limit);
dictionary_start = BROTLI_MIN(size_t,
position + 1 + position_offset, max_backward_limit);
+ if (params->dictionary.contextual.context_based) {
+ p2 = p1;
+ p1 = ringbuffer[position & ringbuffer_mask];
+ dict_id = params->dictionary.contextual.context_map[
+ BROTLI_CONTEXT(p1, p2, literal_context_lut)];
+ }
FN(FindLongestMatch)(privat,
- &params->dictionary,
+ params->dictionary.contextual.dict[dict_id],
ringbuffer, ringbuffer_mask, dist_cache, position + 1, max_length,
max_distance, dictionary_start + gap, params->dist.max_distance,
&sr2);
+ if (ENABLE_COMPOUND_DICTIONARY) {
+ LookupCompoundDictionaryMatch(
+ &params->dictionary.compound, ringbuffer,
+ ringbuffer_mask, dist_cache, position + 1, max_length,
+ dictionary_start, params->dist.max_distance, &sr2);
+ }
if (sr2.score >= sr.score + cost_diff_lazy) {
/* Ok, let's just write one byte for now and start a match from the
next byte. */
diff --git a/dviware/dvisvgm/libs/brotli/enc/bit_cost.c b/dviware/dvisvgm/libs/brotli/enc/bit_cost.c
index 1f3f7ad5c9..6b7c904ced 100644
--- a/dviware/dvisvgm/libs/brotli/enc/bit_cost.c
+++ b/dviware/dvisvgm/libs/brotli/enc/bit_cost.c
@@ -6,28 +6,29 @@
/* Functions to estimate the bit cost of Huffman trees. */
-#include "./bit_cost.h"
+#include "bit_cost.h"
+
+#include <brotli/types.h>
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./fast_log.h"
-#include "./histogram.h"
+#include "fast_log.h"
+#include "histogram.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
#define FN(X) X ## Literal
-#include "./bit_cost_inc.h" /* NOLINT(build/include) */
+#include "bit_cost_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Command
-#include "./bit_cost_inc.h" /* NOLINT(build/include) */
+#include "bit_cost_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Distance
-#include "./bit_cost_inc.h" /* NOLINT(build/include) */
+#include "bit_cost_inc.h" /* NOLINT(build/include) */
#undef FN
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/dviware/dvisvgm/libs/brotli/enc/bit_cost.h b/dviware/dvisvgm/libs/brotli/enc/bit_cost.h
index 6586469e62..f6f2773994 100644
--- a/dviware/dvisvgm/libs/brotli/enc/bit_cost.h
+++ b/dviware/dvisvgm/libs/brotli/enc/bit_cost.h
@@ -9,10 +9,11 @@
#ifndef BROTLI_ENC_BIT_COST_H_
#define BROTLI_ENC_BIT_COST_H_
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./fast_log.h"
-#include "./histogram.h"
+
+#include "../common/platform.h"
+#include "fast_log.h"
+#include "histogram.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -45,7 +46,7 @@ static BROTLI_INLINE double BitsEntropy(
const uint32_t* population, size_t size) {
size_t sum;
double retval = ShannonEntropy(population, size, &sum);
- if (retval < sum) {
+ if (retval < (double)sum) {
/* At least one bit per literal is needed. */
retval = (double)sum;
}
diff --git a/dviware/dvisvgm/libs/brotli/enc/block_splitter.c b/dviware/dvisvgm/libs/brotli/enc/block_splitter.c
index deb7c2e151..eba1b691e5 100644
--- a/dviware/dvisvgm/libs/brotli/enc/block_splitter.c
+++ b/dviware/dvisvgm/libs/brotli/enc/block_splitter.c
@@ -6,18 +6,18 @@
/* Block split point selection utilities. */
-#include "./block_splitter.h"
+#include "block_splitter.h"
#include <string.h> /* memcpy, memset */
#include "../common/platform.h"
-#include "./bit_cost.h"
-#include "./cluster.h"
-#include "./command.h"
-#include "./fast_log.h"
-#include "./histogram.h"
-#include "./memory.h"
-#include "./quality.h"
+#include "bit_cost.h"
+#include "cluster.h"
+#include "command.h"
+#include "fast_log.h"
+#include "histogram.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -30,6 +30,7 @@ static const double kCommandBlockSwitchCost = 13.5;
static const double kDistanceBlockSwitchCost = 14.6;
static const size_t kLiteralStrideLength = 70;
static const size_t kCommandStrideLength = 40;
+static const size_t kDistanceStrideLength = 40;
static const size_t kSymbolsPerLiteralHistogram = 544;
static const size_t kSymbolsPerCommandHistogram = 530;
static const size_t kSymbolsPerDistanceHistogram = 544;
@@ -89,19 +90,19 @@ static BROTLI_INLINE double BitCost(size_t count) {
#define FN(X) X ## Literal
#define DataType uint8_t
/* NOLINTNEXTLINE(build/include) */
-#include "./block_splitter_inc.h"
+#include "block_splitter_inc.h"
#undef DataType
#undef FN
#define FN(X) X ## Command
#define DataType uint16_t
/* NOLINTNEXTLINE(build/include) */
-#include "./block_splitter_inc.h"
+#include "block_splitter_inc.h"
#undef FN
#define FN(X) X ## Distance
/* NOLINTNEXTLINE(build/include) */
-#include "./block_splitter_inc.h"
+#include "block_splitter_inc.h"
#undef DataType
#undef FN
@@ -119,6 +120,8 @@ void BrotliDestroyBlockSplit(MemoryManager* m, BlockSplit* self) {
BROTLI_FREE(m, self->lengths);
}
+/* Extracts literals, command distance and prefix codes, then applies
+ * SplitByteVector to create partitioning. */
void BrotliSplitBlock(MemoryManager* m,
const Command* cmds,
const size_t num_commands,
@@ -136,7 +139,9 @@ void BrotliSplitBlock(MemoryManager* m,
/* Create a continuous array of literals. */
CopyLiteralsToByteArray(cmds, num_commands, data, pos, mask, literals);
/* Create the block split on the array of literals.
- Literal histograms have alphabet size 256. */
+ * Literal histograms can have alphabet size up to 256.
+ * Though, to accomodate context modeling, less than half of maximum size
+ * is allowed. */
SplitByteVectorLiteral(
m, literals, literals_count,
kSymbolsPerLiteralHistogram, kMaxLiteralHistograms,
@@ -144,6 +149,10 @@ void BrotliSplitBlock(MemoryManager* m,
literal_split);
if (BROTLI_IS_OOM(m)) return;
BROTLI_FREE(m, literals);
+ /* NB: this might be a good place for injecting extra splitting without
+ * increasing encoder complexity; however, output parition would be less
+ * optimal than one produced with forced splitting inside
+ * SplitByteVector (FindBlocks / ClusterBlocks). */
}
{
@@ -161,7 +170,7 @@ void BrotliSplitBlock(MemoryManager* m,
kCommandStrideLength, kCommandBlockSwitchCost, params,
insert_and_copy_split);
if (BROTLI_IS_OOM(m)) return;
- /* TODO: reuse for distances? */
+ /* TODO(eustas): reuse for distances? */
BROTLI_FREE(m, insert_and_copy_codes);
}
@@ -181,13 +190,27 @@ void BrotliSplitBlock(MemoryManager* m,
SplitByteVectorDistance(
m, distance_prefixes, j,
kSymbolsPerDistanceHistogram, kMaxCommandHistograms,
- kCommandStrideLength, kDistanceBlockSwitchCost, params,
+ kDistanceStrideLength, kDistanceBlockSwitchCost, params,
dist_split);
if (BROTLI_IS_OOM(m)) return;
BROTLI_FREE(m, distance_prefixes);
}
}
+#if defined(BROTLI_TEST)
+size_t CountLiteralsForTest(const Command*, const size_t);
+size_t CountLiteralsForTest(const Command* cmds, const size_t num_commands) {
+ return CountLiterals(cmds, num_commands);
+}
+
+void CopyLiteralsToByteArrayForTest(const Command*,
+ const size_t, const uint8_t*, const size_t, const size_t, uint8_t*);
+void CopyLiteralsToByteArrayForTest(const Command* cmds,
+ const size_t num_commands, const uint8_t* data, const size_t offset,
+ const size_t mask, uint8_t* literals) {
+ CopyLiteralsToByteArray(cmds, num_commands, data, offset, mask, literals);
+}
+#endif
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/block_splitter.h b/dviware/dvisvgm/libs/brotli/enc/block_splitter.h
index a5e006c4b3..6046b90a5d 100644
--- a/dviware/dvisvgm/libs/brotli/enc/block_splitter.h
+++ b/dviware/dvisvgm/libs/brotli/enc/block_splitter.h
@@ -9,11 +9,12 @@
#ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
#define BROTLI_ENC_BLOCK_SPLITTER_H_
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./command.h"
-#include "./memory.h"
-#include "./quality.h"
+
+#include "../common/platform.h"
+#include "command.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h b/dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h
index e612d6a370..aa40bfd329 100644
--- a/dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/block_splitter_inc.h
@@ -46,17 +46,17 @@ static void FN(RandomSample)(uint32_t* seed,
static void FN(RefineEntropyCodes)(const DataType* data, size_t length,
size_t stride,
size_t num_histograms,
- HistogramType* histograms) {
+ HistogramType* histograms,
+ HistogramType* tmp) {
size_t iters =
kIterMulForRefining * length / stride + kMinItersForRefining;
uint32_t seed = 7;
size_t iter;
iters = ((iters + num_histograms - 1) / num_histograms) * num_histograms;
for (iter = 0; iter < iters; ++iter) {
- HistogramType sample;
- FN(HistogramClear)(&sample);
- FN(RandomSample)(&seed, data, length, stride, &sample);
- FN(HistogramAddHistogram)(&histograms[iter % num_histograms], &sample);
+ FN(HistogramClear)(tmp);
+ FN(RandomSample)(&seed, data, length, stride, tmp);
+ FN(HistogramAddHistogram)(&histograms[iter % num_histograms], tmp);
}
}
@@ -71,46 +71,56 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length,
double* cost,
uint8_t* switch_signal,
uint8_t* block_id) {
- const size_t data_size = FN(HistogramDataSize)();
- const size_t bitmaplen = (num_histograms + 7) >> 3;
+ const size_t alphabet_size = FN(HistogramDataSize)();
+ const size_t bitmap_len = (num_histograms + 7) >> 3;
size_t num_blocks = 1;
+ size_t byte_ix;
size_t i;
size_t j;
BROTLI_DCHECK(num_histograms <= 256);
+
+ /* Trivial case: single historgram -> single block type. */
if (num_histograms <= 1) {
for (i = 0; i < length; ++i) {
block_id[i] = 0;
}
return 1;
}
- memset(insert_cost, 0, sizeof(insert_cost[0]) * data_size * num_histograms);
+
+ /* Fill bitcost for each symbol of all histograms.
+ * Non-existing symbol cost: 2 + log2(total_count).
+ * Regular symbol cost: -log2(symbol_count / total_count). */
+ memset(insert_cost, 0,
+ sizeof(insert_cost[0]) * alphabet_size * num_histograms);
for (i = 0; i < num_histograms; ++i) {
insert_cost[i] = FastLog2((uint32_t)histograms[i].total_count_);
}
- for (i = data_size; i != 0;) {
+ for (i = alphabet_size; i != 0;) {
+ /* Reverse order to use the 0-th row as a temporary storage. */
--i;
for (j = 0; j < num_histograms; ++j) {
insert_cost[i * num_histograms + j] =
insert_cost[j] - BitCost(histograms[j].data_[i]);
}
}
- memset(cost, 0, sizeof(cost[0]) * num_histograms);
- memset(switch_signal, 0, sizeof(switch_signal[0]) * length * bitmaplen);
+
/* After each iteration of this loop, cost[k] will contain the difference
between the minimum cost of arriving at the current byte position using
entropy code k, and the minimum cost of arriving at the current byte
position. This difference is capped at the block switch cost, and if it
reaches block switch cost, it means that when we trace back from the last
position, we need to switch here. */
- for (i = 0; i < length; ++i) {
- const size_t byte_ix = i;
- size_t ix = byte_ix * bitmaplen;
- size_t insert_cost_ix = data[byte_ix] * num_histograms;
+ memset(cost, 0, sizeof(cost[0]) * num_histograms);
+ memset(switch_signal, 0, sizeof(switch_signal[0]) * length * bitmap_len);
+ for (byte_ix = 0; byte_ix < length; ++byte_ix) {
+ size_t ix = byte_ix * bitmap_len;
+ size_t symbol = data[byte_ix];
+ size_t insert_cost_ix = symbol * num_histograms;
double min_cost = 1e99;
double block_switch_cost = block_switch_bitcost;
size_t k;
for (k = 0; k < num_histograms; ++k) {
- /* We are coding the symbol in data[byte_ix] with entropy code k. */
+ /* We are coding the symbol with entropy code k. */
cost[k] += insert_cost[insert_cost_ix + k];
if (cost[k] < min_cost) {
min_cost = cost[k];
@@ -126,20 +136,21 @@ static size_t FN(FindBlocks)(const DataType* data, const size_t length,
if (cost[k] >= block_switch_cost) {
const uint8_t mask = (uint8_t)(1u << (k & 7));
cost[k] = block_switch_cost;
- BROTLI_DCHECK((k >> 3) < bitmaplen);
+ BROTLI_DCHECK((k >> 3) < bitmap_len);
switch_signal[ix + (k >> 3)] |= mask;
}
}
}
+
+ byte_ix = length - 1;
{ /* Trace back from the last position and switch at the marked places. */
- size_t byte_ix = length - 1;
- size_t ix = byte_ix * bitmaplen;
+ size_t ix = byte_ix * bitmap_len;
uint8_t cur_id = block_id[byte_ix];
while (byte_ix > 0) {
const uint8_t mask = (uint8_t)(1u << (cur_id & 7));
- BROTLI_DCHECK(((size_t)cur_id >> 3) < bitmaplen);
+ BROTLI_DCHECK(((size_t)cur_id >> 3) < bitmap_len);
--byte_ix;
- ix -= bitmaplen;
+ ix -= bitmap_len;
if (switch_signal[ix + (cur_id >> 3)] & mask) {
if (cur_id != block_id[byte_ix]) {
cur_id = block_id[byte_ix];
@@ -185,13 +196,16 @@ static void FN(BuildBlockHistograms)(const DataType* data, const size_t length,
}
}
+/* Given the initial partitioning build partitioning with limited number
+ * of histograms (and block types). */
static void FN(ClusterBlocks)(MemoryManager* m,
const DataType* data, const size_t length,
const size_t num_blocks,
uint8_t* block_ids,
BlockSplit* split) {
uint32_t* histogram_symbols = BROTLI_ALLOC(m, uint32_t, num_blocks);
- uint32_t* block_lengths = BROTLI_ALLOC(m, uint32_t, num_blocks);
+ uint32_t* u32 =
+ BROTLI_ALLOC(m, uint32_t, num_blocks + 4 * HISTOGRAMS_PER_BATCH);
const size_t expected_num_clusters = CLUSTERS_PER_BATCH *
(num_blocks + HISTOGRAMS_PER_BATCH - 1) / HISTOGRAMS_PER_BATCH;
size_t all_histograms_size = 0;
@@ -214,20 +228,25 @@ static void FN(ClusterBlocks)(MemoryManager* m,
static const uint32_t kInvalidIndex = BROTLI_UINT32_MAX;
uint32_t* new_index;
size_t i;
- uint32_t sizes[HISTOGRAMS_PER_BATCH] = { 0 };
- uint32_t new_clusters[HISTOGRAMS_PER_BATCH] = { 0 };
- uint32_t symbols[HISTOGRAMS_PER_BATCH] = { 0 };
- uint32_t remap[HISTOGRAMS_PER_BATCH] = { 0 };
+ uint32_t* BROTLI_RESTRICT const sizes = u32 + 0 * HISTOGRAMS_PER_BATCH;
+ uint32_t* BROTLI_RESTRICT const new_clusters = u32 + 1 * HISTOGRAMS_PER_BATCH;
+ uint32_t* BROTLI_RESTRICT const symbols = u32 + 2 * HISTOGRAMS_PER_BATCH;
+ uint32_t* BROTLI_RESTRICT const remap = u32 + 3 * HISTOGRAMS_PER_BATCH;
+ uint32_t* BROTLI_RESTRICT const block_lengths =
+ u32 + 4 * HISTOGRAMS_PER_BATCH;
+ /* TODO(eustas): move to arena? */
+ HistogramType* tmp = BROTLI_ALLOC(m, HistogramType, 2);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(histogram_symbols) ||
- BROTLI_IS_NULL(block_lengths) || BROTLI_IS_NULL(all_histograms) ||
+ BROTLI_IS_NULL(u32) || BROTLI_IS_NULL(all_histograms) ||
BROTLI_IS_NULL(cluster_size) || BROTLI_IS_NULL(histograms) ||
- BROTLI_IS_NULL(pairs)) {
+ BROTLI_IS_NULL(pairs) || BROTLI_IS_NULL(tmp)) {
return;
}
- memset(block_lengths, 0, num_blocks * sizeof(uint32_t));
+ memset(u32, 0, (num_blocks + 4 * HISTOGRAMS_PER_BATCH) * sizeof(uint32_t));
+ /* Calculate block lengths (convert repeating values -> series length). */
{
size_t block_idx = 0;
for (i = 0; i < length; ++i) {
@@ -240,6 +259,7 @@ static void FN(ClusterBlocks)(MemoryManager* m,
BROTLI_DCHECK(block_idx == num_blocks);
}
+ /* Pre-cluster blocks (cluster batches). */
for (i = 0; i < num_blocks; i += HISTOGRAMS_PER_BATCH) {
const size_t num_to_combine =
BROTLI_MIN(size_t, num_blocks - i, HISTOGRAMS_PER_BATCH);
@@ -247,8 +267,9 @@ static void FN(ClusterBlocks)(MemoryManager* m,
size_t j;
for (j = 0; j < num_to_combine; ++j) {
size_t k;
+ size_t block_length = block_lengths[i + j];
FN(HistogramClear)(&histograms[j]);
- for (k = 0; k < block_lengths[i + j]; ++k) {
+ for (k = 0; k < block_length; ++k) {
FN(HistogramAdd)(&histograms[j], data[pos++]);
}
histograms[j].bit_cost_ = FN(BrotliPopulationCost)(&histograms[j]);
@@ -257,7 +278,7 @@ static void FN(ClusterBlocks)(MemoryManager* m,
sizes[j] = 1;
}
num_new_clusters = FN(BrotliHistogramCombine)(
- histograms, sizes, symbols, new_clusters, pairs, num_to_combine,
+ histograms, tmp, sizes, symbols, new_clusters, pairs, num_to_combine,
num_to_combine, HISTOGRAMS_PER_BATCH, max_num_pairs);
BROTLI_ENSURE_CAPACITY(m, HistogramType, all_histograms,
all_histograms_capacity, all_histograms_size + num_new_clusters);
@@ -278,6 +299,7 @@ static void FN(ClusterBlocks)(MemoryManager* m,
}
BROTLI_FREE(m, histograms);
+ /* Final clustering. */
max_num_pairs =
BROTLI_MIN(size_t, 64 * num_clusters, (num_clusters / 2) * num_clusters);
if (pairs_capacity < max_num_pairs + 1) {
@@ -285,19 +307,19 @@ static void FN(ClusterBlocks)(MemoryManager* m,
pairs = BROTLI_ALLOC(m, HistogramPair, max_num_pairs + 1);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(pairs)) return;
}
-
clusters = BROTLI_ALLOC(m, uint32_t, num_clusters);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(clusters)) return;
for (i = 0; i < num_clusters; ++i) {
clusters[i] = (uint32_t)i;
}
num_final_clusters = FN(BrotliHistogramCombine)(
- all_histograms, cluster_size, histogram_symbols, clusters, pairs,
+ all_histograms, tmp, cluster_size, histogram_symbols, clusters, pairs,
num_clusters, num_blocks, BROTLI_MAX_NUMBER_OF_BLOCK_TYPES,
max_num_pairs);
BROTLI_FREE(m, pairs);
BROTLI_FREE(m, cluster_size);
+ /* Assign blocks to final histograms. */
new_index = BROTLI_ALLOC(m, uint32_t, num_clusters);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(new_index)) return;
for (i = 0; i < num_clusters; ++i) new_index[i] = kInvalidIndex;
@@ -305,20 +327,21 @@ static void FN(ClusterBlocks)(MemoryManager* m,
{
uint32_t next_index = 0;
for (i = 0; i < num_blocks; ++i) {
- HistogramType histo;
size_t j;
uint32_t best_out;
double best_bits;
- FN(HistogramClear)(&histo);
+ FN(HistogramClear)(tmp);
for (j = 0; j < block_lengths[i]; ++j) {
- FN(HistogramAdd)(&histo, data[pos++]);
+ FN(HistogramAdd)(tmp, data[pos++]);
}
+ /* Among equally good histograms prefer last used. */
+ /* TODO(eustas): should we give a block-switch discount here? */
best_out = (i == 0) ? histogram_symbols[0] : histogram_symbols[i - 1];
- best_bits =
- FN(BrotliHistogramBitCostDistance)(&histo, &all_histograms[best_out]);
+ best_bits = FN(BrotliHistogramBitCostDistance)(
+ tmp, &all_histograms[best_out], tmp + 1);
for (j = 0; j < num_final_clusters; ++j) {
const double cur_bits = FN(BrotliHistogramBitCostDistance)(
- &histo, &all_histograms[clusters[j]]);
+ tmp, &all_histograms[clusters[j]], tmp + 1);
if (cur_bits < best_bits) {
best_bits = cur_bits;
best_out = clusters[j];
@@ -330,6 +353,7 @@ static void FN(ClusterBlocks)(MemoryManager* m,
}
}
}
+ BROTLI_FREE(m, tmp);
BROTLI_FREE(m, clusters);
BROTLI_FREE(m, all_histograms);
BROTLI_ENSURE_CAPACITY(
@@ -337,6 +361,9 @@ static void FN(ClusterBlocks)(MemoryManager* m,
BROTLI_ENSURE_CAPACITY(
m, uint32_t, split->lengths, split->lengths_alloc_size, num_blocks);
if (BROTLI_IS_OOM(m)) return;
+
+ /* Rewrite final assignment to block-split. There might be less blocks
+ * than |num_blocks| due to clustering. */
{
uint32_t cur_length = 0;
size_t block_idx = 0;
@@ -357,28 +384,41 @@ static void FN(ClusterBlocks)(MemoryManager* m,
split->num_types = (size_t)max_type + 1;
}
BROTLI_FREE(m, new_index);
- BROTLI_FREE(m, block_lengths);
+ BROTLI_FREE(m, u32);
BROTLI_FREE(m, histogram_symbols);
}
+/* Create BlockSplit (partitioning) given the limits, estimates and "effort"
+ * parameters.
+ *
+ * NB: max_histograms is often less than number of histograms allowed by format;
+ * this is done intentionally, to save some "space" for context-aware
+ * clustering (here entropy is estimated for context-free symbols). */
static void FN(SplitByteVector)(MemoryManager* m,
const DataType* data, const size_t length,
- const size_t literals_per_histogram,
+ const size_t symbols_per_histogram,
const size_t max_histograms,
const size_t sampling_stride_length,
const double block_switch_cost,
const BrotliEncoderParams* params,
BlockSplit* split) {
const size_t data_size = FN(HistogramDataSize)();
- size_t num_histograms = length / literals_per_histogram + 1;
HistogramType* histograms;
+ HistogramType* tmp;
+ /* Calculate number of histograms; initial estimate is one histogram per
+ * specified amount of symbols; however, this value is capped. */
+ size_t num_histograms = length / symbols_per_histogram + 1;
if (num_histograms > max_histograms) {
num_histograms = max_histograms;
}
+
+ /* Corner case: no input. */
if (length == 0) {
split->num_types = 1;
return;
- } else if (length < kMinLengthForBlockSplitting) {
+ }
+
+ if (length < kMinLengthForBlockSplitting) {
BROTLI_ENSURE_CAPACITY(m, uint8_t,
split->types, split->types_alloc_size, split->num_blocks + 1);
BROTLI_ENSURE_CAPACITY(m, uint32_t,
@@ -390,7 +430,8 @@ static void FN(SplitByteVector)(MemoryManager* m,
split->num_blocks++;
return;
}
- histograms = BROTLI_ALLOC(m, HistogramType, num_histograms);
+ histograms = BROTLI_ALLOC(m, HistogramType, num_histograms + 1);
+ tmp = histograms + num_histograms;
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(histograms)) return;
/* Find good entropy codes. */
FN(InitialEntropyCodes)(data, length,
@@ -398,7 +439,7 @@ static void FN(SplitByteVector)(MemoryManager* m,
num_histograms, histograms);
FN(RefineEntropyCodes)(data, length,
sampling_stride_length,
- num_histograms, histograms);
+ num_histograms, histograms, tmp);
{
/* Find a good path through literals with the good entropy codes. */
uint8_t* block_ids = BROTLI_ALLOC(m, uint8_t, length);
diff --git a/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c b/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c
index 9348a97e1b..5fa0c69aa8 100644
--- a/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c
+++ b/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.c
@@ -8,20 +8,21 @@
compression algorithms here, just the right ordering of bits to match the
specs. */
-#include "./brotli_bit_stream.h"
+#include "brotli_bit_stream.h"
#include <string.h> /* memcpy, memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./entropy_encode.h"
-#include "./entropy_encode_static.h"
-#include "./fast_log.h"
-#include "./histogram.h"
-#include "./memory.h"
-#include "./write_bits.h"
+#include "entropy_encode.h"
+#include "entropy_encode_static.h"
+#include "fast_log.h"
+#include "histogram.h"
+#include "memory.h"
+#include "write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -286,6 +287,7 @@ void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
/* Write the Huffman tree into the brotli-representation.
The command alphabet is the largest, so this allocation will fit all
alphabets. */
+ /* TODO(eustas): fix me */
uint8_t huffman_tree[BROTLI_NUM_COMMAND_SYMBOLS];
uint8_t huffman_tree_extra_bits[BROTLI_NUM_COMMAND_SYMBOLS];
size_t huffman_tree_size = 0;
@@ -400,7 +402,7 @@ static BROTLI_INLINE BROTLI_BOOL SortHuffmanTree(
return TO_BROTLI_BOOL(v0->total_count_ < v1->total_count_);
}
-void BrotliBuildAndStoreHuffmanTreeFast(MemoryManager* m,
+void BrotliBuildAndStoreHuffmanTreeFast(HuffmanTree* tree,
const uint32_t* histogram,
const size_t histogram_total,
const size_t max_bits,
@@ -432,10 +434,7 @@ void BrotliBuildAndStoreHuffmanTreeFast(MemoryManager* m,
memset(depth, 0, length * sizeof(depth[0]));
{
- const size_t max_tree_size = 2 * length + 1;
- HuffmanTree* tree = BROTLI_ALLOC(m, HuffmanTree, max_tree_size);
uint32_t count_limit;
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tree)) return;
for (count_limit = 1; ; count_limit *= 2) {
HuffmanTree* node = tree;
size_t l;
@@ -500,7 +499,6 @@ void BrotliBuildAndStoreHuffmanTreeFast(MemoryManager* m,
}
}
}
- BROTLI_FREE(m, tree);
}
BrotliConvertBitDepthsToSymbols(depth, length, bits);
if (count <= 4) {
@@ -677,7 +675,14 @@ static void RunLengthCodeZeros(const size_t in_size,
#define SYMBOL_BITS 9
+typedef struct EncodeContextMapArena {
+ uint32_t histogram[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+ uint8_t depths[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+ uint16_t bits[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+} EncodeContextMapArena;
+
static void EncodeContextMap(MemoryManager* m,
+ EncodeContextMapArena* arena,
const uint32_t* context_map,
size_t context_map_size,
size_t num_clusters,
@@ -687,10 +692,10 @@ static void EncodeContextMap(MemoryManager* m,
uint32_t* rle_symbols;
uint32_t max_run_length_prefix = 6;
size_t num_rle_symbols = 0;
- uint32_t histogram[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+ uint32_t* BROTLI_RESTRICT const histogram = arena->histogram;
static const uint32_t kSymbolMask = (1u << SYMBOL_BITS) - 1u;
- uint8_t depths[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
- uint16_t bits[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+ uint8_t* BROTLI_RESTRICT const depths = arena->depths;
+ uint16_t* BROTLI_RESTRICT const bits = arena->bits;
StoreVarLenUint8(num_clusters - 1, storage_ix, storage);
@@ -703,7 +708,7 @@ static void EncodeContextMap(MemoryManager* m,
MoveToFrontTransform(context_map, context_map_size, rle_symbols);
RunLengthCodeZeros(context_map_size, rle_symbols,
&num_rle_symbols, &max_run_length_prefix);
- memset(histogram, 0, sizeof(histogram));
+ memset(histogram, 0, sizeof(arena->histogram));
for (i = 0; i < num_rle_symbols; ++i) {
++histogram[rle_symbols[i] & kSymbolMask];
}
@@ -774,7 +779,7 @@ static void BuildAndStoreBlockSplitCode(const uint8_t* types,
++length_histo[BlockLengthPrefixCode(lengths[i])];
}
StoreVarLenUint8(num_types - 1, storage_ix, storage);
- if (num_types > 1) { /* TODO: else? could StoreBlockSwitch occur? */
+ if (num_types > 1) { /* TODO(eustas): else? could StoreBlockSwitch occur? */
BuildAndStoreHuffmanTree(&type_histo[0], num_types + 2, num_types + 2, tree,
&code->type_depths[0], &code->type_bits[0],
storage_ix, storage);
@@ -787,7 +792,8 @@ static void BuildAndStoreBlockSplitCode(const uint8_t* types,
}
/* Stores a context map where the histogram type is always the block type. */
-static void StoreTrivialContextMap(size_t num_types,
+static void StoreTrivialContextMap(EncodeContextMapArena* arena,
+ size_t num_types,
size_t context_bits,
HuffmanTree* tree,
size_t* storage_ix,
@@ -797,9 +803,9 @@ static void StoreTrivialContextMap(size_t num_types,
size_t repeat_code = context_bits - 1u;
size_t repeat_bits = (1u << repeat_code) - 1u;
size_t alphabet_size = num_types + repeat_code;
- uint32_t histogram[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
- uint8_t depths[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
- uint16_t bits[BROTLI_MAX_CONTEXT_MAP_SYMBOLS];
+ uint32_t* BROTLI_RESTRICT const histogram = arena->histogram;
+ uint8_t* BROTLI_RESTRICT const depths = arena->depths;
+ uint16_t* BROTLI_RESTRICT const bits = arena->bits;
size_t i;
memset(histogram, 0, alphabet_size * sizeof(histogram[0]));
/* Write RLEMAX. */
@@ -914,17 +920,17 @@ static void StoreSymbolWithContext(BlockEncoder* self, size_t symbol,
#define FN(X) X ## Literal
/* NOLINTNEXTLINE(build/include) */
-#include "./block_encoder_inc.h"
+#include "block_encoder_inc.h"
#undef FN
#define FN(X) X ## Command
/* NOLINTNEXTLINE(build/include) */
-#include "./block_encoder_inc.h"
+#include "block_encoder_inc.h"
#undef FN
#define FN(X) X ## Distance
/* NOLINTNEXTLINE(build/include) */
-#include "./block_encoder_inc.h"
+#include "block_encoder_inc.h"
#undef FN
static void JumpToByteBoundary(size_t* storage_ix, uint8_t* storage) {
@@ -932,6 +938,13 @@ static void JumpToByteBoundary(size_t* storage_ix, uint8_t* storage) {
storage[*storage_ix >> 3] = 0;
}
+typedef struct StoreMetablockArena {
+ BlockEncoder literal_enc;
+ BlockEncoder command_enc;
+ BlockEncoder distance_enc;
+ EncodeContextMapArena context_map_arena;
+} StoreMetablockArena;
+
void BrotliStoreMetaBlock(MemoryManager* m,
const uint8_t* input, size_t start_pos, size_t length, size_t mask,
uint8_t prev_byte, uint8_t prev_byte2, BROTLI_BOOL is_last,
@@ -945,9 +958,10 @@ void BrotliStoreMetaBlock(MemoryManager* m,
uint32_t num_effective_distance_symbols = params->dist.alphabet_size_limit;
HuffmanTree* tree;
ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode);
- BlockEncoder literal_enc;
- BlockEncoder command_enc;
- BlockEncoder distance_enc;
+ StoreMetablockArena* arena = NULL;
+ BlockEncoder* literal_enc = NULL;
+ BlockEncoder* command_enc = NULL;
+ BlockEncoder* distance_enc = NULL;
const BrotliDistanceParams* dist = &params->dist;
BROTLI_DCHECK(
num_effective_distance_symbols <= BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS);
@@ -955,21 +969,24 @@ void BrotliStoreMetaBlock(MemoryManager* m,
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tree)) return;
- InitBlockEncoder(&literal_enc, BROTLI_NUM_LITERAL_SYMBOLS,
+ arena = BROTLI_ALLOC(m, StoreMetablockArena, 1);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tree) || BROTLI_IS_NULL(arena)) return;
+ literal_enc = &arena->literal_enc;
+ command_enc = &arena->command_enc;
+ distance_enc = &arena->distance_enc;
+ InitBlockEncoder(literal_enc, BROTLI_NUM_LITERAL_SYMBOLS,
mb->literal_split.num_types, mb->literal_split.types,
mb->literal_split.lengths, mb->literal_split.num_blocks);
- InitBlockEncoder(&command_enc, BROTLI_NUM_COMMAND_SYMBOLS,
+ InitBlockEncoder(command_enc, BROTLI_NUM_COMMAND_SYMBOLS,
mb->command_split.num_types, mb->command_split.types,
mb->command_split.lengths, mb->command_split.num_blocks);
- InitBlockEncoder(&distance_enc, num_effective_distance_symbols,
+ InitBlockEncoder(distance_enc, num_effective_distance_symbols,
mb->distance_split.num_types, mb->distance_split.types,
mb->distance_split.lengths, mb->distance_split.num_blocks);
- BuildAndStoreBlockSwitchEntropyCodes(&literal_enc, tree, storage_ix, storage);
- BuildAndStoreBlockSwitchEntropyCodes(&command_enc, tree, storage_ix, storage);
- BuildAndStoreBlockSwitchEntropyCodes(
- &distance_enc, tree, storage_ix, storage);
+ BuildAndStoreBlockSwitchEntropyCodes(literal_enc, tree, storage_ix, storage);
+ BuildAndStoreBlockSwitchEntropyCodes(command_enc, tree, storage_ix, storage);
+ BuildAndStoreBlockSwitchEntropyCodes(distance_enc, tree, storage_ix, storage);
BrotliWriteBits(2, dist->distance_postfix_bits, storage_ix, storage);
BrotliWriteBits(
@@ -980,34 +997,36 @@ void BrotliStoreMetaBlock(MemoryManager* m,
}
if (mb->literal_context_map_size == 0) {
- StoreTrivialContextMap(mb->literal_histograms_size,
+ StoreTrivialContextMap(
+ &arena->context_map_arena, mb->literal_histograms_size,
BROTLI_LITERAL_CONTEXT_BITS, tree, storage_ix, storage);
} else {
- EncodeContextMap(m,
+ EncodeContextMap(m, &arena->context_map_arena,
mb->literal_context_map, mb->literal_context_map_size,
mb->literal_histograms_size, tree, storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
}
if (mb->distance_context_map_size == 0) {
- StoreTrivialContextMap(mb->distance_histograms_size,
+ StoreTrivialContextMap(
+ &arena->context_map_arena, mb->distance_histograms_size,
BROTLI_DISTANCE_CONTEXT_BITS, tree, storage_ix, storage);
} else {
- EncodeContextMap(m,
+ EncodeContextMap(m, &arena->context_map_arena,
mb->distance_context_map, mb->distance_context_map_size,
mb->distance_histograms_size, tree, storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
}
- BuildAndStoreEntropyCodesLiteral(m, &literal_enc, mb->literal_histograms,
+ BuildAndStoreEntropyCodesLiteral(m, literal_enc, mb->literal_histograms,
mb->literal_histograms_size, BROTLI_NUM_LITERAL_SYMBOLS, tree,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
- BuildAndStoreEntropyCodesCommand(m, &command_enc, mb->command_histograms,
+ BuildAndStoreEntropyCodesCommand(m, command_enc, mb->command_histograms,
mb->command_histograms_size, BROTLI_NUM_COMMAND_SYMBOLS, tree,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
- BuildAndStoreEntropyCodesDistance(m, &distance_enc, mb->distance_histograms,
+ BuildAndStoreEntropyCodesDistance(m, distance_enc, mb->distance_histograms,
mb->distance_histograms_size, num_distance_symbols, tree,
storage_ix, storage);
if (BROTLI_IS_OOM(m)) return;
@@ -1016,12 +1035,12 @@ void BrotliStoreMetaBlock(MemoryManager* m,
for (i = 0; i < n_commands; ++i) {
const Command cmd = commands[i];
size_t cmd_code = cmd.cmd_prefix_;
- StoreSymbol(&command_enc, cmd_code, storage_ix, storage);
+ StoreSymbol(command_enc, cmd_code, storage_ix, storage);
StoreCommandExtra(&cmd, storage_ix, storage);
if (mb->literal_context_map_size == 0) {
size_t j;
for (j = cmd.insert_len_; j != 0; --j) {
- StoreSymbol(&literal_enc, input[pos & mask], storage_ix, storage);
+ StoreSymbol(literal_enc, input[pos & mask], storage_ix, storage);
++pos;
}
} else {
@@ -1030,7 +1049,7 @@ void BrotliStoreMetaBlock(MemoryManager* m,
size_t context =
BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut);
uint8_t literal = input[pos & mask];
- StoreSymbolWithContext(&literal_enc, literal, context,
+ StoreSymbolWithContext(literal_enc, literal, context,
mb->literal_context_map, storage_ix, storage,
BROTLI_LITERAL_CONTEXT_BITS);
prev_byte2 = prev_byte;
@@ -1047,10 +1066,10 @@ void BrotliStoreMetaBlock(MemoryManager* m,
uint32_t distnumextra = cmd.dist_prefix_ >> 10;
uint64_t distextra = cmd.dist_extra_;
if (mb->distance_context_map_size == 0) {
- StoreSymbol(&distance_enc, dist_code, storage_ix, storage);
+ StoreSymbol(distance_enc, dist_code, storage_ix, storage);
} else {
size_t context = CommandDistanceContext(&cmd);
- StoreSymbolWithContext(&distance_enc, dist_code, context,
+ StoreSymbolWithContext(distance_enc, dist_code, context,
mb->distance_context_map, storage_ix, storage,
BROTLI_DISTANCE_CONTEXT_BITS);
}
@@ -1058,9 +1077,10 @@ void BrotliStoreMetaBlock(MemoryManager* m,
}
}
}
- CleanupBlockEncoder(m, &distance_enc);
- CleanupBlockEncoder(m, &command_enc);
- CleanupBlockEncoder(m, &literal_enc);
+ CleanupBlockEncoder(m, distance_enc);
+ CleanupBlockEncoder(m, command_enc);
+ CleanupBlockEncoder(m, literal_enc);
+ BROTLI_FREE(m, arena);
if (is_last) {
JumpToByteBoundary(storage_ix, storage);
}
@@ -1131,54 +1151,60 @@ static void StoreDataWithHuffmanCodes(const uint8_t* input,
}
}
-void BrotliStoreMetaBlockTrivial(MemoryManager* m,
- const uint8_t* input, size_t start_pos, size_t length, size_t mask,
- BROTLI_BOOL is_last, const BrotliEncoderParams* params,
- const Command* commands, size_t n_commands,
- size_t* storage_ix, uint8_t* storage) {
+/* TODO(eustas): pull alloc/dealloc to caller? */
+typedef struct MetablockArena {
HistogramLiteral lit_histo;
HistogramCommand cmd_histo;
HistogramDistance dist_histo;
+ /* TODO(eustas): merge bits and depth? */
uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS];
uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS];
uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS];
uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS];
uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
- HuffmanTree* tree;
+ HuffmanTree tree[MAX_HUFFMAN_TREE_SIZE];
+} MetablockArena;
+
+void BrotliStoreMetaBlockTrivial(MemoryManager* m,
+ const uint8_t* input, size_t start_pos, size_t length, size_t mask,
+ BROTLI_BOOL is_last, const BrotliEncoderParams* params,
+ const Command* commands, size_t n_commands,
+ size_t* storage_ix, uint8_t* storage) {
+ MetablockArena* arena = BROTLI_ALLOC(m, MetablockArena, 1);
uint32_t num_distance_symbols = params->dist.alphabet_size_max;
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return;
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
- HistogramClearLiteral(&lit_histo);
- HistogramClearCommand(&cmd_histo);
- HistogramClearDistance(&dist_histo);
+ HistogramClearLiteral(&arena->lit_histo);
+ HistogramClearCommand(&arena->cmd_histo);
+ HistogramClearDistance(&arena->dist_histo);
BuildHistograms(input, start_pos, mask, commands, n_commands,
- &lit_histo, &cmd_histo, &dist_histo);
+ &arena->lit_histo, &arena->cmd_histo, &arena->dist_histo);
BrotliWriteBits(13, 0, storage_ix, storage);
- tree = BROTLI_ALLOC(m, HuffmanTree, MAX_HUFFMAN_TREE_SIZE);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tree)) return;
- BuildAndStoreHuffmanTree(lit_histo.data_, BROTLI_NUM_LITERAL_SYMBOLS,
- BROTLI_NUM_LITERAL_SYMBOLS, tree,
- lit_depth, lit_bits,
+ BuildAndStoreHuffmanTree(arena->lit_histo.data_, BROTLI_NUM_LITERAL_SYMBOLS,
+ BROTLI_NUM_LITERAL_SYMBOLS, arena->tree,
+ arena->lit_depth, arena->lit_bits,
storage_ix, storage);
- BuildAndStoreHuffmanTree(cmd_histo.data_, BROTLI_NUM_COMMAND_SYMBOLS,
- BROTLI_NUM_COMMAND_SYMBOLS, tree,
- cmd_depth, cmd_bits,
+ BuildAndStoreHuffmanTree(arena->cmd_histo.data_, BROTLI_NUM_COMMAND_SYMBOLS,
+ BROTLI_NUM_COMMAND_SYMBOLS, arena->tree,
+ arena->cmd_depth, arena->cmd_bits,
storage_ix, storage);
- BuildAndStoreHuffmanTree(dist_histo.data_, MAX_SIMPLE_DISTANCE_ALPHABET_SIZE,
- num_distance_symbols, tree,
- dist_depth, dist_bits,
+ BuildAndStoreHuffmanTree(arena->dist_histo.data_,
+ MAX_SIMPLE_DISTANCE_ALPHABET_SIZE,
+ num_distance_symbols, arena->tree,
+ arena->dist_depth, arena->dist_bits,
storage_ix, storage);
- BROTLI_FREE(m, tree);
StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
- n_commands, lit_depth, lit_bits,
- cmd_depth, cmd_bits,
- dist_depth, dist_bits,
+ n_commands, arena->lit_depth, arena->lit_bits,
+ arena->cmd_depth, arena->cmd_bits,
+ arena->dist_depth, arena->dist_bits,
storage_ix, storage);
+ BROTLI_FREE(m, arena);
if (is_last) {
JumpToByteBoundary(storage_ix, storage);
}
@@ -1189,9 +1215,11 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
BROTLI_BOOL is_last, const BrotliEncoderParams* params,
const Command* commands, size_t n_commands,
size_t* storage_ix, uint8_t* storage) {
+ MetablockArena* arena = BROTLI_ALLOC(m, MetablockArena, 1);
uint32_t num_distance_symbols = params->dist.alphabet_size_max;
uint32_t distance_alphabet_bits =
Log2FloorNonZero(num_distance_symbols - 1) + 1;
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return;
StoreCompressedMetaBlockHeader(is_last, length, storage_ix, storage);
@@ -1202,8 +1230,6 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
size_t pos = start_pos;
size_t num_literals = 0;
size_t i;
- uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS];
- uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS];
for (i = 0; i < n_commands; ++i) {
const Command cmd = commands[i];
size_t j;
@@ -1214,61 +1240,50 @@ void BrotliStoreMetaBlockFast(MemoryManager* m,
num_literals += cmd.insert_len_;
pos += CommandCopyLen(&cmd);
}
- BrotliBuildAndStoreHuffmanTreeFast(m, histogram, num_literals,
+ BrotliBuildAndStoreHuffmanTreeFast(arena->tree, histogram, num_literals,
/* max_bits = */ 8,
- lit_depth, lit_bits,
+ arena->lit_depth, arena->lit_bits,
storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
StoreStaticCommandHuffmanTree(storage_ix, storage);
StoreStaticDistanceHuffmanTree(storage_ix, storage);
StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
- n_commands, lit_depth, lit_bits,
+ n_commands, arena->lit_depth, arena->lit_bits,
kStaticCommandCodeDepth,
kStaticCommandCodeBits,
kStaticDistanceCodeDepth,
kStaticDistanceCodeBits,
storage_ix, storage);
} else {
- HistogramLiteral lit_histo;
- HistogramCommand cmd_histo;
- HistogramDistance dist_histo;
- uint8_t lit_depth[BROTLI_NUM_LITERAL_SYMBOLS];
- uint16_t lit_bits[BROTLI_NUM_LITERAL_SYMBOLS];
- uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS];
- uint16_t cmd_bits[BROTLI_NUM_COMMAND_SYMBOLS];
- uint8_t dist_depth[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
- uint16_t dist_bits[MAX_SIMPLE_DISTANCE_ALPHABET_SIZE];
- HistogramClearLiteral(&lit_histo);
- HistogramClearCommand(&cmd_histo);
- HistogramClearDistance(&dist_histo);
+ HistogramClearLiteral(&arena->lit_histo);
+ HistogramClearCommand(&arena->cmd_histo);
+ HistogramClearDistance(&arena->dist_histo);
BuildHistograms(input, start_pos, mask, commands, n_commands,
- &lit_histo, &cmd_histo, &dist_histo);
- BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo.data_,
- lit_histo.total_count_,
+ &arena->lit_histo, &arena->cmd_histo, &arena->dist_histo);
+ BrotliBuildAndStoreHuffmanTreeFast(arena->tree, arena->lit_histo.data_,
+ arena->lit_histo.total_count_,
/* max_bits = */ 8,
- lit_depth, lit_bits,
+ arena->lit_depth, arena->lit_bits,
storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
- BrotliBuildAndStoreHuffmanTreeFast(m, cmd_histo.data_,
- cmd_histo.total_count_,
+ BrotliBuildAndStoreHuffmanTreeFast(arena->tree, arena->cmd_histo.data_,
+ arena->cmd_histo.total_count_,
/* max_bits = */ 10,
- cmd_depth, cmd_bits,
+ arena->cmd_depth, arena->cmd_bits,
storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
- BrotliBuildAndStoreHuffmanTreeFast(m, dist_histo.data_,
- dist_histo.total_count_,
+ BrotliBuildAndStoreHuffmanTreeFast(arena->tree, arena->dist_histo.data_,
+ arena->dist_histo.total_count_,
/* max_bits = */
distance_alphabet_bits,
- dist_depth, dist_bits,
+ arena->dist_depth, arena->dist_bits,
storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
StoreDataWithHuffmanCodes(input, start_pos, mask, commands,
- n_commands, lit_depth, lit_bits,
- cmd_depth, cmd_bits,
- dist_depth, dist_bits,
+ n_commands, arena->lit_depth, arena->lit_bits,
+ arena->cmd_depth, arena->cmd_bits,
+ arena->dist_depth, arena->dist_bits,
storage_ix, storage);
}
+ BROTLI_FREE(m, arena);
+
if (is_last) {
JumpToByteBoundary(storage_ix, storage);
}
@@ -1309,6 +1324,13 @@ void BrotliStoreUncompressedMetaBlock(BROTLI_BOOL is_final_block,
}
}
+#if defined(BROTLI_TEST)
+void GetBlockLengthPrefixCodeForTest(uint32_t len, size_t* code,
+ uint32_t* n_extra, uint32_t* extra) {
+ GetBlockLengthPrefixCode(len, code, n_extra, extra);
+}
+#endif
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h b/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h
index 2ed703bf79..a289509af3 100644
--- a/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h
+++ b/dviware/dvisvgm/libs/brotli/enc/brotli_bit_stream.h
@@ -16,13 +16,14 @@
#ifndef BROTLI_ENC_BROTLI_BIT_STREAM_H_
#define BROTLI_ENC_BROTLI_BIT_STREAM_H_
+#include <brotli/types.h>
+
#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./command.h"
-#include "./entropy_encode.h"
-#include "./memory.h"
-#include "./metablock.h"
+#include "command.h"
+#include "entropy_encode.h"
+#include "memory.h"
+#include "metablock.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -35,7 +36,7 @@ BROTLI_INTERNAL void BrotliStoreHuffmanTree(const uint8_t* depths, size_t num,
HuffmanTree* tree, size_t* storage_ix, uint8_t* storage);
BROTLI_INTERNAL void BrotliBuildAndStoreHuffmanTreeFast(
- MemoryManager* m, const uint32_t* histogram, const size_t histogram_total,
+ HuffmanTree* tree, const uint32_t* histogram, const size_t histogram_total,
const size_t max_bits, uint8_t* depth, uint16_t* bits, size_t* storage_ix,
uint8_t* storage);
@@ -77,6 +78,10 @@ BROTLI_INTERNAL void BrotliStoreUncompressedMetaBlock(
size_t position, size_t mask, size_t len,
size_t* BROTLI_RESTRICT storage_ix, uint8_t* BROTLI_RESTRICT storage);
+#if defined(BROTLI_TEST)
+void GetBlockLengthPrefixCodeForTest(uint32_t, size_t*, uint32_t*, uint32_t*);
+#endif
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/cluster.c b/dviware/dvisvgm/libs/brotli/enc/cluster.c
index a20dfd385f..b0faf8114c 100644
--- a/dviware/dvisvgm/libs/brotli/enc/cluster.c
+++ b/dviware/dvisvgm/libs/brotli/enc/cluster.c
@@ -6,14 +6,15 @@
/* Functions for clustering similar histograms together. */
-#include "./cluster.h"
+#include "cluster.h"
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./bit_cost.h" /* BrotliPopulationCost */
-#include "./fast_log.h"
-#include "./histogram.h"
-#include "./memory.h"
+
+#include "../common/platform.h"
+#include "bit_cost.h" /* BrotliPopulationCost */
+#include "fast_log.h"
+#include "histogram.h"
+#include "memory.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -38,15 +39,15 @@ static BROTLI_INLINE double ClusterCostDiff(size_t size_a, size_t size_b) {
#define CODE(X) X
#define FN(X) X ## Literal
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Command
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Distance
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#undef CODE
diff --git a/dviware/dvisvgm/libs/brotli/enc/cluster.h b/dviware/dvisvgm/libs/brotli/enc/cluster.h
index bb26124d24..013629c6d9 100644
--- a/dviware/dvisvgm/libs/brotli/enc/cluster.h
+++ b/dviware/dvisvgm/libs/brotli/enc/cluster.h
@@ -9,10 +9,11 @@
#ifndef BROTLI_ENC_CLUSTER_H_
#define BROTLI_ENC_CLUSTER_H_
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./histogram.h"
-#include "./memory.h"
+
+#include "../common/platform.h"
+#include "histogram.h"
+#include "memory.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -28,15 +29,15 @@ typedef struct HistogramPair {
#define CODE(X) /* Declaration */;
#define FN(X) X ## Literal
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Command
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Distance
-#include "./cluster_inc.h" /* NOLINT(build/include) */
+#include "cluster_inc.h" /* NOLINT(build/include) */
#undef FN
#undef CODE
diff --git a/dviware/dvisvgm/libs/brotli/enc/cluster_inc.h b/dviware/dvisvgm/libs/brotli/enc/cluster_inc.h
index 3d4f40e601..d6215ef06e 100644
--- a/dviware/dvisvgm/libs/brotli/enc/cluster_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/cluster_inc.h
@@ -12,8 +12,8 @@
/* Computes the bit cost reduction by combining out[idx1] and out[idx2] and if
it is below a threshold, stores the pair (idx1, idx2) in the *pairs queue. */
BROTLI_INTERNAL void FN(BrotliCompareAndPushToQueue)(
- const HistogramType* out, const uint32_t* cluster_size, uint32_t idx1,
- uint32_t idx2, size_t max_num_pairs, HistogramPair* pairs,
+ const HistogramType* out, HistogramType* tmp, const uint32_t* cluster_size,
+ uint32_t idx1, uint32_t idx2, size_t max_num_pairs, HistogramPair* pairs,
size_t* num_pairs) CODE({
BROTLI_BOOL is_good_pair = BROTLI_FALSE;
HistogramPair p;
@@ -42,10 +42,10 @@ BROTLI_INTERNAL void FN(BrotliCompareAndPushToQueue)(
} else {
double threshold = *num_pairs == 0 ? 1e99 :
BROTLI_MAX(double, 0.0, pairs[0].cost_diff);
- HistogramType combo = out[idx1];
double cost_combo;
- FN(HistogramAddHistogram)(&combo, &out[idx2]);
- cost_combo = FN(BrotliPopulationCost)(&combo);
+ *tmp = out[idx1];
+ FN(HistogramAddHistogram)(tmp, &out[idx2]);
+ cost_combo = FN(BrotliPopulationCost)(tmp);
if (cost_combo < threshold - p.cost_diff) {
p.cost_combo = cost_combo;
is_good_pair = BROTLI_TRUE;
@@ -68,6 +68,7 @@ BROTLI_INTERNAL void FN(BrotliCompareAndPushToQueue)(
})
BROTLI_INTERNAL size_t FN(BrotliHistogramCombine)(HistogramType* out,
+ HistogramType* tmp,
uint32_t* cluster_size,
uint32_t* symbols,
uint32_t* clusters,
@@ -87,7 +88,7 @@ BROTLI_INTERNAL size_t FN(BrotliHistogramCombine)(HistogramType* out,
for (idx1 = 0; idx1 < num_clusters; ++idx1) {
size_t idx2;
for (idx2 = idx1 + 1; idx2 < num_clusters; ++idx2) {
- FN(BrotliCompareAndPushToQueue)(out, cluster_size, clusters[idx1],
+ FN(BrotliCompareAndPushToQueue)(out, tmp, cluster_size, clusters[idx1],
clusters[idx2], max_num_pairs, &pairs[0], &num_pairs);
}
}
@@ -146,8 +147,8 @@ BROTLI_INTERNAL size_t FN(BrotliHistogramCombine)(HistogramType* out,
/* Push new pairs formed with the combined histogram to the heap. */
for (i = 0; i < num_clusters; ++i) {
- FN(BrotliCompareAndPushToQueue)(out, cluster_size, best_idx1, clusters[i],
- max_num_pairs, &pairs[0], &num_pairs);
+ FN(BrotliCompareAndPushToQueue)(out, tmp, cluster_size, best_idx1,
+ clusters[i], max_num_pairs, &pairs[0], &num_pairs);
}
}
return num_clusters;
@@ -155,13 +156,14 @@ BROTLI_INTERNAL size_t FN(BrotliHistogramCombine)(HistogramType* out,
/* What is the bit cost of moving histogram from cur_symbol to candidate. */
BROTLI_INTERNAL double FN(BrotliHistogramBitCostDistance)(
- const HistogramType* histogram, const HistogramType* candidate) CODE({
+ const HistogramType* histogram, const HistogramType* candidate,
+ HistogramType* tmp) CODE({
if (histogram->total_count_ == 0) {
return 0.0;
} else {
- HistogramType tmp = *histogram;
- FN(HistogramAddHistogram)(&tmp, candidate);
- return FN(BrotliPopulationCost)(&tmp) - candidate->bit_cost_;
+ *tmp = *histogram;
+ FN(HistogramAddHistogram)(tmp, candidate);
+ return FN(BrotliPopulationCost)(tmp) - candidate->bit_cost_;
}
})
@@ -171,16 +173,16 @@ BROTLI_INTERNAL double FN(BrotliHistogramBitCostDistance)(
Note: we assume that out[]->bit_cost_ is already up-to-date. */
BROTLI_INTERNAL void FN(BrotliHistogramRemap)(const HistogramType* in,
size_t in_size, const uint32_t* clusters, size_t num_clusters,
- HistogramType* out, uint32_t* symbols) CODE({
+ HistogramType* out, HistogramType* tmp, uint32_t* symbols) CODE({
size_t i;
for (i = 0; i < in_size; ++i) {
uint32_t best_out = i == 0 ? symbols[0] : symbols[i - 1];
double best_bits =
- FN(BrotliHistogramBitCostDistance)(&in[i], &out[best_out]);
+ FN(BrotliHistogramBitCostDistance)(&in[i], &out[best_out], tmp);
size_t j;
for (j = 0; j < num_clusters; ++j) {
const double cur_bits =
- FN(BrotliHistogramBitCostDistance)(&in[i], &out[clusters[j]]);
+ FN(BrotliHistogramBitCostDistance)(&in[i], &out[clusters[j]], tmp);
if (cur_bits < best_bits) {
best_bits = cur_bits;
best_out = clusters[j];
@@ -226,7 +228,7 @@ BROTLI_INTERNAL size_t FN(BrotliHistogramReindex)(MemoryManager* m,
++next_index;
}
}
- /* TODO: by using idea of "cycle-sort" we can avoid allocation of
+ /* TODO(eustas): by using idea of "cycle-sort" we can avoid allocation of
tmp and reduce the number of copying by the factor of 2. */
tmp = BROTLI_ALLOC(m, HistogramType, next_index);
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tmp)) return 0;
@@ -257,10 +259,12 @@ BROTLI_INTERNAL void FN(BrotliClusterHistograms)(
size_t pairs_capacity = max_input_histograms * max_input_histograms / 2;
/* For the first pass of clustering, we allow all pairs. */
HistogramPair* pairs = BROTLI_ALLOC(m, HistogramPair, pairs_capacity + 1);
+ /* TODO(eustas): move to "persistent" arena? */
+ HistogramType* tmp = BROTLI_ALLOC(m, HistogramType, 1);
size_t i;
if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(cluster_size) ||
- BROTLI_IS_NULL(clusters) || BROTLI_IS_NULL(pairs)) {
+ BROTLI_IS_NULL(clusters) || BROTLI_IS_NULL(pairs)|| BROTLI_IS_NULL(tmp)) {
return;
}
@@ -283,7 +287,7 @@ BROTLI_INTERNAL void FN(BrotliClusterHistograms)(
clusters[num_clusters + j] = (uint32_t)(i + j);
}
num_new_clusters =
- FN(BrotliHistogramCombine)(out, cluster_size,
+ FN(BrotliHistogramCombine)(out, tmp, cluster_size,
&histogram_symbols[i],
&clusters[num_clusters], pairs,
num_to_combine, num_to_combine,
@@ -301,7 +305,7 @@ BROTLI_INTERNAL void FN(BrotliClusterHistograms)(
if (BROTLI_IS_OOM(m)) return;
/* Collapse similar histograms. */
- num_clusters = FN(BrotliHistogramCombine)(out, cluster_size,
+ num_clusters = FN(BrotliHistogramCombine)(out, tmp, cluster_size,
histogram_symbols, clusters,
pairs, num_clusters, in_size,
max_histograms, max_num_pairs);
@@ -310,7 +314,8 @@ BROTLI_INTERNAL void FN(BrotliClusterHistograms)(
BROTLI_FREE(m, cluster_size);
/* Find the optimal map from original histograms to the final ones. */
FN(BrotliHistogramRemap)(in, in_size, clusters, num_clusters,
- out, histogram_symbols);
+ out, tmp, histogram_symbols);
+ BROTLI_FREE(m, tmp);
BROTLI_FREE(m, clusters);
/* Convert the context map to a canonical form. */
*out_size = FN(BrotliHistogramReindex)(m, out, histogram_symbols, in_size);
diff --git a/dviware/dvisvgm/libs/brotli/enc/command.c b/dviware/dvisvgm/libs/brotli/enc/command.c
index 5e6c249196..bf80561bca 100644
--- a/dviware/dvisvgm/libs/brotli/enc/command.c
+++ b/dviware/dvisvgm/libs/brotli/enc/command.c
@@ -4,7 +4,7 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./command.h"
+#include "command.h"
#include <brotli/types.h>
diff --git a/dviware/dvisvgm/libs/brotli/enc/command.h b/dviware/dvisvgm/libs/brotli/enc/command.h
index d84e373d00..ba4de7eab3 100644
--- a/dviware/dvisvgm/libs/brotli/enc/command.h
+++ b/dviware/dvisvgm/libs/brotli/enc/command.h
@@ -9,12 +9,13 @@
#ifndef BROTLI_ENC_COMMAND_H_
#define BROTLI_ENC_COMMAND_H_
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./fast_log.h"
-#include "./params.h"
-#include "./prefix.h"
+#include "fast_log.h"
+#include "params.h"
+#include "prefix.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.c b/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.c
new file mode 100644
index 0000000000..a3b5e6933d
--- /dev/null
+++ b/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.c
@@ -0,0 +1,207 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#include "compound_dictionary.h"
+
+#include <brotli/types.h>
+
+#include "../common/platform.h"
+#include "memory.h"
+#include "quality.h"
+
+static PreparedDictionary* CreatePreparedDictionaryWithParams(MemoryManager* m,
+ const uint8_t* source, size_t source_size, uint32_t bucket_bits,
+ uint32_t slot_bits, uint32_t hash_bits, uint16_t bucket_limit) {
+ /* Step 1: create "bloated" hasher. */
+ uint32_t num_slots = 1u << slot_bits;
+ uint32_t num_buckets = 1u << bucket_bits;
+ uint32_t hash_shift = 64u - bucket_bits;
+ uint64_t hash_mask = (~((uint64_t)0U)) >> (64 - hash_bits);
+ uint32_t slot_mask = num_slots - 1;
+ size_t alloc_size = (sizeof(uint32_t) << slot_bits) +
+ (sizeof(uint32_t) << slot_bits) +
+ (sizeof(uint16_t) << bucket_bits) +
+ (sizeof(uint32_t) << bucket_bits) +
+ (sizeof(uint32_t) * source_size);
+ uint8_t* flat = NULL;
+ PreparedDictionary* result = NULL;
+ uint16_t* num = NULL;
+ uint32_t* bucket_heads = NULL;
+ uint32_t* next_bucket = NULL;
+ uint32_t* slot_offsets = NULL;
+ uint16_t* heads = NULL;
+ uint32_t* items = NULL;
+ uint8_t** source_ref = NULL;
+ uint32_t i;
+ uint32_t* slot_size = NULL;
+ uint32_t* slot_limit = NULL;
+ uint32_t total_items = 0;
+ if (slot_bits > 16) return NULL;
+ if (slot_bits > bucket_bits) return NULL;
+ if (bucket_bits - slot_bits >= 16) return NULL;
+
+ flat = BROTLI_ALLOC(m, uint8_t, alloc_size);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(flat)) return NULL;
+
+ slot_size = (uint32_t*)flat;
+ slot_limit = (uint32_t*)(&slot_size[num_slots]);
+ num = (uint16_t*)(&slot_limit[num_slots]);
+ bucket_heads = (uint32_t*)(&num[num_buckets]);
+ next_bucket = (uint32_t*)(&bucket_heads[num_buckets]);
+ memset(num, 0, num_buckets * sizeof(num[0]));
+
+ /* TODO(eustas): apply custom "store" order. */
+ for (i = 0; i + 7 < source_size; ++i) {
+ const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(&source[i]) & hash_mask) *
+ kPreparedDictionaryHashMul64Long;
+ const uint32_t key = (uint32_t)(h >> hash_shift);
+ uint16_t count = num[key];
+ next_bucket[i] = (count == 0) ? ((uint32_t)(-1)) : bucket_heads[key];
+ bucket_heads[key] = i;
+ count++;
+ if (count > bucket_limit) count = bucket_limit;
+ num[key] = count;
+ }
+
+ /* Step 2: find slot limits. */
+ for (i = 0; i < num_slots; ++i) {
+ BROTLI_BOOL overflow = BROTLI_FALSE;
+ slot_limit[i] = bucket_limit;
+ while (BROTLI_TRUE) {
+ uint32_t limit = slot_limit[i];
+ size_t j;
+ uint32_t count = 0;
+ overflow = BROTLI_FALSE;
+ for (j = i; j < num_buckets; j += num_slots) {
+ uint32_t size = num[j];
+ /* Last chain may span behind 64K limit; overflow happens only if
+ we are about to use 0xFFFF+ as item offset. */
+ if (count >= 0xFFFF) {
+ overflow = BROTLI_TRUE;
+ break;
+ }
+ if (size > limit) size = limit;
+ count += size;
+ }
+ if (!overflow) {
+ slot_size[i] = count;
+ total_items += count;
+ break;
+ }
+ slot_limit[i]--;
+ }
+ }
+
+ /* Step 3: transfer data to "slim" hasher. */
+ alloc_size = sizeof(PreparedDictionary) + (sizeof(uint32_t) << slot_bits) +
+ (sizeof(uint16_t) << bucket_bits) + (sizeof(uint32_t) * total_items) +
+ sizeof(uint8_t*);
+
+ result = (PreparedDictionary*)BROTLI_ALLOC(m, uint8_t, alloc_size);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(result)) {
+ BROTLI_FREE(m, flat);
+ return NULL;
+ }
+ slot_offsets = (uint32_t*)(&result[1]);
+ heads = (uint16_t*)(&slot_offsets[num_slots]);
+ items = (uint32_t*)(&heads[num_buckets]);
+ source_ref = (uint8_t**)(&items[total_items]);
+
+ result->magic = kLeanPreparedDictionaryMagic;
+ result->num_items = total_items;
+ result->source_size = (uint32_t)source_size;
+ result->hash_bits = hash_bits;
+ result->bucket_bits = bucket_bits;
+ result->slot_bits = slot_bits;
+ BROTLI_UNALIGNED_STORE_PTR(source_ref, source);
+
+ total_items = 0;
+ for (i = 0; i < num_slots; ++i) {
+ slot_offsets[i] = total_items;
+ total_items += slot_size[i];
+ slot_size[i] = 0;
+ }
+ for (i = 0; i < num_buckets; ++i) {
+ uint32_t slot = i & slot_mask;
+ uint32_t count = num[i];
+ uint32_t pos;
+ size_t j;
+ size_t cursor = slot_size[slot];
+ if (count > slot_limit[slot]) count = slot_limit[slot];
+ if (count == 0) {
+ heads[i] = 0xFFFF;
+ continue;
+ }
+ heads[i] = (uint16_t)cursor;
+ cursor += slot_offsets[slot];
+ slot_size[slot] += count;
+ pos = bucket_heads[i];
+ for (j = 0; j < count; j++) {
+ items[cursor++] = pos;
+ pos = next_bucket[pos];
+ }
+ items[cursor - 1] |= 0x80000000;
+ }
+
+ BROTLI_FREE(m, flat);
+ return result;
+}
+
+PreparedDictionary* CreatePreparedDictionary(MemoryManager* m,
+ const uint8_t* source, size_t source_size) {
+ uint32_t bucket_bits = 17;
+ uint32_t slot_bits = 7;
+ uint32_t hash_bits = 40;
+ uint16_t bucket_limit = 32;
+ size_t volume = 16u << bucket_bits;
+ /* Tune parameters to fit dictionary size. */
+ while (volume < source_size && bucket_bits < 22) {
+ bucket_bits++;
+ slot_bits++;
+ volume <<= 1;
+ }
+ return CreatePreparedDictionaryWithParams(m,
+ source, source_size, bucket_bits, slot_bits, hash_bits, bucket_limit);
+}
+
+void DestroyPreparedDictionary(MemoryManager* m,
+ PreparedDictionary* dictionary) {
+ if (!dictionary) return;
+ BROTLI_FREE(m, dictionary);
+}
+
+BROTLI_BOOL AttachPreparedDictionary(
+ CompoundDictionary* compound, const PreparedDictionary* dictionary) {
+ size_t length = 0;
+ size_t index = 0;
+
+ if (compound->num_chunks == SHARED_BROTLI_MAX_COMPOUND_DICTS) {
+ return BROTLI_FALSE;
+ }
+
+ if (!dictionary) return BROTLI_FALSE;
+
+ length = dictionary->source_size;
+ index = compound->num_chunks;
+ compound->total_size += length;
+ compound->chunks[index] = dictionary;
+ compound->chunk_offsets[index + 1] = compound->total_size;
+ {
+ uint32_t* slot_offsets = (uint32_t*)(&dictionary[1]);
+ uint16_t* heads = (uint16_t*)(&slot_offsets[1u << dictionary->slot_bits]);
+ uint32_t* items = (uint32_t*)(&heads[1u << dictionary->bucket_bits]);
+ const void* tail = (void*)&items[dictionary->num_items];
+ if (dictionary->magic == kPreparedDictionaryMagic) {
+ compound->chunk_source[index] = (const uint8_t*)tail;
+ } else {
+ /* dictionary->magic == kLeanPreparedDictionaryMagic */
+ compound->chunk_source[index] =
+ (const uint8_t*)BROTLI_UNALIGNED_LOAD_PTR((const uint8_t**)tail);
+ }
+ }
+ compound->num_chunks++;
+ return BROTLI_TRUE;
+}
diff --git a/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.h b/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.h
new file mode 100644
index 0000000000..9c531d5b19
--- /dev/null
+++ b/dviware/dvisvgm/libs/brotli/enc/compound_dictionary.h
@@ -0,0 +1,74 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+#ifndef BROTLI_ENC_PREPARED_DICTIONARY_H_
+#define BROTLI_ENC_PREPARED_DICTIONARY_H_
+
+#include <brotli/shared_dictionary.h>
+#include <brotli/types.h>
+
+#include "../common/platform.h"
+#include "../common/constants.h"
+#include "memory.h"
+
+/* "Fat" prepared dictionary, could be cooked outside of C implementation,
+ * e.g. on Java side. LZ77 data is copied inside PreparedDictionary struct. */
+static const uint32_t kPreparedDictionaryMagic = 0xDEBCEDE0;
+
+static const uint32_t kSharedDictionaryMagic = 0xDEBCEDE1;
+
+static const uint32_t kManagedDictionaryMagic = 0xDEBCEDE2;
+
+/* "Lean" prepared dictionary. LZ77 data is referenced. It is the responsibility
+ * of caller of "prepare dictionary" to keep the LZ77 data while prepared
+ * dictionary is in use. */
+static const uint32_t kLeanPreparedDictionaryMagic = 0xDEBCEDE3;
+
+static const uint64_t kPreparedDictionaryHashMul64Long =
+ BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u);
+
+typedef struct PreparedDictionary {
+ uint32_t magic;
+ uint32_t num_items;
+ uint32_t source_size;
+ uint32_t hash_bits;
+ uint32_t bucket_bits;
+ uint32_t slot_bits;
+
+ /* --- Dynamic size members --- */
+
+ /* uint32_t slot_offsets[1 << slot_bits]; */
+ /* uint16_t heads[1 << bucket_bits]; */
+ /* uint32_t items[variable]; */
+
+ /* [maybe] uint8_t* source_ref, depending on magic. */
+ /* [maybe] uint8_t source[source_size], depending on magic. */
+} PreparedDictionary;
+
+BROTLI_INTERNAL PreparedDictionary* CreatePreparedDictionary(MemoryManager* m,
+ const uint8_t* source, size_t source_size);
+
+BROTLI_INTERNAL void DestroyPreparedDictionary(MemoryManager* m,
+ PreparedDictionary* dictionary);
+
+typedef struct CompoundDictionary {
+ /* LZ77 prefix, compound dictionary */
+ size_t num_chunks;
+ size_t total_size;
+ /* Client instances. */
+ const PreparedDictionary* chunks[SHARED_BROTLI_MAX_COMPOUND_DICTS + 1];
+ const uint8_t* chunk_source[SHARED_BROTLI_MAX_COMPOUND_DICTS + 1];
+ size_t chunk_offsets[SHARED_BROTLI_MAX_COMPOUND_DICTS + 1];
+
+ size_t num_prepared_instances_;
+ /* Owned instances. */
+ PreparedDictionary* prepared_instances_[SHARED_BROTLI_MAX_COMPOUND_DICTS + 1];
+} CompoundDictionary;
+
+BROTLI_INTERNAL BROTLI_BOOL AttachPreparedDictionary(
+ CompoundDictionary* compound, const PreparedDictionary* dictionary);
+
+#endif /* BROTLI_ENC_PREPARED_DICTIONARY */
diff --git a/dviware/dvisvgm/libs/brotli/enc/compress_fragment.c b/dviware/dvisvgm/libs/brotli/enc/compress_fragment.c
index 9e50b2098a..13890eabf6 100644
--- a/dviware/dvisvgm/libs/brotli/enc/compress_fragment.c
+++ b/dviware/dvisvgm/libs/brotli/enc/compress_fragment.c
@@ -12,19 +12,18 @@
Adapted from the CompressFragment() function in
https://github.com/google/snappy/blob/master/snappy.cc */
-#include "./compress_fragment.h"
+#include "compress_fragment.h"
#include <string.h> /* memcmp, memcpy, memset */
-#include "../common/constants.h"
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./brotli_bit_stream.h"
-#include "./entropy_encode.h"
-#include "./fast_log.h"
-#include "./find_match_length.h"
-#include "./memory.h"
-#include "./write_bits.h"
+
+#include "../common/platform.h"
+#include "brotli_bit_stream.h"
+#include "entropy_encode.h"
+#include "fast_log.h"
+#include "find_match_length.h"
+#include "write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -69,16 +68,18 @@ static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2) {
and thus have to assign a non-zero depth for each literal.
Returns estimated compression ratio millibytes/char for encoding given input
with generated code. */
-static size_t BuildAndStoreLiteralPrefixCode(MemoryManager* m,
+static size_t BuildAndStoreLiteralPrefixCode(BrotliOnePassArena* s,
const uint8_t* input,
const size_t input_size,
uint8_t depths[256],
uint16_t bits[256],
size_t* storage_ix,
uint8_t* storage) {
- uint32_t histogram[256] = { 0 };
+ uint32_t* BROTLI_RESTRICT const histogram = s->histogram;
size_t histogram_total;
size_t i;
+ memset(histogram, 0, sizeof(s->histogram));
+
if (input_size < (1 << 15)) {
for (i = 0; i < input_size; ++i) {
++histogram[input[i]];
@@ -108,10 +109,9 @@ static size_t BuildAndStoreLiteralPrefixCode(MemoryManager* m,
histogram_total += adjust;
}
}
- BrotliBuildAndStoreHuffmanTreeFast(m, histogram, histogram_total,
+ BrotliBuildAndStoreHuffmanTreeFast(s->tree, histogram, histogram_total,
/* max_bits = */ 8,
depths, bits, storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return 0;
{
size_t literal_ratio = 0;
for (i = 0; i < 256; ++i) {
@@ -124,53 +124,56 @@ static size_t BuildAndStoreLiteralPrefixCode(MemoryManager* m,
/* Builds a command and distance prefix code (each 64 symbols) into "depth" and
"bits" based on "histogram" and stores it into the bit stream. */
-static void BuildAndStoreCommandPrefixCode(const uint32_t histogram[128],
- uint8_t depth[128], uint16_t bits[128], size_t* storage_ix,
- uint8_t* storage) {
- /* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */
- HuffmanTree tree[129];
- uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0 };
- uint16_t cmd_bits[64];
-
- BrotliCreateHuffmanTree(histogram, 64, 15, tree, depth);
- BrotliCreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]);
+static void BuildAndStoreCommandPrefixCode(BrotliOnePassArena* s,
+ size_t* storage_ix, uint8_t* storage) {
+ const uint32_t* const histogram = s->cmd_histo;
+ uint8_t* const depth = s->cmd_depth;
+ uint16_t* const bits = s->cmd_bits;
+ uint8_t* BROTLI_RESTRICT const tmp_depth = s->tmp_depth;
+ uint16_t* BROTLI_RESTRICT const tmp_bits = s->tmp_bits;
+ /* TODO(eustas): do only once on initialization. */
+ memset(tmp_depth, 0, BROTLI_NUM_COMMAND_SYMBOLS);
+
+ BrotliCreateHuffmanTree(histogram, 64, 15, s->tree, depth);
+ BrotliCreateHuffmanTree(&histogram[64], 64, 14, s->tree, &depth[64]);
/* We have to jump through a few hoops here in order to compute
the command bits because the symbols are in a different order than in
the full alphabet. This looks complicated, but having the symbols
in this order in the command bits saves a few branches in the Emit*
functions. */
- memcpy(cmd_depth, depth, 24);
- memcpy(cmd_depth + 24, depth + 40, 8);
- memcpy(cmd_depth + 32, depth + 24, 8);
- memcpy(cmd_depth + 40, depth + 48, 8);
- memcpy(cmd_depth + 48, depth + 32, 8);
- memcpy(cmd_depth + 56, depth + 56, 8);
- BrotliConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits);
- memcpy(bits, cmd_bits, 48);
- memcpy(bits + 24, cmd_bits + 32, 16);
- memcpy(bits + 32, cmd_bits + 48, 16);
- memcpy(bits + 40, cmd_bits + 24, 16);
- memcpy(bits + 48, cmd_bits + 40, 16);
- memcpy(bits + 56, cmd_bits + 56, 16);
+ memcpy(tmp_depth, depth, 24);
+ memcpy(tmp_depth + 24, depth + 40, 8);
+ memcpy(tmp_depth + 32, depth + 24, 8);
+ memcpy(tmp_depth + 40, depth + 48, 8);
+ memcpy(tmp_depth + 48, depth + 32, 8);
+ memcpy(tmp_depth + 56, depth + 56, 8);
+ BrotliConvertBitDepthsToSymbols(tmp_depth, 64, tmp_bits);
+ memcpy(bits, tmp_bits, 48);
+ memcpy(bits + 24, tmp_bits + 32, 16);
+ memcpy(bits + 32, tmp_bits + 48, 16);
+ memcpy(bits + 40, tmp_bits + 24, 16);
+ memcpy(bits + 48, tmp_bits + 40, 16);
+ memcpy(bits + 56, tmp_bits + 56, 16);
BrotliConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]);
{
/* Create the bit length array for the full command alphabet. */
size_t i;
- memset(cmd_depth, 0, 64); /* only 64 first values were used */
- memcpy(cmd_depth, depth, 8);
- memcpy(cmd_depth + 64, depth + 8, 8);
- memcpy(cmd_depth + 128, depth + 16, 8);
- memcpy(cmd_depth + 192, depth + 24, 8);
- memcpy(cmd_depth + 384, depth + 32, 8);
+ memset(tmp_depth, 0, 64); /* only 64 first values were used */
+ memcpy(tmp_depth, depth, 8);
+ memcpy(tmp_depth + 64, depth + 8, 8);
+ memcpy(tmp_depth + 128, depth + 16, 8);
+ memcpy(tmp_depth + 192, depth + 24, 8);
+ memcpy(tmp_depth + 384, depth + 32, 8);
for (i = 0; i < 8; ++i) {
- cmd_depth[128 + 8 * i] = depth[40 + i];
- cmd_depth[256 + 8 * i] = depth[48 + i];
- cmd_depth[448 + 8 * i] = depth[56 + i];
+ tmp_depth[128 + 8 * i] = depth[40 + i];
+ tmp_depth[256 + 8 * i] = depth[48 + i];
+ tmp_depth[448 + 8 * i] = depth[56 + i];
}
+ /* TODO(eustas): could/should full-length machinery be avoided? */
BrotliStoreHuffmanTree(
- cmd_depth, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage);
+ tmp_depth, BROTLI_NUM_COMMAND_SYMBOLS, s->tree, storage_ix, storage);
}
- BrotliStoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage);
+ BrotliStoreHuffmanTree(&depth[64], 64, s->tree, storage_ix, storage);
}
/* REQUIRES: insertlen < 6210 */
@@ -369,11 +372,12 @@ static void RewindBitPosition(const size_t new_storage_ix,
*storage_ix = new_storage_ix;
}
-static BROTLI_BOOL ShouldMergeBlock(
+static BROTLI_BOOL ShouldMergeBlock(BrotliOnePassArena* s,
const uint8_t* data, size_t len, const uint8_t* depths) {
- size_t histo[256] = { 0 };
+ uint32_t* BROTLI_RESTRICT const histo = s->histogram;
static const size_t kSampleRate = 43;
size_t i;
+ memset(histo, 0, sizeof(s->histogram));
for (i = 0; i < len; i += kSampleRate) {
++histo[data[i]];
}
@@ -423,11 +427,14 @@ static uint32_t kCmdHistoSeed[128] = {
};
static BROTLI_INLINE void BrotliCompressFragmentFastImpl(
- MemoryManager* m, const uint8_t* input, size_t input_size,
- BROTLI_BOOL is_last, int* table, size_t table_bits, uint8_t cmd_depth[128],
- uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code,
+ BrotliOnePassArena* s, const uint8_t* input, size_t input_size,
+ BROTLI_BOOL is_last, int* table, size_t table_bits,
size_t* storage_ix, uint8_t* storage) {
- uint32_t cmd_histo[128];
+ uint8_t* BROTLI_RESTRICT const cmd_depth = s->cmd_depth;
+ uint16_t* BROTLI_RESTRICT const cmd_bits = s->cmd_bits;
+ uint32_t* BROTLI_RESTRICT const cmd_histo = s->cmd_histo;
+ uint8_t* BROTLI_RESTRICT const lit_depth = s->lit_depth;
+ uint16_t* BROTLI_RESTRICT const lit_bits = s->lit_bits;
const uint8_t* ip_end;
/* "next_emit" is a pointer to the first byte that is not covered by a
@@ -451,9 +458,6 @@ static BROTLI_INLINE void BrotliCompressFragmentFastImpl(
we can update it later if we decide to extend this meta-block. */
size_t mlen_storage_ix = *storage_ix + 3;
- uint8_t lit_depth[256];
- uint16_t lit_bits[256];
-
size_t literal_ratio;
const uint8_t* ip;
@@ -466,25 +470,24 @@ static BROTLI_INLINE void BrotliCompressFragmentFastImpl(
BrotliWriteBits(13, 0, storage_ix, storage);
literal_ratio = BuildAndStoreLiteralPrefixCode(
- m, input, block_size, lit_depth, lit_bits, storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
+ s, input, block_size, s->lit_depth, s->lit_bits, storage_ix, storage);
{
/* Store the pre-compressed command and distance prefix codes. */
size_t i;
- for (i = 0; i + 7 < *cmd_code_numbits; i += 8) {
- BrotliWriteBits(8, cmd_code[i >> 3], storage_ix, storage);
+ for (i = 0; i + 7 < s->cmd_code_numbits; i += 8) {
+ BrotliWriteBits(8, s->cmd_code[i >> 3], storage_ix, storage);
}
}
- BrotliWriteBits(*cmd_code_numbits & 7, cmd_code[*cmd_code_numbits >> 3],
- storage_ix, storage);
+ BrotliWriteBits(s->cmd_code_numbits & 7,
+ s->cmd_code[s->cmd_code_numbits >> 3], storage_ix, storage);
emit_commands:
/* Initialize the command and distance histograms. We will gather
statistics of command and distance codes during the processing
of this block and use it to update the command and distance
prefix codes for the next block. */
- memcpy(cmd_histo, kCmdHistoSeed, sizeof(kCmdHistoSeed));
+ memcpy(s->cmd_histo, kCmdHistoSeed, sizeof(kCmdHistoSeed));
/* "ip" is the input pointer. */
ip = input;
@@ -565,6 +568,8 @@ trawl:
int distance = (int)(base - candidate); /* > 0 */
size_t insert = (size_t)(base - next_emit);
ip += matched;
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %lu copy = %d\n",
+ (int)(next_emit - base_ip), (unsigned long)insert, 2));
BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
if (BROTLI_PREDICT_TRUE(insert < 6210)) {
EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
@@ -593,6 +598,12 @@ trawl:
}
EmitCopyLenLastDistance(matched, cmd_depth, cmd_bits, cmd_histo,
storage_ix, storage);
+ BROTLI_LOG(("[CompressFragment] pos = %d distance = %d\n"
+ "[CompressFragment] pos = %d insert = %d copy = %d\n"
+ "[CompressFragment] pos = %d distance = %d\n",
+ (int)(base - base_ip), (int)distance,
+ (int)(base - base_ip) + 2, 0, (int)matched - 2,
+ (int)(base - base_ip) + 2, (int)distance));
next_emit = ip;
if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -630,6 +641,10 @@ trawl:
storage_ix, storage);
EmitDistance((size_t)last_distance, cmd_depth, cmd_bits,
cmd_histo, storage_ix, storage);
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n"
+ "[CompressFragment] pos = %d distance = %d\n",
+ (int)(base - base_ip), 0, (int)matched,
+ (int)(base - base_ip), (int)last_distance));
next_emit = ip;
if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -667,7 +682,7 @@ trawl:
last insert-only command. */
if (input_size > 0 &&
total_block_size + block_size <= (1 << 20) &&
- ShouldMergeBlock(input, block_size, lit_depth)) {
+ ShouldMergeBlock(s, input, block_size, lit_depth)) {
BROTLI_DCHECK(total_block_size > (1 << 16));
/* Update the size of the current meta-block and continue emitting commands.
We can do this because the current size and the new size both have 5
@@ -680,6 +695,8 @@ trawl:
/* Emit the remaining bytes as literals. */
if (next_emit < ip_end) {
const size_t insert = (size_t)(ip_end - next_emit);
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %lu copy = %d\n",
+ (int)(next_emit - base_ip), (unsigned long)insert, 2));
if (BROTLI_PREDICT_TRUE(insert < 6210)) {
EmitInsertLen(insert, cmd_depth, cmd_bits, cmd_histo,
storage_ix, storage);
@@ -711,20 +728,17 @@ next_block:
/* No block splits, no contexts. */
BrotliWriteBits(13, 0, storage_ix, storage);
literal_ratio = BuildAndStoreLiteralPrefixCode(
- m, input, block_size, lit_depth, lit_bits, storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
- BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits,
- storage_ix, storage);
+ s, input, block_size, lit_depth, lit_bits, storage_ix, storage);
+ BuildAndStoreCommandPrefixCode(s, storage_ix, storage);
goto emit_commands;
}
if (!is_last) {
/* If this is not the last block, update the command and distance prefix
codes for the next block and store the compressed forms. */
- cmd_code[0] = 0;
- *cmd_code_numbits = 0;
- BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depth, cmd_bits,
- cmd_code_numbits, cmd_code);
+ s->cmd_code[0] = 0;
+ s->cmd_code_numbits = 0;
+ BuildAndStoreCommandPrefixCode(s, &s->cmd_code_numbits, s->cmd_code);
}
}
@@ -732,20 +746,17 @@ next_block:
#define BAKE_METHOD_PARAM_(B) \
static BROTLI_NOINLINE void BrotliCompressFragmentFastImpl ## B( \
- MemoryManager* m, const uint8_t* input, size_t input_size, \
- BROTLI_BOOL is_last, int* table, uint8_t cmd_depth[128], \
- uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code, \
- size_t* storage_ix, uint8_t* storage) { \
- BrotliCompressFragmentFastImpl(m, input, input_size, is_last, table, B, \
- cmd_depth, cmd_bits, cmd_code_numbits, cmd_code, storage_ix, storage); \
+ BrotliOnePassArena* s, const uint8_t* input, size_t input_size, \
+ BROTLI_BOOL is_last, int* table, size_t* storage_ix, uint8_t* storage) { \
+ BrotliCompressFragmentFastImpl(s, input, input_size, is_last, table, B, \
+ storage_ix, storage); \
}
FOR_TABLE_BITS_(BAKE_METHOD_PARAM_)
#undef BAKE_METHOD_PARAM_
void BrotliCompressFragmentFast(
- MemoryManager* m, const uint8_t* input, size_t input_size,
- BROTLI_BOOL is_last, int* table, size_t table_size, uint8_t cmd_depth[128],
- uint16_t cmd_bits[128], size_t* cmd_code_numbits, uint8_t* cmd_code,
+ BrotliOnePassArena* s, const uint8_t* input, size_t input_size,
+ BROTLI_BOOL is_last, int* table, size_t table_size,
size_t* storage_ix, uint8_t* storage) {
const size_t initial_storage_ix = *storage_ix;
const size_t table_bits = Log2FloorNonZero(table_size);
@@ -762,8 +773,7 @@ void BrotliCompressFragmentFast(
#define CASE_(B) \
case B: \
BrotliCompressFragmentFastImpl ## B( \
- m, input, input_size, is_last, table, cmd_depth, cmd_bits, \
- cmd_code_numbits, cmd_code, storage_ix, storage); \
+ s, input, input_size, is_last, table, storage_ix, storage);\
break;
FOR_TABLE_BITS_(CASE_)
#undef CASE_
diff --git a/dviware/dvisvgm/libs/brotli/enc/compress_fragment.h b/dviware/dvisvgm/libs/brotli/enc/compress_fragment.h
index 80007f5dca..9c0780f8c9 100644
--- a/dviware/dvisvgm/libs/brotli/enc/compress_fragment.h
+++ b/dviware/dvisvgm/libs/brotli/enc/compress_fragment.h
@@ -12,14 +12,43 @@
#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_H_
#define BROTLI_ENC_COMPRESS_FRAGMENT_H_
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./memory.h"
+
+#include "../common/constants.h"
+#include "../common/platform.h"
+#include "entropy_encode.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
+typedef struct BrotliOnePassArena {
+ uint8_t lit_depth[256];
+ uint16_t lit_bits[256];
+
+ /* Command and distance prefix codes (each 64 symbols, stored back-to-back)
+ used for the next block. The command prefix code is over a smaller alphabet
+ with the following 64 symbols:
+ 0 - 15: insert length code 0, copy length code 0 - 15, same distance
+ 16 - 39: insert length code 0, copy length code 0 - 23
+ 40 - 63: insert length code 0 - 23, copy length code 0
+ Note that symbols 16 and 40 represent the same code in the full alphabet,
+ but we do not use either of them. */
+ uint8_t cmd_depth[128];
+ uint16_t cmd_bits[128];
+ uint32_t cmd_histo[128];
+
+ /* The compressed form of the command and distance prefix codes for the next
+ block. */
+ uint8_t cmd_code[512];
+ size_t cmd_code_numbits;
+
+ HuffmanTree tree[2 * BROTLI_NUM_LITERAL_SYMBOLS + 1];
+ uint32_t histogram[256];
+ uint8_t tmp_depth[BROTLI_NUM_COMMAND_SYMBOLS];
+ uint16_t tmp_bits[64];
+} BrotliOnePassArena;
+
/* Compresses "input" string to the "*storage" buffer as one or more complete
meta-blocks, and updates the "*storage_ix" bit position.
@@ -42,15 +71,11 @@ extern "C" {
REQUIRES: "table_size" is an odd (9, 11, 13, 15) power of two
OUTPUT: maximal copy distance <= |input_size|
OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */
-BROTLI_INTERNAL void BrotliCompressFragmentFast(MemoryManager* m,
+BROTLI_INTERNAL void BrotliCompressFragmentFast(BrotliOnePassArena* s,
const uint8_t* input,
size_t input_size,
BROTLI_BOOL is_last,
int* table, size_t table_size,
- uint8_t cmd_depth[128],
- uint16_t cmd_bits[128],
- size_t* cmd_code_numbits,
- uint8_t* cmd_code,
size_t* storage_ix,
uint8_t* storage);
diff --git a/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c b/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c
index ca68b38139..a762679c1f 100644
--- a/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c
+++ b/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.c
@@ -10,20 +10,20 @@
second pass we emit them into the bit stream using prefix codes built based
on the actual command and literal byte histograms. */
-#include "./compress_fragment_two_pass.h"
+#include "compress_fragment_two_pass.h"
#include <string.h> /* memcmp, memcpy, memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./bit_cost.h"
-#include "./brotli_bit_stream.h"
-#include "./entropy_encode.h"
-#include "./fast_log.h"
-#include "./find_match_length.h"
-#include "./memory.h"
-#include "./write_bits.h"
+#include "bit_cost.h"
+#include "brotli_bit_stream.h"
+#include "entropy_encode.h"
+#include "fast_log.h"
+#include "find_match_length.h"
+#include "write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -66,53 +66,53 @@ static BROTLI_INLINE BROTLI_BOOL IsMatch(const uint8_t* p1, const uint8_t* p2,
/* Builds a command and distance prefix code (each 64 symbols) into "depth" and
"bits" based on "histogram" and stores it into the bit stream. */
-static void BuildAndStoreCommandPrefixCode(
- const uint32_t histogram[128],
- uint8_t depth[128], uint16_t bits[128],
- size_t* storage_ix, uint8_t* storage) {
+static void BuildAndStoreCommandPrefixCode(BrotliTwoPassArena* s,
+ size_t* storage_ix,
+ uint8_t* storage) {
/* Tree size for building a tree over 64 symbols is 2 * 64 + 1. */
- HuffmanTree tree[129];
- uint8_t cmd_depth[BROTLI_NUM_COMMAND_SYMBOLS] = { 0 };
- uint16_t cmd_bits[64];
- BrotliCreateHuffmanTree(histogram, 64, 15, tree, depth);
- BrotliCreateHuffmanTree(&histogram[64], 64, 14, tree, &depth[64]);
+ /* TODO(eustas): initialize once. */
+ memset(s->tmp_depth, 0, sizeof(s->tmp_depth));
+ BrotliCreateHuffmanTree(s->cmd_histo, 64, 15, s->tmp_tree, s->cmd_depth);
+ BrotliCreateHuffmanTree(&s->cmd_histo[64], 64, 14, s->tmp_tree,
+ &s->cmd_depth[64]);
/* We have to jump through a few hoops here in order to compute
the command bits because the symbols are in a different order than in
the full alphabet. This looks complicated, but having the symbols
in this order in the command bits saves a few branches in the Emit*
functions. */
- memcpy(cmd_depth, depth + 24, 24);
- memcpy(cmd_depth + 24, depth, 8);
- memcpy(cmd_depth + 32, depth + 48, 8);
- memcpy(cmd_depth + 40, depth + 8, 8);
- memcpy(cmd_depth + 48, depth + 56, 8);
- memcpy(cmd_depth + 56, depth + 16, 8);
- BrotliConvertBitDepthsToSymbols(cmd_depth, 64, cmd_bits);
- memcpy(bits, cmd_bits + 24, 16);
- memcpy(bits + 8, cmd_bits + 40, 16);
- memcpy(bits + 16, cmd_bits + 56, 16);
- memcpy(bits + 24, cmd_bits, 48);
- memcpy(bits + 48, cmd_bits + 32, 16);
- memcpy(bits + 56, cmd_bits + 48, 16);
- BrotliConvertBitDepthsToSymbols(&depth[64], 64, &bits[64]);
+ memcpy(s->tmp_depth, s->cmd_depth + 24, 24);
+ memcpy(s->tmp_depth + 24, s->cmd_depth, 8);
+ memcpy(s->tmp_depth + 32, s->cmd_depth + 48, 8);
+ memcpy(s->tmp_depth + 40, s->cmd_depth + 8, 8);
+ memcpy(s->tmp_depth + 48, s->cmd_depth + 56, 8);
+ memcpy(s->tmp_depth + 56, s->cmd_depth + 16, 8);
+ BrotliConvertBitDepthsToSymbols(s->tmp_depth, 64, s->tmp_bits);
+ memcpy(s->cmd_bits, s->tmp_bits + 24, 16);
+ memcpy(s->cmd_bits + 8, s->tmp_bits + 40, 16);
+ memcpy(s->cmd_bits + 16, s->tmp_bits + 56, 16);
+ memcpy(s->cmd_bits + 24, s->tmp_bits, 48);
+ memcpy(s->cmd_bits + 48, s->tmp_bits + 32, 16);
+ memcpy(s->cmd_bits + 56, s->tmp_bits + 48, 16);
+ BrotliConvertBitDepthsToSymbols(&s->cmd_depth[64], 64, &s->cmd_bits[64]);
{
/* Create the bit length array for the full command alphabet. */
size_t i;
- memset(cmd_depth, 0, 64); /* only 64 first values were used */
- memcpy(cmd_depth, depth + 24, 8);
- memcpy(cmd_depth + 64, depth + 32, 8);
- memcpy(cmd_depth + 128, depth + 40, 8);
- memcpy(cmd_depth + 192, depth + 48, 8);
- memcpy(cmd_depth + 384, depth + 56, 8);
+ memset(s->tmp_depth, 0, 64); /* only 64 first values were used */
+ memcpy(s->tmp_depth, s->cmd_depth + 24, 8);
+ memcpy(s->tmp_depth + 64, s->cmd_depth + 32, 8);
+ memcpy(s->tmp_depth + 128, s->cmd_depth + 40, 8);
+ memcpy(s->tmp_depth + 192, s->cmd_depth + 48, 8);
+ memcpy(s->tmp_depth + 384, s->cmd_depth + 56, 8);
for (i = 0; i < 8; ++i) {
- cmd_depth[128 + 8 * i] = depth[i];
- cmd_depth[256 + 8 * i] = depth[8 + i];
- cmd_depth[448 + 8 * i] = depth[16 + i];
+ s->tmp_depth[128 + 8 * i] = s->cmd_depth[i];
+ s->tmp_depth[256 + 8 * i] = s->cmd_depth[8 + i];
+ s->tmp_depth[448 + 8 * i] = s->cmd_depth[16 + i];
}
- BrotliStoreHuffmanTree(
- cmd_depth, BROTLI_NUM_COMMAND_SYMBOLS, tree, storage_ix, storage);
+ BrotliStoreHuffmanTree(s->tmp_depth, BROTLI_NUM_COMMAND_SYMBOLS,
+ s->tmp_tree, storage_ix, storage);
}
- BrotliStoreHuffmanTree(&depth[64], 64, tree, storage_ix, storage);
+ BrotliStoreHuffmanTree(&s->cmd_depth[64], 64, s->tmp_tree, storage_ix,
+ storage);
}
static BROTLI_INLINE void EmitInsertLen(
@@ -330,6 +330,8 @@ trawl:
ip += matched;
BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
EmitInsertLen((uint32_t)insert, commands);
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n",
+ (int)(next_emit - base_ip), insert, 2));
memcpy(*literals, next_emit, (size_t)insert);
*literals += insert;
if (distance == last_distance) {
@@ -340,6 +342,12 @@ trawl:
last_distance = distance;
}
EmitCopyLenLastDistance(matched, commands);
+ BROTLI_LOG(("[CompressFragment] pos = %d distance = %d\n"
+ "[CompressFragment] pos = %d insert = %d copy = %d\n"
+ "[CompressFragment] pos = %d distance = %d\n",
+ (int)(base - base_ip), (int)distance,
+ (int)(base - base_ip) + 2, 0, (int)matched - 2,
+ (int)(base - base_ip) + 2, (int)distance));
next_emit = ip;
if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -395,6 +403,10 @@ trawl:
BROTLI_DCHECK(0 == memcmp(base, candidate, matched));
EmitCopyLen(matched, commands);
EmitDistance((uint32_t)last_distance, commands);
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n"
+ "[CompressFragment] pos = %d distance = %d\n",
+ (int)(base - base_ip), 0, (int)matched,
+ (int)(base - base_ip), (int)last_distance));
next_emit = ip;
if (BROTLI_PREDICT_FALSE(ip >= ip_limit)) {
@@ -447,70 +459,71 @@ emit_remainder:
if (next_emit < ip_end) {
const uint32_t insert = (uint32_t)(ip_end - next_emit);
EmitInsertLen(insert, commands);
+ BROTLI_LOG(("[CompressFragment] pos = %d insert = %d copy = %d\n",
+ (int)(next_emit - base_ip), insert, 2));
memcpy(*literals, next_emit, insert);
*literals += insert;
}
}
-static void StoreCommands(MemoryManager* m,
+static void StoreCommands(BrotliTwoPassArena* s,
const uint8_t* literals, const size_t num_literals,
const uint32_t* commands, const size_t num_commands,
size_t* storage_ix, uint8_t* storage) {
static const uint32_t kNumExtraBits[128] = {
- 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
- 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
- 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
+ 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5,
+ 6, 7, 8, 9, 10, 12, 14, 24, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 2, 2, 3, 3, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
+ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
+ 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24,
};
static const uint32_t kInsertOffset[24] = {
- 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578,
- 1090, 2114, 6210, 22594,
+ 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26,
+ 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594,
};
- uint8_t lit_depths[256];
- uint16_t lit_bits[256];
- uint32_t lit_histo[256] = { 0 };
- uint8_t cmd_depths[128] = { 0 };
- uint16_t cmd_bits[128] = { 0 };
- uint32_t cmd_histo[128] = { 0 };
size_t i;
+ memset(s->lit_histo, 0, sizeof(s->lit_histo));
+ /* TODO(eustas): is that necessary? */
+ memset(s->cmd_depth, 0, sizeof(s->cmd_depth));
+ /* TODO(eustas): is that necessary? */
+ memset(s->cmd_bits, 0, sizeof(s->cmd_bits));
+ memset(s->cmd_histo, 0, sizeof(s->cmd_histo));
for (i = 0; i < num_literals; ++i) {
- ++lit_histo[literals[i]];
+ ++s->lit_histo[literals[i]];
}
- BrotliBuildAndStoreHuffmanTreeFast(m, lit_histo, num_literals,
- /* max_bits = */ 8,
- lit_depths, lit_bits,
- storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
+ BrotliBuildAndStoreHuffmanTreeFast(s->tmp_tree, s->lit_histo, num_literals,
+ /* max_bits = */ 8, s->lit_depth,
+ s->lit_bits, storage_ix, storage);
for (i = 0; i < num_commands; ++i) {
const uint32_t code = commands[i] & 0xFF;
BROTLI_DCHECK(code < 128);
- ++cmd_histo[code];
+ ++s->cmd_histo[code];
}
- cmd_histo[1] += 1;
- cmd_histo[2] += 1;
- cmd_histo[64] += 1;
- cmd_histo[84] += 1;
- BuildAndStoreCommandPrefixCode(cmd_histo, cmd_depths, cmd_bits,
- storage_ix, storage);
+ s->cmd_histo[1] += 1;
+ s->cmd_histo[2] += 1;
+ s->cmd_histo[64] += 1;
+ s->cmd_histo[84] += 1;
+ BuildAndStoreCommandPrefixCode(s, storage_ix, storage);
for (i = 0; i < num_commands; ++i) {
const uint32_t cmd = commands[i];
const uint32_t code = cmd & 0xFF;
const uint32_t extra = cmd >> 8;
BROTLI_DCHECK(code < 128);
- BrotliWriteBits(cmd_depths[code], cmd_bits[code], storage_ix, storage);
+ BrotliWriteBits(s->cmd_depth[code], s->cmd_bits[code], storage_ix, storage);
BrotliWriteBits(kNumExtraBits[code], extra, storage_ix, storage);
if (code < 24) {
const uint32_t insert = kInsertOffset[code] + extra;
uint32_t j;
for (j = 0; j < insert; ++j) {
const uint8_t lit = *literals;
- BrotliWriteBits(lit_depths[lit], lit_bits[lit], storage_ix, storage);
+ BrotliWriteBits(s->lit_depth[lit], s->lit_bits[lit], storage_ix,
+ storage);
++literals;
}
}
@@ -521,19 +534,19 @@ static void StoreCommands(MemoryManager* m,
#define MIN_RATIO 0.98
#define SAMPLE_RATE 43
-static BROTLI_BOOL ShouldCompress(
+static BROTLI_BOOL ShouldCompress(BrotliTwoPassArena* s,
const uint8_t* input, size_t input_size, size_t num_literals) {
double corpus_size = (double)input_size;
if ((double)num_literals < MIN_RATIO * corpus_size) {
return BROTLI_TRUE;
} else {
- uint32_t literal_histo[256] = { 0 };
const double max_total_bit_cost = corpus_size * 8 * MIN_RATIO / SAMPLE_RATE;
size_t i;
+ memset(s->lit_histo, 0, sizeof(s->lit_histo));
for (i = 0; i < input_size; i += SAMPLE_RATE) {
- ++literal_histo[input[i]];
+ ++s->lit_histo[input[i]];
}
- return TO_BROTLI_BOOL(BitsEntropy(literal_histo, 256) < max_total_bit_cost);
+ return TO_BROTLI_BOOL(BitsEntropy(s->lit_histo, 256) < max_total_bit_cost);
}
}
@@ -555,7 +568,7 @@ static void EmitUncompressedMetaBlock(const uint8_t* input, size_t input_size,
}
static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
- MemoryManager* m, const uint8_t* input, size_t input_size,
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size,
BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf,
int* table, size_t table_bits, size_t min_match,
size_t* storage_ix, uint8_t* storage) {
@@ -573,14 +586,13 @@ static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
CreateCommands(input, block_size, input_size, base_ip, table,
table_bits, min_match, &literals, &commands);
num_literals = (size_t)(literals - literal_buf);
- if (ShouldCompress(input, block_size, num_literals)) {
+ if (ShouldCompress(s, input, block_size, num_literals)) {
const size_t num_commands = (size_t)(commands - command_buf);
BrotliStoreMetaBlockHeader(block_size, 0, storage_ix, storage);
/* No block splits, no contexts. */
BrotliWriteBits(13, 0, storage_ix, storage);
- StoreCommands(m, literal_buf, num_literals, command_buf, num_commands,
+ StoreCommands(s, literal_buf, num_literals, command_buf, num_commands,
storage_ix, storage);
- if (BROTLI_IS_OOM(m)) return;
} else {
/* Since we did not find many backward references and the entropy of
the data is close to 8 bits, we can simply emit an uncompressed block.
@@ -597,18 +609,18 @@ static BROTLI_INLINE void BrotliCompressFragmentTwoPassImpl(
#define BAKE_METHOD_PARAM_(B) \
static BROTLI_NOINLINE void BrotliCompressFragmentTwoPassImpl ## B( \
- MemoryManager* m, const uint8_t* input, size_t input_size, \
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size, \
BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf, \
int* table, size_t* storage_ix, uint8_t* storage) { \
size_t min_match = (B <= 15) ? 4 : 6; \
- BrotliCompressFragmentTwoPassImpl(m, input, input_size, is_last, command_buf,\
+ BrotliCompressFragmentTwoPassImpl(s, input, input_size, is_last, command_buf,\
literal_buf, table, B, min_match, storage_ix, storage); \
}
FOR_TABLE_BITS_(BAKE_METHOD_PARAM_)
#undef BAKE_METHOD_PARAM_
void BrotliCompressFragmentTwoPass(
- MemoryManager* m, const uint8_t* input, size_t input_size,
+ BrotliTwoPassArena* s, const uint8_t* input, size_t input_size,
BROTLI_BOOL is_last, uint32_t* command_buf, uint8_t* literal_buf,
int* table, size_t table_size, size_t* storage_ix, uint8_t* storage) {
const size_t initial_storage_ix = *storage_ix;
@@ -617,7 +629,7 @@ void BrotliCompressFragmentTwoPass(
#define CASE_(B) \
case B: \
BrotliCompressFragmentTwoPassImpl ## B( \
- m, input, input_size, is_last, command_buf, \
+ s, input, input_size, is_last, command_buf, \
literal_buf, table, storage_ix, storage); \
break;
FOR_TABLE_BITS_(CASE_)
diff --git a/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h b/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h
index 928677df42..6d28d9bb78 100644
--- a/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h
+++ b/dviware/dvisvgm/libs/brotli/enc/compress_fragment_two_pass.h
@@ -13,16 +13,34 @@
#ifndef BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
#define BROTLI_ENC_COMPRESS_FRAGMENT_TWO_PASS_H_
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./memory.h"
+
+#include "../common/constants.h"
+#include "../common/platform.h"
+#include "entropy_encode.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
+/* TODO(eustas): turn to macro. */
static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17;
+typedef struct BrotliTwoPassArena {
+ uint32_t lit_histo[256];
+ uint8_t lit_depth[256];
+ uint16_t lit_bits[256];
+
+ uint32_t cmd_histo[128];
+ uint8_t cmd_depth[128];
+ uint16_t cmd_bits[128];
+
+ /* BuildAndStoreCommandPrefixCode */
+ HuffmanTree tmp_tree[2 * BROTLI_NUM_LITERAL_SYMBOLS + 1];
+ uint8_t tmp_depth[BROTLI_NUM_COMMAND_SYMBOLS];
+ uint16_t tmp_bits[64];
+} BrotliTwoPassArena;
+
/* Compresses "input" string to the "*storage" buffer as one or more complete
meta-blocks, and updates the "*storage_ix" bit position.
@@ -36,7 +54,7 @@ static const size_t kCompressFragmentTwoPassBlockSize = 1 << 17;
REQUIRES: "table_size" is a power of two
OUTPUT: maximal copy distance <= |input_size|
OUTPUT: maximal copy distance <= BROTLI_MAX_BACKWARD_LIMIT(18) */
-BROTLI_INTERNAL void BrotliCompressFragmentTwoPass(MemoryManager* m,
+BROTLI_INTERNAL void BrotliCompressFragmentTwoPass(BrotliTwoPassArena* s,
const uint8_t* input,
size_t input_size,
BROTLI_BOOL is_last,
diff --git a/dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c b/dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c
index 16d853fe5a..1a60eb3cda 100644
--- a/dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c
+++ b/dviware/dvisvgm/libs/brotli/enc/dictionary_hash.c
@@ -7,12 +7,13 @@
/* Hash table on the 4-byte prefixes of static dictionary words. */
#include "../common/platform.h"
-#include "./dictionary_hash.h"
+#include "dictionary_hash.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
+/* GENERATED CODE START */
BROTLI_INTERNAL const uint16_t kStaticDictionaryHashWords[32768] = {
1002,0,0,0,0,0,0,0,0,683,0,0,0,0,0,0,0,1265,0,0,0,0,0,1431,0,0,0,0,0,0,40,0,0,0,
0,155,8,741,0,624,0,0,0,0,0,0,0,0,0,0,0,0,66,503,0,0,0,451,0,0,0,0,0,0,0,835,70,
@@ -1840,6 +1841,7 @@ BROTLI_INTERNAL const uint8_t kStaticDictionaryHashLengths[32768] = {
0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,
10,7,0,0,0,0,0,0,0,0,9,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,11,0,0,0,0,0,0,0,8,6,0,0,9,
7,0,0,12,4,0,0,0,0,0,0,12,6,0,6,0,7,0,0,8,5,0,0,0,0};
+/* GENERATED CODE END */
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/encode.c b/dviware/dvisvgm/libs/brotli/enc/encode.c
index e77009e39a..95ff2eaf50 100644
--- a/dviware/dvisvgm/libs/brotli/enc/encode.c
+++ b/dviware/dvisvgm/libs/brotli/enc/encode.c
@@ -7,6 +7,8 @@
/* Implementation of Brotli compressor. */
#include <brotli/encode.h>
+#include <brotli/shared_dictionary.h>
+#include <brotli/types.h>
#include <stdlib.h> /* free, malloc */
#include <string.h> /* memcpy, memset */
@@ -15,24 +17,26 @@
#include "../common/context.h"
#include "../common/platform.h"
#include "../common/version.h"
-#include "./backward_references.h"
-#include "./backward_references_hq.h"
-#include "./bit_cost.h"
-#include "./brotli_bit_stream.h"
-#include "./compress_fragment.h"
-#include "./compress_fragment_two_pass.h"
-#include "./encoder_dict.h"
-#include "./entropy_encode.h"
-#include "./fast_log.h"
-#include "./hash.h"
-#include "./histogram.h"
-#include "./memory.h"
-#include "./metablock.h"
-#include "./prefix.h"
-#include "./quality.h"
-#include "./ringbuffer.h"
-#include "./utf8_util.h"
-#include "./write_bits.h"
+#include "backward_references.h"
+#include "backward_references_hq.h"
+#include "bit_cost.h"
+#include "brotli_bit_stream.h"
+#include "compress_fragment.h"
+#include "compress_fragment_two_pass.h"
+#include "dictionary_hash.h"
+#include "encoder_dict.h"
+#include "entropy_encode.h"
+#include "fast_log.h"
+#include "hash.h"
+#include "histogram.h"
+#include "memory.h"
+#include "metablock.h"
+#include "prefix.h"
+#include "state.h"
+#include "quality.h"
+#include "ringbuffer.h"
+#include "utf8_util.h"
+#include "write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -40,94 +44,6 @@ extern "C" {
#define COPY_ARRAY(dst, src) memcpy(dst, src, sizeof(src));
-typedef enum BrotliEncoderStreamState {
- /* Default state. */
- BROTLI_STREAM_PROCESSING = 0,
- /* Intermediate state; after next block is emitted, byte-padding should be
- performed before getting back to default state. */
- BROTLI_STREAM_FLUSH_REQUESTED = 1,
- /* Last metablock was produced; no more input is acceptable. */
- BROTLI_STREAM_FINISHED = 2,
- /* Flushing compressed block and writing meta-data block header. */
- BROTLI_STREAM_METADATA_HEAD = 3,
- /* Writing metadata block body. */
- BROTLI_STREAM_METADATA_BODY = 4
-} BrotliEncoderStreamState;
-
-typedef enum BrotliEncoderFlintState {
- BROTLI_FLINT_NEEDS_2_BYTES = 2,
- BROTLI_FLINT_NEEDS_1_BYTE = 1,
- BROTLI_FLINT_WAITING_FOR_PROCESSING = 0,
- BROTLI_FLINT_WAITING_FOR_FLUSHING = -1,
- BROTLI_FLINT_DONE = -2
-} BrotliEncoderFlintState;
-
-typedef struct BrotliEncoderStateStruct {
- BrotliEncoderParams params;
-
- MemoryManager memory_manager_;
-
- uint64_t input_pos_;
- RingBuffer ringbuffer_;
- size_t cmd_alloc_size_;
- Command* commands_;
- size_t num_commands_;
- size_t num_literals_;
- size_t last_insert_len_;
- uint64_t last_flush_pos_;
- uint64_t last_processed_pos_;
- int dist_cache_[BROTLI_NUM_DISTANCE_SHORT_CODES];
- int saved_dist_cache_[4];
- uint16_t last_bytes_;
- uint8_t last_bytes_bits_;
- /* "Flint" is a tiny uncompressed block emitted before the continuation
- block to unwire literal context from previous data. Despite being int8_t,
- field is actually BrotliEncoderFlintState enum. */
- int8_t flint_;
- uint8_t prev_byte_;
- uint8_t prev_byte2_;
- size_t storage_size_;
- uint8_t* storage_;
-
- Hasher hasher_;
-
- /* Hash table for FAST_ONE_PASS_COMPRESSION_QUALITY mode. */
- int small_table_[1 << 10]; /* 4KiB */
- int* large_table_; /* Allocated only when needed */
- size_t large_table_size_;
- /* Command and distance prefix codes (each 64 symbols, stored back-to-back)
- used for the next block in FAST_ONE_PASS_COMPRESSION_QUALITY. The command
- prefix code is over a smaller alphabet with the following 64 symbols:
- 0 - 15: insert length code 0, copy length code 0 - 15, same distance
- 16 - 39: insert length code 0, copy length code 0 - 23
- 40 - 63: insert length code 0 - 23, copy length code 0
- Note that symbols 16 and 40 represent the same code in the full alphabet,
- but we do not use either of them in FAST_ONE_PASS_COMPRESSION_QUALITY. */
- uint8_t cmd_depths_[128];
- uint16_t cmd_bits_[128];
- /* The compressed form of the command and distance prefix codes for the next
- block in FAST_ONE_PASS_COMPRESSION_QUALITY. */
- uint8_t cmd_code_[512];
- size_t cmd_code_numbits_;
- /* Command and literal buffers for FAST_TWO_PASS_COMPRESSION_QUALITY. */
- uint32_t* command_buf_;
- uint8_t* literal_buf_;
-
- uint8_t* next_out_;
- size_t available_out_;
- size_t total_out_;
- /* Temporary buffer for padding flush bits or metadata block header / body. */
- union {
- uint64_t u64[2];
- uint8_t u8[16];
- } tiny_buf_;
- uint32_t remaining_metadata_bytes_;
- BrotliEncoderStreamState stream_state_;
-
- BROTLI_BOOL is_last_block_emitted_;
- BROTLI_BOOL is_initialized_;
-} BrotliEncoderStateStruct;
-
static size_t InputBlockSize(BrotliEncoderState* s) {
return (size_t)1 << s->params.lgblock;
}
@@ -147,7 +63,7 @@ BROTLI_BOOL BrotliEncoderSetParameter(
BrotliEncoderState* state, BrotliEncoderParameter p, uint32_t value) {
/* Changing parameters on the fly is not implemented yet. */
if (state->is_initialized_) return BROTLI_FALSE;
- /* TODO: Validate/clamp parameters here. */
+ /* TODO(eustas): Validate/clamp parameters here. */
switch (p) {
case BROTLI_PARAM_MODE:
state->params.mode = (BrotliEncoderMode)value;
@@ -283,11 +199,9 @@ static void EncodeWindowBits(int lgwin, BROTLI_BOOL large_window,
}
}
+/* TODO(eustas): move to compress_fragment.c? */
/* Initializes the command and distance prefix codes for the first block. */
-static void InitCommandPrefixCodes(uint8_t cmd_depths[128],
- uint16_t cmd_bits[128],
- uint8_t cmd_code[512],
- size_t* cmd_code_numbits) {
+static void InitCommandPrefixCodes(BrotliOnePassArena* s) {
static const uint8_t kDefaultCommandDepths[128] = {
0, 4, 4, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
0, 0, 0, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7,
@@ -320,13 +234,13 @@ static void InitCommandPrefixCodes(uint8_t cmd_depths[128],
0x46, 0xe1, 0xb0, 0xd0, 0x4e, 0xb2, 0xf7, 0x04, 0x00,
};
static const size_t kDefaultCommandCodeNumBits = 448;
- COPY_ARRAY(cmd_depths, kDefaultCommandDepths);
- COPY_ARRAY(cmd_bits, kDefaultCommandBits);
+ COPY_ARRAY(s->cmd_depth, kDefaultCommandDepths);
+ COPY_ARRAY(s->cmd_bits, kDefaultCommandBits);
/* Initialize the pre-compressed form of the command and distance prefix
codes. */
- COPY_ARRAY(cmd_code, kDefaultCommandCode);
- *cmd_code_numbits = kDefaultCommandCodeNumBits;
+ COPY_ARRAY(s->cmd_code, kDefaultCommandCode);
+ s->cmd_code_numbits = kDefaultCommandCodeNumBits;
}
/* Decide about the context map based on the ability of the prediction
@@ -401,7 +315,8 @@ static void ChooseContextMap(int quality,
first 5 bits of literals. */
static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
size_t start_pos, size_t length, size_t mask, int quality, size_t size_hint,
- size_t* num_literal_contexts, const uint32_t** literal_context_map) {
+ size_t* num_literal_contexts, const uint32_t** literal_context_map,
+ uint32_t* arena) {
static const uint32_t kStaticContextMapComplexUTF8[64] = {
11, 11, 12, 12, /* 0 special */
0, 0, 0, 0, /* 4 lf */
@@ -426,16 +341,17 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
return BROTLI_FALSE;
} else {
const size_t end_pos = start_pos + length;
- /* To make entropy calculations faster and to fit on the stack, we collect
- histograms over the 5 most significant bits of literals. One histogram
+ /* To make entropy calculations faster, we collect histograms
+ over the 5 most significant bits of literals. One histogram
without context and 13 additional histograms for each context value. */
- uint32_t combined_histo[32] = { 0 };
- uint32_t context_histo[13][32] = { { 0 } };
+ uint32_t* BROTLI_RESTRICT const combined_histo = arena;
+ uint32_t* BROTLI_RESTRICT const context_histo = arena + 32;
uint32_t total = 0;
double entropy[3];
size_t dummy;
size_t i;
ContextLut utf8_lut = BROTLI_CONTEXT_LUT(CONTEXT_UTF8);
+ memset(arena, 0, sizeof(arena[0]) * 32 * 14);
for (; start_pos + 64 <= end_pos; start_pos += 4096) {
const size_t stride_end_pos = start_pos + 64;
uint8_t prev2 = input[start_pos & mask];
@@ -449,7 +365,7 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
BROTLI_CONTEXT(prev1, prev2, utf8_lut)];
++total;
++combined_histo[literal >> 3];
- ++context_histo[context][literal >> 3];
+ ++context_histo[(context << 5) + (literal >> 3)];
prev2 = prev1;
prev1 = literal;
}
@@ -457,7 +373,7 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
entropy[1] = ShannonEntropy(combined_histo, 32, &dummy);
entropy[2] = 0;
for (i = 0; i < 13; ++i) {
- entropy[2] += ShannonEntropy(&context_histo[i][0], 32, &dummy);
+ entropy[2] += ShannonEntropy(context_histo + (i << 5), 32, &dummy);
}
entropy[0] = 1.0 / (double)total;
entropy[1] *= entropy[0];
@@ -481,19 +397,21 @@ static BROTLI_BOOL ShouldUseComplexStaticContextMap(const uint8_t* input,
static void DecideOverLiteralContextModeling(const uint8_t* input,
size_t start_pos, size_t length, size_t mask, int quality, size_t size_hint,
- size_t* num_literal_contexts, const uint32_t** literal_context_map) {
+ size_t* num_literal_contexts, const uint32_t** literal_context_map,
+ uint32_t* arena) {
if (quality < MIN_QUALITY_FOR_CONTEXT_MODELING || length < 64) {
return;
} else if (ShouldUseComplexStaticContextMap(
input, start_pos, length, mask, quality, size_hint,
- num_literal_contexts, literal_context_map)) {
+ num_literal_contexts, literal_context_map, arena)) {
/* Context map was already set, nothing else to do. */
} else {
/* Gather bi-gram data of the UTF8 byte prefixes. To make the analysis of
UTF8 data faster we only examine 64 byte long strides at every 4kB
intervals. */
const size_t end_pos = start_pos + length;
- uint32_t bigram_prefix_histo[9] = { 0 };
+ uint32_t* BROTLI_RESTRICT const bigram_prefix_histo = arena;
+ memset(bigram_prefix_histo, 0, sizeof(arena[0]) * 9);
for (; start_pos + 64 <= end_pos; start_pos += 4096) {
static const int lut[4] = { 0, 0, 1, 2 };
const size_t stride_end_pos = start_pos + 64;
@@ -513,7 +431,7 @@ static void DecideOverLiteralContextModeling(const uint8_t* input,
static BROTLI_BOOL ShouldCompress(
const uint8_t* data, const size_t mask, const uint64_t last_flush_pos,
const size_t bytes, const size_t num_literals, const size_t num_commands) {
- /* TODO: find more precise minimal block overhead. */
+ /* TODO(eustas): find more precise minimal block overhead. */
if (bytes <= 2) return BROTLI_FALSE;
if (num_commands < (bytes >> 8) + 2) {
if ((double)num_literals > 0.99 * (double)bytes) {
@@ -613,10 +531,14 @@ static void WriteMetaBlockInternal(MemoryManager* m,
size_t num_literal_contexts = 1;
const uint32_t* literal_context_map = NULL;
if (!params->disable_literal_context_modeling) {
+ /* TODO(eustas): pull to higher level and reuse. */
+ uint32_t* arena = BROTLI_ALLOC(m, uint32_t, 14 * 32);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return;
DecideOverLiteralContextModeling(
data, wrapped_last_flush_pos, bytes, mask, params->quality,
params->size_hint, &num_literal_contexts,
- &literal_context_map);
+ &literal_context_map, arena);
+ BROTLI_FREE(m, arena);
}
BrotliBuildMetaBlockGreedy(m, data, wrapped_last_flush_pos, mask,
prev_byte, prev_byte2, literal_context_lut, num_literal_contexts,
@@ -681,12 +603,13 @@ static void ChooseDistanceParams(BrotliEncoderParams* params) {
}
}
- BrotliInitDistanceParams(
- params, distance_postfix_bits, num_direct_distance_codes);
+ BrotliInitDistanceParams(&params->dist, distance_postfix_bits,
+ num_direct_distance_codes, params->large_window);
}
static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) {
- if (BROTLI_IS_OOM(&s->memory_manager_)) return BROTLI_FALSE;
+ MemoryManager* m = &s->memory_manager_;
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
if (s->is_initialized_) return BROTLI_TRUE;
s->last_bytes_bits_ = 0;
@@ -728,8 +651,12 @@ static BROTLI_BOOL EnsureInitialized(BrotliEncoderState* s) {
}
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
- InitCommandPrefixCodes(s->cmd_depths_, s->cmd_bits_,
- s->cmd_code_, &s->cmd_code_numbits_);
+ s->one_pass_arena_ = BROTLI_ALLOC(m, BrotliOnePassArena, 1);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ InitCommandPrefixCodes(s->one_pass_arena_);
+ } else if (s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) {
+ s->two_pass_arena_ = BROTLI_ALLOC(m, BrotliTwoPassArena, 1);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
}
s->is_initialized_ = BROTLI_TRUE;
@@ -745,7 +672,7 @@ static void BrotliEncoderInitParams(BrotliEncoderParams* params) {
params->stream_offset = 0;
params->size_hint = 0;
params->disable_literal_context_modeling = BROTLI_FALSE;
- BrotliInitEncoderDictionary(&params->dictionary);
+ BrotliInitSharedEncoderDictionary(&params->dictionary);
params->dist.distance_postfix_bits = 0;
params->dist.num_direct_distance_codes = 0;
params->dist.alphabet_size_max =
@@ -754,6 +681,11 @@ static void BrotliEncoderInitParams(BrotliEncoderParams* params) {
params->dist.max_distance = BROTLI_MAX_DISTANCE;
}
+static void BrotliEncoderCleanupParams(MemoryManager* m,
+ BrotliEncoderParams* params) {
+ BrotliCleanupSharedEncoderDictionary(m, &params->dictionary);
+}
+
static void BrotliEncoderInitState(BrotliEncoderState* s) {
BrotliEncoderInitParams(&s->params);
s->input_pos_ = 0;
@@ -769,9 +701,11 @@ static void BrotliEncoderInitState(BrotliEncoderState* s) {
HasherInit(&s->hasher_);
s->large_table_ = NULL;
s->large_table_size_ = 0;
- s->cmd_code_numbits_ = 0;
+ s->one_pass_arena_ = NULL;
+ s->two_pass_arena_ = NULL;
s->command_buf_ = NULL;
s->literal_buf_ = NULL;
+ s->total_in_ = 0;
s->next_out_ = NULL;
s->available_out_ = 0;
s->total_out_ = 0;
@@ -796,13 +730,9 @@ static void BrotliEncoderInitState(BrotliEncoderState* s) {
BrotliEncoderState* BrotliEncoderCreateInstance(
brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
- BrotliEncoderState* state = 0;
- if (!alloc_func && !free_func) {
- state = (BrotliEncoderState*)malloc(sizeof(BrotliEncoderState));
- } else if (alloc_func && free_func) {
- state = (BrotliEncoderState*)alloc_func(opaque, sizeof(BrotliEncoderState));
- }
- if (state == 0) {
+ BrotliEncoderState* state = (BrotliEncoderState*)BrotliBootstrapAlloc(
+ sizeof(BrotliEncoderState), alloc_func, free_func, opaque);
+ if (state == NULL) {
/* BROTLI_DUMP(); */
return 0;
}
@@ -812,19 +742,36 @@ BrotliEncoderState* BrotliEncoderCreateInstance(
return state;
}
+#ifdef BROTLI_REPORTING
+/* When BROTLI_REPORTING is defined extra reporting module have to be linked. */
+void BrotliEncoderOnFinish(const BrotliEncoderState* s);
+#define BROTLI_ENCODER_ON_FINISH(s) BrotliEncoderOnFinish(s);
+#else
+#if !defined(BROTLI_ENCODER_ON_FINISH)
+#define BROTLI_ENCODER_ON_FINISH(s) (void)(s);
+#endif
+#endif
+
static void BrotliEncoderCleanupState(BrotliEncoderState* s) {
MemoryManager* m = &s->memory_manager_;
+
+ BROTLI_ENCODER_ON_FINISH(s);
+
if (BROTLI_IS_OOM(m)) {
BrotliWipeOutMemoryManager(m);
return;
}
+
BROTLI_FREE(m, s->storage_);
BROTLI_FREE(m, s->commands_);
RingBufferFree(m, &s->ringbuffer_);
DestroyHasher(m, &s->hasher_);
BROTLI_FREE(m, s->large_table_);
+ BROTLI_FREE(m, s->one_pass_arena_);
+ BROTLI_FREE(m, s->two_pass_arena_);
BROTLI_FREE(m, s->command_buf_);
BROTLI_FREE(m, s->literal_buf_);
+ BrotliEncoderCleanupParams(m, &s->params);
}
/* Deinitializes and frees BrotliEncoderState instance. */
@@ -832,11 +779,8 @@ void BrotliEncoderDestroyInstance(BrotliEncoderState* state) {
if (!state) {
return;
} else {
- MemoryManager* m = &state->memory_manager_;
- brotli_free_func free_func = m->free_func;
- void* opaque = m->opaque;
BrotliEncoderCleanupState(state);
- free_func(opaque, state);
+ BrotliBootstrapFree(state, &state->memory_manager_);
}
}
@@ -925,6 +869,8 @@ static void ExtendLastCommand(BrotliEncoderState* s, uint32_t* bytes,
uint64_t cmd_dist = (uint64_t)s->dist_cache_[0];
uint32_t distance_code = CommandRestoreDistanceCode(last_command,
&s->params.dist);
+ const CompoundDictionary* dict = &s->params.dictionary.compound;
+ size_t compound_dictionary_size = dict->total_size;
if (distance_code < BROTLI_NUM_DISTANCE_SHORT_CODES ||
distance_code - (BROTLI_NUM_DISTANCE_SHORT_CODES - 1) == cmd_dist) {
if (cmd_dist <= max_distance) {
@@ -935,6 +881,38 @@ static void ExtendLastCommand(BrotliEncoderState* s, uint32_t* bytes,
(*wrapped_last_processed_pos)++;
}
} else {
+ if ((cmd_dist - max_distance - 1) < compound_dictionary_size &&
+ last_copy_len < cmd_dist - max_distance) {
+ size_t address =
+ compound_dictionary_size - (size_t)(cmd_dist - max_distance) +
+ (size_t)last_copy_len;
+ size_t br_index = 0;
+ size_t br_offset;
+ const uint8_t* chunk;
+ size_t chunk_length;
+ while (address >= dict->chunk_offsets[br_index + 1]) br_index++;
+ br_offset = address - dict->chunk_offsets[br_index];
+ chunk = dict->chunk_source[br_index];
+ chunk_length =
+ dict->chunk_offsets[br_index + 1] - dict->chunk_offsets[br_index];
+ while (*bytes != 0 && data[*wrapped_last_processed_pos & mask] ==
+ chunk[br_offset]) {
+ last_command->copy_len_++;
+ (*bytes)--;
+ (*wrapped_last_processed_pos)++;
+ if (++br_offset == chunk_length) {
+ br_index++;
+ br_offset = 0;
+ if (br_index != dict->num_chunks) {
+ chunk = dict->chunk_source[br_index];
+ chunk_length = dict->chunk_offsets[br_index + 1] -
+ dict->chunk_offsets[br_index];
+ } else {
+ break;
+ }
+ }
+ }
+ }
}
/* The copy length is at most the metablock size, and thus expressible. */
GetLengthCode(last_command->insert_len_,
@@ -952,8 +930,8 @@ static void ExtendLastCommand(BrotliEncoderState* s, uint32_t* bytes,
If |*out_size| is positive, |*output| points to the start of the output
data. If |is_last| or |force_flush| is BROTLI_TRUE, an output meta-block is
always created. However, until |is_last| is BROTLI_TRUE encoder may retain up
- to 7 bits of the last byte of output. To force encoder to dump the remaining
- bits use WriteMetadata() to append an empty meta-data block.
+ to 7 bits of the last byte of output. Byte-alignment could be enforced by
+ emitting an empty meta-data block.
Returns BROTLI_FALSE if the size of the input data is larger than
input_block_size().
*/
@@ -968,10 +946,39 @@ static BROTLI_BOOL EncodeData(
MemoryManager* m = &s->memory_manager_;
ContextType literal_context_mode;
ContextLut literal_context_lut;
+ BROTLI_BOOL fast_compress =
+ s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY ||
+ s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY;
data = s->ringbuffer_.buffer_;
mask = s->ringbuffer_.mask_;
+ if (delta == 0) { /* No new input; still might want to flush or finish. */
+ if (!data) { /* No input has been processed so far. */
+ if (is_last) { /* Emit complete finalized stream. */
+ BROTLI_DCHECK(s->last_bytes_bits_ <= 14);
+ s->last_bytes_ |= (uint16_t)(3u << s->last_bytes_bits_);
+ s->last_bytes_bits_ = (uint8_t)(s->last_bytes_bits_ + 2u);
+ s->tiny_buf_.u8[0] = (uint8_t)s->last_bytes_;
+ s->tiny_buf_.u8[1] = (uint8_t)(s->last_bytes_ >> 8);
+ *output = s->tiny_buf_.u8;
+ *out_size = (s->last_bytes_bits_ + 7u) >> 3u;
+ return BROTLI_TRUE;
+ } else { /* No data, not last -> no-op. */
+ *out_size = 0;
+ return BROTLI_TRUE;
+ }
+ } else {
+ /* Fast compress performs flush every block -> flush is no-op. */
+ if (!is_last && (!force_flush || fast_compress)) { /* Another no-op. */
+ *out_size = 0;
+ return BROTLI_TRUE;
+ }
+ }
+ }
+ BROTLI_DCHECK(data);
+
+ if (s->params.quality > s->params.dictionary.max_quality) return BROTLI_FALSE;
/* Adding more blocks after "last" block is forbidden. */
if (s->is_last_block_emitted_) return BROTLI_FALSE;
if (is_last) s->is_last_block_emitted_ = BROTLI_TRUE;
@@ -991,19 +998,12 @@ static BROTLI_BOOL EncodeData(
}
}
- if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY ||
- s->params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) {
+ if (fast_compress) {
uint8_t* storage;
size_t storage_ix = s->last_bytes_bits_;
size_t table_size;
int* table;
- if (delta == 0 && !is_last) {
- /* We have no new input data and we don't have to finish the stream, so
- nothing to do. */
- *out_size = 0;
- return BROTLI_TRUE;
- }
storage = GetBrotliStorage(s, 2 * bytes + 503);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
storage[0] = (uint8_t)s->last_bytes_;
@@ -1012,16 +1012,14 @@ static BROTLI_BOOL EncodeData(
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
BrotliCompressFragmentFast(
- m, &data[wrapped_last_processed_pos & mask],
+ s->one_pass_arena_, &data[wrapped_last_processed_pos & mask],
bytes, is_last,
table, table_size,
- s->cmd_depths_, s->cmd_bits_,
- &s->cmd_code_numbits_, s->cmd_code_,
&storage_ix, storage);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
} else {
BrotliCompressFragmentTwoPass(
- m, &data[wrapped_last_processed_pos & mask],
+ s->two_pass_arena_, &data[wrapped_last_processed_pos & mask],
bytes, is_last,
s->command_buf_, s->literal_buf_,
table, table_size,
@@ -1099,7 +1097,7 @@ static BROTLI_BOOL EncodeData(
const size_t max_commands = max_length / 8;
const size_t processed_bytes = (size_t)(s->input_pos_ - s->last_flush_pos_);
/* If maximal possible additional block doesn't fit metablock, flush now. */
- /* TODO: Postpone decision until next block arrives? */
+ /* TODO(eustas): Postpone decision until next block arrives? */
const BROTLI_BOOL next_input_fits_metablock = TO_BROTLI_BOOL(
processed_bytes + InputBlockSize(s) <= max_length);
/* If block splitting is not used, then flush as soon as there is some
@@ -1192,7 +1190,7 @@ static size_t WriteMetadataHeader(
if (block_size == 0) {
BrotliWriteBits(2, 0, &storage_ix, header);
} else {
- uint32_t nbits = (block_size == 1) ? 0 :
+ uint32_t nbits = (block_size == 1) ? 1 :
(Log2FloorNonZero((uint32_t)block_size - 1) + 1);
uint32_t nbytes = (nbits + 7) / 8;
BrotliWriteBits(2, nbytes, &storage_ix, header);
@@ -1201,228 +1199,6 @@ static size_t WriteMetadataHeader(
return (storage_ix + 7u) >> 3;
}
-static BROTLI_BOOL BrotliCompressBufferQuality10(
- int lgwin, size_t input_size, const uint8_t* input_buffer,
- size_t* encoded_size, uint8_t* encoded_buffer) {
- MemoryManager memory_manager;
- MemoryManager* m = &memory_manager;
-
- const size_t mask = BROTLI_SIZE_MAX >> 1;
- int dist_cache[4] = { 4, 11, 15, 16 };
- int saved_dist_cache[4] = { 4, 11, 15, 16 };
- BROTLI_BOOL ok = BROTLI_TRUE;
- const size_t max_out_size = *encoded_size;
- size_t total_out_size = 0;
- uint16_t last_bytes;
- uint8_t last_bytes_bits;
-
- const size_t hasher_eff_size = BROTLI_MIN(size_t,
- input_size, BROTLI_MAX_BACKWARD_LIMIT(lgwin) + BROTLI_WINDOW_GAP);
-
- BrotliEncoderParams params;
-
- const int lgmetablock = BROTLI_MIN(int, 24, lgwin + 1);
- size_t max_block_size;
- const size_t max_metablock_size = (size_t)1 << lgmetablock;
- const size_t max_literals_per_metablock = max_metablock_size / 8;
- const size_t max_commands_per_metablock = max_metablock_size / 8;
- size_t metablock_start = 0;
- uint8_t prev_byte = 0;
- uint8_t prev_byte2 = 0;
-
- Hasher hasher;
- HasherInit(&hasher);
-
- BrotliEncoderInitParams(&params);
- params.quality = 10;
- params.lgwin = lgwin;
- if (lgwin > BROTLI_MAX_WINDOW_BITS) {
- params.large_window = BROTLI_TRUE;
- }
- SanitizeParams(&params);
- params.lgblock = ComputeLgBlock(&params);
- ChooseDistanceParams(&params);
- max_block_size = (size_t)1 << params.lgblock;
-
- BrotliInitMemoryManager(m, 0, 0, 0);
-
- BROTLI_DCHECK(input_size <= mask + 1);
- EncodeWindowBits(lgwin, params.large_window, &last_bytes, &last_bytes_bits);
- InitOrStitchToPreviousBlock(m, &hasher, input_buffer, mask, &params,
- 0, hasher_eff_size, BROTLI_TRUE);
- if (BROTLI_IS_OOM(m)) goto oom;
-
- while (ok && metablock_start < input_size) {
- const size_t metablock_end =
- BROTLI_MIN(size_t, input_size, metablock_start + max_metablock_size);
- const size_t expected_num_commands =
- (metablock_end - metablock_start) / 12 + 16;
- Command* commands = 0;
- size_t num_commands = 0;
- size_t last_insert_len = 0;
- size_t num_literals = 0;
- size_t metablock_size = 0;
- size_t cmd_alloc_size = 0;
- BROTLI_BOOL is_last;
- uint8_t* storage;
- size_t storage_ix;
-
- ContextType literal_context_mode = ChooseContextMode(&params,
- input_buffer, metablock_start, mask, metablock_end - metablock_start);
- ContextLut literal_context_lut = BROTLI_CONTEXT_LUT(literal_context_mode);
-
- size_t block_start;
- for (block_start = metablock_start; block_start < metablock_end; ) {
- size_t block_size =
- BROTLI_MIN(size_t, metablock_end - block_start, max_block_size);
- ZopfliNode* nodes = BROTLI_ALLOC(m, ZopfliNode, block_size + 1);
- size_t path_size;
- size_t new_cmd_alloc_size;
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(nodes)) goto oom;
- BrotliInitZopfliNodes(nodes, block_size + 1);
- StitchToPreviousBlockH10(&hasher.privat._H10, block_size, block_start,
- input_buffer, mask);
- path_size = BrotliZopfliComputeShortestPath(m, block_size, block_start,
- input_buffer, mask, literal_context_lut, &params, dist_cache, &hasher,
- nodes);
- if (BROTLI_IS_OOM(m)) goto oom;
- /* We allocate a command buffer in the first iteration of this loop that
- will be likely big enough for the whole metablock, so that for most
- inputs we will not have to reallocate in later iterations. We do the
- allocation here and not before the loop, because if the input is small,
- this will be allocated after the Zopfli cost model is freed, so this
- will not increase peak memory usage.
- TODO: If the first allocation is too small, increase command
- buffer size exponentially. */
- new_cmd_alloc_size = BROTLI_MAX(size_t, expected_num_commands,
- num_commands + path_size + 1);
- if (cmd_alloc_size != new_cmd_alloc_size) {
- Command* new_commands = BROTLI_ALLOC(m, Command, new_cmd_alloc_size);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(new_commands)) goto oom;
- cmd_alloc_size = new_cmd_alloc_size;
- if (commands) {
- memcpy(new_commands, commands, sizeof(Command) * num_commands);
- BROTLI_FREE(m, commands);
- }
- commands = new_commands;
- }
- BrotliZopfliCreateCommands(block_size, block_start, &nodes[0], dist_cache,
- &last_insert_len, &params, &commands[num_commands], &num_literals);
- num_commands += path_size;
- block_start += block_size;
- metablock_size += block_size;
- BROTLI_FREE(m, nodes);
- if (num_literals > max_literals_per_metablock ||
- num_commands > max_commands_per_metablock) {
- break;
- }
- }
-
- if (last_insert_len > 0) {
- InitInsertCommand(&commands[num_commands++], last_insert_len);
- num_literals += last_insert_len;
- }
-
- is_last = TO_BROTLI_BOOL(metablock_start + metablock_size == input_size);
- storage = NULL;
- storage_ix = last_bytes_bits;
-
- if (metablock_size == 0) {
- /* Write the ISLAST and ISEMPTY bits. */
- storage = BROTLI_ALLOC(m, uint8_t, 16);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(storage)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- BrotliWriteBits(2, 3, &storage_ix, storage);
- storage_ix = (storage_ix + 7u) & ~7u;
- } else if (!ShouldCompress(input_buffer, mask, metablock_start,
- metablock_size, num_literals, num_commands)) {
- /* Restore the distance cache, as its last update by
- CreateBackwardReferences is now unused. */
- memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
- storage = BROTLI_ALLOC(m, uint8_t, metablock_size + 16);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(storage)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- BrotliStoreUncompressedMetaBlock(is_last, input_buffer,
- metablock_start, mask, metablock_size,
- &storage_ix, storage);
- } else {
- MetaBlockSplit mb;
- BrotliEncoderParams block_params = params;
- InitMetaBlockSplit(&mb);
- BrotliBuildMetaBlock(m, input_buffer, metablock_start, mask,
- &block_params,
- prev_byte, prev_byte2,
- commands, num_commands,
- literal_context_mode,
- &mb);
- if (BROTLI_IS_OOM(m)) goto oom;
- {
- /* The number of distance symbols effectively used for distance
- histograms. It might be less than distance alphabet size
- for "Large Window Brotli" (32-bit). */
- BrotliOptimizeHistograms(block_params.dist.alphabet_size_limit, &mb);
- }
- storage = BROTLI_ALLOC(m, uint8_t, 2 * metablock_size + 503);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(storage)) goto oom;
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- BrotliStoreMetaBlock(m, input_buffer, metablock_start, metablock_size,
- mask, prev_byte, prev_byte2,
- is_last,
- &block_params,
- literal_context_mode,
- commands, num_commands,
- &mb,
- &storage_ix, storage);
- if (BROTLI_IS_OOM(m)) goto oom;
- if (metablock_size + 4 < (storage_ix >> 3)) {
- /* Restore the distance cache and last byte. */
- memcpy(dist_cache, saved_dist_cache, 4 * sizeof(dist_cache[0]));
- storage[0] = (uint8_t)last_bytes;
- storage[1] = (uint8_t)(last_bytes >> 8);
- storage_ix = last_bytes_bits;
- BrotliStoreUncompressedMetaBlock(is_last, input_buffer,
- metablock_start, mask,
- metablock_size, &storage_ix, storage);
- }
- DestroyMetaBlockSplit(m, &mb);
- }
- last_bytes = (uint16_t)(storage[storage_ix >> 3]);
- last_bytes_bits = storage_ix & 7u;
- metablock_start += metablock_size;
- if (metablock_start < input_size) {
- prev_byte = input_buffer[metablock_start - 1];
- prev_byte2 = input_buffer[metablock_start - 2];
- }
- /* Save the state of the distance cache in case we need to restore it for
- emitting an uncompressed block. */
- memcpy(saved_dist_cache, dist_cache, 4 * sizeof(dist_cache[0]));
-
- {
- const size_t out_size = storage_ix >> 3;
- total_out_size += out_size;
- if (total_out_size <= max_out_size) {
- memcpy(encoded_buffer, storage, out_size);
- encoded_buffer += out_size;
- } else {
- ok = BROTLI_FALSE;
- }
- }
- BROTLI_FREE(m, storage);
- BROTLI_FREE(m, commands);
- }
-
- *encoded_size = total_out_size;
- DestroyHasher(m, &hasher);
- return ok;
-
-oom:
- BrotliWipeOutMemoryManager(m);
- return BROTLI_FALSE;
-}
-
size_t BrotliEncoderMaxCompressedSize(size_t input_size) {
/* [window bits / empty metadata] + N * [uncompressed] + [last empty] */
size_t num_large_blocks = input_size >> 14;
@@ -1470,7 +1246,8 @@ static size_t MakeUncompressedStream(
BROTLI_BOOL BrotliEncoderCompress(
int quality, int lgwin, BrotliEncoderMode mode, size_t input_size,
- const uint8_t input_buffer[BROTLI_ARRAY_PARAM(input_size)], size_t* encoded_size,
+ const uint8_t input_buffer[BROTLI_ARRAY_PARAM(input_size)],
+ size_t* encoded_size,
uint8_t encoded_buffer[BROTLI_ARRAY_PARAM(*encoded_size)]) {
BrotliEncoderState* s;
size_t out_size = *encoded_size;
@@ -1487,17 +1264,6 @@ BROTLI_BOOL BrotliEncoderCompress(
*encoded_buffer = 6;
return BROTLI_TRUE;
}
- if (quality == 10) {
- /* TODO: Implement this direct path for all quality levels. */
- const int lg_win = BROTLI_MIN(int, BROTLI_LARGE_MAX_WINDOW_BITS,
- BROTLI_MAX(int, 16, lgwin));
- int ok = BrotliCompressBufferQuality10(lg_win, input_size, input_buffer,
- encoded_size, encoded_buffer);
- if (!ok || (max_out_size && *encoded_size > max_out_size)) {
- goto fallback;
- }
- return BROTLI_TRUE;
- }
s = BrotliEncoderCreateInstance(0, 0, 0);
if (!s) {
@@ -1509,6 +1275,7 @@ BROTLI_BOOL BrotliEncoderCompress(
uint8_t* next_out = encoded_buffer;
size_t total_out = 0;
BROTLI_BOOL result = BROTLI_FALSE;
+ /* TODO(eustas): check that parameters are sane. */
BrotliEncoderSetParameter(s, BROTLI_PARAM_QUALITY, (uint32_t)quality);
BrotliEncoderSetParameter(s, BROTLI_PARAM_LGWIN, (uint32_t)lgwin);
BrotliEncoderSetParameter(s, BROTLI_PARAM_MODE, (uint32_t)mode);
@@ -1560,6 +1327,18 @@ static void InjectBytePaddingBlock(BrotliEncoderState* s) {
s->available_out_ += (seal_bits + 7) >> 3;
}
+/* Fills the |total_out|, if it is not NULL. */
+static void SetTotalOut(BrotliEncoderState* s, size_t* total_out) {
+ if (total_out) {
+ /* Saturating conversion uint64_t -> size_t */
+ size_t result = (size_t)-1;
+ if (s->total_out_ < result) {
+ result = (size_t)s->total_out_;
+ }
+ *total_out = result;
+ }
+}
+
/* Injects padding bits or pushes compressed data to output.
Returns false if nothing is done. */
static BROTLI_BOOL InjectFlushOrPushOutput(BrotliEncoderState* s,
@@ -1579,7 +1358,7 @@ static BROTLI_BOOL InjectFlushOrPushOutput(BrotliEncoderState* s,
s->next_out_ += copy_output_size;
s->available_out_ -= copy_output_size;
s->total_out_ += copy_output_size;
- if (total_out) *total_out = s->total_out_;
+ SetTotalOut(s, total_out);
return BROTLI_TRUE;
}
@@ -1676,19 +1455,19 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
if (s->params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
- BrotliCompressFragmentFast(m, *next_in, block_size, is_last, table,
- table_size, s->cmd_depths_, s->cmd_bits_, &s->cmd_code_numbits_,
- s->cmd_code_, &storage_ix, storage);
+ BrotliCompressFragmentFast(s->one_pass_arena_, *next_in, block_size,
+ is_last, table, table_size, &storage_ix, storage);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
} else {
- BrotliCompressFragmentTwoPass(m, *next_in, block_size, is_last,
- command_buf, literal_buf, table, table_size,
+ BrotliCompressFragmentTwoPass(s->two_pass_arena_, *next_in, block_size,
+ is_last, command_buf, literal_buf, table, table_size,
&storage_ix, storage);
if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
}
if (block_size != 0) {
*next_in += block_size;
*available_in -= block_size;
+ s->total_in_ += block_size;
}
if (inplace) {
size_t out_bytes = storage_ix >> 3;
@@ -1697,7 +1476,7 @@ static BROTLI_BOOL BrotliEncoderCompressStreamFast(
*next_out += out_bytes;
*available_out -= out_bytes;
s->total_out_ += out_bytes;
- if (total_out) *total_out = s->total_out_;
+ SetTotalOut(s, total_out);
} else {
size_t out_bytes = storage_ix >> 3;
s->next_out_ = storage;
@@ -1766,6 +1545,7 @@ static BROTLI_BOOL ProcessMetadata(
memcpy(*next_out, *next_in, copy);
*next_in += copy;
*available_in -= copy;
+ s->total_in_ += copy; /* not actually data input, though */
s->remaining_metadata_bytes_ -= copy;
*next_out += copy;
*available_out -= copy;
@@ -1776,6 +1556,7 @@ static BROTLI_BOOL ProcessMetadata(
memcpy(s->next_out_, *next_in, copy);
*next_in += copy;
*available_in -= copy;
+ s->total_in_ += copy; /* not actually data input, though */
s->remaining_metadata_bytes_ -= copy;
s->available_out_ = copy;
}
@@ -1803,7 +1584,7 @@ static void UpdateSizeHint(BrotliEncoderState* s, size_t available_in) {
BROTLI_BOOL BrotliEncoderCompressStream(
BrotliEncoderState* s, BrotliEncoderOperation op, size_t* available_in,
- const uint8_t** next_in, size_t* available_out,uint8_t** next_out,
+ const uint8_t** next_in, size_t* available_out, uint8_t** next_out,
size_t* total_out) {
if (!EnsureInitialized(s)) return BROTLI_FALSE;
@@ -1845,6 +1626,7 @@ BROTLI_BOOL BrotliEncoderCompressStream(
CopyInputToRingBuffer(s, copy_input_size, *next_in);
*next_in += copy_input_size;
*available_in -= copy_input_size;
+ s->total_in_ += copy_input_size;
if (s->flint_ > 0) s->flint_ = (int8_t)(s->flint_ - (int)copy_input_size);
continue;
}
@@ -1922,6 +1704,293 @@ uint32_t BrotliEncoderVersion(void) {
return BROTLI_VERSION;
}
+BrotliEncoderPreparedDictionary* BrotliEncoderPrepareDictionary(
+ BrotliSharedDictionaryType type, size_t size,
+ const uint8_t data[BROTLI_ARRAY_PARAM(size)], int quality,
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
+ ManagedDictionary* managed_dictionary = NULL;
+ BROTLI_BOOL type_is_known = BROTLI_FALSE;
+ type_is_known |= (type == BROTLI_SHARED_DICTIONARY_RAW);
+#if defined(BROTLI_EXPERIMENTAL)
+ type_is_known |= (type == BROTLI_SHARED_DICTIONARY_SERIALIZED);
+#endif /* BROTLI_EXPERIMENTAL */
+ if (!type_is_known) {
+ return NULL;
+ }
+ managed_dictionary =
+ BrotliCreateManagedDictionary(alloc_func, free_func, opaque);
+ if (managed_dictionary == NULL) {
+ return NULL;
+ }
+ if (type == BROTLI_SHARED_DICTIONARY_RAW) {
+ managed_dictionary->dictionary = (uint32_t*)CreatePreparedDictionary(
+ &managed_dictionary->memory_manager_, data, size);
+ }
+#if defined(BROTLI_EXPERIMENTAL)
+ if (type == BROTLI_SHARED_DICTIONARY_SERIALIZED) {
+ SharedEncoderDictionary* dict = (SharedEncoderDictionary*)BrotliAllocate(
+ &managed_dictionary->memory_manager_, sizeof(SharedEncoderDictionary));
+ managed_dictionary->dictionary = (uint32_t*)dict;
+ if (dict != NULL) {
+ BROTLI_BOOL ok = BrotliInitCustomSharedEncoderDictionary(
+ &managed_dictionary->memory_manager_, data, size, quality, dict);
+ if (!ok) {
+ BrotliFree(&managed_dictionary->memory_manager_, dict);
+ managed_dictionary->dictionary = NULL;
+ }
+ }
+ }
+#else /* BROTLI_EXPERIMENTAL */
+ (void)quality;
+#endif /* BROTLI_EXPERIMENTAL */
+ if (managed_dictionary->dictionary == NULL) {
+ BrotliDestroyManagedDictionary(managed_dictionary);
+ return NULL;
+ }
+ return (BrotliEncoderPreparedDictionary*)managed_dictionary;
+}
+
+void BrotliEncoderDestroyPreparedDictionary(
+ BrotliEncoderPreparedDictionary* dictionary) {
+ ManagedDictionary* dict = (ManagedDictionary*)dictionary;
+ if (!dictionary) return;
+ /* First field of dictionary structs. */
+ /* Only managed dictionaries are eligible for destruction by this method. */
+ if (dict->magic != kManagedDictionaryMagic) {
+ return;
+ }
+ if (dict->dictionary == NULL) {
+ /* This should never ever happen. */
+ } else if (*dict->dictionary == kLeanPreparedDictionaryMagic) {
+ DestroyPreparedDictionary(
+ &dict->memory_manager_, (PreparedDictionary*)dict->dictionary);
+ } else if (*dict->dictionary == kSharedDictionaryMagic) {
+ BrotliCleanupSharedEncoderDictionary(&dict->memory_manager_,
+ (SharedEncoderDictionary*)dict->dictionary);
+ BrotliFree(&dict->memory_manager_, dict->dictionary);
+ } else {
+ /* There is also kPreparedDictionaryMagic, but such instances should be
+ * constructed and destroyed by different means. */
+ }
+ dict->dictionary = NULL;
+ BrotliDestroyManagedDictionary(dict);
+}
+
+BROTLI_BOOL BrotliEncoderAttachPreparedDictionary(BrotliEncoderState* state,
+ const BrotliEncoderPreparedDictionary* dictionary) {
+ /* First field of dictionary structs */
+ const BrotliEncoderPreparedDictionary* dict = dictionary;
+ uint32_t magic = *((const uint32_t*)dict);
+ SharedEncoderDictionary* current = NULL;
+ if (magic == kManagedDictionaryMagic) {
+ /* Unwrap managed dictionary. */
+ ManagedDictionary* managed_dictionary = (ManagedDictionary*)dict;
+ magic = *managed_dictionary->dictionary;
+ dict = (BrotliEncoderPreparedDictionary*)managed_dictionary->dictionary;
+ }
+ current = &state->params.dictionary;
+ if (magic == kPreparedDictionaryMagic ||
+ magic == kLeanPreparedDictionaryMagic) {
+ const PreparedDictionary* prepared = (const PreparedDictionary*)dict;
+ if (!AttachPreparedDictionary(&current->compound, prepared)) {
+ return BROTLI_FALSE;
+ }
+ } else if (magic == kSharedDictionaryMagic) {
+ const SharedEncoderDictionary* attached =
+ (const SharedEncoderDictionary*)dict;
+ BROTLI_BOOL was_default = !current->contextual.context_based &&
+ current->contextual.num_dictionaries == 1 &&
+ current->contextual.dict[0]->hash_table_words ==
+ kStaticDictionaryHashWords &&
+ current->contextual.dict[0]->hash_table_lengths ==
+ kStaticDictionaryHashLengths;
+ BROTLI_BOOL new_default = !attached->contextual.context_based &&
+ attached->contextual.num_dictionaries == 1 &&
+ attached->contextual.dict[0]->hash_table_words ==
+ kStaticDictionaryHashWords &&
+ attached->contextual.dict[0]->hash_table_lengths ==
+ kStaticDictionaryHashLengths;
+ size_t i;
+ if (state->is_initialized_) return BROTLI_FALSE;
+ current->max_quality =
+ BROTLI_MIN(int, current->max_quality, attached->max_quality);
+ for (i = 0; i < attached->compound.num_chunks; i++) {
+ if (!AttachPreparedDictionary(&current->compound,
+ attached->compound.chunks[i])) {
+ return BROTLI_FALSE;
+ }
+ }
+ if (!new_default) {
+ if (!was_default) return BROTLI_FALSE;
+ /* Copy by value, but then set num_instances_ to 0 because their memory
+ is managed by attached, not by current */
+ current->contextual = attached->contextual;
+ current->contextual.num_instances_ = 0;
+ }
+ } else {
+ return BROTLI_FALSE;
+ }
+ return BROTLI_TRUE;
+}
+
+size_t BrotliEncoderEstimatePeakMemoryUsage(int quality, int lgwin,
+ size_t input_size) {
+ BrotliEncoderParams params;
+ size_t memory_manager_slots = BROTLI_ENCODER_MEMORY_MANAGER_SLOTS;
+ size_t memory_manager_size = memory_manager_slots * sizeof(void*);
+ BrotliEncoderInitParams(&params);
+ params.quality = quality;
+ params.lgwin = lgwin;
+ params.size_hint = input_size;
+ params.large_window = lgwin > BROTLI_MAX_WINDOW_BITS;
+ SanitizeParams(&params);
+ params.lgblock = ComputeLgBlock(&params);
+ ChooseHasher(&params, &params.hasher);
+ if (params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY ||
+ params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY) {
+ size_t state_size = sizeof(BrotliEncoderState);
+ size_t block_size = BROTLI_MIN(size_t, input_size, (1ul << params.lgwin));
+ size_t hash_table_size =
+ HashTableSize(MaxHashTableSize(params.quality), block_size);
+ size_t hash_size =
+ (hash_table_size < (1u << 10)) ? 0 : sizeof(int) * hash_table_size;
+ size_t cmdbuf_size = params.quality == FAST_TWO_PASS_COMPRESSION_QUALITY ?
+ 5 * BROTLI_MIN(size_t, block_size, 1ul << 17) : 0;
+ if (params.quality == FAST_ONE_PASS_COMPRESSION_QUALITY) {
+ state_size += sizeof(BrotliOnePassArena);
+ } else {
+ state_size += sizeof(BrotliTwoPassArena);
+ }
+ return hash_size + cmdbuf_size + state_size;
+ } else {
+ size_t short_ringbuffer_size = (size_t)1 << params.lgblock;
+ int ringbuffer_bits = ComputeRbBits(&params);
+ size_t ringbuffer_size = input_size < short_ringbuffer_size ?
+ input_size : (1u << ringbuffer_bits) + short_ringbuffer_size;
+ size_t hash_size[4] = {0};
+ size_t metablock_size =
+ BROTLI_MIN(size_t, input_size, MaxMetablockSize(&params));
+ size_t inputblock_size =
+ BROTLI_MIN(size_t, input_size, (size_t)1 << params.lgblock);
+ size_t cmdbuf_size = metablock_size * 2 + inputblock_size * 6;
+ size_t outbuf_size = metablock_size * 2 + 503;
+ size_t histogram_size = 0;
+ HasherSize(&params, BROTLI_TRUE, input_size, hash_size);
+ if (params.quality < MIN_QUALITY_FOR_BLOCK_SPLIT) {
+ cmdbuf_size = BROTLI_MIN(size_t, cmdbuf_size,
+ MAX_NUM_DELAYED_SYMBOLS * sizeof(Command) + inputblock_size * 12);
+ }
+ if (params.quality >= MIN_QUALITY_FOR_HQ_BLOCK_SPLITTING) {
+ /* Only a very rough estimation, based on enwik8. */
+ histogram_size = 200 << 20;
+ } else if (params.quality >= MIN_QUALITY_FOR_BLOCK_SPLIT) {
+ size_t literal_histograms =
+ BROTLI_MIN(size_t, metablock_size / 6144, 256);
+ size_t command_histograms =
+ BROTLI_MIN(size_t, metablock_size / 6144, 256);
+ size_t distance_histograms =
+ BROTLI_MIN(size_t, metablock_size / 6144, 256);
+ histogram_size = literal_histograms * sizeof(HistogramLiteral) +
+ command_histograms * sizeof(HistogramCommand) +
+ distance_histograms * sizeof(HistogramDistance);
+ }
+ return (memory_manager_size + ringbuffer_size +
+ hash_size[0] + hash_size[1] + hash_size[2] + hash_size[3] +
+ cmdbuf_size +
+ outbuf_size +
+ histogram_size);
+ }
+}
+size_t BrotliEncoderGetPreparedDictionarySize(
+ const BrotliEncoderPreparedDictionary* prepared_dictionary) {
+ /* First field of dictionary structs */
+ const BrotliEncoderPreparedDictionary* prepared = prepared_dictionary;
+ uint32_t magic = *((const uint32_t*)prepared);
+ size_t overhead = 0;
+ if (magic == kManagedDictionaryMagic) {
+ const ManagedDictionary* managed = (const ManagedDictionary*)prepared;
+ overhead = sizeof(ManagedDictionary);
+ magic = *managed->dictionary;
+ prepared = (const BrotliEncoderPreparedDictionary*)managed->dictionary;
+ }
+
+ if (magic == kPreparedDictionaryMagic) {
+ const PreparedDictionary* dictionary =
+ (const PreparedDictionary*)prepared;
+ /* Keep in sync with step 3 of CreatePreparedDictionary */
+ return sizeof(PreparedDictionary) + dictionary->source_size +
+ (sizeof(uint32_t) << dictionary->slot_bits) +
+ (sizeof(uint16_t) << dictionary->bucket_bits) +
+ (sizeof(uint32_t) * dictionary->num_items) + overhead;
+ } else if (magic == kLeanPreparedDictionaryMagic) {
+ const PreparedDictionary* dictionary =
+ (const PreparedDictionary*)prepared;
+ /* Keep in sync with step 3 of CreatePreparedDictionary */
+ return sizeof(PreparedDictionary) + sizeof(uint8_t*) +
+ (sizeof(uint32_t) << dictionary->slot_bits) +
+ (sizeof(uint16_t) << dictionary->bucket_bits) +
+ (sizeof(uint32_t) * dictionary->num_items) + overhead;
+ } else if (magic == kSharedDictionaryMagic) {
+ const SharedEncoderDictionary* dictionary =
+ (const SharedEncoderDictionary*)prepared;
+ const CompoundDictionary* compound = &dictionary->compound;
+ const ContextualEncoderDictionary* contextual = &dictionary->contextual;
+ size_t result = sizeof(*dictionary);
+ size_t i;
+ size_t num_instances;
+ const BrotliEncoderDictionary* instances;
+ for (i = 0; i < compound->num_prepared_instances_; i++) {
+ size_t size = BrotliEncoderGetPreparedDictionarySize(
+ (const BrotliEncoderPreparedDictionary*)
+ compound->prepared_instances_[i]);
+ if (!size) return 0; /* error */
+ result += size;
+ }
+ if (contextual->context_based) {
+ num_instances = contextual->num_instances_;
+ instances = contextual->instances_;
+ result += sizeof(*instances) * num_instances;
+ } else {
+ num_instances = 1;
+ instances = &contextual->instance_;
+ }
+ for (i = 0; i < num_instances; i++) {
+ const BrotliEncoderDictionary* dict = &instances[i];
+ result += dict->trie.pool_capacity * sizeof(BrotliTrieNode);
+ if (dict->hash_table_data_words_) {
+ result += sizeof(kStaticDictionaryHashWords);
+ }
+ if (dict->hash_table_data_lengths_) {
+ result += sizeof(kStaticDictionaryHashLengths);
+ }
+ if (dict->buckets_data_) {
+ result += sizeof(*dict->buckets_data_) * dict->buckets_alloc_size_;
+ }
+ if (dict->dict_words_data_) {
+ result += sizeof(*dict->dict_words) * dict->dict_words_alloc_size_;
+ }
+ if (dict->words_instance_) {
+ result += sizeof(*dict->words_instance_);
+ /* data_size not added here: it is never allocated by the
+ SharedEncoderDictionary, instead it always points to the file
+ already loaded in memory. So if the caller wants to include
+ this memory as well, add the size of the loaded dictionary
+ file to this. */
+ }
+ }
+ return result + overhead;
+ }
+ return 0; /* error */
+}
+
+#if defined(BROTLI_TEST)
+size_t MakeUncompressedStreamForTest(const uint8_t*, size_t, uint8_t*);
+size_t MakeUncompressedStreamForTest(
+ const uint8_t* input, size_t input_size, uint8_t* output) {
+ return MakeUncompressedStream(input, input_size, output);
+}
+#endif
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/encoder_dict.c b/dviware/dvisvgm/libs/brotli/enc/encoder_dict.c
index c9e963b89d..6602c55a24 100644
--- a/dviware/dvisvgm/libs/brotli/enc/encoder_dict.c
+++ b/dviware/dvisvgm/libs/brotli/enc/encoder_dict.c
@@ -4,18 +4,45 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./encoder_dict.h"
+#include "encoder_dict.h"
+
+#include <stdlib.h> /* malloc, free */
#include "../common/dictionary.h"
+#include "../common/platform.h"
+#include "../common/shared_dictionary_internal.h"
#include "../common/transform.h"
-#include "./dictionary_hash.h"
-#include "./hash.h"
+#include "compound_dictionary.h"
+#include "dictionary_hash.h"
+#include "memory.h"
+#include "quality.h"
+#include "hash.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict) {
+#define NUM_HASH_BITS 15u
+#define NUM_HASH_BUCKETS (1u << NUM_HASH_BITS)
+
+static void BrotliTrieInit(BrotliTrie* trie) {
+ trie->pool_capacity = 0;
+ trie->pool_size = 0;
+ trie->pool = 0;
+
+ /* Set up the root node */
+ trie->root.single = 0;
+ trie->root.len_ = 0;
+ trie->root.idx_ = 0;
+ trie->root.sub = 0;
+}
+
+static void BrotliTrieFree(MemoryManager* m, BrotliTrie* trie) {
+ BrotliFree(m, trie->pool);
+}
+
+/* Initializes to RFC 7932 static dictionary / transforms. */
+static void InitEncoderDictionary(BrotliEncoderDictionary* dict) {
dict->words = BrotliGetDictionary();
dict->num_transforms = (uint32_t)BrotliGetTransforms()->num_transforms;
@@ -26,8 +53,588 @@ void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict) {
dict->cutoffTransformsCount = kCutoffTransformsCount;
dict->cutoffTransforms = kCutoffTransforms;
+
+ dict->parent = 0;
+
+ dict->hash_table_data_words_ = 0;
+ dict->hash_table_data_lengths_ = 0;
+ dict->buckets_alloc_size_ = 0;
+ dict->buckets_data_ = 0;
+ dict->dict_words_alloc_size_ = 0;
+ dict->dict_words_data_ = 0;
+ dict->words_instance_ = 0;
+ dict->has_words_heavy = BROTLI_FALSE;
+ BrotliTrieInit(&dict->trie);
+}
+
+static void BrotliDestroyEncoderDictionary(MemoryManager* m,
+ BrotliEncoderDictionary* dict) {
+ BrotliFree(m, dict->hash_table_data_words_);
+ BrotliFree(m, dict->hash_table_data_lengths_);
+ BrotliFree(m, dict->buckets_data_);
+ BrotliFree(m, dict->dict_words_data_);
+ BrotliFree(m, dict->words_instance_);
+ BrotliTrieFree(m, &dict->trie);
+}
+
+#if defined(BROTLI_EXPERIMENTAL)
+/* Word length must be at least 4 bytes */
+static uint32_t Hash(const uint8_t* data, int bits) {
+ uint32_t h = BROTLI_UNALIGNED_LOAD32LE(data) * kHashMul32;
+ /* The higher bits contain more mixture from the multiplication,
+ so we take our results from there. */
+ return h >> (32 - bits);
+}
+
+/* Theoretical max possible word size after transform */
+#define kTransformedBufferSize \
+ (256 + 256 + SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH)
+
+/* To be safe buffer must have at least kTransformedBufferSize */
+static void TransformedDictionaryWord(uint32_t word_idx, int len, int transform,
+ const BrotliTransforms* transforms,
+ const BrotliEncoderDictionary* dict,
+ uint8_t* buffer, size_t* size) {
+ const uint8_t* dict_word = &dict->words->data[
+ dict->words->offsets_by_length[len] + (uint32_t)len * word_idx];
+ *size = (size_t)BrotliTransformDictionaryWord(buffer, dict_word, len,
+ transforms, transform);
+}
+
+static DictWord MakeDictWord(uint8_t len, uint8_t transform, uint16_t idx) {
+ DictWord result;
+ result.len = len;
+ result.transform = transform;
+ result.idx = idx;
+ return result;
+}
+
+static uint32_t BrotliTrieAlloc(MemoryManager* m, size_t num, BrotliTrie* trie,
+ BrotliTrieNode** keep) {
+ uint32_t result;
+ uint32_t keep_index = 0;
+ if (keep && *keep != &trie->root) {
+ /* Optional node to keep, since address may change after re-allocating */
+ keep_index = (uint32_t)(*keep - trie->pool);
+ }
+ if (trie->pool_size == 0) {
+ /* Have a dummy node in the front. We do not want the result to be 0, it
+ must be at least 1, 0 represents "null pointer" */
+ trie->pool_size = 1;
+ }
+ BROTLI_ENSURE_CAPACITY(m, BrotliTrieNode, trie->pool, trie->pool_capacity,
+ trie->pool_size + num);
+ if (BROTLI_IS_OOM(m)) return 0;
+ /* Init the new nodes to empty */
+ memset(trie->pool + trie->pool_size, 0, sizeof(*trie->pool) * num);
+ result = (uint32_t)trie->pool_size;
+ trie->pool_size += num;
+ if (keep && *keep != &trie->root) {
+ *keep = trie->pool + keep_index;
+ }
+ return result;
+}
+
+/**
+ * len and idx: payload for last node
+ * word, size: the string
+ * index: position in the string
+ */
+static BROTLI_BOOL BrotliTrieNodeAdd(MemoryManager* m, uint8_t len,
+ uint32_t idx, const uint8_t* word, size_t size, int index,
+ BrotliTrieNode* node, BrotliTrie* trie) {
+ BrotliTrieNode* child = 0;
+ uint8_t c;
+ if ((size_t)index == size) {
+ if (!node->len_ || idx < node->idx_) {
+ node->len_ = len;
+ node->idx_ = idx;
+ }
+ return BROTLI_TRUE;
+ }
+ c = word[index];
+ if (node->single && c != node->c) {
+ BrotliTrieNode old = trie->pool[node->sub];
+ uint32_t new_nodes = BrotliTrieAlloc(m, 32, trie, &node);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ node->single = 0;
+ node->sub = new_nodes;
+ trie->pool[node->sub + (node->c >> 4)].sub = new_nodes + 16;
+ trie->pool[trie->pool[node->sub + (node->c >> 4)].sub + (node->c & 15)] =
+ old;
+ }
+ if (!node->sub) {
+ uint32_t new_node = BrotliTrieAlloc(m, 1, trie, &node);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ node->single = 1;
+ node->c = c;
+ node->sub = new_node;
+ }
+ if (node->single) {
+ child = &trie->pool[node->sub];
+ } else {
+ if (!trie->pool[node->sub + (c >> 4)].sub) {
+ uint32_t new_nodes = BrotliTrieAlloc(m, 16, trie, &node);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ trie->pool[node->sub + (c >> 4)].sub = new_nodes;
+ }
+ child = &trie->pool[trie->pool[node->sub + (c >> 4)].sub + (c & 15)];
+ }
+ return BrotliTrieNodeAdd(m, len, idx, word, size, index + 1, child, trie);
+}
+
+static BROTLI_BOOL BrotliTrieAdd(MemoryManager* m, uint8_t len, uint32_t idx,
+ const uint8_t* word, size_t size, BrotliTrie* trie) {
+ return BrotliTrieNodeAdd(m, len, idx, word, size, 0, &trie->root, trie);
+}
+
+const BrotliTrieNode* BrotliTrieSub(const BrotliTrie* trie,
+ const BrotliTrieNode* node, uint8_t c) {
+ BrotliTrieNode* temp_node;
+ if (node->single) {
+ if (node->c == c) return &trie->pool[node->sub];
+ return 0;
+ }
+ if (!node->sub) return 0;
+ temp_node = &trie->pool[node->sub + (c >> 4)];
+ if (!temp_node->sub) return 0;
+ return &trie->pool[temp_node->sub + (c & 15)];
+}
+
+static const BrotliTrieNode* BrotliTrieFind(const BrotliTrie* trie,
+ const uint8_t* word, size_t size) {
+ const BrotliTrieNode* node = &trie->root;
+ size_t i;
+ for (i = 0; i < size; i++) {
+ node = BrotliTrieSub(trie, node, word[i]);
+ if (!node) return 0;
+ }
+ return node;
+}
+
+static BROTLI_BOOL BuildDictionaryLut(MemoryManager* m,
+ const BrotliTransforms* transforms,
+ BrotliEncoderDictionary* dict) {
+ uint32_t i;
+ DictWord* dict_words;
+ uint16_t* buckets;
+ DictWord** words_by_hash;
+ size_t* words_by_hash_size;
+ size_t* words_by_hash_capacity;
+ BrotliTrie dedup;
+ uint8_t word[kTransformedBufferSize];
+ size_t word_size;
+ size_t total = 0;
+ uint8_t l;
+ uint16_t idx;
+
+ BrotliTrieInit(&dedup);
+
+ words_by_hash = (DictWord**)BrotliAllocate(m,
+ sizeof(*words_by_hash) * NUM_HASH_BUCKETS);
+ words_by_hash_size = (size_t*)BrotliAllocate(m,
+ sizeof(*words_by_hash_size) * NUM_HASH_BUCKETS);
+ words_by_hash_capacity = (size_t*)BrotliAllocate(m,
+ sizeof(*words_by_hash_capacity) * NUM_HASH_BUCKETS);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ memset(words_by_hash, 0, sizeof(*words_by_hash) * NUM_HASH_BUCKETS);
+ memset(words_by_hash_size, 0, sizeof(*words_by_hash_size) * NUM_HASH_BUCKETS);
+ memset(words_by_hash_capacity, 0,
+ sizeof(*words_by_hash_capacity) * NUM_HASH_BUCKETS);
+
+ if (transforms->num_transforms > 0) {
+ for (l = SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH;
+ l <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH; ++l) {
+ uint16_t n = dict->words->size_bits_by_length[l] ?
+ (uint16_t)(1 << dict->words->size_bits_by_length[l]) : 0u;
+ for (idx = 0; idx < n; ++idx) {
+ uint32_t key;
+ /* First transform (usually identity) */
+ TransformedDictionaryWord(idx, l, 0, transforms, dict, word,
+ &word_size);
+ /* Cannot hash words smaller than 4 bytes */
+ if (word_size < 4) {
+ /* Break instead of continue, all next words of this length will have
+ same length after transform */
+ break;
+ }
+ if (!BrotliTrieAdd(m, 0, idx, word, word_size, &dedup)) {
+ return BROTLI_FALSE;
+ }
+ key = Hash(word, NUM_HASH_BITS);
+ BROTLI_ENSURE_CAPACITY_APPEND(m, DictWord, words_by_hash[key],
+ words_by_hash_capacity[key], words_by_hash_size[key],
+ MakeDictWord(l, 0, idx));
+ ++total;
+ }
+ }
+ }
+
+ /* These LUT transforms only supported if no custom transforms. This is
+ ok, we will use the heavy trie instead. */
+ if (transforms == BrotliGetTransforms()) {
+ for (l = SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH;
+ l <= SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH; ++l) {
+ uint16_t n = dict->words->size_bits_by_length[l] ?
+ (uint16_t)(1 << dict->words->size_bits_by_length[l]) : 0u;
+ for (idx = 0; idx < n; ++idx) {
+ int k;
+ BROTLI_BOOL is_ascii = BROTLI_TRUE;
+ size_t offset = dict->words->offsets_by_length[l] + (size_t)l * idx;
+ const uint8_t* data = &dict->words->data[offset];
+ for (k = 0; k < l; ++k) {
+ if (data[k] >= 128) is_ascii = BROTLI_FALSE;
+ }
+ if (data[0] < 128) {
+ int transform = 9; /* {empty, uppercase first, empty} */
+ uint32_t ix = idx + (uint32_t)transform * n;
+ const BrotliTrieNode* it;
+ TransformedDictionaryWord(idx, l, transform, transforms,
+ dict, word, &word_size);
+ it = BrotliTrieFind(&dedup, word, word_size);
+ if (!it || it->idx_ > ix) {
+ uint32_t key = Hash(word, NUM_HASH_BITS);
+ if (!BrotliTrieAdd(m, 0, ix, word, word_size, &dedup)) {
+ return BROTLI_FALSE;
+ }
+ BROTLI_ENSURE_CAPACITY_APPEND(m, DictWord, words_by_hash[key],
+ words_by_hash_capacity[key], words_by_hash_size[key],
+ MakeDictWord(l, BROTLI_TRANSFORM_UPPERCASE_FIRST, idx));
+ ++total;
+ }
+ }
+ if (is_ascii) {
+ int transform = 44; /* {empty, uppercase all, empty} */
+ uint32_t ix = idx + (uint32_t)transform * n;
+ const BrotliTrieNode* it;
+ TransformedDictionaryWord(idx, l, transform, transforms,
+ dict, word, &word_size);
+ it = BrotliTrieFind(&dedup, word, word_size);
+ if (!it || it->idx_ > ix) {
+ uint32_t key = Hash(word, NUM_HASH_BITS);
+ if (!BrotliTrieAdd(m, 0, ix, word, word_size, &dedup)) {
+ return BROTLI_FALSE;
+ }
+ BROTLI_ENSURE_CAPACITY_APPEND(m, DictWord, words_by_hash[key],
+ words_by_hash_capacity[key], words_by_hash_size[key],
+ MakeDictWord(l, BROTLI_TRANSFORM_UPPERCASE_ALL, idx));
+ ++total;
+ }
+ }
+ }
+ }
+ }
+
+ dict_words = (DictWord*)BrotliAllocate(m,
+ sizeof(*dict->dict_words) * (total + 1));
+ buckets = (uint16_t*)BrotliAllocate(m,
+ sizeof(*dict->buckets) * NUM_HASH_BUCKETS);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ dict->dict_words_alloc_size_ = total + 1;
+ dict->dict_words = dict->dict_words_data_ = dict_words;
+ dict->buckets_alloc_size_ = NUM_HASH_BUCKETS;
+ dict->buckets = dict->buckets_data_ = buckets;
+
+ /* Unused; makes offsets start from 1. */
+ dict_words[0] = MakeDictWord(0, 0, 0);
+ total = 1;
+ for (i = 0; i < NUM_HASH_BUCKETS; ++i) {
+ size_t num_words = words_by_hash_size[i];
+ if (num_words > 0) {
+ buckets[i] = (uint16_t)(total);
+ memcpy(&dict_words[total], &words_by_hash[i][0],
+ sizeof(dict_words[0]) * num_words);
+ total += num_words;
+ dict_words[total - 1].len |= 0x80;
+ } else {
+ buckets[i] = 0;
+ }
+ }
+
+ for (i = 0; i < NUM_HASH_BUCKETS; ++i) {
+ BrotliFree(m, words_by_hash[i]);
+ }
+ BrotliFree(m, words_by_hash);
+ BrotliFree(m, words_by_hash_size);
+ BrotliFree(m, words_by_hash_capacity);
+ BrotliTrieFree(m, &dedup);
+
+ return BROTLI_TRUE;
+}
+
+static void BuildDictionaryHashTable(uint16_t* hash_table_words,
+ uint8_t* hash_table_lengths, const BrotliDictionary* dict) {
+ int j, len;
+ /* The order of the loops is such that in case of collision, words with
+ shorter length are preferred, and in case of same length, words with
+ smaller index. There is only a single word per bucket. */
+ /* TODO(lode): consider adding optional user-supplied frequency_map to use
+ for preferred words instead, this can make the encoder better for
+ quality 9 and below without affecting the decoder */
+ memset(hash_table_words, 0, sizeof(kStaticDictionaryHashWords));
+ memset(hash_table_lengths, 0, sizeof(kStaticDictionaryHashLengths));
+ for (len = SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH;
+ len >= SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH; --len) {
+ const size_t num_words = dict->size_bits_by_length[len] ?
+ (1u << dict->size_bits_by_length[len]) : 0;
+ for (j = (int)num_words - 1; j >= 0; --j) {
+ size_t offset = dict->offsets_by_length[len] +
+ (size_t)len * (size_t)j;
+ const uint8_t* word = &dict->data[offset];
+ const uint32_t key = Hash(word, 14);
+ int idx = (int)(key << 1) + (len < 8 ? 1 : 0);
+ BROTLI_DCHECK(idx < (int)NUM_HASH_BUCKETS);
+ hash_table_words[idx] = (uint16_t)j;
+ hash_table_lengths[idx] = (uint8_t)len;
+ }
+ }
}
+static BROTLI_BOOL GenerateWordsHeavy(MemoryManager* m,
+ const BrotliTransforms* transforms,
+ BrotliEncoderDictionary* dict) {
+ int i, j, l;
+ for (j = (int)transforms->num_transforms - 1; j >= 0 ; --j) {
+ for (l = 0; l < 32; l++) {
+ int num = (int)((1u << dict->words->size_bits_by_length[l]) & ~1u);
+ for (i = 0; i < num; i++) {
+ uint8_t transformed[kTransformedBufferSize];
+ size_t size;
+ TransformedDictionaryWord(
+ (uint32_t)i, l, j, transforms, dict, transformed, &size);
+ if (size < 4) continue;
+ if (!BrotliTrieAdd(m, (uint8_t)l, (uint32_t)(i + num * j),
+ transformed, size, &dict->trie)) {
+ return BROTLI_FALSE;
+ }
+ }
+ }
+ }
+ return BROTLI_TRUE;
+}
+
+/* Computes cutoffTransformsCount (in count) and cutoffTransforms (in data) for
+ the custom transforms, where possible within the limits of the
+ cutoffTransforms encoding. The fast encoder uses this to do fast lookup for
+ transforms that remove the N last characters (OmitLast). */
+static void ComputeCutoffTransforms(
+ const BrotliTransforms* transforms,
+ uint32_t* count, uint64_t* data) {
+ int i;
+ /* The encoding in a 64-bit integer of transform N in the data is: (N << 2) +
+ ((cutoffTransforms >> (N * 6)) & 0x3F), so for example the identity
+ transform code must be 0-63, for N=1 the transform code must be 4-67, ...,
+ for N=9 it must be 36-99.
+ TODO(lode): consider a simple flexible uint8_t[10] instead of the uint64_t
+ for the cutoff transforms, so that shared dictionaries can have the
+ OmitLast transforms anywhere without loss. */
+ *count = 0;
+ *data = 0;
+ for (i = 0; i < BROTLI_TRANSFORMS_MAX_CUT_OFF + 1; i++) {
+ int idx = transforms->cutOffTransforms[i];
+ if (idx == -1) break; /* Not found */
+ if (idx < (i << 2)) break; /* Too small for the encoding */
+ if (idx >= (i << 2) + 64) break; /* Too large for the encoding */
+ (*count)++;
+ *data |= (uint64_t)(((uint64_t)idx -
+ ((uint64_t)i << 2u)) << ((uint64_t)i * 6u));
+ }
+}
+
+static BROTLI_BOOL ComputeDictionary(MemoryManager* m, int quality,
+ const BrotliTransforms* transforms,
+ BrotliEncoderDictionary* current) {
+ int default_words = current->words == BrotliGetDictionary();
+ int default_transforms = transforms == BrotliGetTransforms();
+
+ if (default_words && default_transforms) {
+ /* hashes are already set to Brotli defaults */
+ return BROTLI_TRUE;
+ }
+
+ current->hash_table_data_words_ = (uint16_t*)BrotliAllocate(
+ m, sizeof(kStaticDictionaryHashWords));
+ current->hash_table_data_lengths_ = (uint8_t*)BrotliAllocate(
+ m, sizeof(kStaticDictionaryHashLengths));
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ current->hash_table_words = current->hash_table_data_words_;
+ current->hash_table_lengths = current->hash_table_data_lengths_;
+
+ BuildDictionaryHashTable(current->hash_table_data_words_,
+ current->hash_table_data_lengths_, current->words);
+
+ ComputeCutoffTransforms(transforms,
+ &current->cutoffTransformsCount, &current->cutoffTransforms);
+
+ /* Only compute the data for slow encoder if the requested quality is high
+ enough to need it */
+ if (quality >= ZOPFLIFICATION_QUALITY) {
+ if (!BuildDictionaryLut(m, transforms, current)) return BROTLI_FALSE;
+
+ /* For the built-in Brotli transforms, there is a hard-coded function to
+ handle all transforms, but for custom transforms, we use the following
+ large hammer instead */
+ current->has_words_heavy = !default_transforms;
+ if (current->has_words_heavy) {
+ if (!GenerateWordsHeavy(m, transforms, current)) return BROTLI_FALSE;
+ }
+ }
+
+ return BROTLI_TRUE;
+}
+#endif /* BROTLI_EXPERIMENTAL */
+
+void BrotliInitSharedEncoderDictionary(SharedEncoderDictionary* dict) {
+ dict->magic = kSharedDictionaryMagic;
+
+ dict->compound.num_chunks = 0;
+ dict->compound.total_size = 0;
+ dict->compound.chunk_offsets[0] = 0;
+ dict->compound.num_prepared_instances_ = 0;
+
+ dict->contextual.context_based = 0;
+ dict->contextual.num_dictionaries = 1;
+ dict->contextual.instances_ = 0;
+ dict->contextual.num_instances_ = 1; /* The instance_ field */
+ dict->contextual.dict[0] = &dict->contextual.instance_;
+ InitEncoderDictionary(&dict->contextual.instance_);
+ dict->contextual.instance_.parent = &dict->contextual;
+
+ dict->max_quality = BROTLI_MAX_QUALITY;
+}
+
+#if defined(BROTLI_EXPERIMENTAL)
+/* TODO(eustas): make sure that tooling will warn user if not all the cutoff
+ transforms are available (for low-quality encoder). */
+static BROTLI_BOOL InitCustomSharedEncoderDictionary(
+ MemoryManager* m, const BrotliSharedDictionary* decoded_dict,
+ int quality, SharedEncoderDictionary* dict) {
+ ContextualEncoderDictionary* contextual;
+ CompoundDictionary* compound;
+ BrotliEncoderDictionary* instances;
+ int i;
+ BrotliInitSharedEncoderDictionary(dict);
+
+ contextual = &dict->contextual;
+ compound = &dict->compound;
+
+ for (i = 0; i < (int)decoded_dict->num_prefix; i++) {
+ PreparedDictionary* prepared = CreatePreparedDictionary(m,
+ decoded_dict->prefix[i], decoded_dict->prefix_size[i]);
+ AttachPreparedDictionary(compound, prepared);
+ /* remember for cleanup */
+ compound->prepared_instances_[
+ compound->num_prepared_instances_++] = prepared;
+ }
+
+ dict->max_quality = quality;
+ contextual->context_based = decoded_dict->context_based;
+ if (decoded_dict->context_based) {
+ memcpy(contextual->context_map, decoded_dict->context_map,
+ SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS);
+ }
+
+ contextual->num_dictionaries = decoded_dict->num_dictionaries;
+ contextual->num_instances_ = decoded_dict->num_dictionaries;
+ if (contextual->num_instances_ == 1) {
+ instances = &contextual->instance_;
+ } else {
+ contextual->instances_ = (BrotliEncoderDictionary*)
+ BrotliAllocate(m, sizeof(*contextual->instances_) *
+ contextual->num_instances_);
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ instances = contextual->instances_;
+ }
+ for (i = 0; i < (int)contextual->num_instances_; i++) {
+ BrotliEncoderDictionary* current = &instances[i];
+ InitEncoderDictionary(current);
+ current->parent = &dict->contextual;
+ if (decoded_dict->words[i] == BrotliGetDictionary()) {
+ current->words = BrotliGetDictionary();
+ } else {
+ current->words_instance_ = (BrotliDictionary*)BrotliAllocate(
+ m, sizeof(BrotliDictionary));
+ if (BROTLI_IS_OOM(m)) return BROTLI_FALSE;
+ *current->words_instance_ = *decoded_dict->words[i];
+ current->words = current->words_instance_;
+ }
+ current->num_transforms =
+ (uint32_t)decoded_dict->transforms[i]->num_transforms;
+ if (!ComputeDictionary(
+ m, quality, decoded_dict->transforms[i], current)) {
+ return BROTLI_FALSE;
+ }
+
+ contextual->dict[i] = current;
+ }
+
+ return BROTLI_TRUE; /* success */
+}
+
+BROTLI_BOOL BrotliInitCustomSharedEncoderDictionary(
+ MemoryManager* m, const uint8_t* encoded_dict, size_t size,
+ int quality, SharedEncoderDictionary* dict) {
+ BROTLI_BOOL success = BROTLI_FALSE;
+ BrotliSharedDictionary* decoded_dict = BrotliSharedDictionaryCreateInstance(
+ m->alloc_func, m->free_func, m->opaque);
+ if (!decoded_dict) { /* OOM */
+ return BROTLI_FALSE;
+ }
+ success = BrotliSharedDictionaryAttach(
+ decoded_dict, BROTLI_SHARED_DICTIONARY_SERIALIZED, size, encoded_dict);
+ if (success) {
+ success = InitCustomSharedEncoderDictionary(m,
+ decoded_dict, quality, dict);
+ }
+ BrotliSharedDictionaryDestroyInstance(decoded_dict);
+ return success;
+}
+#endif /* BROTLI_EXPERIMENTAL */
+
+void BrotliCleanupSharedEncoderDictionary(MemoryManager* m,
+ SharedEncoderDictionary* dict) {
+ size_t i;
+ for (i = 0; i < dict->compound.num_prepared_instances_; i++) {
+ DestroyPreparedDictionary(m,
+ (PreparedDictionary*)dict->compound.prepared_instances_[i]);
+ }
+ if (dict->contextual.num_instances_ == 1) {
+ BrotliDestroyEncoderDictionary(m, &dict->contextual.instance_);
+ } else if (dict->contextual.num_instances_ > 1) {
+ for (i = 0; i < dict->contextual.num_instances_; i++) {
+ BrotliDestroyEncoderDictionary(m, &dict->contextual.instances_[i]);
+ }
+ BrotliFree(m, dict->contextual.instances_);
+ }
+}
+
+ManagedDictionary* BrotliCreateManagedDictionary(
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
+ ManagedDictionary* result = (ManagedDictionary*)BrotliBootstrapAlloc(
+ sizeof(ManagedDictionary), alloc_func, free_func, opaque);
+ if (result == NULL) return NULL;
+
+ result->magic = kManagedDictionaryMagic;
+ BrotliInitMemoryManager(
+ &result->memory_manager_, alloc_func, free_func, opaque);
+ result->dictionary = NULL;
+
+ return result;
+}
+
+void BrotliDestroyManagedDictionary(ManagedDictionary* dictionary) {
+ if (!dictionary) return;
+ BrotliBootstrapFree(dictionary, &dictionary->memory_manager_);
+}
+
+/* Escalate internal functions visibility; for testing purposes only. */
+#if defined(BROTLI_TEST)
+void InitEncoderDictionaryForTest(BrotliEncoderDictionary*);
+void InitEncoderDictionaryForTest(BrotliEncoderDictionary* d) {
+ InitEncoderDictionary(d);
+}
+#endif
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/encoder_dict.h b/dviware/dvisvgm/libs/brotli/enc/encoder_dict.h
index a1c329fbf4..27dcbcd2f3 100644
--- a/dviware/dvisvgm/libs/brotli/enc/encoder_dict.h
+++ b/dviware/dvisvgm/libs/brotli/enc/encoder_dict.h
@@ -7,15 +7,56 @@
#ifndef BROTLI_ENC_ENCODER_DICT_H_
#define BROTLI_ENC_ENCODER_DICT_H_
+#include <brotli/shared_dictionary.h>
+#include <brotli/types.h>
+
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./static_dict_lut.h"
+#include "compound_dictionary.h"
+#include "memory.h"
+#include "static_dict_lut.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
+/*
+Dictionary hierarchy for Encoder:
+-SharedEncoderDictionary
+--CompoundDictionary
+---PreparedDictionary [up to 15x]
+ = prefix dictionary with precomputed hashes
+--ContextualEncoderDictionary
+---BrotliEncoderDictionary [up to 64x]
+ = for each context, precomputed static dictionary with words + transforms
+
+Dictionary hiearchy from common: similar, but without precomputed hashes
+-BrotliSharedDictionary
+--BrotliDictionary [up to 64x]
+--BrotliTransforms [up to 64x]
+--const uint8_t* prefix [up to 15x]: compound dictionaries
+*/
+
+typedef struct BrotliTrieNode {
+ uint8_t single; /* if 1, sub is a single node for c instead of 256 */
+ uint8_t c;
+ uint8_t len_; /* untransformed length */
+ uint32_t idx_; /* word index + num words * transform index */
+ uint32_t sub; /* index of sub node(s) in the pool */
+} BrotliTrieNode;
+
+typedef struct BrotliTrie {
+ BrotliTrieNode* pool;
+ size_t pool_capacity;
+ size_t pool_size;
+ BrotliTrieNode root;
+} BrotliTrie;
+
+#if defined(BROTLI_EXPERIMENTAL)
+BROTLI_INTERNAL const BrotliTrieNode* BrotliTrieSub(const BrotliTrie* trie,
+ const BrotliTrieNode* node, uint8_t c);
+#endif /* BROTLI_EXPERIMENTAL */
+
/* Dictionary data (words and transforms) for 1 possible context */
typedef struct BrotliEncoderDictionary {
const BrotliDictionary* words;
@@ -32,9 +73,82 @@ typedef struct BrotliEncoderDictionary {
/* from static_dict_lut.h, for slow encoder */
const uint16_t* buckets;
const DictWord* dict_words;
+ /* Heavy version, for use by slow encoder when there are custom transforms.
+ Contains every possible transformed dictionary word in a trie. It encodes
+ about as fast as the non-heavy encoder but consumes a lot of memory and
+ takes time to build. */
+ BrotliTrie trie;
+ BROTLI_BOOL has_words_heavy;
+
+ /* Reference to other dictionaries. */
+ const struct ContextualEncoderDictionary* parent;
+
+ /* Allocated memory, used only when not using the Brotli defaults */
+ uint16_t* hash_table_data_words_;
+ uint8_t* hash_table_data_lengths_;
+ size_t buckets_alloc_size_;
+ uint16_t* buckets_data_;
+ size_t dict_words_alloc_size_;
+ DictWord* dict_words_data_;
+ BrotliDictionary* words_instance_;
} BrotliEncoderDictionary;
-BROTLI_INTERNAL void BrotliInitEncoderDictionary(BrotliEncoderDictionary* dict);
+/* Dictionary data for all 64 contexts */
+typedef struct ContextualEncoderDictionary {
+ BROTLI_BOOL context_based;
+ uint8_t num_dictionaries;
+ uint8_t context_map[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS];
+ const BrotliEncoderDictionary* dict[SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS];
+
+ /* If num_instances_ is 1, instance_ is used, else dynamic allocation with
+ instances_ is used. */
+ size_t num_instances_;
+ BrotliEncoderDictionary instance_;
+ BrotliEncoderDictionary* instances_;
+} ContextualEncoderDictionary;
+
+typedef struct SharedEncoderDictionary {
+ /* Magic value to distinguish this struct from PreparedDictionary for
+ certain external usages. */
+ uint32_t magic;
+
+ /* LZ77 prefix, compound dictionary */
+ CompoundDictionary compound;
+
+ /* Custom static dictionary (optionally context-based) */
+ ContextualEncoderDictionary contextual;
+
+ /* The maximum quality the dictionary was computed for */
+ int max_quality;
+} SharedEncoderDictionary;
+
+typedef struct ManagedDictionary {
+ uint32_t magic;
+ MemoryManager memory_manager_;
+ uint32_t* dictionary;
+} ManagedDictionary;
+
+/* Initializes to the brotli built-in dictionary */
+BROTLI_INTERNAL void BrotliInitSharedEncoderDictionary(
+ SharedEncoderDictionary* dict);
+
+#if defined(BROTLI_EXPERIMENTAL)
+/* Initializes to shared dictionary that will be parsed from
+ encoded_dict. Requires that you keep the encoded_dict buffer
+ around, parts of data will point to it. */
+BROTLI_INTERNAL BROTLI_BOOL BrotliInitCustomSharedEncoderDictionary(
+ MemoryManager* m, const uint8_t* encoded_dict, size_t size,
+ int quality, SharedEncoderDictionary* dict);
+#endif /* BROTLI_EXPERIMENTAL */
+
+BROTLI_INTERNAL void BrotliCleanupSharedEncoderDictionary(
+ MemoryManager* m, SharedEncoderDictionary* dict);
+
+BROTLI_INTERNAL ManagedDictionary* BrotliCreateManagedDictionary(
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
+
+BROTLI_INTERNAL void BrotliDestroyManagedDictionary(
+ ManagedDictionary* dictionary);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/entropy_encode.c b/dviware/dvisvgm/libs/brotli/enc/entropy_encode.c
index b50ccb5d1f..9aed43b6eb 100644
--- a/dviware/dvisvgm/libs/brotli/enc/entropy_encode.c
+++ b/dviware/dvisvgm/libs/brotli/enc/entropy_encode.c
@@ -6,13 +6,14 @@
/* Entropy encoding (Huffman) utilities. */
-#include "./entropy_encode.h"
+#include "entropy_encode.h"
#include <string.h> /* memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/entropy_encode.h b/dviware/dvisvgm/libs/brotli/enc/entropy_encode.h
index 9618e1d359..e1c779cc6f 100644
--- a/dviware/dvisvgm/libs/brotli/enc/entropy_encode.h
+++ b/dviware/dvisvgm/libs/brotli/enc/entropy_encode.h
@@ -9,9 +9,10 @@
#ifndef BROTLI_ENC_ENTROPY_ENCODE_H_
#define BROTLI_ENC_ENTROPY_ENCODE_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h b/dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h
index 62b99a954c..ecff1fe9ee 100644
--- a/dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h
+++ b/dviware/dvisvgm/libs/brotli/enc/entropy_encode_static.h
@@ -9,10 +9,11 @@
#ifndef BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
#define BROTLI_ENC_ENTROPY_ENCODE_STATIC_H_
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./write_bits.h"
+#include "write_bits.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -76,6 +77,7 @@ static const uint8_t kStaticDistanceCodeDepth[64] = {
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
};
+/* GENERATED CODE START */
static const uint32_t kCodeLengthBits[18] = {
0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 15, 31, 0, 11, 7,
};
@@ -531,6 +533,7 @@ static BROTLI_INLINE void StoreStaticDistanceHuffmanTree(
size_t* storage_ix, uint8_t* storage) {
BrotliWriteBits(28, 0x0369DC03u, storage_ix, storage);
}
+/* GENERATED CODE END */
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/fast_log.c b/dviware/dvisvgm/libs/brotli/enc/fast_log.c
index 2319baeb74..2fa0efcf86 100644
--- a/dviware/dvisvgm/libs/brotli/enc/fast_log.c
+++ b/dviware/dvisvgm/libs/brotli/enc/fast_log.c
@@ -4,7 +4,7 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./fast_log.h"
+#include "fast_log.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/fast_log.h b/dviware/dvisvgm/libs/brotli/enc/fast_log.h
index 2094f13e55..f82f4cffc8 100644
--- a/dviware/dvisvgm/libs/brotli/enc/fast_log.h
+++ b/dviware/dvisvgm/libs/brotli/enc/fast_log.h
@@ -11,9 +11,10 @@
#include <math.h>
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/find_match_length.h b/dviware/dvisvgm/libs/brotli/enc/find_match_length.h
index f8853a70fb..f3de0bdb6b 100644
--- a/dviware/dvisvgm/libs/brotli/enc/find_match_length.h
+++ b/dviware/dvisvgm/libs/brotli/enc/find_match_length.h
@@ -9,9 +9,10 @@
#ifndef BROTLI_ENC_FIND_MATCH_LENGTH_H_
#define BROTLI_ENC_FIND_MATCH_LENGTH_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
@@ -21,31 +22,23 @@ extern "C" {
static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
const uint8_t* s2,
size_t limit) {
- size_t matched = 0;
- size_t limit2 = (limit >> 3) + 1; /* + 1 is for pre-decrement in while */
- while (BROTLI_PREDICT_TRUE(--limit2)) {
- if (BROTLI_PREDICT_FALSE(BROTLI_UNALIGNED_LOAD64LE(s2) ==
- BROTLI_UNALIGNED_LOAD64LE(s1 + matched))) {
- s2 += 8;
- matched += 8;
- } else {
- uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^
- BROTLI_UNALIGNED_LOAD64LE(s1 + matched);
+ const uint8_t *s1_orig = s1;
+ for (; limit >= 8; limit -= 8) {
+ uint64_t x = BROTLI_UNALIGNED_LOAD64LE(s2) ^
+ BROTLI_UNALIGNED_LOAD64LE(s1);
+ s2 += 8;
+ if (x != 0) {
size_t matching_bits = (size_t)BROTLI_TZCNT64(x);
- matched += matching_bits >> 3;
- return matched;
+ return (size_t)(s1 - s1_orig) + (matching_bits >> 3);
}
+ s1 += 8;
}
- limit = (limit & 7) + 1; /* + 1 is for pre-decrement in while */
- while (--limit) {
- if (BROTLI_PREDICT_TRUE(s1[matched] == *s2)) {
- ++s2;
- ++matched;
- } else {
- return matched;
- }
+ while (limit && *s1 == *s2) {
+ limit--;
+ ++s2;
+ ++s1;
}
- return matched;
+ return (size_t)(s1 - s1_orig);
}
#else
static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash.h b/dviware/dvisvgm/libs/brotli/enc/hash.h
index 6362f69b9f..5677d82920 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash.h
@@ -10,33 +10,49 @@
#ifndef BROTLI_ENC_HASH_H_
#define BROTLI_ENC_HASH_H_
+#include <stdlib.h> /* exit */
#include <string.h> /* memcmp, memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./encoder_dict.h"
-#include "./fast_log.h"
-#include "./find_match_length.h"
-#include "./memory.h"
-#include "./quality.h"
-#include "./static_dict.h"
+#include "compound_dictionary.h"
+#include "encoder_dict.h"
+#include "fast_log.h"
+#include "find_match_length.h"
+#include "memory.h"
+#include "quality.h"
+#include "static_dict.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
typedef struct {
- /* Dynamically allocated area; first member for quickest access. */
- void* extra;
+ /**
+ * Dynamically allocated areas; regular hasher uses one or two allocations;
+ * "composite" hasher uses up to 4 allocations.
+ */
+ void* extra[4];
+
+ /**
+ * False before the fisrt invocation of HasherSetup (where "extra" memory)
+ * is allocated.
+ */
+ BROTLI_BOOL is_setup_;
size_t dict_num_lookups;
size_t dict_num_matches;
BrotliHasherParams params;
- /* False if hasher needs to be "prepared" before use. */
+ /**
+ * False if hasher needs to be "prepared" before use (before the first
+ * invocation of HasherSetup or after HasherReset). "preparation" is hasher
+ * data initialization (using input ringbuffer).
+ */
BROTLI_BOOL is_prepared_;
} HasherCommon;
@@ -62,8 +78,7 @@ typedef struct HasherSearchResult {
for this use.
* The number has been tuned heuristically against compression benchmarks. */
static const uint32_t kHashMul32 = 0x1E35A7BD;
-static const uint64_t kHashMul64 = BROTLI_MAKE_UINT64_T(0x1E35A7BD, 0x1E35A7BD);
-static const uint64_t kHashMul64Long =
+static const uint64_t kHashMul64 =
BROTLI_MAKE_UINT64_T(0x1FE35A7Bu, 0xD3579BD3u);
static BROTLI_INLINE uint32_t Hash14(const uint8_t* data) {
@@ -232,7 +247,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define BUCKET_BITS 17
#define MAX_TREE_SEARCH_DEPTH 64
#define MAX_TREE_COMP_LENGTH 128
-#include "./hash_to_binary_tree_inc.h" /* NOLINT(build/include) */
+#include "hash_to_binary_tree_inc.h" /* NOLINT(build/include) */
#undef MAX_TREE_SEARCH_DEPTH
#undef MAX_TREE_COMP_LENGTH
#undef BUCKET_BITS
@@ -249,7 +264,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define BUCKET_SWEEP_BITS 0
#define HASH_LEN 5
#define USE_DICTIONARY 1
-#include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
#undef BUCKET_SWEEP_BITS
#undef USE_DICTIONARY
#undef HASHER
@@ -257,7 +272,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define HASHER() H3
#define BUCKET_SWEEP_BITS 1
#define USE_DICTIONARY 0
-#include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
#undef USE_DICTIONARY
#undef BUCKET_SWEEP_BITS
#undef BUCKET_BITS
@@ -267,7 +282,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define BUCKET_BITS 17
#define BUCKET_SWEEP_BITS 2
#define USE_DICTIONARY 1
-#include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
#undef USE_DICTIONARY
#undef HASH_LEN
#undef BUCKET_SWEEP_BITS
@@ -275,11 +290,11 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#undef HASHER
#define HASHER() H5
-#include "./hash_longest_match_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match_inc.h" /* NOLINT(build/include) */
#undef HASHER
#define HASHER() H6
-#include "./hash_longest_match64_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match64_inc.h" /* NOLINT(build/include) */
#undef HASHER
#define BUCKET_BITS 15
@@ -288,13 +303,13 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define NUM_BANKS 1
#define BANK_BITS 16
#define HASHER() H40
-#include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
+#include "hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
#undef HASHER
#undef NUM_LAST_DISTANCES_TO_CHECK
#define NUM_LAST_DISTANCES_TO_CHECK 10
#define HASHER() H41
-#include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
+#include "hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
#undef HASHER
#undef NUM_LAST_DISTANCES_TO_CHECK
#undef NUM_BANKS
@@ -304,7 +319,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define NUM_BANKS 512
#define BANK_BITS 9
#define HASHER() H42
-#include "./hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
+#include "hash_forgetful_chain_inc.h" /* NOLINT(build/include) */
#undef HASHER
#undef NUM_LAST_DISTANCES_TO_CHECK
#undef NUM_BANKS
@@ -317,7 +332,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define BUCKET_SWEEP_BITS 2
#define HASH_LEN 7
#define USE_DICTIONARY 0
-#include "./hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
+#include "hash_longest_match_quickly_inc.h" /* NOLINT(build/include) */
#undef USE_DICTIONARY
#undef HASH_LEN
#undef BUCKET_SWEEP_BITS
@@ -331,14 +346,14 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define JUMP 4
#define NUMBUCKETS 16777216
#define MASK ((NUMBUCKETS * 64) - 1)
-#include "./hash_rolling_inc.h" /* NOLINT(build/include) */
+#include "hash_rolling_inc.h" /* NOLINT(build/include) */
#undef JUMP
#undef HASHER
#define HASHER() HROLLING
#define JUMP 1
-#include "./hash_rolling_inc.h" /* NOLINT(build/include) */
+#include "hash_rolling_inc.h" /* NOLINT(build/include) */
#undef MASK
#undef NUMBUCKETS
#undef JUMP
@@ -348,7 +363,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define HASHER() H35
#define HASHER_A H3
#define HASHER_B HROLLING_FAST
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
+#include "hash_composite_inc.h" /* NOLINT(build/include) */
#undef HASHER_A
#undef HASHER_B
#undef HASHER
@@ -356,7 +371,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define HASHER() H55
#define HASHER_A H54
#define HASHER_B HROLLING_FAST
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
+#include "hash_composite_inc.h" /* NOLINT(build/include) */
#undef HASHER_A
#undef HASHER_B
#undef HASHER
@@ -364,7 +379,7 @@ static BROTLI_INLINE size_t BackwardMatchLengthCode(const BackwardMatch* self) {
#define HASHER() H65
#define HASHER_A H6
#define HASHER_B HROLLING
-#include "./hash_composite_inc.h" /* NOLINT(build/include) */
+#include "hash_composite_inc.h" /* NOLINT(build/include) */
#undef HASHER_A
#undef HASHER_B
#undef HASHER
@@ -391,43 +406,55 @@ typedef struct {
/* MUST be invoked before any other method. */
static BROTLI_INLINE void HasherInit(Hasher* hasher) {
- hasher->common.extra = NULL;
+ hasher->common.is_setup_ = BROTLI_FALSE;
+ hasher->common.extra[0] = NULL;
+ hasher->common.extra[1] = NULL;
+ hasher->common.extra[2] = NULL;
+ hasher->common.extra[3] = NULL;
}
static BROTLI_INLINE void DestroyHasher(MemoryManager* m, Hasher* hasher) {
- if (hasher->common.extra == NULL) return;
- BROTLI_FREE(m, hasher->common.extra);
+ if (hasher->common.extra[0] != NULL) BROTLI_FREE(m, hasher->common.extra[0]);
+ if (hasher->common.extra[1] != NULL) BROTLI_FREE(m, hasher->common.extra[1]);
+ if (hasher->common.extra[2] != NULL) BROTLI_FREE(m, hasher->common.extra[2]);
+ if (hasher->common.extra[3] != NULL) BROTLI_FREE(m, hasher->common.extra[3]);
}
static BROTLI_INLINE void HasherReset(Hasher* hasher) {
hasher->common.is_prepared_ = BROTLI_FALSE;
}
-static BROTLI_INLINE size_t HasherSize(const BrotliEncoderParams* params,
- BROTLI_BOOL one_shot, const size_t input_size) {
+static BROTLI_INLINE void HasherSize(const BrotliEncoderParams* params,
+ BROTLI_BOOL one_shot, const size_t input_size, size_t* alloc_size) {
switch (params->hasher.type) {
-#define SIZE_(N) \
- case N: \
- return HashMemAllocInBytesH ## N(params, one_shot, input_size);
+#define SIZE_(N) \
+ case N: \
+ HashMemAllocInBytesH ## N(params, one_shot, input_size, alloc_size); \
+ break;
FOR_ALL_HASHERS(SIZE_)
#undef SIZE_
default:
break;
}
- return 0; /* Default case. */
}
static BROTLI_INLINE void HasherSetup(MemoryManager* m, Hasher* hasher,
BrotliEncoderParams* params, const uint8_t* data, size_t position,
size_t input_size, BROTLI_BOOL is_last) {
BROTLI_BOOL one_shot = (position == 0 && is_last);
- if (hasher->common.extra == NULL) {
- size_t alloc_size;
+ if (!hasher->common.is_setup_) {
+ size_t alloc_size[4] = {0};
+ size_t i;
ChooseHasher(params, &params->hasher);
- alloc_size = HasherSize(params, one_shot, input_size);
- hasher->common.extra = BROTLI_ALLOC(m, uint8_t, alloc_size);
- if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(hasher->common.extra)) return;
hasher->common.params = params->hasher;
+ hasher->common.dict_num_lookups = 0;
+ hasher->common.dict_num_matches = 0;
+ HasherSize(params, one_shot, input_size, alloc_size);
+ for (i = 0; i < 4; ++i) {
+ if (alloc_size[i] == 0) continue;
+ hasher->common.extra[i] = BROTLI_ALLOC(m, uint8_t, alloc_size[i]);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(hasher->common.extra[i])) return;
+ }
switch (hasher->common.params.type) {
#define INITIALIZE_(N) \
case N: \
@@ -440,6 +467,7 @@ static BROTLI_INLINE void HasherSetup(MemoryManager* m, Hasher* hasher,
break;
}
HasherReset(hasher);
+ hasher->common.is_setup_ = BROTLI_TRUE;
}
if (!hasher->common.is_prepared_) {
@@ -454,10 +482,6 @@ static BROTLI_INLINE void HasherSetup(MemoryManager* m, Hasher* hasher,
#undef PREPARE_
default: break;
}
- if (position == 0) {
- hasher->common.dict_num_lookups = 0;
- hasher->common.dict_num_matches = 0;
- }
hasher->common.is_prepared_ = BROTLI_TRUE;
}
}
@@ -481,6 +505,222 @@ static BROTLI_INLINE void InitOrStitchToPreviousBlock(
}
}
+/* NB: when seamless dictionary-ring-buffer copies are implemented, don't forget
+ to add proper guards for non-zero-BROTLI_PARAM_STREAM_OFFSET. */
+static BROTLI_INLINE void FindCompoundDictionaryMatch(
+ const PreparedDictionary* self, const uint8_t* BROTLI_RESTRICT data,
+ const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache,
+ const size_t cur_ix, const size_t max_length, const size_t distance_offset,
+ const size_t max_distance, HasherSearchResult* BROTLI_RESTRICT out) {
+ const uint32_t source_size = self->source_size;
+ const size_t boundary = distance_offset - source_size;
+ const uint32_t hash_bits = self->hash_bits;
+ const uint32_t bucket_bits = self->bucket_bits;
+ const uint32_t slot_bits = self->slot_bits;
+
+ const uint32_t hash_shift = 64u - bucket_bits;
+ const uint32_t slot_mask = (~((uint32_t)0U)) >> (32 - slot_bits);
+ const uint64_t hash_mask = (~((uint64_t)0U)) >> (64 - hash_bits);
+
+ const uint32_t* slot_offsets = (uint32_t*)(&self[1]);
+ const uint16_t* heads = (uint16_t*)(&slot_offsets[1u << slot_bits]);
+ const uint32_t* items = (uint32_t*)(&heads[1u << bucket_bits]);
+ const uint8_t* source = NULL;
+
+ const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+ score_t best_score = out->score;
+ size_t best_len = out->len;
+ size_t i;
+ const uint64_t h =
+ (BROTLI_UNALIGNED_LOAD64LE(&data[cur_ix_masked]) & hash_mask) *
+ kPreparedDictionaryHashMul64Long;
+ const uint32_t key = (uint32_t)(h >> hash_shift);
+ const uint32_t slot = key & slot_mask;
+ const uint32_t head = heads[key];
+ const uint32_t* BROTLI_RESTRICT chain = &items[slot_offsets[slot] + head];
+ uint32_t item = (head == 0xFFFF) ? 1 : 0;
+
+ const void* tail = (void*)&items[self->num_items];
+ if (self->magic == kPreparedDictionaryMagic) {
+ source = (const uint8_t*)tail;
+ } else {
+ /* kLeanPreparedDictionaryMagic */
+ source = (const uint8_t*)BROTLI_UNALIGNED_LOAD_PTR((const uint8_t**)tail);
+ }
+
+ for (i = 0; i < 4; ++i) {
+ const size_t distance = (size_t)distance_cache[i];
+ size_t offset;
+ size_t limit;
+ size_t len;
+ if (distance <= boundary || distance > distance_offset) continue;
+ offset = distance_offset - distance;
+ limit = source_size - offset;
+ limit = limit > max_length ? max_length : limit;
+ len = FindMatchLengthWithLimit(&source[offset], &data[cur_ix_masked],
+ limit);
+ if (len >= 2) {
+ score_t score = BackwardReferenceScoreUsingLastDistance(len);
+ if (best_score < score) {
+ if (i != 0) score -= BackwardReferencePenaltyUsingLastDistance(i);
+ if (best_score < score) {
+ best_score = score;
+ if (len > best_len) best_len = len;
+ out->len = len;
+ out->len_code_delta = 0;
+ out->distance = distance;
+ out->score = best_score;
+ }
+ }
+ }
+ }
+ while (item == 0) {
+ size_t offset;
+ size_t distance;
+ size_t limit;
+ item = *chain;
+ chain++;
+ offset = item & 0x7FFFFFFF;
+ item &= 0x80000000;
+ distance = distance_offset - offset;
+ limit = source_size - offset;
+ limit = (limit > max_length) ? max_length : limit;
+ if (distance > max_distance) continue;
+ if (cur_ix_masked + best_len > ring_buffer_mask ||
+ best_len >= limit ||
+ data[cur_ix_masked + best_len] != source[offset + best_len]) {
+ continue;
+ }
+ {
+ const size_t len = FindMatchLengthWithLimit(&source[offset],
+ &data[cur_ix_masked],
+ limit);
+ if (len >= 4) {
+ score_t score = BackwardReferenceScore(len, distance);
+ if (best_score < score) {
+ best_score = score;
+ best_len = len;
+ out->len = best_len;
+ out->len_code_delta = 0;
+ out->distance = distance;
+ out->score = best_score;
+ }
+ }
+ }
+ }
+}
+
+/* NB: when seamless dictionary-ring-buffer copies are implemented, don't forget
+ to add proper guards for non-zero-BROTLI_PARAM_STREAM_OFFSET. */
+static BROTLI_INLINE size_t FindAllCompoundDictionaryMatches(
+ const PreparedDictionary* self, const uint8_t* BROTLI_RESTRICT data,
+ const size_t ring_buffer_mask, const size_t cur_ix, const size_t min_length,
+ const size_t max_length, const size_t distance_offset,
+ const size_t max_distance, BackwardMatch* matches, size_t match_limit) {
+ const uint32_t source_size = self->source_size;
+ const uint32_t hash_bits = self->hash_bits;
+ const uint32_t bucket_bits = self->bucket_bits;
+ const uint32_t slot_bits = self->slot_bits;
+
+ const uint32_t hash_shift = 64u - bucket_bits;
+ const uint32_t slot_mask = (~((uint32_t)0U)) >> (32 - slot_bits);
+ const uint64_t hash_mask = (~((uint64_t)0U)) >> (64 - hash_bits);
+
+ const uint32_t* slot_offsets = (uint32_t*)(&self[1]);
+ const uint16_t* heads = (uint16_t*)(&slot_offsets[1u << slot_bits]);
+ const uint32_t* items = (uint32_t*)(&heads[1u << bucket_bits]);
+ const uint8_t* source = NULL;
+
+ const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
+ size_t best_len = min_length;
+ const uint64_t h =
+ (BROTLI_UNALIGNED_LOAD64LE(&data[cur_ix_masked]) & hash_mask) *
+ kPreparedDictionaryHashMul64Long;
+ const uint32_t key = (uint32_t)(h >> hash_shift);
+ const uint32_t slot = key & slot_mask;
+ const uint32_t head = heads[key];
+ const uint32_t* BROTLI_RESTRICT chain = &items[slot_offsets[slot] + head];
+ uint32_t item = (head == 0xFFFF) ? 1 : 0;
+ size_t found = 0;
+
+ const void* tail = (void*)&items[self->num_items];
+ if (self->magic == kPreparedDictionaryMagic) {
+ source = (const uint8_t*)tail;
+ } else {
+ /* kLeanPreparedDictionaryMagic */
+ source = (const uint8_t*)BROTLI_UNALIGNED_LOAD_PTR((const uint8_t**)tail);
+ }
+
+ while (item == 0) {
+ size_t offset;
+ size_t distance;
+ size_t limit;
+ size_t len;
+ item = *chain;
+ chain++;
+ offset = item & 0x7FFFFFFF;
+ item &= 0x80000000;
+ distance = distance_offset - offset;
+ limit = source_size - offset;
+ limit = (limit > max_length) ? max_length : limit;
+ if (distance > max_distance) continue;
+ if (cur_ix_masked + best_len > ring_buffer_mask ||
+ best_len >= limit ||
+ data[cur_ix_masked + best_len] != source[offset + best_len]) {
+ continue;
+ }
+ len = FindMatchLengthWithLimit(
+ &source[offset], &data[cur_ix_masked], limit);
+ if (len > best_len) {
+ best_len = len;
+ InitBackwardMatch(matches++, distance, len);
+ found++;
+ if (found == match_limit) break;
+ }
+ }
+ return found;
+}
+
+static BROTLI_INLINE void LookupCompoundDictionaryMatch(
+ const CompoundDictionary* addon, const uint8_t* BROTLI_RESTRICT data,
+ const size_t ring_buffer_mask, const int* BROTLI_RESTRICT distance_cache,
+ const size_t cur_ix, const size_t max_length,
+ const size_t max_ring_buffer_distance, const size_t max_distance,
+ HasherSearchResult* sr) {
+ size_t base_offset = max_ring_buffer_distance + 1 + addon->total_size - 1;
+ size_t d;
+ for (d = 0; d < addon->num_chunks; ++d) {
+ /* Only one prepared dictionary type is currently supported. */
+ FindCompoundDictionaryMatch(
+ (const PreparedDictionary*)addon->chunks[d], data, ring_buffer_mask,
+ distance_cache, cur_ix, max_length,
+ base_offset - addon->chunk_offsets[d], max_distance, sr);
+ }
+}
+
+static BROTLI_INLINE size_t LookupAllCompoundDictionaryMatches(
+ const CompoundDictionary* addon, const uint8_t* BROTLI_RESTRICT data,
+ const size_t ring_buffer_mask, const size_t cur_ix, size_t min_length,
+ const size_t max_length, const size_t max_ring_buffer_distance,
+ const size_t max_distance, BackwardMatch* matches,
+ size_t match_limit) {
+ size_t base_offset = max_ring_buffer_distance + 1 + addon->total_size - 1;
+ size_t d;
+ size_t total_found = 0;
+ for (d = 0; d < addon->num_chunks; ++d) {
+ /* Only one prepared dictionary type is currently supported. */
+ total_found += FindAllCompoundDictionaryMatches(
+ (const PreparedDictionary*)addon->chunks[d], data, ring_buffer_mask,
+ cur_ix, min_length, max_length, base_offset - addon->chunk_offsets[d],
+ max_distance, matches + total_found, match_limit - total_found);
+ if (total_found == match_limit) break;
+ if (total_found > 0) {
+ min_length = BackwardMatchLength(&matches[total_found - 1]);
+ }
+ }
+ return total_found;
+}
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h
index cba156c0e2..3923bc72c8 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_composite_inc.h
@@ -30,10 +30,10 @@ static BROTLI_INLINE size_t FN(StoreLookahead)(void) {
typedef struct HashComposite {
HASHER_A ha;
HASHER_B hb;
+ HasherCommon ha_common;
HasherCommon hb_common;
/* Shortcuts. */
- void* extra;
HasherCommon* common;
BROTLI_BOOL fresh;
@@ -43,12 +43,12 @@ typedef struct HashComposite {
static void FN(Initialize)(HasherCommon* common,
HashComposite* BROTLI_RESTRICT self, const BrotliEncoderParams* params) {
self->common = common;
- self->extra = common->extra;
+ self->ha_common = *self->common;
self->hb_common = *self->common;
self->fresh = BROTLI_TRUE;
self->params = params;
- /* TODO: Initialize of the hashers is defered to Prepare (and params
+ /* TODO(lode): Initialize of the hashers is deferred to Prepare (and params
remembered here) because we don't get the one_shot and input_size params
here that are needed to know the memory size of them. Instead provide
those params to all hashers FN(Initialize) */
@@ -59,21 +59,36 @@ static void FN(Prepare)(
size_t input_size, const uint8_t* BROTLI_RESTRICT data) {
if (self->fresh) {
self->fresh = BROTLI_FALSE;
- self->hb_common.extra = (uint8_t*)self->extra +
- FN_A(HashMemAllocInBytes)(self->params, one_shot, input_size);
-
- FN_A(Initialize)(self->common, &self->ha, self->params);
+ self->ha_common.extra[0] = self->common->extra[0];
+ self->ha_common.extra[1] = self->common->extra[1];
+ self->ha_common.extra[2] = NULL;
+ self->ha_common.extra[3] = NULL;
+ self->hb_common.extra[0] = self->common->extra[2];
+ self->hb_common.extra[1] = self->common->extra[3];
+ self->hb_common.extra[2] = NULL;
+ self->hb_common.extra[3] = NULL;
+
+ FN_A(Initialize)(&self->ha_common, &self->ha, self->params);
FN_B(Initialize)(&self->hb_common, &self->hb, self->params);
}
FN_A(Prepare)(&self->ha, one_shot, input_size, data);
FN_B(Prepare)(&self->hb, one_shot, input_size, data);
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
- return FN_A(HashMemAllocInBytes)(params, one_shot, input_size) +
- FN_B(HashMemAllocInBytes)(params, one_shot, input_size);
+ size_t input_size, size_t* alloc_size) {
+ size_t alloc_size_a[4] = {0};
+ size_t alloc_size_b[4] = {0};
+ FN_A(HashMemAllocInBytes)(params, one_shot, input_size, alloc_size_a);
+ FN_B(HashMemAllocInBytes)(params, one_shot, input_size, alloc_size_b);
+ /* Should never happen. */
+ if (alloc_size_a[2] != 0 || alloc_size_a[3] != 0) exit(EXIT_FAILURE);
+ if (alloc_size_b[2] != 0 || alloc_size_b[3] != 0) exit(EXIT_FAILURE);
+ alloc_size[0] = alloc_size_a[0];
+ alloc_size[1] = alloc_size_a[1];
+ alloc_size[2] = alloc_size_b[0];
+ alloc_size[3] = alloc_size_b[1];
}
static BROTLI_INLINE void FN(Store)(HashComposite* BROTLI_RESTRICT self,
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h
index bfae6ba6a2..48e1cdcdf2 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_forgetful_chain_inc.h
@@ -49,7 +49,7 @@ typedef struct HashForgetfulChain {
size_t max_hops;
/* Shortcuts. */
- void* extra;
+ void* extra[2];
HasherCommon* common;
/* --- Dynamic size members --- */
@@ -77,14 +77,15 @@ static uint8_t* FN(TinyHash)(void* extra) {
}
static FN(Bank)* FN(Banks)(void* extra) {
- return (FN(Bank)*)(&FN(TinyHash)(extra)[65536]);
+ return (FN(Bank)*)(extra);
}
static void FN(Initialize)(
HasherCommon* common, HashForgetfulChain* BROTLI_RESTRICT self,
const BrotliEncoderParams* params) {
self->common = common;
- self->extra = common->extra;
+ self->extra[0] = common->extra[0];
+ self->extra[1] = common->extra[1];
self->max_hops = (params->quality > 6 ? 7u : 8u) << (params->quality - 4);
}
@@ -92,9 +93,9 @@ static void FN(Initialize)(
static void FN(Prepare)(
HashForgetfulChain* BROTLI_RESTRICT self, BROTLI_BOOL one_shot,
size_t input_size, const uint8_t* BROTLI_RESTRICT data) {
- uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra);
- uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra);
- uint8_t* BROTLI_RESTRICT tiny_hash = FN(TinyHash)(self->extra);
+ uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra[0]);
+ uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra[0]);
+ uint8_t* BROTLI_RESTRICT tiny_hash = FN(TinyHash)(self->extra[0]);
/* Partial preparation is 100 times slower (per socket). */
size_t partial_prepare_threshold = BUCKET_SIZE >> 6;
if (one_shot && input_size <= partial_prepare_threshold) {
@@ -116,24 +117,25 @@ static void FN(Prepare)(
memset(self->free_slot_idx, 0, sizeof(self->free_slot_idx));
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
+ size_t input_size, size_t* alloc_size) {
BROTLI_UNUSED(params);
BROTLI_UNUSED(one_shot);
BROTLI_UNUSED(input_size);
- return sizeof(uint32_t) * BUCKET_SIZE + sizeof(uint16_t) * BUCKET_SIZE +
- sizeof(uint8_t) * 65536 + sizeof(FN(Bank)) * NUM_BANKS;
+ alloc_size[0] = sizeof(uint32_t) * BUCKET_SIZE +
+ sizeof(uint16_t) * BUCKET_SIZE + sizeof(uint8_t) * 65536;
+ alloc_size[1] = sizeof(FN(Bank)) * NUM_BANKS;
}
/* Look at 4 bytes at &data[ix & mask]. Compute a hash from these, and prepend
node to corresponding chain; also update tiny_hash for current position. */
static BROTLI_INLINE void FN(Store)(HashForgetfulChain* BROTLI_RESTRICT self,
const uint8_t* BROTLI_RESTRICT data, const size_t mask, const size_t ix) {
- uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra);
- uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra);
- uint8_t* BROTLI_RESTRICT tiny_hash = FN(TinyHash)(self->extra);
- FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra);
+ uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra[0]);
+ uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra[0]);
+ uint8_t* BROTLI_RESTRICT tiny_hash = FN(TinyHash)(self->extra[0]);
+ FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra[1]);
const size_t key = FN(HashBytes)(&data[ix & mask]);
const size_t bank = key & (NUM_BANKS - 1);
const size_t idx = self->free_slot_idx[bank]++ & (BANK_SIZE - 1);
@@ -196,10 +198,10 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
const size_t cur_ix, const size_t max_length, const size_t max_backward,
const size_t dictionary_distance, const size_t max_distance,
HasherSearchResult* BROTLI_RESTRICT out) {
- uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra);
- uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra);
- uint8_t* BROTLI_RESTRICT tiny_hashes = FN(TinyHash)(self->extra);
- FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra);
+ uint32_t* BROTLI_RESTRICT addr = FN(Addr)(self->extra[0]);
+ uint16_t* BROTLI_RESTRICT head = FN(Head)(self->extra[0]);
+ uint8_t* BROTLI_RESTRICT tiny_hashes = FN(TinyHash)(self->extra[0]);
+ FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra[1]);
const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
/* Don't accept a short copy from far away. */
score_t min_score = out->score;
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h
index 956fb304b3..e48fc61554 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match64_inc.h
@@ -20,13 +20,12 @@ static BROTLI_INLINE size_t FN(HashTypeLength)(void) { return 8; }
static BROTLI_INLINE size_t FN(StoreLookahead)(void) { return 8; }
/* HashBytes is the function that chooses the bucket to place the address in. */
-static BROTLI_INLINE uint32_t FN(HashBytes)(const uint8_t* BROTLI_RESTRICT data,
- const uint64_t mask,
- const int shift) {
- const uint64_t h = (BROTLI_UNALIGNED_LOAD64LE(data) & mask) * kHashMul64Long;
+static BROTLI_INLINE size_t FN(HashBytes)(const uint8_t* BROTLI_RESTRICT data,
+ uint64_t hash_mul) {
+ const uint64_t h = BROTLI_UNALIGNED_LOAD64LE(data) * hash_mul;
/* The higher bits contain more mixture from the multiplication,
so we take our results from there. */
- return (uint32_t)(h >> shift);
+ return (size_t)(h >> (64 - 15));
}
typedef struct HashLongestMatch {
@@ -35,10 +34,8 @@ typedef struct HashLongestMatch {
/* Only block_size_ newest backward references are kept,
and the older are forgotten. */
size_t block_size_;
- /* Left-shift for computing hash bucket index from hash value. */
- int hash_shift_;
- /* Mask for selecting the next 4-8 bytes of input */
- uint64_t hash_mask_;
+ /* Hash multiplier tuned to match length. */
+ uint64_t hash_mul_;
/* Mask for accessing entries in a block (in a ring-buffer manner). */
uint32_t block_mask_;
@@ -63,16 +60,16 @@ static void FN(Initialize)(
self->common_ = common;
BROTLI_UNUSED(params);
- self->hash_shift_ = 64 - common->params.bucket_bits;
- self->hash_mask_ = (~((uint64_t)0U)) >> (64 - 8 * common->params.hash_len);
+ self->hash_mul_ = kHashMul64 << (64 - 5 * 8);
+ BROTLI_DCHECK(common->params.bucket_bits == 15);
self->bucket_size_ = (size_t)1 << common->params.bucket_bits;
self->block_bits_ = common->params.block_bits;
self->block_size_ = (size_t)1 << common->params.block_bits;
self->block_mask_ = (uint32_t)(self->block_size_ - 1);
self->num_last_distances_to_check_ =
common->params.num_last_distances_to_check;
- self->num_ = (uint16_t*)common->extra;
- self->buckets_ = (uint32_t*)&self->num_[self->bucket_size_];
+ self->num_ = (uint16_t*)common->extra[0];
+ self->buckets_ = (uint32_t*)common->extra[1];
}
static void FN(Prepare)(
@@ -84,8 +81,7 @@ static void FN(Prepare)(
if (one_shot && input_size <= partial_prepare_threshold) {
size_t i;
for (i = 0; i < input_size; ++i) {
- const uint32_t key = FN(HashBytes)(&data[i], self->hash_mask_,
- self->hash_shift_);
+ const size_t key = FN(HashBytes)(&data[i], self->hash_mul_);
num[key] = 0;
}
} else {
@@ -93,15 +89,15 @@ static void FN(Prepare)(
}
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
+ size_t input_size, size_t* alloc_size) {
size_t bucket_size = (size_t)1 << params->hasher.bucket_bits;
size_t block_size = (size_t)1 << params->hasher.block_bits;
BROTLI_UNUSED(one_shot);
BROTLI_UNUSED(input_size);
- return sizeof(uint16_t) * bucket_size +
- sizeof(uint32_t) * bucket_size * block_size;
+ alloc_size[0] = sizeof(uint16_t) * bucket_size;
+ alloc_size[1] = sizeof(uint32_t) * bucket_size * block_size;
}
/* Look at 4 bytes at &data[ix & mask].
@@ -111,8 +107,7 @@ static BROTLI_INLINE void FN(Store)(
const size_t mask, const size_t ix) {
uint16_t* BROTLI_RESTRICT num = self->num_;
uint32_t* BROTLI_RESTRICT buckets = self->buckets_;
- const uint32_t key = FN(HashBytes)(&data[ix & mask], self->hash_mask_,
- self->hash_shift_);
+ const size_t key = FN(HashBytes)(&data[ix & mask], self->hash_mul_);
const size_t minor_ix = num[key] & self->block_mask_;
const size_t offset = minor_ix + (key << self->block_bits_);
++num[key];
@@ -217,14 +212,17 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
}
}
{
- const uint32_t key = FN(HashBytes)(
- &data[cur_ix_masked], self->hash_mask_, self->hash_shift_);
+ const size_t key = FN(HashBytes)(&data[cur_ix_masked], self->hash_mul_);
uint32_t* BROTLI_RESTRICT bucket = &buckets[key << self->block_bits_];
const size_t down =
(num[key] > self->block_size_) ?
(num[key] - self->block_size_) : 0u;
- for (i = num[key]; i > down;) {
+ const uint32_t first4 = BrotliUnalignedRead32(data + cur_ix_masked);
+ const size_t max_length_m4 = max_length - 4;
+ i = num[key];
+ for (; i > down;) {
size_t prev_ix = bucket[--i & self->block_mask_];
+ uint32_t current4;
const size_t backward = cur_ix - prev_ix;
if (BROTLI_PREDICT_FALSE(backward > max_backward)) {
break;
@@ -235,22 +233,19 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
continue;
}
+ current4 = BrotliUnalignedRead32(data + prev_ix);
+ if (first4 != current4) continue;
{
- const size_t len = FindMatchLengthWithLimit(&data[prev_ix],
- &data[cur_ix_masked],
- max_length);
- if (len >= 4) {
- /* Comparing for >= 3 does not change the semantics, but just saves
- for a few unnecessary binary logarithms in backward reference
- score, since we are not interested in such short matches. */
- score_t score = BackwardReferenceScore(len, backward);
- if (best_score < score) {
- best_score = score;
- best_len = len;
- out->len = best_len;
- out->distance = backward;
- out->score = best_score;
- }
+ const size_t len = FindMatchLengthWithLimit(&data[prev_ix + 4],
+ &data[cur_ix_masked + 4],
+ max_length_m4) + 4;
+ const score_t score = BackwardReferenceScore(len, backward);
+ if (best_score < score) {
+ best_score = score;
+ best_len = len;
+ out->len = best_len;
+ out->distance = backward;
+ out->score = best_score;
}
}
}
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h
index 27f4463d7f..788e9ef993 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_inc.h
@@ -54,10 +54,6 @@ typedef struct HashLongestMatch {
uint32_t* buckets_; /* uint32_t[bucket_size * block_size]; */
} HashLongestMatch;
-static BROTLI_INLINE uint16_t* FN(Num)(void* extra) {
- return (uint16_t*)extra;
-}
-
static void FN(Initialize)(
HasherCommon* common, HashLongestMatch* BROTLI_RESTRICT self,
const BrotliEncoderParams* params) {
@@ -68,8 +64,8 @@ static void FN(Initialize)(
self->bucket_size_ = (size_t)1 << common->params.bucket_bits;
self->block_size_ = (size_t)1 << common->params.block_bits;
self->block_mask_ = (uint32_t)(self->block_size_ - 1);
- self->num_ = (uint16_t*)common->extra;
- self->buckets_ = (uint32_t*)(&self->num_[self->bucket_size_]);
+ self->num_ = (uint16_t*)common->extra[0];
+ self->buckets_ = (uint32_t*)common->extra[1];
self->block_bits_ = common->params.block_bits;
self->num_last_distances_to_check_ =
common->params.num_last_distances_to_check;
@@ -92,15 +88,15 @@ static void FN(Prepare)(
}
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
+ size_t input_size, size_t* alloc_size) {
size_t bucket_size = (size_t)1 << params->hasher.bucket_bits;
size_t block_size = (size_t)1 << params->hasher.block_bits;
BROTLI_UNUSED(one_shot);
BROTLI_UNUSED(input_size);
- return sizeof(uint16_t) * bucket_size +
- sizeof(uint32_t) * bucket_size * block_size;
+ alloc_size[0] = sizeof(uint16_t) * bucket_size;
+ alloc_size[1] = sizeof(uint32_t) * bucket_size * block_size;
}
/* Look at 4 bytes at &data[ix & mask].
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h
index e5ba840ab9..54397ef891 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_longest_match_quickly_inc.h
@@ -49,7 +49,7 @@ static void FN(Initialize)(
self->common = common;
BROTLI_UNUSED(params);
- self->buckets_ = (uint32_t*)common->extra;
+ self->buckets_ = (uint32_t*)common->extra[0];
}
static void FN(Prepare)(
@@ -80,13 +80,13 @@ static void FN(Prepare)(
}
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
+ size_t input_size, size_t* alloc_size) {
BROTLI_UNUSED(params);
BROTLI_UNUSED(one_shot);
BROTLI_UNUSED(input_size);
- return sizeof(uint32_t) * BUCKET_SIZE;
+ alloc_size[0] = sizeof(uint32_t) * BUCKET_SIZE;
}
/* Look at 5 bytes at &data[ix & mask].
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h
index 586ae73859..4c7a6b199a 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_rolling_inc.h
@@ -67,7 +67,7 @@ static void FN(Initialize)(
self->factor_remove *= self->factor;
}
- self->table = (uint32_t*)common->extra;
+ self->table = (uint32_t*)common->extra[0];
for (i = 0; i < NUMBUCKETS; i++) {
self->table[i] = FN(kInvalidPos);
}
@@ -88,13 +88,13 @@ static void FN(Prepare)(HashRolling* BROTLI_RESTRICT self, BROTLI_BOOL one_shot,
BROTLI_UNUSED(one_shot);
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
- return NUMBUCKETS * sizeof(uint32_t);
+ size_t input_size, size_t* alloc_size) {
BROTLI_UNUSED(params);
BROTLI_UNUSED(one_shot);
BROTLI_UNUSED(input_size);
+ alloc_size[0] = NUMBUCKETS * sizeof(uint32_t);
}
static BROTLI_INLINE void FN(Store)(HashRolling* BROTLI_RESTRICT self,
diff --git a/dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h b/dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h
index 9880e0aef6..a639d2d4b0 100644
--- a/dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/hash_to_binary_tree_inc.h
@@ -57,8 +57,8 @@ typedef struct HashToBinaryTree {
static void FN(Initialize)(
HasherCommon* common, HashToBinaryTree* BROTLI_RESTRICT self,
const BrotliEncoderParams* params) {
- self->buckets_ = (uint32_t*)common->extra;
- self->forest_ = &self->buckets_[BUCKET_SIZE];
+ self->buckets_ = (uint32_t*)common->extra[0];
+ self->forest_ = (uint32_t*)common->extra[1];
self->window_mask_ = (1u << params->lgwin) - 1u;
self->invalid_pos_ = (uint32_t)(0 - self->window_mask_);
@@ -78,14 +78,15 @@ static void FN(Prepare)
}
}
-static BROTLI_INLINE size_t FN(HashMemAllocInBytes)(
+static BROTLI_INLINE void FN(HashMemAllocInBytes)(
const BrotliEncoderParams* params, BROTLI_BOOL one_shot,
- size_t input_size) {
+ size_t input_size, size_t* alloc_size) {
size_t num_nodes = (size_t)1 << params->lgwin;
if (one_shot && input_size < num_nodes) {
num_nodes = input_size;
}
- return sizeof(uint32_t) * BUCKET_SIZE + 2 * sizeof(uint32_t) * num_nodes;
+ alloc_size[0] = sizeof(uint32_t) * BUCKET_SIZE;
+ alloc_size[1] = 2 * sizeof(uint32_t) * num_nodes;
}
static BROTLI_INLINE size_t FN(LeftChildIndex)(
diff --git a/dviware/dvisvgm/libs/brotli/enc/histogram.c b/dviware/dvisvgm/libs/brotli/enc/histogram.c
index 6da2ff6bb4..4dbb87f907 100644
--- a/dviware/dvisvgm/libs/brotli/enc/histogram.c
+++ b/dviware/dvisvgm/libs/brotli/enc/histogram.c
@@ -6,11 +6,11 @@
/* Build per-context histograms of literals, commands and distance codes. */
-#include "./histogram.h"
+#include "histogram.h"
#include "../common/context.h"
-#include "./block_splitter.h"
-#include "./command.h"
+#include "block_splitter.h"
+#include "command.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -63,7 +63,7 @@ void BrotliBuildHistogramsWithContext(
BlockSplitIteratorNext(&insert_and_copy_it);
HistogramAddCommand(&insert_and_copy_histograms[insert_and_copy_it.type_],
cmd->cmd_prefix_);
- /* TODO: unwrap iterator blocks. */
+ /* TODO(eustas): unwrap iterator blocks. */
for (j = cmd->insert_len_; j != 0; --j) {
size_t context;
BlockSplitIteratorNext(&literal_it);
diff --git a/dviware/dvisvgm/libs/brotli/enc/histogram.h b/dviware/dvisvgm/libs/brotli/enc/histogram.h
index 42af3c3f9d..d1abd973c1 100644
--- a/dviware/dvisvgm/libs/brotli/enc/histogram.h
+++ b/dviware/dvisvgm/libs/brotli/enc/histogram.h
@@ -11,12 +11,13 @@
#include <string.h> /* memset */
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./block_splitter.h"
-#include "./command.h"
+#include "block_splitter.h"
+#include "command.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -28,7 +29,7 @@ extern "C" {
#define FN(X) X ## Literal
#define DATA_SIZE BROTLI_NUM_LITERAL_SYMBOLS
#define DataType uint8_t
-#include "./histogram_inc.h" /* NOLINT(build/include) */
+#include "histogram_inc.h" /* NOLINT(build/include) */
#undef DataType
#undef DATA_SIZE
#undef FN
@@ -36,13 +37,13 @@ extern "C" {
#define FN(X) X ## Command
#define DataType uint16_t
#define DATA_SIZE BROTLI_NUM_COMMAND_SYMBOLS
-#include "./histogram_inc.h" /* NOLINT(build/include) */
+#include "histogram_inc.h" /* NOLINT(build/include) */
#undef DATA_SIZE
#undef FN
#define FN(X) X ## Distance
#define DATA_SIZE BROTLI_NUM_HISTOGRAM_DISTANCE_SYMBOLS
-#include "./histogram_inc.h" /* NOLINT(build/include) */
+#include "histogram_inc.h" /* NOLINT(build/include) */
#undef DataType
#undef DATA_SIZE
#undef FN
diff --git a/dviware/dvisvgm/libs/brotli/enc/literal_cost.c b/dviware/dvisvgm/libs/brotli/enc/literal_cost.c
index c231100e34..2ac847f3c9 100644
--- a/dviware/dvisvgm/libs/brotli/enc/literal_cost.c
+++ b/dviware/dvisvgm/libs/brotli/enc/literal_cost.c
@@ -7,12 +7,15 @@
/* Literal cost model to allow backward reference replacement to be efficient.
*/
-#include "./literal_cost.h"
+#include "literal_cost.h"
+
+#include <string.h> /* memset */
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./fast_log.h"
-#include "./utf8_util.h"
+
+#include "../common/platform.h"
+#include "fast_log.h"
+#include "utf8_util.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -54,22 +57,23 @@ static size_t DecideMultiByteStatsLevel(size_t pos, size_t len, size_t mask,
}
static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
- const uint8_t* data, float* cost) {
+ const uint8_t* data,
+ size_t* histogram, float* cost) {
/* max_utf8 is 0 (normal ASCII single byte modeling),
1 (for 2-byte UTF-8 modeling), or 2 (for 3-byte UTF-8 modeling). */
const size_t max_utf8 = DecideMultiByteStatsLevel(pos, len, mask, data);
- size_t histogram[3][256] = { { 0 } };
size_t window_half = 495;
size_t in_window = BROTLI_MIN(size_t, window_half, len);
size_t in_window_utf8[3] = { 0 };
-
size_t i;
+ memset(histogram, 0, 3 * 256 * sizeof(histogram[0]));
+
{ /* Bootstrap histograms. */
size_t last_c = 0;
size_t utf8_pos = 0;
for (i = 0; i < in_window; ++i) {
size_t c = data[(pos + i) & mask];
- ++histogram[utf8_pos][c];
+ ++histogram[256 * utf8_pos + c];
++in_window_utf8[utf8_pos];
utf8_pos = UTF8Position(last_c, c, max_utf8);
last_c = c;
@@ -85,7 +89,7 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
size_t last_c =
i < window_half + 2 ? 0 : data[(pos + i - window_half - 2) & mask];
size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8);
- --histogram[utf8_pos2][data[(pos + i - window_half) & mask]];
+ --histogram[256 * utf8_pos2 + data[(pos + i - window_half) & mask]];
--in_window_utf8[utf8_pos2];
}
if (i + window_half < len) {
@@ -93,7 +97,7 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
size_t c = data[(pos + i + window_half - 1) & mask];
size_t last_c = data[(pos + i + window_half - 2) & mask];
size_t utf8_pos2 = UTF8Position(last_c, c, max_utf8);
- ++histogram[utf8_pos2][data[(pos + i + window_half) & mask]];
+ ++histogram[256 * utf8_pos2 + data[(pos + i + window_half) & mask]];
++in_window_utf8[utf8_pos2];
}
{
@@ -101,7 +105,7 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
size_t last_c = i < 2 ? 0 : data[(pos + i - 2) & mask];
size_t utf8_pos = UTF8Position(last_c, c, max_utf8);
size_t masked_pos = (pos + i) & mask;
- size_t histo = histogram[utf8_pos][data[masked_pos]];
+ size_t histo = histogram[256 * utf8_pos + data[masked_pos]];
double lit_cost;
if (histo == 0) {
histo = 1;
@@ -125,17 +129,18 @@ static void EstimateBitCostsForLiteralsUTF8(size_t pos, size_t len, size_t mask,
}
void BrotliEstimateBitCostsForLiterals(size_t pos, size_t len, size_t mask,
- const uint8_t* data, float* cost) {
+ const uint8_t* data,
+ size_t* histogram, float* cost) {
if (BrotliIsMostlyUTF8(data, pos, mask, len, kMinUTF8Ratio)) {
- EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, cost);
+ EstimateBitCostsForLiteralsUTF8(pos, len, mask, data, histogram, cost);
return;
} else {
- size_t histogram[256] = { 0 };
size_t window_half = 2000;
size_t in_window = BROTLI_MIN(size_t, window_half, len);
+ size_t i;
+ memset(histogram, 0, 256 * sizeof(histogram[0]));
/* Bootstrap histogram. */
- size_t i;
for (i = 0; i < in_window; ++i) {
++histogram[data[(pos + i) & mask]];
}
diff --git a/dviware/dvisvgm/libs/brotli/enc/literal_cost.h b/dviware/dvisvgm/libs/brotli/enc/literal_cost.h
index 8f53f39d3f..284a8e5af7 100644
--- a/dviware/dvisvgm/libs/brotli/enc/literal_cost.h
+++ b/dviware/dvisvgm/libs/brotli/enc/literal_cost.h
@@ -10,9 +10,10 @@
#ifndef BROTLI_ENC_LITERAL_COST_H_
#define BROTLI_ENC_LITERAL_COST_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
@@ -21,7 +22,8 @@ extern "C" {
ring-buffer (data, mask) will take entropy coded and writes these estimates
to the cost[0..len) array. */
BROTLI_INTERNAL void BrotliEstimateBitCostsForLiterals(
- size_t pos, size_t len, size_t mask, const uint8_t* data, float* cost);
+ size_t pos, size_t len, size_t mask, const uint8_t* data, size_t* histogram,
+ float* cost);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/memory.c b/dviware/dvisvgm/libs/brotli/enc/memory.c
index f6ed7e3cb7..bb5e364198 100644
--- a/dviware/dvisvgm/libs/brotli/enc/memory.c
+++ b/dviware/dvisvgm/libs/brotli/enc/memory.c
@@ -7,21 +7,22 @@
/* Algorithms for distributing the literals and commands of a metablock between
block types and contexts. */
-#include "./memory.h"
+#include "memory.h"
#include <stdlib.h> /* exit, free, malloc */
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-#define MAX_PERM_ALLOCATED 128
-#define MAX_NEW_ALLOCATED 64
-#define MAX_NEW_FREED 64
+#define MAX_NEW_ALLOCATED (BROTLI_ENCODER_MEMORY_MANAGER_SLOTS >> 2)
+#define MAX_NEW_FREED (BROTLI_ENCODER_MEMORY_MANAGER_SLOTS >> 2)
+#define MAX_PERM_ALLOCATED (BROTLI_ENCODER_MEMORY_MANAGER_SLOTS >> 1)
#define PERM_ALLOCATED_OFFSET 0
#define NEW_ALLOCATED_OFFSET MAX_PERM_ALLOCATED
@@ -67,6 +68,7 @@ void BrotliWipeOutMemoryManager(MemoryManager* m) {
static void SortPointers(void** items, const size_t n) {
/* Shell sort. */
+ /* TODO(eustas): fine-tune for "many slots" case */
static const size_t gaps[] = {23, 10, 4, 1};
int g = 0;
for (; g < 4; ++g) {
@@ -165,6 +167,28 @@ void BrotliWipeOutMemoryManager(MemoryManager* m) {
#endif /* BROTLI_ENCODER_EXIT_ON_OOM */
+void* BrotliBootstrapAlloc(size_t size,
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque) {
+ if (!alloc_func && !free_func) {
+ return malloc(size);
+ } else if (alloc_func && free_func) {
+ return alloc_func(opaque, size);
+ }
+ return NULL;
+}
+
+void BrotliBootstrapFree(void* address, MemoryManager* m) {
+ if (!address) {
+ /* Should not happen! */
+ return;
+ } else {
+ /* Copy values, as those would be freed. */
+ brotli_free_func free_func = m->free_func;
+ void* opaque = m->opaque;
+ free_func(opaque, address);
+ }
+}
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/memory.h b/dviware/dvisvgm/libs/brotli/enc/memory.h
index 832e7b2b6e..a4417df4cb 100644
--- a/dviware/dvisvgm/libs/brotli/enc/memory.h
+++ b/dviware/dvisvgm/libs/brotli/enc/memory.h
@@ -11,9 +11,10 @@
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
@@ -23,6 +24,16 @@ extern "C" {
#define BROTLI_ENCODER_EXIT_ON_OOM
#endif
+#if !defined(BROTLI_ENCODER_EXIT_ON_OOM)
+#if defined(BROTLI_EXPERIMENTAL)
+#define BROTLI_ENCODER_MEMORY_MANAGER_SLOTS (48*1024)
+#else /* BROTLI_EXPERIMENTAL */
+#define BROTLI_ENCODER_MEMORY_MANAGER_SLOTS 256
+#endif /* BROTLI_EXPERIMENTAL */
+#else /* BROTLI_ENCODER_EXIT_ON_OOM */
+#define BROTLI_ENCODER_MEMORY_MANAGER_SLOTS 0
+#endif /* BROTLI_ENCODER_EXIT_ON_OOM */
+
typedef struct MemoryManager {
brotli_alloc_func alloc_func;
brotli_free_func free_func;
@@ -32,7 +43,7 @@ typedef struct MemoryManager {
size_t perm_allocated;
size_t new_allocated;
size_t new_freed;
- void* pointers[256];
+ void* pointers[BROTLI_ENCODER_MEMORY_MANAGER_SLOTS];
#endif /* BROTLI_ENCODER_EXIT_ON_OOM */
} MemoryManager;
@@ -107,6 +118,12 @@ V: value to append
A[(S) - 1] = (V); \
}
+/* "Bootstrap" allocations are not tracked by memory manager; should be used
+ only to allocate MemoryManager itself (or structure containing it). */
+BROTLI_INTERNAL void* BrotliBootstrapAlloc(size_t size,
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
+BROTLI_INTERNAL void BrotliBootstrapFree(void* address, MemoryManager* m);
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/metablock.c b/dviware/dvisvgm/libs/brotli/enc/metablock.c
index 5aa4d4f17c..0c5c078d05 100644
--- a/dviware/dvisvgm/libs/brotli/enc/metablock.c
+++ b/dviware/dvisvgm/libs/brotli/enc/metablock.c
@@ -7,27 +7,27 @@
/* Algorithms for distributing the literals and commands of a metablock between
block types and contexts. */
-#include "./metablock.h"
+#include "metablock.h"
+
+#include <brotli/types.h>
#include "../common/constants.h"
#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./bit_cost.h"
-#include "./block_splitter.h"
-#include "./cluster.h"
-#include "./entropy_encode.h"
-#include "./histogram.h"
-#include "./memory.h"
-#include "./quality.h"
+#include "bit_cost.h"
+#include "block_splitter.h"
+#include "cluster.h"
+#include "entropy_encode.h"
+#include "histogram.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
-void BrotliInitDistanceParams(BrotliEncoderParams* params,
- uint32_t npostfix, uint32_t ndirect) {
- BrotliDistanceParams* dist_params = &params->dist;
+void BrotliInitDistanceParams(BrotliDistanceParams* dist_params,
+ uint32_t npostfix, uint32_t ndirect, BROTLI_BOOL large_window) {
uint32_t alphabet_size_max;
uint32_t alphabet_size_limit;
uint32_t max_distance;
@@ -41,7 +41,7 @@ void BrotliInitDistanceParams(BrotliEncoderParams* params,
max_distance = ndirect + (1U << (BROTLI_MAX_DISTANCE_BITS + npostfix + 2)) -
(1U << (npostfix + 2));
- if (params->large_window) {
+ if (large_window) {
BrotliDistanceCodeLimit limit = BrotliCalculateDistanceCodeLimit(
BROTLI_MAX_ALLOWED_DISTANCE, npostfix, ndirect);
alphabet_size_max = BROTLI_DISTANCE_ALPHABET_SIZE(
@@ -83,14 +83,14 @@ static BROTLI_BOOL ComputeDistanceCost(const Command* cmds,
size_t num_commands,
const BrotliDistanceParams* orig_params,
const BrotliDistanceParams* new_params,
- double* cost) {
+ double* cost,
+ HistogramDistance* tmp) {
size_t i;
BROTLI_BOOL equal_params = BROTLI_FALSE;
uint16_t dist_prefix;
uint32_t dist_extra;
double extra_bits = 0.0;
- HistogramDistance histo;
- HistogramClearDistance(&histo);
+ HistogramClearDistance(tmp);
if (orig_params->distance_postfix_bits == new_params->distance_postfix_bits &&
orig_params->num_direct_distance_codes ==
@@ -114,12 +114,12 @@ static BROTLI_BOOL ComputeDistanceCost(const Command* cmds,
&dist_prefix,
&dist_extra);
}
- HistogramAddDistance(&histo, dist_prefix & 0x3FF);
+ HistogramAddDistance(tmp, dist_prefix & 0x3FF);
extra_bits += dist_prefix >> 10;
}
}
- *cost = BrotliPopulationCostDistance(&histo) + extra_bits;
+ *cost = BrotliPopulationCostDistance(tmp) + extra_bits;
return BROTLI_TRUE;
}
@@ -147,43 +147,46 @@ void BrotliBuildMetaBlock(MemoryManager* m,
uint32_t ndirect_msb = 0;
BROTLI_BOOL check_orig = BROTLI_TRUE;
double best_dist_cost = 1e99;
- BrotliEncoderParams orig_params = *params;
- BrotliEncoderParams new_params = *params;
+ BrotliDistanceParams orig_params = params->dist;
+ BrotliDistanceParams new_params = params->dist;
+ HistogramDistance* tmp = BROTLI_ALLOC(m, HistogramDistance, 1);
+
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(tmp)) return;
for (npostfix = 0; npostfix <= BROTLI_MAX_NPOSTFIX; npostfix++) {
for (; ndirect_msb < 16; ndirect_msb++) {
uint32_t ndirect = ndirect_msb << npostfix;
BROTLI_BOOL skip;
double dist_cost;
- BrotliInitDistanceParams(&new_params, npostfix, ndirect);
- if (npostfix == orig_params.dist.distance_postfix_bits &&
- ndirect == orig_params.dist.num_direct_distance_codes) {
+ BrotliInitDistanceParams(&new_params, npostfix, ndirect,
+ params->large_window);
+ if (npostfix == orig_params.distance_postfix_bits &&
+ ndirect == orig_params.num_direct_distance_codes) {
check_orig = BROTLI_FALSE;
}
skip = !ComputeDistanceCost(
- cmds, num_commands,
- &orig_params.dist, &new_params.dist, &dist_cost);
+ cmds, num_commands, &orig_params, &new_params, &dist_cost, tmp);
if (skip || (dist_cost > best_dist_cost)) {
break;
}
best_dist_cost = dist_cost;
- params->dist = new_params.dist;
+ params->dist = new_params;
}
if (ndirect_msb > 0) ndirect_msb--;
ndirect_msb /= 2;
}
if (check_orig) {
double dist_cost;
- ComputeDistanceCost(cmds, num_commands,
- &orig_params.dist, &orig_params.dist, &dist_cost);
+ ComputeDistanceCost(cmds, num_commands, &orig_params, &orig_params,
+ &dist_cost, tmp);
if (dist_cost < best_dist_cost) {
/* NB: currently unused; uncomment when more param tuning is added. */
/* best_dist_cost = dist_cost; */
- params->dist = orig_params.dist;
+ params->dist = orig_params;
}
}
- RecomputeDistancePrefixes(cmds, num_commands,
- &orig_params.dist, &params->dist);
+ BROTLI_FREE(m, tmp);
+ RecomputeDistancePrefixes(cmds, num_commands, &orig_params, &params->dist);
BrotliSplitBlock(m, cmds, num_commands,
ringbuffer, pos, mask, params,
@@ -284,15 +287,15 @@ void BrotliBuildMetaBlock(MemoryManager* m,
}
#define FN(X) X ## Literal
-#include "./metablock_inc.h" /* NOLINT(build/include) */
+#include "metablock_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Command
-#include "./metablock_inc.h" /* NOLINT(build/include) */
+#include "metablock_inc.h" /* NOLINT(build/include) */
#undef FN
#define FN(X) X ## Distance
-#include "./metablock_inc.h" /* NOLINT(build/include) */
+#include "metablock_inc.h" /* NOLINT(build/include) */
#undef FN
#define BROTLI_MAX_STATIC_CONTEXTS 13
@@ -535,17 +538,21 @@ static void MapStaticContexts(MemoryManager* m,
}
}
-static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
- MemoryManager* m, const uint8_t* ringbuffer, size_t pos, size_t mask,
- uint8_t prev_byte, uint8_t prev_byte2, ContextLut literal_context_lut,
- const size_t num_contexts, const uint32_t* static_context_map,
- const Command* commands, size_t n_commands, MetaBlockSplit* mb) {
+typedef struct GreedyMetablockArena {
union {
BlockSplitterLiteral plain;
ContextBlockSplitter ctx;
} lit_blocks;
BlockSplitterCommand cmd_blocks;
BlockSplitterDistance dist_blocks;
+} GreedyMetablockArena;
+
+static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
+ MemoryManager* m, GreedyMetablockArena* arena, const uint8_t* ringbuffer,
+ size_t pos, size_t mask, uint8_t prev_byte, uint8_t prev_byte2,
+ ContextLut literal_context_lut, const size_t num_contexts,
+ const uint32_t* static_context_map, const Command* commands,
+ size_t n_commands, MetaBlockSplit* mb) {
size_t num_literals = 0;
size_t i;
for (i = 0; i < n_commands; ++i) {
@@ -553,20 +560,20 @@ static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
}
if (num_contexts == 1) {
- InitBlockSplitterLiteral(m, &lit_blocks.plain, 256, 512, 400.0,
+ InitBlockSplitterLiteral(m, &arena->lit_blocks.plain, 256, 512, 400.0,
num_literals, &mb->literal_split, &mb->literal_histograms,
&mb->literal_histograms_size);
} else {
- InitContextBlockSplitter(m, &lit_blocks.ctx, 256, num_contexts, 512, 400.0,
- num_literals, &mb->literal_split, &mb->literal_histograms,
+ InitContextBlockSplitter(m, &arena->lit_blocks.ctx, 256, num_contexts, 512,
+ 400.0, num_literals, &mb->literal_split, &mb->literal_histograms,
&mb->literal_histograms_size);
}
if (BROTLI_IS_OOM(m)) return;
- InitBlockSplitterCommand(m, &cmd_blocks, BROTLI_NUM_COMMAND_SYMBOLS, 1024,
- 500.0, n_commands, &mb->command_split, &mb->command_histograms,
+ InitBlockSplitterCommand(m, &arena->cmd_blocks, BROTLI_NUM_COMMAND_SYMBOLS,
+ 1024, 500.0, n_commands, &mb->command_split, &mb->command_histograms,
&mb->command_histograms_size);
if (BROTLI_IS_OOM(m)) return;
- InitBlockSplitterDistance(m, &dist_blocks, 64, 512, 100.0, n_commands,
+ InitBlockSplitterDistance(m, &arena->dist_blocks, 64, 512, 100.0, n_commands,
&mb->distance_split, &mb->distance_histograms,
&mb->distance_histograms_size);
if (BROTLI_IS_OOM(m)) return;
@@ -574,15 +581,15 @@ static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
for (i = 0; i < n_commands; ++i) {
const Command cmd = commands[i];
size_t j;
- BlockSplitterAddSymbolCommand(&cmd_blocks, cmd.cmd_prefix_);
+ BlockSplitterAddSymbolCommand(&arena->cmd_blocks, cmd.cmd_prefix_);
for (j = cmd.insert_len_; j != 0; --j) {
uint8_t literal = ringbuffer[pos & mask];
if (num_contexts == 1) {
- BlockSplitterAddSymbolLiteral(&lit_blocks.plain, literal);
+ BlockSplitterAddSymbolLiteral(&arena->lit_blocks.plain, literal);
} else {
size_t context =
BROTLI_CONTEXT(prev_byte, prev_byte2, literal_context_lut);
- ContextBlockSplitterAddSymbol(&lit_blocks.ctx, m, literal,
+ ContextBlockSplitterAddSymbol(&arena->lit_blocks.ctx, m, literal,
static_context_map[context]);
if (BROTLI_IS_OOM(m)) return;
}
@@ -595,21 +602,24 @@ static BROTLI_INLINE void BrotliBuildMetaBlockGreedyInternal(
prev_byte2 = ringbuffer[(pos - 2) & mask];
prev_byte = ringbuffer[(pos - 1) & mask];
if (cmd.cmd_prefix_ >= 128) {
- BlockSplitterAddSymbolDistance(&dist_blocks, cmd.dist_prefix_ & 0x3FF);
+ BlockSplitterAddSymbolDistance(
+ &arena->dist_blocks, cmd.dist_prefix_ & 0x3FF);
}
}
}
if (num_contexts == 1) {
BlockSplitterFinishBlockLiteral(
- &lit_blocks.plain, /* is_final = */ BROTLI_TRUE);
+ &arena->lit_blocks.plain, /* is_final = */ BROTLI_TRUE);
} else {
ContextBlockSplitterFinishBlock(
- &lit_blocks.ctx, m, /* is_final = */ BROTLI_TRUE);
+ &arena->lit_blocks.ctx, m, /* is_final = */ BROTLI_TRUE);
if (BROTLI_IS_OOM(m)) return;
}
- BlockSplitterFinishBlockCommand(&cmd_blocks, /* is_final = */ BROTLI_TRUE);
- BlockSplitterFinishBlockDistance(&dist_blocks, /* is_final = */ BROTLI_TRUE);
+ BlockSplitterFinishBlockCommand(
+ &arena->cmd_blocks, /* is_final = */ BROTLI_TRUE);
+ BlockSplitterFinishBlockDistance(
+ &arena->dist_blocks, /* is_final = */ BROTLI_TRUE);
if (num_contexts > 1) {
MapStaticContexts(m, num_contexts, static_context_map, mb);
@@ -628,14 +638,18 @@ void BrotliBuildMetaBlockGreedy(MemoryManager* m,
const Command* commands,
size_t n_commands,
MetaBlockSplit* mb) {
+ GreedyMetablockArena* arena = BROTLI_ALLOC(m, GreedyMetablockArena, 1);
+ if (BROTLI_IS_OOM(m) || BROTLI_IS_NULL(arena)) return;
if (num_contexts == 1) {
- BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte,
- prev_byte2, literal_context_lut, 1, NULL, commands, n_commands, mb);
+ BrotliBuildMetaBlockGreedyInternal(m, arena, ringbuffer, pos, mask,
+ prev_byte, prev_byte2, literal_context_lut, 1, NULL, commands,
+ n_commands, mb);
} else {
- BrotliBuildMetaBlockGreedyInternal(m, ringbuffer, pos, mask, prev_byte,
- prev_byte2, literal_context_lut, num_contexts, static_context_map,
- commands, n_commands, mb);
+ BrotliBuildMetaBlockGreedyInternal(m, arena, ringbuffer, pos, mask,
+ prev_byte, prev_byte2, literal_context_lut, num_contexts,
+ static_context_map, commands, n_commands, mb);
}
+ BROTLI_FREE(m, arena);
}
void BrotliOptimizeHistograms(uint32_t num_distance_codes,
diff --git a/dviware/dvisvgm/libs/brotli/enc/metablock.h b/dviware/dvisvgm/libs/brotli/enc/metablock.h
index 334a79a443..db38f8fd21 100644
--- a/dviware/dvisvgm/libs/brotli/enc/metablock.h
+++ b/dviware/dvisvgm/libs/brotli/enc/metablock.h
@@ -10,14 +10,15 @@
#ifndef BROTLI_ENC_METABLOCK_H_
#define BROTLI_ENC_METABLOCK_H_
+#include <brotli/types.h>
+
#include "../common/context.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./block_splitter.h"
-#include "./command.h"
-#include "./histogram.h"
-#include "./memory.h"
-#include "./quality.h"
+#include "block_splitter.h"
+#include "command.h"
+#include "histogram.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -95,8 +96,8 @@ BROTLI_INTERNAL void BrotliBuildMetaBlockGreedy(
BROTLI_INTERNAL void BrotliOptimizeHistograms(uint32_t num_distance_codes,
MetaBlockSplit* mb);
-BROTLI_INTERNAL void BrotliInitDistanceParams(BrotliEncoderParams* params,
- uint32_t npostfix, uint32_t ndirect);
+BROTLI_INTERNAL void BrotliInitDistanceParams(BrotliDistanceParams* params,
+ uint32_t npostfix, uint32_t ndirect, BROTLI_BOOL large_window);
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/metablock_inc.h b/dviware/dvisvgm/libs/brotli/enc/metablock_inc.h
index ed507ef5ef..f9393869ab 100644
--- a/dviware/dvisvgm/libs/brotli/enc/metablock_inc.h
+++ b/dviware/dvisvgm/libs/brotli/enc/metablock_inc.h
@@ -27,6 +27,9 @@ typedef struct FN(BlockSplitter) {
HistogramType* histograms_; /* not owned */
size_t* histograms_size_; /* not owned */
+ /* Temporary storage for BlockSplitterFinishBlock. */
+ HistogramType combined_histo[2];
+
/* The number of symbols that we want to collect before deciding on whether
or not to merge the block with a previous one or emit a new block. */
size_t target_block_size_;
@@ -104,17 +107,16 @@ static void FN(BlockSplitterFinishBlock)(
} else if (self->block_size_ > 0) {
double entropy = BitsEntropy(histograms[self->curr_histogram_ix_].data_,
self->alphabet_size_);
- HistogramType combined_histo[2];
double combined_entropy[2];
double diff[2];
size_t j;
for (j = 0; j < 2; ++j) {
size_t last_histogram_ix = self->last_histogram_ix_[j];
- combined_histo[j] = histograms[self->curr_histogram_ix_];
- FN(HistogramAddHistogram)(&combined_histo[j],
+ self->combined_histo[j] = histograms[self->curr_histogram_ix_];
+ FN(HistogramAddHistogram)(&self->combined_histo[j],
&histograms[last_histogram_ix]);
combined_entropy[j] = BitsEntropy(
- &combined_histo[j].data_[0], self->alphabet_size_);
+ &self->combined_histo[j].data_[0], self->alphabet_size_);
diff[j] = combined_entropy[j] - entropy - last_entropy[j];
}
@@ -141,7 +143,7 @@ static void FN(BlockSplitterFinishBlock)(
split->lengths[self->num_blocks_] = (uint32_t)self->block_size_;
split->types[self->num_blocks_] = split->types[self->num_blocks_ - 2];
BROTLI_SWAP(size_t, self->last_histogram_ix_, 0, 1);
- histograms[self->last_histogram_ix_[0]] = combined_histo[1];
+ histograms[self->last_histogram_ix_[0]] = self->combined_histo[1];
last_entropy[1] = last_entropy[0];
last_entropy[0] = combined_entropy[1];
++self->num_blocks_;
@@ -152,7 +154,7 @@ static void FN(BlockSplitterFinishBlock)(
} else {
/* Combine this block with last block. */
split->lengths[self->num_blocks_ - 1] += (uint32_t)self->block_size_;
- histograms[self->last_histogram_ix_[0]] = combined_histo[0];
+ histograms[self->last_histogram_ix_[0]] = self->combined_histo[0];
last_entropy[0] = combined_entropy[0];
if (split->num_types == 1) {
last_entropy[1] = last_entropy[0];
diff --git a/dviware/dvisvgm/libs/brotli/enc/params.h b/dviware/dvisvgm/libs/brotli/enc/params.h
index 54a7f00736..78b2ab6082 100644
--- a/dviware/dvisvgm/libs/brotli/enc/params.h
+++ b/dviware/dvisvgm/libs/brotli/enc/params.h
@@ -10,13 +10,13 @@
#define BROTLI_ENC_PARAMS_H_
#include <brotli/encode.h>
-#include "./encoder_dict.h"
+
+#include "encoder_dict.h"
typedef struct BrotliHasherParams {
int type;
int bucket_bits;
int block_bits;
- int hash_len;
int num_last_distances_to_check;
} BrotliHasherParams;
@@ -40,7 +40,8 @@ typedef struct BrotliEncoderParams {
BROTLI_BOOL large_window;
BrotliHasherParams hasher;
BrotliDistanceParams dist;
- BrotliEncoderDictionary dictionary;
+ /* TODO(eustas): rename to BrotliShared... */
+ SharedEncoderDictionary dictionary;
} BrotliEncoderParams;
#endif /* BROTLI_ENC_PARAMS_H_ */
diff --git a/dviware/dvisvgm/libs/brotli/enc/prefix.h b/dviware/dvisvgm/libs/brotli/enc/prefix.h
index fd359a478d..0f006f1614 100644
--- a/dviware/dvisvgm/libs/brotli/enc/prefix.h
+++ b/dviware/dvisvgm/libs/brotli/enc/prefix.h
@@ -10,10 +10,11 @@
#ifndef BROTLI_ENC_PREFIX_H_
#define BROTLI_ENC_PREFIX_H_
+#include <brotli/types.h>
+
#include "../common/constants.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./fast_log.h"
+#include "fast_log.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/quality.h b/dviware/dvisvgm/libs/brotli/enc/quality.h
index 5f4d034503..ffdfd72fb4 100644
--- a/dviware/dvisvgm/libs/brotli/enc/quality.h
+++ b/dviware/dvisvgm/libs/brotli/enc/quality.h
@@ -10,9 +10,10 @@
#ifndef BROTLI_ENC_QUALITY_H_
#define BROTLI_ENC_QUALITY_H_
-#include "../common/platform.h"
#include <brotli/encode.h>
-#include "./params.h"
+
+#include "../common/platform.h"
+#include "params.h"
#define FAST_ONE_PASS_COMPRESSION_QUALITY 0
#define FAST_TWO_PASS_COMPRESSION_QUALITY 1
@@ -118,6 +119,41 @@ static BROTLI_INLINE size_t LiteralSpreeLengthForSparseSearch(
return params->quality < 9 ? 64 : 512;
}
+/* Quality to hasher mapping:
+
+ - q02: h02 (longest_match_quickly), b16, l5
+
+ - q03: h03 (longest_match_quickly), b17, l5
+
+ - q04: h04 (longest_match_quickly), b17, l5
+ - q04: h54 (longest_match_quickly), b20, l7 | for large files
+
+ - q05: h05 (longest_match ), b14, l4
+ - q05: h06 (longest_match64 ), b15, l5 | for large files
+ - q05: h40 (forgetful_chain ), b15, l4 | for small window
+
+ - q06: h05 (longest_match ), b14, l4
+ - q06: h06 (longest_match64 ), b15, l5 | for large files
+ - q06: h40 (forgetful_chain ), b15, l4 | for small window
+
+ - q07: h05 (longest_match ), b15, l4
+ - q07: h06 (longest_match64 ), b15, l5 | for large files
+ - q07: h41 (forgetful_chain ), b15, l4 | for small window
+
+ - q08: h05 (longest_match ), b15, l4
+ - q08: h06 (longest_match64 ), b15, l5 | for large files
+ - q08: h41 (forgetful_chain ), b15, l4 | for small window
+
+ - q09: h05 (longest_match ), b15, l4
+ - q09: h06 (longest_match64 ), b15, l5 | for large files
+ - q09: h42 (forgetful_chain ), b15, l4 | for small window
+
+ - q10: t10 (to_binary_tree ), b17, l128
+
+ - q11: t10 (to_binary_tree ), b17, l128
+
+ Where "q" is quality, "h" is hasher type, "b" is bucket bits,
+ "l" is source len. */
static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params,
BrotliHasherParams* hparams) {
if (params->quality > 9) {
@@ -132,10 +168,11 @@ static BROTLI_INLINE void ChooseHasher(const BrotliEncoderParams* params,
hparams->type = 6;
hparams->block_bits = params->quality - 1;
hparams->bucket_bits = 15;
- hparams->hash_len = 5;
hparams->num_last_distances_to_check =
params->quality < 7 ? 4 : params->quality < 9 ? 10 : 16;
} else {
+ /* TODO(eustas): often previous setting (H6) is faster and denser; consider
+ adding an option to use it. */
hparams->type = 5;
hparams->block_bits = params->quality - 1;
hparams->bucket_bits = params->quality < 7 ? 14 : 15;
diff --git a/dviware/dvisvgm/libs/brotli/enc/ringbuffer.h b/dviware/dvisvgm/libs/brotli/enc/ringbuffer.h
index 8dce148039..27245b7f39 100644
--- a/dviware/dvisvgm/libs/brotli/enc/ringbuffer.h
+++ b/dviware/dvisvgm/libs/brotli/enc/ringbuffer.h
@@ -11,10 +11,11 @@
#include <string.h> /* memcpy */
-#include "../common/platform.h"
#include <brotli/types.h>
-#include "./memory.h"
-#include "./quality.h"
+
+#include "../common/platform.h"
+#include "memory.h"
+#include "quality.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/state.h b/dviware/dvisvgm/libs/brotli/enc/state.h
new file mode 100644
index 0000000000..cb82987701
--- /dev/null
+++ b/dviware/dvisvgm/libs/brotli/enc/state.h
@@ -0,0 +1,104 @@
+/* Copyright 2022 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* Encoder state. */
+
+#ifndef BROTLI_ENC_STATE_H_
+#define BROTLI_ENC_STATE_H_
+
+#include <brotli/types.h>
+
+#include "command.h"
+#include "compress_fragment.h"
+#include "compress_fragment_two_pass.h"
+#include "hash.h"
+#include "memory.h"
+#include "params.h"
+#include "ringbuffer.h"
+
+typedef enum BrotliEncoderStreamState {
+ /* Default state. */
+ BROTLI_STREAM_PROCESSING = 0,
+ /* Intermediate state; after next block is emitted, byte-padding should be
+ performed before getting back to default state. */
+ BROTLI_STREAM_FLUSH_REQUESTED = 1,
+ /* Last metablock was produced; no more input is acceptable. */
+ BROTLI_STREAM_FINISHED = 2,
+ /* Flushing compressed block and writing meta-data block header. */
+ BROTLI_STREAM_METADATA_HEAD = 3,
+ /* Writing metadata block body. */
+ BROTLI_STREAM_METADATA_BODY = 4
+} BrotliEncoderStreamState;
+
+typedef enum BrotliEncoderFlintState {
+ BROTLI_FLINT_NEEDS_2_BYTES = 2,
+ BROTLI_FLINT_NEEDS_1_BYTE = 1,
+ BROTLI_FLINT_WAITING_FOR_PROCESSING = 0,
+ BROTLI_FLINT_WAITING_FOR_FLUSHING = -1,
+ BROTLI_FLINT_DONE = -2
+} BrotliEncoderFlintState;
+
+typedef struct BrotliEncoderStateStruct {
+ BrotliEncoderParams params;
+
+ MemoryManager memory_manager_;
+
+ uint64_t input_pos_;
+ RingBuffer ringbuffer_;
+ size_t cmd_alloc_size_;
+ Command* commands_;
+ size_t num_commands_;
+ size_t num_literals_;
+ size_t last_insert_len_;
+ uint64_t last_flush_pos_;
+ uint64_t last_processed_pos_;
+ int dist_cache_[BROTLI_NUM_DISTANCE_SHORT_CODES];
+ int saved_dist_cache_[4];
+ uint16_t last_bytes_;
+ uint8_t last_bytes_bits_;
+ /* "Flint" is a tiny uncompressed block emitted before the continuation
+ block to unwire literal context from previous data. Despite being int8_t,
+ field is actually BrotliEncoderFlintState enum. */
+ int8_t flint_;
+ uint8_t prev_byte_;
+ uint8_t prev_byte2_;
+ size_t storage_size_;
+ uint8_t* storage_;
+
+ Hasher hasher_;
+
+ /* Hash table for FAST_ONE_PASS_COMPRESSION_QUALITY mode. */
+ int small_table_[1 << 10]; /* 4KiB */
+ int* large_table_; /* Allocated only when needed */
+ size_t large_table_size_;
+
+ BrotliOnePassArena* one_pass_arena_;
+ BrotliTwoPassArena* two_pass_arena_;
+
+ /* Command and literal buffers for FAST_TWO_PASS_COMPRESSION_QUALITY. */
+ uint32_t* command_buf_;
+ uint8_t* literal_buf_;
+
+ uint64_t total_in_;
+ uint8_t* next_out_;
+ size_t available_out_;
+ uint64_t total_out_;
+ /* Temporary buffer for padding flush bits or metadata block header / body. */
+ union {
+ uint64_t u64[2];
+ uint8_t u8[16];
+ } tiny_buf_;
+ uint32_t remaining_metadata_bytes_;
+ BrotliEncoderStreamState stream_state_;
+
+ BROTLI_BOOL is_last_block_emitted_;
+ BROTLI_BOOL is_initialized_;
+} BrotliEncoderStateStruct;
+
+typedef struct BrotliEncoderStateStruct BrotliEncoderStateInternal;
+#define BrotliEncoderState BrotliEncoderStateInternal
+
+#endif // BROTLI_ENC_STATE_H_
diff --git a/dviware/dvisvgm/libs/brotli/enc/static_dict.c b/dviware/dvisvgm/libs/brotli/enc/static_dict.c
index 7299ab7203..291d283354 100644
--- a/dviware/dvisvgm/libs/brotli/enc/static_dict.c
+++ b/dviware/dvisvgm/libs/brotli/enc/static_dict.c
@@ -4,13 +4,13 @@
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/
-#include "./static_dict.h"
+#include "static_dict.h"
#include "../common/dictionary.h"
#include "../common/platform.h"
#include "../common/transform.h"
-#include "./encoder_dict.h"
-#include "./find_match_length.h"
+#include "encoder_dict.h"
+#include "find_match_length.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -74,10 +74,27 @@ static BROTLI_INLINE BROTLI_BOOL IsMatch(const BrotliDictionary* dictionary,
}
}
-BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
+/* Finds matches for a single static dictionary */
+static BROTLI_BOOL BrotliFindAllStaticDictionaryMatchesFor(
const BrotliEncoderDictionary* dictionary, const uint8_t* data,
size_t min_length, size_t max_length, uint32_t* matches) {
BROTLI_BOOL has_found_match = BROTLI_FALSE;
+#if defined(BROTLI_EXPERIMENTAL)
+ if (dictionary->has_words_heavy) {
+ const BrotliTrieNode* node = &dictionary->trie.root;
+ size_t l = 0;
+ while (node && l < max_length) {
+ uint8_t c;
+ if (l >= min_length && node->len_) {
+ AddMatch(node->idx_, l, node->len_, matches);
+ has_found_match = BROTLI_TRUE;
+ }
+ c = data[l++];
+ node = BrotliTrieSub(&dictionary->trie, node, c);
+ }
+ return has_found_match;
+ }
+#endif /* BROTLI_EXPERIMENTAL */
{
size_t offset = dictionary->buckets[Hash(data)];
BROTLI_BOOL end = !offset;
@@ -481,6 +498,45 @@ BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
return has_found_match;
}
+/* Finds matches for one or more dictionaries, if multiple are present
+ in the contextual dictionary */
+BROTLI_BOOL BrotliFindAllStaticDictionaryMatches(
+ const BrotliEncoderDictionary* dictionary, const uint8_t* data,
+ size_t min_length, size_t max_length, uint32_t* matches) {
+ BROTLI_BOOL has_found_match =
+ BrotliFindAllStaticDictionaryMatchesFor(
+ dictionary, data, min_length, max_length, matches);
+
+ if (!!dictionary->parent && dictionary->parent->num_dictionaries > 1) {
+ uint32_t matches2[BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1];
+ int l;
+ const BrotliEncoderDictionary* dictionary2 = dictionary->parent->dict[0];
+ if (dictionary2 == dictionary) {
+ dictionary2 = dictionary->parent->dict[1];
+ }
+
+ for (l = 0; l < BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1; l++) {
+ matches2[l] = kInvalidMatch;
+ }
+
+ has_found_match |= BrotliFindAllStaticDictionaryMatchesFor(
+ dictionary2, data, min_length, max_length, matches2);
+
+ for (l = 0; l < BROTLI_MAX_STATIC_DICTIONARY_MATCH_LEN + 1; l++) {
+ if (matches2[l] != kInvalidMatch) {
+ uint32_t dist = (uint32_t)(matches2[l] >> 5);
+ uint32_t len_code = matches2[l] & 31;
+ uint32_t skipdist = (uint32_t)((uint32_t)(1 << dictionary->words->
+ size_bits_by_length[len_code]) & ~1u) *
+ (uint32_t)dictionary->num_transforms;
+ /* TODO(lode): check for dist overflow */
+ dist += skipdist;
+ AddMatch(dist, (size_t)l, len_code, matches);
+ }
+ }
+ }
+ return has_found_match;
+}
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/static_dict.h b/dviware/dvisvgm/libs/brotli/enc/static_dict.h
index 6b5d4eb0c9..ab832207d1 100644
--- a/dviware/dvisvgm/libs/brotli/enc/static_dict.h
+++ b/dviware/dvisvgm/libs/brotli/enc/static_dict.h
@@ -9,10 +9,11 @@
#ifndef BROTLI_ENC_STATIC_DICT_H_
#define BROTLI_ENC_STATIC_DICT_H_
+#include <brotli/types.h>
+
#include "../common/dictionary.h"
#include "../common/platform.h"
-#include <brotli/types.h>
-#include "./encoder_dict.h"
+#include "encoder_dict.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
diff --git a/dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h b/dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h
index e299cda6d8..a465ffde74 100644
--- a/dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h
+++ b/dviware/dvisvgm/libs/brotli/enc/static_dict_lut.h
@@ -22,6 +22,7 @@ typedef struct DictWord {
uint16_t idx;
} DictWord;
+/* GENERATED CODE START */
static const int kDictNumBits = 15;
static const uint32_t kDictHashMul32 = 0x1E35A7BD;
@@ -5856,6 +5857,7 @@ static const DictWord kStaticDictionaryWords[31705] = {
,0,1735},{5,0,598},{7,0,791},{8,0,108},{9,0,123},{7,10,1570},{140,10,542},{142,
11,410},{9,11,660},{138,11,347}
};
+/* GENERATED CODE END */
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
diff --git a/dviware/dvisvgm/libs/brotli/enc/utf8_util.c b/dviware/dvisvgm/libs/brotli/enc/utf8_util.c
index e802b6a751..65ec3f5c8d 100644
--- a/dviware/dvisvgm/libs/brotli/enc/utf8_util.c
+++ b/dviware/dvisvgm/libs/brotli/enc/utf8_util.c
@@ -6,7 +6,7 @@
/* Heuristics for deciding about the UTF8-ness of strings. */
-#include "./utf8_util.h"
+#include "utf8_util.h"
#include <brotli/types.h>
diff --git a/dviware/dvisvgm/libs/brotli/enc/utf8_util.h b/dviware/dvisvgm/libs/brotli/enc/utf8_util.h
index 8fda80c220..a38a95383c 100644
--- a/dviware/dvisvgm/libs/brotli/enc/utf8_util.h
+++ b/dviware/dvisvgm/libs/brotli/enc/utf8_util.h
@@ -9,9 +9,10 @@
#ifndef BROTLI_ENC_UTF8_UTIL_H_
#define BROTLI_ENC_UTF8_UTIL_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
diff --git a/dviware/dvisvgm/libs/brotli/enc/write_bits.h b/dviware/dvisvgm/libs/brotli/enc/write_bits.h
index f6f88b45be..242754b0ee 100644
--- a/dviware/dvisvgm/libs/brotli/enc/write_bits.h
+++ b/dviware/dvisvgm/libs/brotli/enc/write_bits.h
@@ -9,9 +9,10 @@
#ifndef BROTLI_ENC_WRITE_BITS_H_
#define BROTLI_ENC_WRITE_BITS_H_
-#include "../common/platform.h"
#include <brotli/types.h>
+#include "../common/platform.h"
+
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
diff --git a/dviware/dvisvgm/libs/brotli/include/brotli/decode.h b/dviware/dvisvgm/libs/brotli/include/brotli/decode.h
index 0f5c8f9d11..af1aa23f60 100644
--- a/dviware/dvisvgm/libs/brotli/include/brotli/decode.h
+++ b/dviware/dvisvgm/libs/brotli/include/brotli/decode.h
@@ -13,6 +13,7 @@
#define BROTLI_DEC_DECODE_H_
#include <brotli/port.h>
+#include <brotli/shared_dictionary.h>
#include <brotli/types.h>
#if defined(__cplusplus) || defined(c_plusplus)
@@ -85,8 +86,9 @@ typedef enum {
BROTLI_ERROR_CODE(_ERROR_FORMAT_, PADDING_2, -15) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_FORMAT_, DISTANCE, -16) SEPARATOR \
\
- /* -17..-18 codes are reserved */ \
+ /* -17 code is reserved */ \
\
+ BROTLI_ERROR_CODE(_ERROR_, COMPOUND_DICTIONARY, -18) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_, DICTIONARY_NOT_SET, -19) SEPARATOR \
BROTLI_ERROR_CODE(_ERROR_, INVALID_ARGUMENTS, -20) SEPARATOR \
\
@@ -155,6 +157,28 @@ BROTLI_DEC_API BROTLI_BOOL BrotliDecoderSetParameter(
BrotliDecoderState* state, BrotliDecoderParameter param, uint32_t value);
/**
+ * Adds LZ77 prefix dictionary, adds or replaces built-in static dictionary and
+ * transforms.
+ *
+ * Attached dictionary ownership is not transferred.
+ * Data provided to this method should be kept accessible until
+ * decoding is finished and decoder instance is destroyed.
+ *
+ * @note Dictionaries can NOT be attached after actual decoding is started.
+ *
+ * @param state decoder instance
+ * @param type dictionary data format
+ * @param data_size length of memory region pointed by @p data
+ * @param data dictionary data in format corresponding to @p type
+ * @returns ::BROTLI_FALSE if dictionary is corrupted,
+ * or dictionary count limit is reached
+ * @returns ::BROTLI_TRUE if dictionary is accepted / attached
+ */
+BROTLI_DEC_API BROTLI_BOOL BrotliDecoderAttachDictionary(
+ BrotliDecoderState* state, BrotliSharedDictionaryType type,
+ size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]);
+
+/**
* Creates an instance of ::BrotliDecoderState and initializes it.
*
* The instance can be used once for decoding and should then be destroyed with
@@ -333,10 +357,51 @@ BROTLI_DEC_API const char* BrotliDecoderErrorString(BrotliDecoderErrorCode c);
/**
* Gets a decoder library version.
*
- * Look at BROTLI_VERSION for more information.
+ * Look at BROTLI_MAKE_HEX_VERSION for more information.
*/
BROTLI_DEC_API uint32_t BrotliDecoderVersion(void);
+/**
+ * Callback to fire on metadata block start.
+ *
+ * After this callback is fired, if @p size is not @c 0, it is followed by
+ * ::brotli_decoder_metadata_chunk_func as more metadata block contents become
+ * accessible.
+ *
+ * @param opaque callback handle
+ * @param size size of metadata block
+ */
+typedef void (*brotli_decoder_metadata_start_func)(void* opaque, size_t size);
+
+/**
+ * Callback to fire on metadata block chunk becomes available.
+ *
+ * This function can be invoked multiple times per metadata block; block should
+ * be considered finished when sum of @p size matches the announced metadata
+ * block size. Chunks contents pointed by @p data are transient and shouln not
+ * be accessed after leaving the callback.
+ *
+ * @param opaque callback handle
+ * @param data pointer to metadata contents
+ * @param size size of metadata block chunk, at least @c 1
+ */
+typedef void (*brotli_decoder_metadata_chunk_func)(void* opaque,
+ const uint8_t* data,
+ size_t size);
+
+/**
+ * Sets callback for receiving metadata blocks.
+ *
+ * @param state decoder instance
+ * @param start_func callback on metadata block start
+ * @param chunk_func callback on metadata block chunk
+ * @param opaque callback handle
+ */
+BROTLI_DEC_API void BrotliDecoderSetMetadataCallbacks(
+ BrotliDecoderState* state,
+ brotli_decoder_metadata_start_func start_func,
+ brotli_decoder_metadata_chunk_func chunk_func, void* opaque);
+
#if defined(__cplusplus) || defined(c_plusplus)
} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/libs/brotli/include/brotli/encode.h b/dviware/dvisvgm/libs/brotli/include/brotli/encode.h
index b2774cb631..dea9931ebb 100644
--- a/dviware/dvisvgm/libs/brotli/include/brotli/encode.h
+++ b/dviware/dvisvgm/libs/brotli/include/brotli/encode.h
@@ -13,6 +13,7 @@
#define BROTLI_ENC_ENCODE_H_
#include <brotli/port.h>
+#include <brotli/shared_dictionary.h>
#include <brotli/types.h>
#if defined(__cplusplus) || defined(c_plusplus)
@@ -269,6 +270,51 @@ BROTLI_ENC_API BrotliEncoderState* BrotliEncoderCreateInstance(
*/
BROTLI_ENC_API void BrotliEncoderDestroyInstance(BrotliEncoderState* state);
+/* Opaque type for pointer to different possible internal structures containing
+ dictionary prepared for the encoder */
+typedef struct BrotliEncoderPreparedDictionaryStruct
+ BrotliEncoderPreparedDictionary;
+
+/**
+ * Prepares a shared dictionary from the given file format for the encoder.
+ *
+ * @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
+ * case they are both zero, default memory allocators are used. @p opaque is
+ * passed to @p alloc_func and @p free_func when they are called. @p free_func
+ * has to return without doing anything when asked to free a NULL pointer.
+ *
+ * @param type type of dictionary stored in data
+ * @param data_size size of @p data buffer
+ * @param data pointer to the dictionary data
+ * @param quality the maximum Brotli quality to prepare the dictionary for,
+ * use BROTLI_MAX_QUALITY by default
+ * @param alloc_func custom memory allocation function
+ * @param free_func custom memory free function
+ * @param opaque custom memory manager handle
+ */
+BROTLI_ENC_API BrotliEncoderPreparedDictionary*
+BrotliEncoderPrepareDictionary(BrotliSharedDictionaryType type,
+ size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)],
+ int quality,
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
+
+BROTLI_ENC_API void BrotliEncoderDestroyPreparedDictionary(
+ BrotliEncoderPreparedDictionary* dictionary);
+
+/**
+ * Attaches a prepared dictionary of any type to the encoder. Can be used
+ * multiple times to attach multiple dictionaries. The dictionary type was
+ * determined by BrotliEncoderPrepareDictionary. Multiple raw prefix
+ * dictionaries and/or max 1 serialized dictionary with custom words can be
+ * attached.
+ *
+ * @returns ::BROTLI_FALSE in case of error
+ * @returns ::BROTLI_TRUE otherwise
+ */
+BROTLI_ENC_API BROTLI_BOOL BrotliEncoderAttachPreparedDictionary(
+ BrotliEncoderState* state,
+ const BrotliEncoderPreparedDictionary* dictionary);
+
/**
* Calculates the output size bound for the given @p input_size.
*
@@ -407,7 +453,7 @@ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderHasMoreOutput(
*
* This method is used to make language bindings easier and more efficient:
* -# push data to ::BrotliEncoderCompressStream,
- * until ::BrotliEncoderHasMoreOutput returns BROTL_TRUE
+ * until ::BrotliEncoderHasMoreOutput returns BROTLI_TRUE
* -# use ::BrotliEncoderTakeOutput to peek bytes and copy to language-specific
* entity
*
@@ -433,11 +479,18 @@ BROTLI_ENC_API BROTLI_BOOL BrotliEncoderHasMoreOutput(
BROTLI_ENC_API const uint8_t* BrotliEncoderTakeOutput(
BrotliEncoderState* state, size_t* size);
+/* Returns the estimated peak memory usage (in bytes) of the BrotliCompress()
+ function, not counting the memory needed for the input and output. */
+BROTLI_ENC_EXTRA_API size_t BrotliEncoderEstimatePeakMemoryUsage(
+ int quality, int lgwin, size_t input_size);
+/* Returns 0 if dictionary is not valid; otherwise returns allocation size. */
+BROTLI_ENC_EXTRA_API size_t BrotliEncoderGetPreparedDictionarySize(
+ const BrotliEncoderPreparedDictionary* dictionary);
/**
* Gets an encoder library version.
*
- * Look at BROTLI_VERSION for more information.
+ * Look at BROTLI_MAKE_HEX_VERSION for more information.
*/
BROTLI_ENC_API uint32_t BrotliEncoderVersion(void);
diff --git a/dviware/dvisvgm/libs/brotli/include/brotli/port.h b/dviware/dvisvgm/libs/brotli/include/brotli/port.h
index 825237a335..0d50019042 100644
--- a/dviware/dvisvgm/libs/brotli/include/brotli/port.h
+++ b/dviware/dvisvgm/libs/brotli/include/brotli/port.h
@@ -224,14 +224,6 @@
#define BROTLI_HAS_FEATURE(feature) (0)
#endif
-#if defined(ADDRESS_SANITIZER) || BROTLI_HAS_FEATURE(address_sanitizer) || \
- defined(THREAD_SANITIZER) || BROTLI_HAS_FEATURE(thread_sanitizer) || \
- defined(MEMORY_SANITIZER) || BROTLI_HAS_FEATURE(memory_sanitizer)
-#define BROTLI_SANITIZED 1
-#else
-#define BROTLI_SANITIZED 0
-#endif
-
#if defined(_WIN32) || defined(__CYGWIN__)
#define BROTLI_PUBLIC
#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
@@ -247,9 +239,28 @@
#define BROTLI_PUBLIC
#endif
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
- !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \
- !defined(__PGI) && !defined(__PGIC__) && !defined(__TINYC__)
+/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */
+#if !defined(BROTLI_INTERNAL)
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define BROTLI_INTERNAL
+#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
+ BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
+ BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
+ BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
+ BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \
+ BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
+ (BROTLI_TI_VERSION_CHECK(7, 3, 0) && \
+ defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__))
+#define BROTLI_INTERNAL __attribute__ ((visibility ("hidden")))
+#else
+#define BROTLI_INTERNAL
+#endif
+#endif
+
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
+ !defined(__STDC_NO_VLA__) && !defined(__cplusplus) && \
+ !defined(__PGI) && !defined(__PGIC__) && !defined(__TINYC__) && \
+ !defined(__clang__)
#define BROTLI_ARRAY_PARAM(name) (name)
#else
#define BROTLI_ARRAY_PARAM(name)
@@ -285,4 +296,10 @@
#define BROTLI_ENC_API
#endif
+#if defined(BROTLI_BUILD_ENC_EXTRA_API)
+#define BROTLI_ENC_EXTRA_API BROTLI_ENC_API
+#else
+#define BROTLI_ENC_EXTRA_API BROTLI_INTERNAL
+#endif
+
#endif /* BROTLI_COMMON_PORT_H_ */
diff --git a/dviware/dvisvgm/libs/brotli/include/brotli/shared_dictionary.h b/dviware/dvisvgm/libs/brotli/include/brotli/shared_dictionary.h
new file mode 100644
index 0000000000..2970c2dcc9
--- /dev/null
+++ b/dviware/dvisvgm/libs/brotli/include/brotli/shared_dictionary.h
@@ -0,0 +1,100 @@
+/* Copyright 2017 Google Inc. All Rights Reserved.
+
+ Distributed under MIT license.
+ See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
+*/
+
+/* (Opaque) Shared Dictionary definition and utilities. */
+
+#ifndef BROTLI_COMMON_SHARED_DICTIONARY_H_
+#define BROTLI_COMMON_SHARED_DICTIONARY_H_
+
+#include <brotli/port.h>
+#include <brotli/types.h>
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+#define SHARED_BROTLI_MIN_DICTIONARY_WORD_LENGTH 4
+#define SHARED_BROTLI_MAX_DICTIONARY_WORD_LENGTH 31
+#define SHARED_BROTLI_NUM_DICTIONARY_CONTEXTS 64
+#define SHARED_BROTLI_MAX_COMPOUND_DICTS 15
+
+/**
+ * Opaque structure that holds shared dictionary data.
+ *
+ * Allocated and initialized with ::BrotliSharedDictionaryCreateInstance.
+ * Cleaned up and deallocated with ::BrotliSharedDictionaryDestroyInstance.
+ */
+typedef struct BrotliSharedDictionaryStruct BrotliSharedDictionary;
+
+/**
+ * Input data type for ::BrotliSharedDictionaryAttach.
+ */
+typedef enum BrotliSharedDictionaryType {
+ /** Raw LZ77 prefix dictionary. */
+ BROTLI_SHARED_DICTIONARY_RAW = 0,
+ /** Serialized shared dictionary.
+ *
+ * DO NOT USE: methods accepting this value will fail.
+ */
+ BROTLI_SHARED_DICTIONARY_SERIALIZED = 1
+} BrotliSharedDictionaryType;
+
+/**
+ * Creates an instance of ::BrotliSharedDictionary.
+ *
+ * Fresh instance has default word dictionary and transforms
+ * and no LZ77 prefix dictionary.
+ *
+ * @p alloc_func and @p free_func @b MUST be both zero or both non-zero. In the
+ * case they are both zero, default memory allocators are used. @p opaque is
+ * passed to @p alloc_func and @p free_func when they are called. @p free_func
+ * has to return without doing anything when asked to free a NULL pointer.
+ *
+ * @param alloc_func custom memory allocation function
+ * @param free_func custom memory free function
+ * @param opaque custom memory manager handle
+ * @returns @c 0 if instance can not be allocated or initialized
+ * @returns pointer to initialized ::BrotliSharedDictionary otherwise
+ */
+BROTLI_COMMON_API BrotliSharedDictionary* BrotliSharedDictionaryCreateInstance(
+ brotli_alloc_func alloc_func, brotli_free_func free_func, void* opaque);
+
+/**
+ * Deinitializes and frees ::BrotliSharedDictionary instance.
+ *
+ * @param dict shared dictionary instance to be cleaned up and deallocated
+ */
+BROTLI_COMMON_API void BrotliSharedDictionaryDestroyInstance(
+ BrotliSharedDictionary* dict);
+
+/**
+ * Attaches dictionary to a given instance of ::BrotliSharedDictionary.
+ *
+ * Dictionary to be attached is represented in a serialized format as a region
+ * of memory.
+ *
+ * Provided data it partially referenced by a resulting (compound) dictionary,
+ * and should be kept untouched, while at least one compound dictionary uses it.
+ * This way memory overhead is kept minimal by the cost of additional resource
+ * management.
+ *
+ * @param dict dictionary to extend
+ * @param type type of dictionary to attach
+ * @param data_size size of @p data
+ * @param data serialized dictionary of type @p type, with at least @p data_size
+ * addressable bytes
+ * @returns ::BROTLI_TRUE if provided dictionary is successfully attached
+ * @returns ::BROTLI_FALSE otherwise
+ */
+BROTLI_COMMON_API BROTLI_BOOL BrotliSharedDictionaryAttach(
+ BrotliSharedDictionary* dict, BrotliSharedDictionaryType type,
+ size_t data_size, const uint8_t data[BROTLI_ARRAY_PARAM(data_size)]);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* extern "C" */
+#endif
+
+#endif /* BROTLI_COMMON_SHARED_DICTIONARY_H_ */
diff --git a/dviware/dvisvgm/libs/xxHash/xxh3.h b/dviware/dvisvgm/libs/xxHash/xxh3.h
index f7dc1959b5..7e3ce68e0c 100644
--- a/dviware/dvisvgm/libs/xxHash/xxh3.h
+++ b/dviware/dvisvgm/libs/xxHash/xxh3.h
@@ -1,7 +1,7 @@
/*
* xxHash - Extremely Fast Hash algorithm
* Development source file for `xxh3`
- * Copyright (C) 2019-2020 Yann Collet
+ * Copyright (C) 2019-2021 Yann Collet
*
* BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
*
diff --git a/dviware/dvisvgm/libs/xxHash/xxhash.c b/dviware/dvisvgm/libs/xxHash/xxhash.c
index 0fae88c5d6..083b039d70 100644
--- a/dviware/dvisvgm/libs/xxHash/xxhash.c
+++ b/dviware/dvisvgm/libs/xxHash/xxhash.c
@@ -1,6 +1,6 @@
/*
* xxHash - Extremely Fast Hash algorithm
- * Copyright (C) 2012-2020 Yann Collet
+ * Copyright (C) 2012-2021 Yann Collet
*
* BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
*
diff --git a/dviware/dvisvgm/libs/xxHash/xxhash.h b/dviware/dvisvgm/libs/xxHash/xxhash.h
index 511c4d12bf..a18e8c762d 100644
--- a/dviware/dvisvgm/libs/xxHash/xxhash.h
+++ b/dviware/dvisvgm/libs/xxHash/xxhash.h
@@ -1,7 +1,7 @@
/*
* xxHash - Extremely Fast Hash algorithm
* Header File
- * Copyright (C) 2012-2020 Yann Collet
+ * Copyright (C) 2012-2021 Yann Collet
*
* BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)
*
@@ -32,49 +32,142 @@
* - xxHash homepage: https://www.xxhash.com
* - xxHash source repository: https://github.com/Cyan4973/xxHash
*/
+
/*!
* @mainpage xxHash
*
+ * xxHash is an extremely fast non-cryptographic hash algorithm, working at RAM speed
+ * limits.
+ *
+ * It is proposed in four flavors, in three families:
+ * 1. @ref XXH32_family
+ * - Classic 32-bit hash function. Simple, compact, and runs on almost all
+ * 32-bit and 64-bit systems.
+ * 2. @ref XXH64_family
+ * - Classic 64-bit adaptation of XXH32. Just as simple, and runs well on most
+ * 64-bit systems (but _not_ 32-bit systems).
+ * 3. @ref XXH3_family
+ * - Modern 64-bit and 128-bit hash function family which features improved
+ * strength and performance across the board, especially on smaller data.
+ * It benefits greatly from SIMD and 64-bit without requiring it.
+ *
+ * Benchmarks
+ * ---
+ * The reference system uses an Intel i7-9700K CPU, and runs Ubuntu x64 20.04.
+ * The open source benchmark program is compiled with clang v10.0 using -O3 flag.
+ *
+ * | Hash Name | ISA ext | Width | Large Data Speed | Small Data Velocity |
+ * | -------------------- | ------- | ----: | ---------------: | ------------------: |
+ * | XXH3_64bits() | @b AVX2 | 64 | 59.4 GB/s | 133.1 |
+ * | MeowHash | AES-NI | 128 | 58.2 GB/s | 52.5 |
+ * | XXH3_128bits() | @b AVX2 | 128 | 57.9 GB/s | 118.1 |
+ * | CLHash | PCLMUL | 64 | 37.1 GB/s | 58.1 |
+ * | XXH3_64bits() | @b SSE2 | 64 | 31.5 GB/s | 133.1 |
+ * | XXH3_128bits() | @b SSE2 | 128 | 29.6 GB/s | 118.1 |
+ * | RAM sequential read | | N/A | 28.0 GB/s | N/A |
+ * | ahash | AES-NI | 64 | 22.5 GB/s | 107.2 |
+ * | City64 | | 64 | 22.0 GB/s | 76.6 |
+ * | T1ha2 | | 64 | 22.0 GB/s | 99.0 |
+ * | City128 | | 128 | 21.7 GB/s | 57.7 |
+ * | FarmHash | AES-NI | 64 | 21.3 GB/s | 71.9 |
+ * | XXH64() | | 64 | 19.4 GB/s | 71.0 |
+ * | SpookyHash | | 64 | 19.3 GB/s | 53.2 |
+ * | Mum | | 64 | 18.0 GB/s | 67.0 |
+ * | CRC32C | SSE4.2 | 32 | 13.0 GB/s | 57.9 |
+ * | XXH32() | | 32 | 9.7 GB/s | 71.9 |
+ * | City32 | | 32 | 9.1 GB/s | 66.0 |
+ * | Blake3* | @b AVX2 | 256 | 4.4 GB/s | 8.1 |
+ * | Murmur3 | | 32 | 3.9 GB/s | 56.1 |
+ * | SipHash* | | 64 | 3.0 GB/s | 43.2 |
+ * | Blake3* | @b SSE2 | 256 | 2.4 GB/s | 8.1 |
+ * | HighwayHash | | 64 | 1.4 GB/s | 6.0 |
+ * | FNV64 | | 64 | 1.2 GB/s | 62.7 |
+ * | Blake2* | | 256 | 1.1 GB/s | 5.1 |
+ * | SHA1* | | 160 | 0.8 GB/s | 5.6 |
+ * | MD5* | | 128 | 0.6 GB/s | 7.8 |
+ * @note
+ * - Hashes which require a specific ISA extension are noted. SSE2 is also noted,
+ * even though it is mandatory on x64.
+ * - Hashes with an asterisk are cryptographic. Note that MD5 is non-cryptographic
+ * by modern standards.
+ * - Small data velocity is a rough average of algorithm's efficiency for small
+ * data. For more accurate information, see the wiki.
+ * - More benchmarks and strength tests are found on the wiki:
+ * https://github.com/Cyan4973/xxHash/wiki
+ *
+ * Usage
+ * ------
+ * All xxHash variants use a similar API. Changing the algorithm is a trivial
+ * substitution.
+ *
+ * @pre
+ * For functions which take an input and length parameter, the following
+ * requirements are assumed:
+ * - The range from [`input`, `input + length`) is valid, readable memory.
+ * - The only exception is if the `length` is `0`, `input` may be `NULL`.
+ * - For C++, the objects must have the *TriviallyCopyable* property, as the
+ * functions access bytes directly as if it was an array of `unsigned char`.
+ *
+ * @anchor single_shot_example
+ * **Single Shot**
+ *
+ * These functions are stateless functions which hash a contiguous block of memory,
+ * immediately returning the result. They are the easiest and usually the fastest
+ * option.
+ *
+ * XXH32(), XXH64(), XXH3_64bits(), XXH3_128bits()
+ *
+ * @code{.c}
+ * #include <string.h>
+ * #include "xxhash.h"
+ *
+ * // Example for a function which hashes a null terminated string with XXH32().
+ * XXH32_hash_t hash_string(const char* string, XXH32_hash_t seed)
+ * {
+ * // NULL pointers are only valid if the length is zero
+ * size_t length = (string == NULL) ? 0 : strlen(string);
+ * return XXH32(string, length, seed);
+ * }
+ * @endcode
+ *
+ * @anchor streaming_example
+ * **Streaming**
+ *
+ * These groups of functions allow incremental hashing of unknown size, even
+ * more than what would fit in a size_t.
+ *
+ * XXH32_reset(), XXH64_reset(), XXH3_64bits_reset(), XXH3_128bits_reset()
+ *
+ * @code{.c}
+ * #include <stdio.h>
+ * #include <assert.h>
+ * #include "xxhash.h"
+ * // Example for a function which hashes a FILE incrementally with XXH3_64bits().
+ * XXH64_hash_t hashFile(FILE* f)
+ * {
+ * // Allocate a state struct. Do not just use malloc() or new.
+ * XXH3_state_t* state = XXH3_createState();
+ * assert(state != NULL && "Out of memory!");
+ * // Reset the state to start a new hashing session.
+ * XXH3_64bits_reset(state);
+ * char buffer[4096];
+ * size_t count;
+ * // Read the file in chunks
+ * while ((count = fread(buffer, 1, sizeof(buffer), f)) != 0) {
+ * // Run update() as many times as necessary to process the data
+ * XXH3_64bits_update(state, buffer, count);
+ * }
+ * // Retrieve the finalized hash. This will not change the state.
+ * XXH64_hash_t result = XXH3_64bits_digest(state);
+ * // Free the state. Do not use free().
+ * XXH3_freeState(state);
+ * return result;
+ * }
+ * @endcode
+ *
* @file xxhash.h
* xxHash prototypes and implementation
*/
-/* TODO: update */
-/* Notice extracted from xxHash homepage:
-
-xxHash is an extremely fast hash algorithm, running at RAM speed limits.
-It also successfully passes all tests from the SMHasher suite.
-
-Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2 Duo @3GHz)
-
-Name Speed Q.Score Author
-xxHash 5.4 GB/s 10
-CrapWow 3.2 GB/s 2 Andrew
-MurmurHash 3a 2.7 GB/s 10 Austin Appleby
-SpookyHash 2.0 GB/s 10 Bob Jenkins
-SBox 1.4 GB/s 9 Bret Mulvey
-Lookup3 1.2 GB/s 9 Bob Jenkins
-SuperFastHash 1.2 GB/s 1 Paul Hsieh
-CityHash64 1.05 GB/s 10 Pike & Alakuijala
-FNV 0.55 GB/s 5 Fowler, Noll, Vo
-CRC32 0.43 GB/s 9
-MD5-32 0.33 GB/s 10 Ronald L. Rivest
-SHA1-32 0.28 GB/s 10
-
-Q.Score is a measure of quality of the hash function.
-It depends on successfully passing SMHasher test set.
-10 is a perfect score.
-
-Note: SMHasher's CRC32 implementation is not the fastest one.
-Other speed-oriented implementations can be faster,
-especially in combination with PCLMUL instruction:
-https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html?showComment=1552696407071#c3490092340461170735
-
-A 64-bit version, named XXH64, is available since r35.
-It offers much better speed, but for 64-bit applications only.
-Name Speed on 64 bits Speed on 32 bits
-XXH64 13.8 GB/s 1.9 GB/s
-XXH32 6.8 GB/s 6.0 GB/s
-*/
#if defined (__cplusplus)
extern "C" {
@@ -84,21 +177,80 @@ extern "C" {
* INLINE mode
******************************/
/*!
- * XXH_INLINE_ALL (and XXH_PRIVATE_API)
+ * @defgroup public Public API
+ * Contains details on the public xxHash functions.
+ * @{
+ */
+#ifdef XXH_DOXYGEN
+/*!
+ * @brief Gives access to internal state declaration, required for static allocation.
+ *
+ * Incompatible with dynamic linking, due to risks of ABI changes.
+ *
+ * Usage:
+ * @code{.c}
+ * #define XXH_STATIC_LINKING_ONLY
+ * #include "xxhash.h"
+ * @endcode
+ */
+# define XXH_STATIC_LINKING_ONLY
+/* Do not undef XXH_STATIC_LINKING_ONLY for Doxygen */
+
+/*!
+ * @brief Gives access to internal definitions.
+ *
+ * Usage:
+ * @code{.c}
+ * #define XXH_STATIC_LINKING_ONLY
+ * #define XXH_IMPLEMENTATION
+ * #include "xxhash.h"
+ * @endcode
+ */
+# define XXH_IMPLEMENTATION
+/* Do not undef XXH_IMPLEMENTATION for Doxygen */
+
+/*!
+ * @brief Exposes the implementation and marks all functions as `inline`.
+ *
* Use these build macros to inline xxhash into the target unit.
* Inlining improves performance on small inputs, especially when the length is
* expressed as a compile-time constant:
*
- * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html
+ * https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html
*
* It also keeps xxHash symbols private to the unit, so they are not exported.
*
* Usage:
+ * @code{.c}
* #define XXH_INLINE_ALL
* #include "xxhash.h"
- *
+ * @endcode
* Do not compile and link xxhash.o as a separate object, as it is not useful.
*/
+# define XXH_INLINE_ALL
+# undef XXH_INLINE_ALL
+/*!
+ * @brief Exposes the implementation without marking functions as inline.
+ */
+# define XXH_PRIVATE_API
+# undef XXH_PRIVATE_API
+/*!
+ * @brief Emulate a namespace by transparently prefixing all symbols.
+ *
+ * If you want to include _and expose_ xxHash functions from within your own
+ * library, but also want to avoid symbol collisions with other libraries which
+ * may also include xxHash, you can use @ref XXH_NAMESPACE to automatically prefix
+ * any public symbol from xxhash library with the value of @ref XXH_NAMESPACE
+ * (therefore, avoid empty or numeric values).
+ *
+ * Note that no change is required within the calling program as long as it
+ * includes `xxhash.h`: Regular symbol names will be automatically translated
+ * by this header.
+ */
+# define XXH_NAMESPACE /* YOUR NAME HERE */
+# undef XXH_NAMESPACE
+#endif
+
#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \
&& !defined(XXH_INLINE_ALL_31684351384)
/* this section should be traversed only once */
@@ -213,21 +365,13 @@ extern "C" {
# undef XXHASH_H_STATIC_13879238742
#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */
-
-
/* ****************************************************************
* Stable API
*****************************************************************/
#ifndef XXHASH_H_5627135585666179
#define XXHASH_H_5627135585666179 1
-
-/*!
- * @defgroup public Public API
- * Contains details on the public xxHash functions.
- * @{
- */
-/* specific declaration modes for Windows */
+/*! @brief Marks a global symbol. */
#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API)
# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))
# ifdef XXH_EXPORT
@@ -240,24 +384,6 @@ extern "C" {
# endif
#endif
-#ifdef XXH_DOXYGEN
-/*!
- * @brief Emulate a namespace by transparently prefixing all symbols.
- *
- * If you want to include _and expose_ xxHash functions from within your own
- * library, but also want to avoid symbol collisions with other libraries which
- * may also include xxHash, you can use XXH_NAMESPACE to automatically prefix
- * any public symbol from xxhash library with the value of XXH_NAMESPACE
- * (therefore, avoid empty or numeric values).
- *
- * Note that no change is required within the calling program as long as it
- * includes `xxhash.h`: Regular symbol names will be automatically translated
- * by this header.
- */
-# define XXH_NAMESPACE /* YOUR NAME HERE */
-# undef XXH_NAMESPACE
-#endif
-
#ifdef XXH_NAMESPACE
# define XXH_CAT(A,B) A##B
# define XXH_NAME2(A,B) XXH_CAT(A,B)
@@ -318,11 +444,39 @@ extern "C" {
/* *************************************
+* Compiler specifics
+***************************************/
+
+/* specific declaration modes for Windows */
+#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API)
+# if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))
+# ifdef XXH_EXPORT
+# define XXH_PUBLIC_API __declspec(dllexport)
+# elif XXH_IMPORT
+# define XXH_PUBLIC_API __declspec(dllimport)
+# endif
+# else
+# define XXH_PUBLIC_API /* do nothing */
+# endif
+#endif
+
+#if defined (__GNUC__)
+# define XXH_CONSTF __attribute__((const))
+# define XXH_PUREF __attribute__((pure))
+# define XXH_MALLOCF __attribute__((malloc))
+#else
+# define XXH_CONSTF /* disable */
+# define XXH_PUREF
+# define XXH_MALLOCF
+#endif
+
+/* *************************************
* Version
***************************************/
#define XXH_VERSION_MAJOR 0
#define XXH_VERSION_MINOR 8
-#define XXH_VERSION_RELEASE 1
+#define XXH_VERSION_RELEASE 2
+/*! @brief Version number, encoded as two digits each */
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
/*!
@@ -331,16 +485,22 @@ extern "C" {
* This is mostly useful when xxHash is compiled as a shared library,
* since the returned value comes from the library, as opposed to header file.
*
- * @return `XXH_VERSION_NUMBER` of the invoked library.
+ * @return @ref XXH_VERSION_NUMBER of the invoked library.
*/
-XXH_PUBLIC_API unsigned XXH_versionNumber (void);
+XXH_PUBLIC_API XXH_CONSTF unsigned XXH_versionNumber (void);
/* ****************************
* Common basic types
******************************/
#include <stddef.h> /* size_t */
-typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
+/*!
+ * @brief Exit code for the streaming API.
+ */
+typedef enum {
+ XXH_OK = 0, /*!< OK */
+ XXH_ERROR /*!< Error */
+} XXH_errorcode;
/*-**********************************************************************
@@ -364,29 +524,27 @@ typedef uint32_t XXH32_hash_t;
# include <limits.h>
# if UINT_MAX == 0xFFFFFFFFUL
typedef unsigned int XXH32_hash_t;
+# elif ULONG_MAX == 0xFFFFFFFFUL
+ typedef unsigned long XXH32_hash_t;
# else
-# if ULONG_MAX == 0xFFFFFFFFUL
- typedef unsigned long XXH32_hash_t;
-# else
-# error "unsupported platform: need a 32-bit type"
-# endif
+# error "unsupported platform: need a 32-bit type"
# endif
#endif
/*!
* @}
*
- * @defgroup xxh32_family XXH32 family
+ * @defgroup XXH32_family XXH32 family
* @ingroup public
* Contains functions used in the classic 32-bit xxHash algorithm.
*
* @note
* XXH32 is useful for older platforms, with no or poor 64-bit performance.
- * Note that @ref xxh3_family provides competitive speed
- * for both 32-bit and 64-bit systems, and offers true 64/128 bit hash results.
+ * Note that the @ref XXH3_family provides competitive speed for both 32-bit
+ * and 64-bit systems, and offers true 64/128 bit hash results.
*
- * @see @ref xxh64_family, @ref xxh3_family : Other xxHash families
- * @see @ref xxh32_impl for implementation details
+ * @see @ref XXH64_family, @ref XXH3_family : Other xxHash families
+ * @see @ref XXH32_impl for implementation details
* @{
*/
@@ -395,6 +553,8 @@ typedef uint32_t XXH32_hash_t;
*
* Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s
*
+ * See @ref single_shot_example "Single Shot Example" for an example.
+ *
* @param input The block of data to be hashed, at least @p length bytes in size.
* @param length The length of @p input, in bytes.
* @param seed The 32-bit seed to alter the hash's output predictably.
@@ -412,8 +572,9 @@ typedef uint32_t XXH32_hash_t;
* @see
* XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version.
*/
-XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed);
+XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed);
+#ifndef XXH_NO_STREAM
/*!
* Streaming functions generate the xxHash value from an incremental input.
* This method is slower than single-call functions, due to state management.
@@ -436,32 +597,7 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_
*
* When done, release the state using `XXH*_freeState()`.
*
- * Example code for incrementally hashing a file:
- * @code{.c}
- * #include <stdio.h>
- * #include <xxhash.h>
- * #define BUFFER_SIZE 256
- *
- * // Note: XXH64 and XXH3 use the same interface.
- * XXH32_hash_t
- * hashFile(FILE* stream)
- * {
- * XXH32_state_t* state;
- * unsigned char buf[BUFFER_SIZE];
- * size_t amt;
- * XXH32_hash_t hash;
- *
- * state = XXH32_createState(); // Create a state
- * assert(state != NULL); // Error check here
- * XXH32_reset(state, 0xbaad5eed); // Reset state with our seed
- * while ((amt = fread(buf, 1, sizeof(buf), stream)) != 0) {
- * XXH32_update(state, buf, amt); // Hash the file in chunks
- * }
- * hash = XXH32_digest(state); // Finalize the hash
- * XXH32_freeState(state); // Clean up
- * return hash;
- * }
- * @endcode
+ * @see streaming_example at the top of @ref xxhash.h for an example.
*/
/*!
@@ -478,7 +614,7 @@ typedef struct XXH32_state_s XXH32_state_t;
* Must be freed with XXH32_freeState().
* @return An allocated XXH32_state_t on success, `NULL` on failure.
*/
-XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);
+XXH_PUBLIC_API XXH_MALLOCF XXH32_state_t* XXH32_createState(void);
/*!
* @brief Frees an @ref XXH32_state_t.
*
@@ -546,7 +682,8 @@ XXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void*
*
* @return The calculated xxHash32 value from that state.
*/
-XXH_PUBLIC_API XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);
+XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);
+#endif /* !XXH_NO_STREAM */
/******* Canonical representation *******/
@@ -597,43 +734,72 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t
*
* @return The converted hash.
*/
-XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
+XXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
+/*! @cond Doxygen ignores this part */
#ifdef __has_attribute
# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x)
#else
# define XXH_HAS_ATTRIBUTE(x) 0
#endif
+/*! @endcond */
+/*! @cond Doxygen ignores this part */
+/*
+ * C23 __STDC_VERSION__ number hasn't been specified yet. For now
+ * leave as `201711L` (C17 + 1).
+ * TODO: Update to correct value when its been specified.
+ */
+#define XXH_C23_VN 201711L
+/*! @endcond */
+
+/*! @cond Doxygen ignores this part */
/* C-language Attributes are added in C23. */
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute)
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) && defined(__has_c_attribute)
# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)
#else
# define XXH_HAS_C_ATTRIBUTE(x) 0
#endif
+/*! @endcond */
+/*! @cond Doxygen ignores this part */
#if defined(__cplusplus) && defined(__has_cpp_attribute)
# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
#else
# define XXH_HAS_CPP_ATTRIBUTE(x) 0
#endif
+/*! @endcond */
+/*! @cond Doxygen ignores this part */
/*
-Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute
-introduced in CPP17 and C23.
-CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough
-C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough
-*/
-#if XXH_HAS_C_ATTRIBUTE(x)
-# define XXH_FALLTHROUGH [[fallthrough]]
-#elif XXH_HAS_CPP_ATTRIBUTE(x)
+ * Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute
+ * introduced in CPP17 and C23.
+ * CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough
+ * C23 : https://en.cppreference.com/w/c/language/attributes/fallthrough
+ */
+#if XXH_HAS_C_ATTRIBUTE(fallthrough) || XXH_HAS_CPP_ATTRIBUTE(fallthrough)
# define XXH_FALLTHROUGH [[fallthrough]]
#elif XXH_HAS_ATTRIBUTE(__fallthrough__)
-# define XXH_FALLTHROUGH __attribute__ ((fallthrough))
+# define XXH_FALLTHROUGH __attribute__ ((__fallthrough__))
#else
-# define XXH_FALLTHROUGH
+# define XXH_FALLTHROUGH /* fallthrough */
#endif
+/*! @endcond */
+
+/*! @cond Doxygen ignores this part */
+/*
+ * Define XXH_NOESCAPE for annotated pointers in public API.
+ * https://clang.llvm.org/docs/AttributeReference.html#noescape
+ * As of writing this, only supported by clang.
+ */
+#if XXH_HAS_ATTRIBUTE(noescape)
+# define XXH_NOESCAPE __attribute__((noescape))
+#else
+# define XXH_NOESCAPE
+#endif
+/*! @endcond */
+
/*!
* @}
@@ -671,7 +837,7 @@ typedef uint64_t XXH64_hash_t;
/*!
* @}
*
- * @defgroup xxh64_family XXH64 family
+ * @defgroup XXH64_family XXH64 family
* @ingroup public
* @{
* Contains functions used in the classic 64-bit xxHash algorithm.
@@ -682,7 +848,6 @@ typedef uint64_t XXH64_hash_t;
* It provides better speed for systems with vector processing capabilities.
*/
-
/*!
* @brief Calculates the 64-bit hash of @p input using xxHash64.
*
@@ -706,32 +871,131 @@ typedef uint64_t XXH64_hash_t;
* @see
* XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version.
*/
-XXH_PUBLIC_API XXH64_hash_t XXH64(const void* input, size_t length, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed);
/******* Streaming *******/
+#ifndef XXH_NO_STREAM
/*!
* @brief The opaque state struct for the XXH64 streaming API.
*
* @see XXH64_state_s for details.
*/
typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
-XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void);
+
+/*!
+ * @brief Allocates an @ref XXH64_state_t.
+ *
+ * Must be freed with XXH64_freeState().
+ * @return An allocated XXH64_state_t on success, `NULL` on failure.
+ */
+XXH_PUBLIC_API XXH_MALLOCF XXH64_state_t* XXH64_createState(void);
+
+/*!
+ * @brief Frees an @ref XXH64_state_t.
+ *
+ * Must be allocated with XXH64_createState().
+ * @param statePtr A pointer to an @ref XXH64_state_t allocated with @ref XXH64_createState().
+ * @return XXH_OK.
+ */
XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr);
-XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dst_state, const XXH64_state_t* src_state);
-XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, XXH64_hash_t seed);
-XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
-XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr);
+/*!
+ * @brief Copies one @ref XXH64_state_t to another.
+ *
+ * @param dst_state The state to copy to.
+ * @param src_state The state to copy from.
+ * @pre
+ * @p dst_state and @p src_state must not be `NULL` and must not overlap.
+ */
+XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dst_state, const XXH64_state_t* src_state);
+/*!
+ * @brief Resets an @ref XXH64_state_t to begin a new hash.
+ *
+ * This function resets and seeds a state. Call it before @ref XXH64_update().
+ *
+ * @param statePtr The state struct to reset.
+ * @param seed The 64-bit seed to alter the hash result predictably.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed);
+
+/*!
+ * @brief Consumes a block of @p input to an @ref XXH64_state_t.
+ *
+ * Call this to incrementally consume blocks of data.
+ *
+ * @param statePtr The state struct to update.
+ * @param input The block of data to be hashed, at least @p length bytes in size.
+ * @param length The length of @p input, in bytes.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ * @pre
+ * The memory between @p input and @p input + @p length must be valid,
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH_NOESCAPE XXH64_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
+
+/*!
+ * @brief Returns the calculated hash value from an @ref XXH64_state_t.
+ *
+ * @note
+ * Calling XXH64_digest() will not affect @p statePtr, so you can update,
+ * digest, and update again.
+ *
+ * @param statePtr The state struct to calculate the hash from.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return The calculated xxHash64 value from that state.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_digest (XXH_NOESCAPE const XXH64_state_t* statePtr);
+#endif /* !XXH_NO_STREAM */
/******* Canonical representation *******/
+
+/*!
+ * @brief Canonical (big endian) representation of @ref XXH64_hash_t.
+ */
typedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t;
-XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash);
-XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);
+
+/*!
+ * @brief Converts an @ref XXH64_hash_t to a big endian @ref XXH64_canonical_t.
+ *
+ * @param dst The @ref XXH64_canonical_t pointer to be stored to.
+ * @param hash The @ref XXH64_hash_t to be converted.
+ *
+ * @pre
+ * @p dst must not be `NULL`.
+ */
+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash);
+
+/*!
+ * @brief Converts an @ref XXH64_canonical_t to a native @ref XXH64_hash_t.
+ *
+ * @param src The @ref XXH64_canonical_t to convert.
+ *
+ * @pre
+ * @p src must not be `NULL`.
+ *
+ * @return The converted hash.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src);
+
+#ifndef XXH_NO_XXH3
/*!
* @}
* ************************************************************************
- * @defgroup xxh3_family XXH3 family
+ * @defgroup XXH3_family XXH3 family
* @ingroup public
* @{
*
@@ -751,16 +1015,26 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
*
* XXH3's speed benefits greatly from SIMD and 64-bit arithmetic,
* but does not require it.
- * Any 32-bit and 64-bit targets that can run XXH32 smoothly
- * can run XXH3 at competitive speeds, even without vector support.
- * Further details are explained in the implementation.
- *
- * Optimized implementations are provided for AVX512, AVX2, SSE2, NEON, POWER8,
- * ZVector and scalar targets. This can be controlled via the XXH_VECTOR macro.
+ * Most 32-bit and 64-bit targets that can run XXH32 smoothly can run XXH3
+ * at competitive speeds, even without vector support. Further details are
+ * explained in the implementation.
+ *
+ * XXH3 has a fast scalar implementation, but it also includes accelerated SIMD
+ * implementations for many common platforms:
+ * - AVX512
+ * - AVX2
+ * - SSE2
+ * - ARM NEON
+ * - WebAssembly SIMD128
+ * - POWER8 VSX
+ * - s390x ZVector
+ * This can be controlled via the @ref XXH_VECTOR macro, but it automatically
+ * selects the best version according to predefined macros. For the x86 family, an
+ * automatic runtime dispatcher is included separately in @ref xxh_x86dispatch.c.
*
* XXH3 implementation is portable:
* it has a generic C90 formulation that can be compiled on any platform,
- * all implementations generage exactly the same hash value on all platforms.
+ * all implementations generate exactly the same hash value on all platforms.
* Starting from v0.8.0, it's also labelled "stable", meaning that
* any future version will also generate the same hash value.
*
@@ -772,24 +1046,42 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
*
* The API supports one-shot hashing, streaming mode, and custom secrets.
*/
-
/*-**********************************************************************
* XXH3 64-bit variant
************************************************************************/
-/* XXH3_64bits():
- * default 64-bit variant, using default secret and default seed of 0.
- * It's the fastest variant. */
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* data, size_t len);
+/*!
+ * @brief 64-bit unseeded variant of XXH3.
+ *
+ * This is equivalent to @ref XXH3_64bits_withSeed() with a seed of 0, however
+ * it may have slightly better performance due to constant propagation of the
+ * defaults.
+ *
+ * @see
+ * XXH32(), XXH64(), XXH3_128bits(): equivalent for the other xxHash algorithms
+ * @see
+ * XXH3_64bits_withSeed(), XXH3_64bits_withSecret(): other seeding variants
+ * @see
+ * XXH3_64bits_reset(), XXH3_64bits_update(), XXH3_64bits_digest(): Streaming version.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length);
-/*
- * XXH3_64bits_withSeed():
- * This variant generates a custom secret on the fly
- * based on default secret altered using the `seed` value.
+/*!
+ * @brief 64-bit seeded variant of XXH3
+ *
+ * This variant generates a custom secret on the fly based on default secret
+ * altered using the `seed` value.
+ *
* While this operation is decently fast, note that it's not completely free.
- * Note: seed==0 produces the same results as XXH3_64bits().
+ *
+ * @note
+ * seed == 0 produces the same results as @ref XXH3_64bits().
+ *
+ * @param input The data to hash
+ * @param length The length
+ * @param seed The 64-bit seed to alter the state.
*/
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed);
/*!
* The bare minimum size for a custom secret.
@@ -800,8 +1092,9 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, X
*/
#define XXH3_SECRET_SIZE_MIN 136
-/*
- * XXH3_64bits_withSecret():
+/*!
+ * @brief 64-bit variant of XXH3 with a custom "secret".
+ *
* It's possible to provide any blob of bytes as a "secret" to generate the hash.
* This makes it more difficult for an external actor to prepare an intentional collision.
* The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN).
@@ -817,10 +1110,11 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSeed(const void* data, size_t len, X
* This is not necessarily the case when using the blob of bytes directly
* because, when hashing _small_ inputs, only a portion of the secret is employed.
*/
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize);
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize);
/******* Streaming *******/
+#ifndef XXH_NO_STREAM
/*
* Streaming requires state maintenance.
* This operation costs memory and CPU.
@@ -834,23 +1128,53 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_withSecret(const void* data, size_t len,
* @see XXH3_state_s for details.
*/
typedef struct XXH3_state_s XXH3_state_t;
-XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void);
+XXH_PUBLIC_API XXH_MALLOCF XXH3_state_t* XXH3_createState(void);
XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr);
-XXH_PUBLIC_API void XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state);
-/*
- * XXH3_64bits_reset():
- * Initialize with default parameters.
- * digest will be equivalent to `XXH3_64bits()`.
+/*!
+ * @brief Copies one @ref XXH3_state_t to another.
+ *
+ * @param dst_state The state to copy to.
+ * @param src_state The state to copy from.
+ * @pre
+ * @p dst_state and @p src_state must not be `NULL` and must not overlap.
*/
-XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH3_state_t* statePtr);
-/*
- * XXH3_64bits_reset_withSeed():
- * Generate a custom secret from `seed`, and store it into `statePtr`.
- * digest will be equivalent to `XXH3_64bits_withSeed()`.
+XXH_PUBLIC_API void XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state);
+
+/*!
+ * @brief Resets an @ref XXH3_state_t to begin a new hash.
+ *
+ * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_64bits_update().
+ * Digest will be equivalent to `XXH3_64bits()`.
+ *
+ * @param statePtr The state struct to reset.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ *
*/
-XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed);
-/*
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);
+
+/*!
+ * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.
+ *
+ * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_64bits_update().
+ * Digest will be equivalent to `XXH3_64bits_withSeed()`.
+ *
+ * @param statePtr The state struct to reset.
+ * @param seed The 64-bit seed to alter the state.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ *
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);
+
+/*!
* XXH3_64bits_reset_withSecret():
* `secret` is referenced, it _must outlive_ the hash streaming session.
* Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`,
@@ -859,10 +1183,44 @@ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr,
* When in doubt about the randomness of a candidate `secret`,
* consider employing `XXH3_generateSecret()` instead (see below).
*/
-XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize);
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);
-XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH3_state_t* statePtr, const void* input, size_t length);
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* statePtr);
+/*!
+ * @brief Consumes a block of @p input to an @ref XXH3_state_t.
+ *
+ * Call this to incrementally consume blocks of data.
+ *
+ * @param statePtr The state struct to update.
+ * @param input The block of data to be hashed, at least @p length bytes in size.
+ * @param length The length of @p input, in bytes.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ * @pre
+ * The memory between @p input and @p input + @p length must be valid,
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
+
+/*!
+ * @brief Returns the calculated XXH3 64-bit hash value from an @ref XXH3_state_t.
+ *
+ * @note
+ * Calling XXH3_64bits_digest() will not affect @p statePtr, so you can update,
+ * digest, and update again.
+ *
+ * @param statePtr The state struct to calculate the hash from.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return The calculated XXH3 64-bit hash value from that state.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);
+#endif /* !XXH_NO_STREAM */
/* note : canonical representation of XXH3 is the same as XXH64
* since they both produce XXH64_hash_t values */
@@ -883,11 +1241,31 @@ typedef struct {
XXH64_hash_t high64; /*!< `value >> 64` */
} XXH128_hash_t;
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* data, size_t len);
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed(const void* data, size_t len, XXH64_hash_t seed);
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t len, const void* secret, size_t secretSize);
+/*!
+ * @brief Unseeded 128-bit variant of XXH3
+ *
+ * The 128-bit variant of XXH3 has more strength, but it has a bit of overhead
+ * for shorter inputs.
+ *
+ * This is equivalent to @ref XXH3_128bits_withSeed() with a seed of 0, however
+ * it may have slightly better performance due to constant propagation of the
+ * defaults.
+ *
+ * @see
+ * XXH32(), XXH64(), XXH3_64bits(): equivalent for the other xxHash algorithms
+ * @see
+ * XXH3_128bits_withSeed(), XXH3_128bits_withSecret(): other seeding variants
+ * @see
+ * XXH3_128bits_reset(), XXH3_128bits_update(), XXH3_128bits_digest(): Streaming version.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* data, size_t len);
+/*! @brief Seeded 128-bit variant of XXH3. @see XXH3_64bits_withSeed(). */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSeed(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed);
+/*! @brief Custom secret 128-bit variant of XXH3. @see XXH3_64bits_withSecret(). */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize);
/******* Streaming *******/
+#ifndef XXH_NO_STREAM
/*
* Streaming requires state maintenance.
* This operation costs memory and CPU.
@@ -900,12 +1278,77 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret(const void* data, size_t le
* All reset and streaming functions have same meaning as their 64-bit counterpart.
*/
-XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH3_state_t* statePtr);
-XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed);
-XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize);
+/*!
+ * @brief Resets an @ref XXH3_state_t to begin a new hash.
+ *
+ * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_128bits_update().
+ * Digest will be equivalent to `XXH3_128bits()`.
+ *
+ * @param statePtr The state struct to reset.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ *
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);
-XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH3_state_t* statePtr, const void* input, size_t length);
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr);
+/*!
+ * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.
+ *
+ * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_128bits_update().
+ * Digest will be equivalent to `XXH3_128bits_withSeed()`.
+ *
+ * @param statePtr The state struct to reset.
+ * @param seed The 64-bit seed to alter the state.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ *
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);
+/*! @brief Custom secret 128-bit variant of XXH3. @see XXH_64bits_reset_withSecret(). */
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);
+
+/*!
+ * @brief Consumes a block of @p input to an @ref XXH3_state_t.
+ *
+ * Call this to incrementally consume blocks of data.
+ *
+ * @param statePtr The state struct to update.
+ * @param input The block of data to be hashed, at least @p length bytes in size.
+ * @param length The length of @p input, in bytes.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ * @pre
+ * The memory between @p input and @p input + @p length must be valid,
+ * readable, contiguous memory. However, if @p length is `0`, @p input may be
+ * `NULL`. In C++, this also must be *TriviallyCopyable*.
+ *
+ * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.
+ */
+XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);
+
+/*!
+ * @brief Returns the calculated XXH3 128-bit hash value from an @ref XXH3_state_t.
+ *
+ * @note
+ * Calling XXH3_128bits_digest() will not affect @p statePtr, so you can update,
+ * digest, and update again.
+ *
+ * @param statePtr The state struct to calculate the hash from.
+ *
+ * @pre
+ * @p statePtr must not be `NULL`.
+ *
+ * @return The calculated XXH3 128-bit hash value from that state.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);
+#endif /* !XXH_NO_STREAM */
/* Following helper functions make it possible to compare XXH128_hast_t values.
* Since XXH128_hash_t is a structure, this capability is not offered by the language.
@@ -915,26 +1358,48 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* statePtr);
* XXH128_isEqual():
* Return: 1 if `h1` and `h2` are equal, 0 if they are not.
*/
-XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2);
+XXH_PUBLIC_API XXH_PUREF int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2);
/*!
- * XXH128_cmp():
- *
+ * @brief Compares two @ref XXH128_hash_t
* This comparator is compatible with stdlib's `qsort()`/`bsearch()`.
*
- * return: >0 if *h128_1 > *h128_2
- * =0 if *h128_1 == *h128_2
- * <0 if *h128_1 < *h128_2
+ * @return: >0 if *h128_1 > *h128_2
+ * =0 if *h128_1 == *h128_2
+ * <0 if *h128_1 < *h128_2
*/
-XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2);
+XXH_PUBLIC_API XXH_PUREF int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2);
/******* Canonical representation *******/
typedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t;
-XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash);
-XXH_PUBLIC_API XXH128_hash_t XXH128_hashFromCanonical(const XXH128_canonical_t* src);
+/*!
+ * @brief Converts an @ref XXH128_hash_t to a big endian @ref XXH128_canonical_t.
+ *
+ * @param dst The @ref XXH128_canonical_t pointer to be stored to.
+ * @param hash The @ref XXH128_hash_t to be converted.
+ *
+ * @pre
+ * @p dst must not be `NULL`.
+ */
+XXH_PUBLIC_API void XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash);
+
+/*!
+ * @brief Converts an @ref XXH128_canonical_t to a native @ref XXH128_hash_t.
+ *
+ * @param src The @ref XXH128_canonical_t to convert.
+ *
+ * @pre
+ * @p src must not be `NULL`.
+ *
+ * @return The converted hash.
+ */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src);
+
+
+#endif /* !XXH_NO_XXH3 */
#endif /* XXH_NO_LONG_LONG */
/*!
@@ -978,7 +1443,7 @@ struct XXH32_state_s {
XXH32_hash_t v[4]; /*!< Accumulator lanes */
XXH32_hash_t mem32[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */
XXH32_hash_t memsize; /*!< Amount of data in @ref mem32 */
- XXH32_hash_t reserved; /*!< Reserved field. Do not read or write to it, it may be removed. */
+ XXH32_hash_t reserved; /*!< Reserved field. Do not read nor write to it. */
}; /* typedef'd to XXH32_state_t */
@@ -1002,9 +1467,11 @@ struct XXH64_state_s {
XXH64_hash_t mem64[4]; /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */
XXH32_hash_t memsize; /*!< Amount of data in @ref mem64 */
XXH32_hash_t reserved32; /*!< Reserved field, needed for padding anyways*/
- XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it, it may be removed. */
+ XXH64_hash_t reserved64; /*!< Reserved field. Do not read or write to it. */
}; /* typedef'd to XXH64_state_t */
+#ifndef XXH_NO_XXH3
+
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */
# include <stdalign.h>
# define XXH_ALIGN(n) alignas(n)
@@ -1038,6 +1505,7 @@ struct XXH64_state_s {
#define XXH3_INTERNALBUFFER_SIZE 256
/*!
+ * @internal
* @brief Default size of the secret buffer (and @ref XXH3_kSecret).
*
* This is the size used in @ref XXH3_kSecret and the seeded functions.
@@ -1070,7 +1538,7 @@ struct XXH64_state_s {
*/
struct XXH3_state_s {
XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]);
- /*!< The 8 accumulators. Similar to `vN` in @ref XXH32_state_s::v1 and @ref XXH64_state_s */
+ /*!< The 8 accumulators. See @ref XXH32_state_s::v and @ref XXH64_state_s::v */
XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]);
/*!< Used to store a custom secret generated from a seed. */
XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]);
@@ -1110,69 +1578,119 @@ struct XXH3_state_s {
* Note that this doesn't prepare the state for a streaming operation,
* it's still necessary to use XXH3_NNbits_reset*() afterwards.
*/
-#define XXH3_INITSTATE(XXH3_state_ptr) { (XXH3_state_ptr)->seed = 0; }
+#define XXH3_INITSTATE(XXH3_state_ptr) \
+ do { \
+ XXH3_state_t* tmp_xxh3_state_ptr = (XXH3_state_ptr); \
+ tmp_xxh3_state_ptr->seed = 0; \
+ tmp_xxh3_state_ptr->extSecret = NULL; \
+ } while(0)
-/* XXH128() :
+/*!
* simple alias to pre-selected XXH3_128bits variant
*/
-XXH_PUBLIC_API XXH128_hash_t XXH128(const void* data, size_t len, XXH64_hash_t seed);
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed);
/* === Experimental API === */
/* Symbols defined below must be considered tied to a specific library version. */
-/*
+/*!
* XXH3_generateSecret():
*
* Derive a high-entropy secret from any user-defined content, named customSeed.
* The generated secret can be used in combination with `*_withSecret()` functions.
- * The `_withSecret()` variants are useful to provide a higher level of protection than 64-bit seed,
- * as it becomes much more difficult for an external actor to guess how to impact the calculation logic.
+ * The `_withSecret()` variants are useful to provide a higher level of protection
+ * than 64-bit seed, as it becomes much more difficult for an external actor to
+ * guess how to impact the calculation logic.
*
* The function accepts as input a custom seed of any length and any content,
- * and derives from it a high-entropy secret of length @secretSize
- * into an already allocated buffer @secretBuffer.
- * @secretSize must be >= XXH3_SECRET_SIZE_MIN
+ * and derives from it a high-entropy secret of length @p secretSize into an
+ * already allocated buffer @p secretBuffer.
*
* The generated secret can then be used with any `*_withSecret()` variant.
- * Functions `XXH3_128bits_withSecret()`, `XXH3_64bits_withSecret()`,
- * `XXH3_128bits_reset_withSecret()` and `XXH3_64bits_reset_withSecret()`
+ * The functions @ref XXH3_128bits_withSecret(), @ref XXH3_64bits_withSecret(),
+ * @ref XXH3_128bits_reset_withSecret() and @ref XXH3_64bits_reset_withSecret()
* are part of this list. They all accept a `secret` parameter
- * which must be large enough for implementation reasons (>= XXH3_SECRET_SIZE_MIN)
+ * which must be large enough for implementation reasons (>= @ref XXH3_SECRET_SIZE_MIN)
* _and_ feature very high entropy (consist of random-looking bytes).
- * These conditions can be a high bar to meet, so
- * XXH3_generateSecret() can be employed to ensure proper quality.
+ * These conditions can be a high bar to meet, so @ref XXH3_generateSecret() can
+ * be employed to ensure proper quality.
+ *
+ * @p customSeed can be anything. It can have any size, even small ones,
+ * and its content can be anything, even "poor entropy" sources such as a bunch
+ * of zeroes. The resulting `secret` will nonetheless provide all required qualities.
*
- * customSeed can be anything. It can have any size, even small ones,
- * and its content can be anything, even "poor entropy" sources such as a bunch of zeroes.
- * The resulting `secret` will nonetheless provide all required qualities.
+ * @pre
+ * - @p secretSize must be >= @ref XXH3_SECRET_SIZE_MIN
+ * - When @p customSeedSize > 0, supplying NULL as customSeed is undefined behavior.
*
- * When customSeedSize > 0, supplying NULL as customSeed is undefined behavior.
+ * Example code:
+ * @code{.c}
+ * #include <stdio.h>
+ * #include <stdlib.h>
+ * #include <string.h>
+ * #define XXH_STATIC_LINKING_ONLY // expose unstable API
+ * #include "xxhash.h"
+ * // Hashes argv[2] using the entropy from argv[1].
+ * int main(int argc, char* argv[])
+ * {
+ * char secret[XXH3_SECRET_SIZE_MIN];
+ * if (argv != 3) { return 1; }
+ * XXH3_generateSecret(secret, sizeof(secret), argv[1], strlen(argv[1]));
+ * XXH64_hash_t h = XXH3_64bits_withSecret(
+ * argv[2], strlen(argv[2]),
+ * secret, sizeof(secret)
+ * );
+ * printf("%016llx\n", (unsigned long long) h);
+ * }
+ * @endcode
*/
-XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize);
-
+XXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize);
-/*
- * XXH3_generateSecret_fromSeed():
- *
- * Generate the same secret as the _withSeed() variants.
- *
- * The resulting secret has a length of XXH3_SECRET_DEFAULT_SIZE (necessarily).
- * @secretBuffer must be already allocated, of size at least XXH3_SECRET_DEFAULT_SIZE bytes.
+/*!
+ * @brief Generate the same secret as the _withSeed() variants.
*
* The generated secret can be used in combination with
*`*_withSecret()` and `_withSecretandSeed()` variants.
- * This generator is notably useful in combination with `_withSecretandSeed()`,
- * as a way to emulate a faster `_withSeed()` variant.
+ *
+ * Example C++ `std::string` hash class:
+ * @code{.cpp}
+ * #include <string>
+ * #define XXH_STATIC_LINKING_ONLY // expose unstable API
+ * #include "xxhash.h"
+ * // Slow, seeds each time
+ * class HashSlow {
+ * XXH64_hash_t seed;
+ * public:
+ * HashSlow(XXH64_hash_t s) : seed{s} {}
+ * size_t operator()(const std::string& x) const {
+ * return size_t{XXH3_64bits_withSeed(x.c_str(), x.length(), seed)};
+ * }
+ * };
+ * // Fast, caches the seeded secret for future uses.
+ * class HashFast {
+ * unsigned char secret[XXH3_SECRET_SIZE_MIN];
+ * public:
+ * HashFast(XXH64_hash_t s) {
+ * XXH3_generateSecret_fromSeed(secret, seed);
+ * }
+ * size_t operator()(const std::string& x) const {
+ * return size_t{
+ * XXH3_64bits_withSecret(x.c_str(), x.length(), secret, sizeof(secret))
+ * };
+ * }
+ * };
+ * @endcode
+ * @param secretBuffer A writable buffer of @ref XXH3_SECRET_SIZE_MIN bytes
+ * @param seed The seed to seed the state.
*/
-XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed);
+XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed);
-/*
- * *_withSecretandSeed() :
+/*!
* These variants generate hash values using either
- * @seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes)
- * or @secret for "large" keys (>= XXH3_MIDSIZE_MAX).
+ * @p seed for "short" keys (< XXH3_MIDSIZE_MAX = 240 bytes)
+ * or @p secret for "large" keys (>= XXH3_MIDSIZE_MAX).
*
* This generally benefits speed, compared to `_withSeed()` or `_withSecret()`.
* `_withSeed()` has to generate the secret on the fly for "large" keys.
@@ -1181,7 +1699,7 @@ XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_
* which requires more instructions than _withSeed() variants.
* Therefore, _withSecretandSeed variant combines the best of both worlds.
*
- * When @secret has been generated by XXH3_generateSecret_fromSeed(),
+ * When @p secret has been generated by XXH3_generateSecret_fromSeed(),
* this variant produces *exactly* the same results as `_withSeed()` variant,
* hence offering only a pure speed benefit on "large" input,
* by skipping the need to regenerate the secret for every large input.
@@ -1190,32 +1708,34 @@ XXH_PUBLIC_API void XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_
* for example with XXH3_64bits(), which then becomes the seed,
* and then employ both the seed and the secret in _withSecretandSeed().
* On top of speed, an added benefit is that each bit in the secret
- * has a 50% chance to swap each bit in the output,
- * via its impact to the seed.
+ * has a 50% chance to swap each bit in the output, via its impact to the seed.
+ *
* This is not guaranteed when using the secret directly in "small data" scenarios,
* because only portions of the secret are employed for small data.
*/
-XXH_PUBLIC_API XXH64_hash_t
-XXH3_64bits_withSecretandSeed(const void* data, size_t len,
- const void* secret, size_t secretSize,
+XXH_PUBLIC_API XXH_PUREF XXH64_hash_t
+XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* data, size_t len,
+ XXH_NOESCAPE const void* secret, size_t secretSize,
XXH64_hash_t seed);
-
-XXH_PUBLIC_API XXH128_hash_t
-XXH3_128bits_withSecretandSeed(const void* data, size_t len,
- const void* secret, size_t secretSize,
+/*! @copydoc XXH3_64bits_withSecretandSeed() */
+XXH_PUBLIC_API XXH_PUREF XXH128_hash_t
+XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length,
+ XXH_NOESCAPE const void* secret, size_t secretSize,
XXH64_hash_t seed64);
-
+#ifndef XXH_NO_STREAM
+/*! @copydoc XXH3_64bits_withSecretandSeed() */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
- const void* secret, size_t secretSize,
+XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr,
+ XXH_NOESCAPE const void* secret, size_t secretSize,
XXH64_hash_t seed64);
-
+/*! @copydoc XXH3_64bits_withSecretandSeed() */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
- const void* secret, size_t secretSize,
+XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr,
+ XXH_NOESCAPE const void* secret, size_t secretSize,
XXH64_hash_t seed64);
+#endif /* !XXH_NO_STREAM */
-
+#endif /* !XXH_NO_XXH3 */
#endif /* XXH_NO_LONG_LONG */
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
# define XXH_IMPLEMENTATION
@@ -1269,7 +1789,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
/*!
* @brief Define this to disable 64-bit code.
*
- * Useful if only using the @ref xxh32_family and you have a strict C90 compiler.
+ * Useful if only using the @ref XXH32_family and you have a strict C90 compiler.
*/
# define XXH_NO_LONG_LONG
# undef XXH_NO_LONG_LONG /* don't actually */
@@ -1292,7 +1812,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
* Use `memcpy()`. Safe and portable. Note that most modern compilers will
* eliminate the function call and treat it as an unaligned access.
*
- * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((packed))`
+ * - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((aligned(1)))`
* @par
* Depends on compiler extensions and is therefore not portable.
* This method is safe _if_ your compiler supports it,
@@ -1312,20 +1832,48 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
* inline small `memcpy()` calls, and it might also be faster on big-endian
* systems which lack a native byteswap instruction. However, some compilers
* will emit literal byteshifts even if the target supports unaligned access.
- * .
+ *
*
* @warning
* Methods 1 and 2 rely on implementation-defined behavior. Use these with
* care, as what works on one compiler/platform/optimization level may cause
* another to read garbage data or even crash.
*
- * See http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details.
+ * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details.
*
* Prefer these methods in priority order (0 > 3 > 1 > 2)
*/
# define XXH_FORCE_MEMORY_ACCESS 0
/*!
+ * @def XXH_SIZE_OPT
+ * @brief Controls how much xxHash optimizes for size.
+ *
+ * xxHash, when compiled, tends to result in a rather large binary size. This
+ * is mostly due to heavy usage to forced inlining and constant folding of the
+ * @ref XXH3_family to increase performance.
+ *
+ * However, some developers prefer size over speed. This option can
+ * significantly reduce the size of the generated code. When using the `-Os`
+ * or `-Oz` options on GCC or Clang, this is defined to 1 by default,
+ * otherwise it is defined to 0.
+ *
+ * Most of these size optimizations can be controlled manually.
+ *
+ * This is a number from 0-2.
+ * - `XXH_SIZE_OPT` == 0: Default. xxHash makes no size optimizations. Speed
+ * comes first.
+ * - `XXH_SIZE_OPT` == 1: Default for `-Os` and `-Oz`. xxHash is more
+ * conservative and disables hacks that increase code size. It implies the
+ * options @ref XXH_NO_INLINE_HINTS == 1, @ref XXH_FORCE_ALIGN_CHECK == 0,
+ * and @ref XXH3_NEON_LANES == 8 if they are not already defined.
+ * - `XXH_SIZE_OPT` == 2: xxHash tries to make itself as small as possible.
+ * Performance may cry. For example, the single shot functions just use the
+ * streaming API.
+ */
+# define XXH_SIZE_OPT 0
+
+/*!
* @def XXH_FORCE_ALIGN_CHECK
* @brief If defined to non-zero, adds a special path for aligned inputs (XXH32()
* and XXH64() only).
@@ -1346,9 +1894,11 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
*
* In these cases, the alignment check can be removed by setting this macro to 0.
* Then the code will always use unaligned memory access.
- * Align check is automatically disabled on x86, x64 & arm64,
+ * Align check is automatically disabled on x86, x64, ARM64, and some ARM chips
* which are platforms known to offer good unaligned memory accesses performance.
*
+ * It is also disabled by default when @ref XXH_SIZE_OPT >= 1.
+ *
* This option does not affect XXH3 (only XXH32 and XXH64).
*/
# define XXH_FORCE_ALIGN_CHECK 0
@@ -1370,12 +1920,29 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
* XXH_NO_INLINE_HINTS marks all internal functions as static, giving the
* compiler full control on whether to inline or not.
*
- * When not optimizing (-O0), optimizing for size (-Os, -Oz), or using
- * -fno-inline with GCC or Clang, this will automatically be defined.
+ * When not optimizing (-O0), using `-fno-inline` with GCC or Clang, or if
+ * @ref XXH_SIZE_OPT >= 1, this will automatically be defined.
*/
# define XXH_NO_INLINE_HINTS 0
/*!
+ * @def XXH3_INLINE_SECRET
+ * @brief Determines whether to inline the XXH3 withSecret code.
+ *
+ * When the secret size is known, the compiler can improve the performance
+ * of XXH3_64bits_withSecret() and XXH3_128bits_withSecret().
+ *
+ * However, if the secret size is not known, it doesn't have any benefit. This
+ * happens when xxHash is compiled into a global symbol. Therefore, if
+ * @ref XXH_INLINE_ALL is *not* defined, this will be defined to 0.
+ *
+ * Additionally, this defaults to 0 on GCC 12+, which has an issue with function pointers
+ * that are *sometimes* force inline on -Og, and it is impossible to automatically
+ * detect this optimization level.
+ */
+# define XXH3_INLINE_SECRET 0
+
+/*!
* @def XXH32_ENDJMP
* @brief Whether to use a jump for `XXH32_finalize`.
*
@@ -1396,34 +1963,45 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
*/
# define XXH_OLD_NAMES
# undef XXH_OLD_NAMES /* don't actually use, it is ugly. */
+
+/*!
+ * @def XXH_NO_STREAM
+ * @brief Disables the streaming API.
+ *
+ * When xxHash is not inlined and the streaming functions are not used, disabling
+ * the streaming functions can improve code size significantly, especially with
+ * the @ref XXH3_family which tends to make constant folded copies of itself.
+ */
+# define XXH_NO_STREAM
+# undef XXH_NO_STREAM /* don't actually */
#endif /* XXH_DOXYGEN */
/*!
* @}
*/
#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
- /* prefer __packed__ structures (method 1) for gcc on armv7+ and mips */
-# if !defined(__clang__) && \
-( \
- (defined(__INTEL_COMPILER) && !defined(_WIN32)) || \
- ( \
- defined(__GNUC__) && ( \
- (defined(__ARM_ARCH) && __ARM_ARCH >= 7) || \
- ( \
- defined(__mips__) && \
- (__mips <= 5 || __mips_isa_rev < 6) && \
- (!defined(__mips16) || defined(__mips_mips16e2)) \
- ) \
- ) \
- ) \
-)
+ /* prefer __packed__ structures (method 1) for GCC
+ * < ARMv7 with unaligned access (e.g. Raspbian armhf) still uses byte shifting, so we use memcpy
+ * which for some reason does unaligned loads. */
+# if defined(__GNUC__) && !(defined(__ARM_ARCH) && __ARM_ARCH < 7 && defined(__ARM_FEATURE_UNALIGNED))
# define XXH_FORCE_MEMORY_ACCESS 1
# endif
#endif
+#ifndef XXH_SIZE_OPT
+ /* default to 1 for -Os or -Oz */
+# if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE_SIZE__)
+# define XXH_SIZE_OPT 1
+# else
+# define XXH_SIZE_OPT 0
+# endif
+#endif
+
#ifndef XXH_FORCE_ALIGN_CHECK /* can be defined externally */
-# if defined(__i386) || defined(__x86_64__) || defined(__aarch64__) \
- || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) /* visual */
+ /* don't check on sizeopt, x86, aarch64, or arm when unaligned access is available */
+# if XXH_SIZE_OPT >= 1 || \
+ defined(__i386) || defined(__x86_64__) || defined(__aarch64__) || defined(__ARM_FEATURE_UNALIGNED) \
+ || defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM64) || defined(_M_ARM) /* visual */
# define XXH_FORCE_ALIGN_CHECK 0
# else
# define XXH_FORCE_ALIGN_CHECK 1
@@ -1431,14 +2009,22 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
#endif
#ifndef XXH_NO_INLINE_HINTS
-# if defined(__OPTIMIZE_SIZE__) /* -Os, -Oz */ \
- || defined(__NO_INLINE__) /* -O0, -fno-inline */
+# if XXH_SIZE_OPT >= 1 || defined(__NO_INLINE__) /* -O0, -fno-inline */
# define XXH_NO_INLINE_HINTS 1
# else
# define XXH_NO_INLINE_HINTS 0
# endif
#endif
+#ifndef XXH3_INLINE_SECRET
+# if (defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12) \
+ || !defined(XXH_INLINE_ALL)
+# define XXH3_INLINE_SECRET 0
+# else
+# define XXH3_INLINE_SECRET 1
+# endif
+#endif
+
#ifndef XXH32_ENDJMP
/* generally preferable for performance */
# define XXH32_ENDJMP 0
@@ -1453,6 +2039,24 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
/* *************************************
* Includes & Memory related functions
***************************************/
+#if defined(XXH_NO_STREAM)
+/* nothing */
+#elif defined(XXH_NO_STDLIB)
+
+/* When requesting to disable any mention of stdlib,
+ * the library loses the ability to invoked malloc / free.
+ * In practice, it means that functions like `XXH*_createState()`
+ * will always fail, and return NULL.
+ * This flag is useful in situations where
+ * xxhash.h is integrated into some kernel, embedded or limited environment
+ * without access to dynamic allocation.
+ */
+
+static XXH_CONSTF void* XXH_malloc(size_t s) { (void)s; return NULL; }
+static void XXH_free(void* p) { (void)p; }
+
+#else
+
/*
* Modify the local functions below should you wish to use
* different memory routines for malloc() and free()
@@ -1463,7 +2067,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr,
* @internal
* @brief Modify this function to use a different routine than malloc().
*/
-static void* XXH_malloc(size_t s) { return malloc(s); }
+static XXH_MALLOCF void* XXH_malloc(size_t s) { return malloc(s); }
/*!
* @internal
@@ -1471,6 +2075,8 @@ static void* XXH_malloc(size_t s) { return malloc(s); }
*/
static void XXH_free(void* p) { free(p); }
+#endif /* XXH_NO_STDLIB */
+
#include <string.h>
/*!
@@ -1515,6 +2121,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
# define XXH_NO_INLINE static
#endif
+#if XXH3_INLINE_SECRET
+# define XXH3_WITH_SECRET_INLINE XXH_FORCE_INLINE
+#else
+# define XXH3_WITH_SECRET_INLINE XXH_NO_INLINE
+#endif
/* *************************************
@@ -1540,7 +2151,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
# include <assert.h> /* note: can still be disabled with NDEBUG */
# define XXH_ASSERT(c) assert(c)
#else
-# define XXH_ASSERT(c) ((void)0)
+# if defined(__INTEL_COMPILER)
+# define XXH_ASSERT(c) XXH_ASSUME((unsigned char) (c))
+# else
+# define XXH_ASSERT(c) XXH_ASSUME(c)
+# endif
#endif
/* note: use after variable declarations */
@@ -1572,11 +2187,19 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
* XXH3_initCustomSecret_scalar().
*/
#if defined(__GNUC__) || defined(__clang__)
-# define XXH_COMPILER_GUARD(var) __asm__ __volatile__("" : "+r" (var))
+# define XXH_COMPILER_GUARD(var) __asm__("" : "+r" (var))
#else
# define XXH_COMPILER_GUARD(var) ((void)0)
#endif
+/* Specifically for NEON vectors which use the "w" constraint, on
+ * Clang. */
+#if defined(__clang__) && defined(__ARM_ARCH) && !defined(__wasm__)
+# define XXH_COMPILER_GUARD_CLANG_NEON(var) __asm__("" : "+w" (var))
+#else
+# define XXH_COMPILER_GUARD_CLANG_NEON(var) ((void)0)
+#endif
+
/* *************************************
* Basic Types
***************************************/
@@ -1591,6 +2214,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size)
typedef XXH32_hash_t xxh_u32;
#ifdef XXH_OLD_NAMES
+# warning "XXH_OLD_NAMES is planned to be removed starting v0.9. If the program depends on it, consider moving away from it by employing newer type names directly"
# define BYTE xxh_u8
# define U8 xxh_u8
# define U32 xxh_u32
@@ -1664,25 +2288,26 @@ static xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr;
#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))
/*
- * __pack instructions are safer but compiler specific, hence potentially
- * problematic for some compilers.
- *
- * Currently only defined for GCC and ICC.
+ * __attribute__((aligned(1))) is supported by gcc and clang. Originally the
+ * documentation claimed that it only increased the alignment, but actually it
+ * can decrease it on gcc, clang, and icc:
+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502,
+ * https://gcc.godbolt.org/z/xYez1j67Y.
*/
#ifdef XXH_OLD_NAMES
typedef union { xxh_u32 u32; } __attribute__((packed)) unalign;
#endif
static xxh_u32 XXH_read32(const void* ptr)
{
- typedef union { xxh_u32 u32; } __attribute__((packed)) xxh_unalign;
- return ((const xxh_unalign*)ptr)->u32;
+ typedef __attribute__((aligned(1))) xxh_u32 xxh_unalign32;
+ return *((const xxh_unalign32*)ptr);
}
#else
/*
* Portable and safe solution. Generally efficient.
- * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
+ * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
*/
static xxh_u32 XXH_read32(const void* memPtr)
{
@@ -1758,6 +2383,51 @@ static int XXH_isLittleEndian(void)
# define XXH_HAS_BUILTIN(x) 0
#endif
+
+
+/*
+ * C23 and future versions have standard "unreachable()".
+ * Once it has been implemented reliably we can add it as an
+ * additional case:
+ *
+ * ```
+ * #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN)
+ * # include <stddef.h>
+ * # ifdef unreachable
+ * # define XXH_UNREACHABLE() unreachable()
+ * # endif
+ * #endif
+ * ```
+ *
+ * Note C++23 also has std::unreachable() which can be detected
+ * as follows:
+ * ```
+ * #if defined(__cpp_lib_unreachable) && (__cpp_lib_unreachable >= 202202L)
+ * # include <utility>
+ * # define XXH_UNREACHABLE() std::unreachable()
+ * #endif
+ * ```
+ * NB: `__cpp_lib_unreachable` is defined in the `<version>` header.
+ * We don't use that as including `<utility>` in `extern "C"` blocks
+ * doesn't work on GCC12
+ */
+
+#if XXH_HAS_BUILTIN(__builtin_unreachable)
+# define XXH_UNREACHABLE() __builtin_unreachable()
+
+#elif defined(_MSC_VER)
+# define XXH_UNREACHABLE() __assume(0)
+
+#else
+# define XXH_UNREACHABLE()
+#endif
+
+#if XXH_HAS_BUILTIN(__builtin_assume)
+# define XXH_ASSUME(c) __builtin_assume(c)
+#else
+# define XXH_ASSUME(c) if (!(c)) { XXH_UNREACHABLE(); }
+#endif
+
/*!
* @internal
* @def XXH_rotl32(x,r)
@@ -1880,8 +2550,10 @@ XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }
*********************************************************************/
/*!
* @}
- * @defgroup xxh32_impl XXH32 implementation
+ * @defgroup XXH32_impl XXH32 implementation
* @ingroup impl
+ *
+ * Details on the XXH32 implementation.
* @{
*/
/* #define instead of static const, to be used as initializers */
@@ -1915,7 +2587,7 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
acc += input * XXH_PRIME32_2;
acc = XXH_rotl32(acc, 13);
acc *= XXH_PRIME32_1;
-#if (defined(__SSE4_1__) || defined(__aarch64__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)
+#if (defined(__SSE4_1__) || defined(__aarch64__) || defined(__wasm_simd128__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)
/*
* UGLY HACK:
* A compiler fence is the only thing that prevents GCC and Clang from
@@ -1945,9 +2617,12 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
* can load data, while v3 can multiply. SSE forces them to operate
* together.
*
- * This is also enabled on AArch64, as Clang autovectorizes it incorrectly
- * and it is pointless writing a NEON implementation that is basically the
- * same speed as scalar for XXH32.
+ * This is also enabled on AArch64, as Clang is *very aggressive* in vectorizing
+ * the loop. NEON is only faster on the A53, and with the newer cores, it is less
+ * than half the speed.
+ *
+ * Additionally, this is used on WASM SIMD128 because it JITs to the same
+ * SIMD instructions and has the same issue.
*/
XXH_COMPILER_GUARD(acc);
#endif
@@ -1961,17 +2636,17 @@ static xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)
* The final mix ensures that all input bits have a chance to impact any bit in
* the output digest, resulting in an unbiased distribution.
*
- * @param h32 The hash to avalanche.
+ * @param hash The hash to avalanche.
* @return The avalanched hash.
*/
-static xxh_u32 XXH32_avalanche(xxh_u32 h32)
+static xxh_u32 XXH32_avalanche(xxh_u32 hash)
{
- h32 ^= h32 >> 15;
- h32 *= XXH_PRIME32_2;
- h32 ^= h32 >> 13;
- h32 *= XXH_PRIME32_3;
- h32 ^= h32 >> 16;
- return(h32);
+ hash ^= hash >> 15;
+ hash *= XXH_PRIME32_2;
+ hash ^= hash >> 13;
+ hash *= XXH_PRIME32_3;
+ hash ^= hash >> 16;
+ return hash;
}
#define XXH_get32bits(p) XXH_readLE32_align(p, align)
@@ -1984,24 +2659,25 @@ static xxh_u32 XXH32_avalanche(xxh_u32 h32)
* This final stage will digest them to ensure that all input bytes are present
* in the final mix.
*
- * @param h32 The hash to finalize.
+ * @param hash The hash to finalize.
* @param ptr The pointer to the remaining input.
* @param len The remaining length, modulo 16.
* @param align Whether @p ptr is aligned.
* @return The finalized hash.
+ * @see XXH64_finalize().
*/
-static xxh_u32
-XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
+static XXH_PUREF xxh_u32
+XXH32_finalize(xxh_u32 hash, const xxh_u8* ptr, size_t len, XXH_alignment align)
{
-#define XXH_PROCESS1 do { \
- h32 += (*ptr++) * XXH_PRIME32_5; \
- h32 = XXH_rotl32(h32, 11) * XXH_PRIME32_1; \
+#define XXH_PROCESS1 do { \
+ hash += (*ptr++) * XXH_PRIME32_5; \
+ hash = XXH_rotl32(hash, 11) * XXH_PRIME32_1; \
} while (0)
-#define XXH_PROCESS4 do { \
- h32 += XXH_get32bits(ptr) * XXH_PRIME32_3; \
- ptr += 4; \
- h32 = XXH_rotl32(h32, 17) * XXH_PRIME32_4; \
+#define XXH_PROCESS4 do { \
+ hash += XXH_get32bits(ptr) * XXH_PRIME32_3; \
+ ptr += 4; \
+ hash = XXH_rotl32(hash, 17) * XXH_PRIME32_4; \
} while (0)
if (ptr==NULL) XXH_ASSERT(len == 0);
@@ -2017,49 +2693,49 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
XXH_PROCESS1;
--len;
}
- return XXH32_avalanche(h32);
+ return XXH32_avalanche(hash);
} else {
switch(len&15) /* or switch(bEnd - p) */ {
case 12: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 8: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 4: XXH_PROCESS4;
- return XXH32_avalanche(h32);
+ return XXH32_avalanche(hash);
case 13: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 9: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 5: XXH_PROCESS4;
XXH_PROCESS1;
- return XXH32_avalanche(h32);
+ return XXH32_avalanche(hash);
case 14: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 10: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 6: XXH_PROCESS4;
XXH_PROCESS1;
XXH_PROCESS1;
- return XXH32_avalanche(h32);
+ return XXH32_avalanche(hash);
case 15: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 11: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 7: XXH_PROCESS4;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 3: XXH_PROCESS1;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 2: XXH_PROCESS1;
- XXH_FALLTHROUGH;
+ XXH_FALLTHROUGH; /* fallthrough */
case 1: XXH_PROCESS1;
- XXH_FALLTHROUGH;
- case 0: return XXH32_avalanche(h32);
+ XXH_FALLTHROUGH; /* fallthrough */
+ case 0: return XXH32_avalanche(hash);
}
XXH_ASSERT(0);
- return h32; /* reaching this point is deemed impossible */
+ return hash; /* reaching this point is deemed impossible */
}
}
@@ -2079,7 +2755,7 @@ XXH32_finalize(xxh_u32 h32, const xxh_u8* ptr, size_t len, XXH_alignment align)
* @param align Whether @p input is aligned.
* @return The calculated hash.
*/
-XXH_FORCE_INLINE xxh_u32
+XXH_FORCE_INLINE XXH_PUREF xxh_u32
XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align)
{
xxh_u32 h32;
@@ -2112,10 +2788,10 @@ XXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment
return XXH32_finalize(h32, input, len&15, align);
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed)
{
-#if 0
+#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2
/* Simple version, good for code maintenance, but unfortunately slow for small inputs */
XXH32_state_t state;
XXH32_reset(&state, seed);
@@ -2134,42 +2810,39 @@ XXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t s
/******* Hash streaming *******/
-/*!
- * @ingroup xxh32_family
- */
+#ifndef XXH_NO_STREAM
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void)
{
return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)
{
XXH_free(statePtr);
return XXH_OK;
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState)
{
XXH_memcpy(dstState, srcState, sizeof(*dstState));
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed)
{
- XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */
- memset(&state, 0, sizeof(state));
- state.v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2;
- state.v[1] = seed + XXH_PRIME32_2;
- state.v[2] = seed + 0;
- state.v[3] = seed - XXH_PRIME32_1;
- /* do not write into reserved, planned to be removed in a future version */
- XXH_memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved));
+ XXH_ASSERT(statePtr != NULL);
+ memset(statePtr, 0, sizeof(*statePtr));
+ statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2;
+ statePtr->v[1] = seed + XXH_PRIME32_2;
+ statePtr->v[2] = seed + 0;
+ statePtr->v[3] = seed - XXH_PRIME32_1;
return XXH_OK;
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH_errorcode
XXH32_update(XXH32_state_t* state, const void* input, size_t len)
{
@@ -2224,7 +2897,7 @@ XXH32_update(XXH32_state_t* state, const void* input, size_t len)
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state)
{
xxh_u32 h32;
@@ -2242,12 +2915,12 @@ XXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state)
return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned);
}
-
+#endif /* !XXH_NO_STREAM */
/******* Canonical representation *******/
/*!
- * @ingroup xxh32_family
+ * @ingroup XXH32_family
* The default return values from XXH functions are unsigned 32 and 64 bit
* integers.
*
@@ -2266,7 +2939,7 @@ XXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t
if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);
XXH_memcpy(dst, &hash, sizeof(*dst));
}
-/*! @ingroup xxh32_family */
+/*! @ingroup XXH32_family */
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src)
{
return XXH_readBE32(src);
@@ -2307,25 +2980,26 @@ static xxh_u64 XXH_read64(const void* memPtr)
#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))
/*
- * __pack instructions are safer, but compiler specific, hence potentially
- * problematic for some compilers.
- *
- * Currently only defined for GCC and ICC.
+ * __attribute__((aligned(1))) is supported by gcc and clang. Originally the
+ * documentation claimed that it only increased the alignment, but actually it
+ * can decrease it on gcc, clang, and icc:
+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502,
+ * https://gcc.godbolt.org/z/xYez1j67Y.
*/
#ifdef XXH_OLD_NAMES
typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64;
#endif
static xxh_u64 XXH_read64(const void* ptr)
{
- typedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) xxh_unalign64;
- return ((const xxh_unalign64*)ptr)->u64;
+ typedef __attribute__((aligned(1))) xxh_u64 xxh_unalign64;
+ return *((const xxh_unalign64*)ptr);
}
#else
/*
* Portable and safe solution. Generally efficient.
- * see: http://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
+ * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html
*/
static xxh_u64 XXH_read64(const void* memPtr)
{
@@ -2409,8 +3083,10 @@ XXH_readLE64_align(const void* ptr, XXH_alignment align)
/******* xxh64 *******/
/*!
* @}
- * @defgroup xxh64_impl XXH64 implementation
+ * @defgroup XXH64_impl XXH64 implementation
* @ingroup impl
+ *
+ * Details on the XXH64 implementation.
* @{
*/
/* #define rather that static const, to be used as initializers */
@@ -2428,6 +3104,7 @@ XXH_readLE64_align(const void* ptr, XXH_alignment align)
# define PRIME64_5 XXH_PRIME64_5
#endif
+/*! @copydoc XXH32_round */
static xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input)
{
acc += input * XXH_PRIME64_2;
@@ -2444,43 +3121,59 @@ static xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val)
return acc;
}
-static xxh_u64 XXH64_avalanche(xxh_u64 h64)
+/*! @copydoc XXH32_avalanche */
+static xxh_u64 XXH64_avalanche(xxh_u64 hash)
{
- h64 ^= h64 >> 33;
- h64 *= XXH_PRIME64_2;
- h64 ^= h64 >> 29;
- h64 *= XXH_PRIME64_3;
- h64 ^= h64 >> 32;
- return h64;
+ hash ^= hash >> 33;
+ hash *= XXH_PRIME64_2;
+ hash ^= hash >> 29;
+ hash *= XXH_PRIME64_3;
+ hash ^= hash >> 32;
+ return hash;
}
#define XXH_get64bits(p) XXH_readLE64_align(p, align)
-static xxh_u64
-XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
+/*!
+ * @internal
+ * @brief Processes the last 0-31 bytes of @p ptr.
+ *
+ * There may be up to 31 bytes remaining to consume from the input.
+ * This final stage will digest them to ensure that all input bytes are present
+ * in the final mix.
+ *
+ * @param hash The hash to finalize.
+ * @param ptr The pointer to the remaining input.
+ * @param len The remaining length, modulo 32.
+ * @param align Whether @p ptr is aligned.
+ * @return The finalized hash
+ * @see XXH32_finalize().
+ */
+static XXH_PUREF xxh_u64
+XXH64_finalize(xxh_u64 hash, const xxh_u8* ptr, size_t len, XXH_alignment align)
{
if (ptr==NULL) XXH_ASSERT(len == 0);
len &= 31;
while (len >= 8) {
xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr));
ptr += 8;
- h64 ^= k1;
- h64 = XXH_rotl64(h64,27) * XXH_PRIME64_1 + XXH_PRIME64_4;
+ hash ^= k1;
+ hash = XXH_rotl64(hash,27) * XXH_PRIME64_1 + XXH_PRIME64_4;
len -= 8;
}
if (len >= 4) {
- h64 ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1;
+ hash ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1;
ptr += 4;
- h64 = XXH_rotl64(h64, 23) * XXH_PRIME64_2 + XXH_PRIME64_3;
+ hash = XXH_rotl64(hash, 23) * XXH_PRIME64_2 + XXH_PRIME64_3;
len -= 4;
}
while (len > 0) {
- h64 ^= (*ptr++) * XXH_PRIME64_5;
- h64 = XXH_rotl64(h64, 11) * XXH_PRIME64_1;
+ hash ^= (*ptr++) * XXH_PRIME64_5;
+ hash = XXH_rotl64(hash, 11) * XXH_PRIME64_1;
--len;
}
- return XXH64_avalanche(h64);
+ return XXH64_avalanche(hash);
}
#ifdef XXH_OLD_NAMES
@@ -2493,7 +3186,15 @@ XXH64_finalize(xxh_u64 h64, const xxh_u8* ptr, size_t len, XXH_alignment align)
# undef XXH_PROCESS8_64
#endif
-XXH_FORCE_INLINE xxh_u64
+/*!
+ * @internal
+ * @brief The implementation for @ref XXH64().
+ *
+ * @param input , len , seed Directly passed from @ref XXH64().
+ * @param align Whether @p input is aligned.
+ * @return The calculated hash.
+ */
+XXH_FORCE_INLINE XXH_PUREF xxh_u64
XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align)
{
xxh_u64 h64;
@@ -2530,10 +3231,10 @@ XXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment
}
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t seed)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API XXH64_hash_t XXH64 (XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)
{
-#if 0
+#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2
/* Simple version, good for code maintenance, but unfortunately slow for small inputs */
XXH64_state_t state;
XXH64_reset(&state, seed);
@@ -2551,42 +3252,40 @@ XXH_PUBLIC_API XXH64_hash_t XXH64 (const void* input, size_t len, XXH64_hash_t s
}
/******* Hash Streaming *******/
-
-/*! @ingroup xxh64_family*/
+#ifndef XXH_NO_STREAM
+/*! @ingroup XXH64_family*/
XXH_PUBLIC_API XXH64_state_t* XXH64_createState(void)
{
return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));
}
-/*! @ingroup xxh64_family */
+/*! @ingroup XXH64_family */
XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
{
XXH_free(statePtr);
return XXH_OK;
}
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* dstState, const XXH64_state_t* srcState)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dstState, const XXH64_state_t* srcState)
{
XXH_memcpy(dstState, srcState, sizeof(*dstState));
}
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, XXH64_hash_t seed)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed)
{
- XXH64_state_t state; /* use a local state to memcpy() in order to avoid strict-aliasing warnings */
- memset(&state, 0, sizeof(state));
- state.v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2;
- state.v[1] = seed + XXH_PRIME64_2;
- state.v[2] = seed + 0;
- state.v[3] = seed - XXH_PRIME64_1;
- /* do not write into reserved64, might be removed in a future version */
- XXH_memcpy(statePtr, &state, sizeof(state) - sizeof(state.reserved64));
+ XXH_ASSERT(statePtr != NULL);
+ memset(statePtr, 0, sizeof(*statePtr));
+ statePtr->v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2;
+ statePtr->v[1] = seed + XXH_PRIME64_2;
+ statePtr->v[2] = seed + 0;
+ statePtr->v[3] = seed - XXH_PRIME64_1;
return XXH_OK;
}
-/*! @ingroup xxh64_family */
+/*! @ingroup XXH64_family */
XXH_PUBLIC_API XXH_errorcode
-XXH64_update (XXH64_state_t* state, const void* input, size_t len)
+XXH64_update (XXH_NOESCAPE XXH64_state_t* state, XXH_NOESCAPE const void* input, size_t len)
{
if (input==NULL) {
XXH_ASSERT(len == 0);
@@ -2636,8 +3335,8 @@ XXH64_update (XXH64_state_t* state, const void* input, size_t len)
}
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API XXH64_hash_t XXH64_digest(XXH_NOESCAPE const XXH64_state_t* state)
{
xxh_u64 h64;
@@ -2655,20 +3354,20 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_digest(const XXH64_state_t* state)
return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned);
}
-
+#endif /* !XXH_NO_STREAM */
/******* Canonical representation *******/
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t hash)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash)
{
XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t));
if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);
XXH_memcpy(dst, &hash, sizeof(*dst));
}
-/*! @ingroup xxh64_family */
-XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src)
+/*! @ingroup XXH64_family */
+XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src)
{
return XXH_readBE64(src);
}
@@ -2681,7 +3380,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
************************************************************************ */
/*!
* @}
- * @defgroup xxh3_impl XXH3 implementation
+ * @defgroup XXH3_impl XXH3 implementation
* @ingroup impl
* @{
*/
@@ -2689,11 +3388,19 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
/* === Compiler specifics === */
#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */
-# define XXH_RESTRICT /* disable */
+# define XXH_RESTRICT /* disable */
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* >= C99 */
# define XXH_RESTRICT restrict
+#elif (defined (__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) \
+ || (defined (__clang__)) \
+ || (defined (_MSC_VER) && (_MSC_VER >= 1400)) \
+ || (defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 1300))
+/*
+ * There are a LOT more compilers that recognize __restrict but this
+ * covers the major ones.
+ */
+# define XXH_RESTRICT __restrict
#else
-/* Note: it might be useful to define __restrict or __restrict__ for some C++ compilers */
# define XXH_RESTRICT /* disable */
#endif
@@ -2707,17 +3414,33 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
# define XXH_unlikely(x) (x)
#endif
-#if defined(__GNUC__)
-# if defined(__AVX2__)
-# include <immintrin.h>
-# elif defined(__SSE2__)
-# include <emmintrin.h>
-# elif defined(__ARM_NEON__) || defined(__ARM_NEON)
+#ifndef XXH_HAS_INCLUDE
+# ifdef __has_include
+# define XXH_HAS_INCLUDE(x) __has_include(x)
+# else
+# define XXH_HAS_INCLUDE(x) 0
+# endif
+#endif
+
+#if defined(__GNUC__) || defined(__clang__)
+# if defined(__ARM_FEATURE_SVE)
+# include <arm_sve.h>
+# endif
+# if defined(__ARM_NEON__) || defined(__ARM_NEON) \
+ || (defined(_M_ARM) && _M_ARM >= 7) \
+ || defined(_M_ARM64) || defined(_M_ARM64EC) \
+ || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* WASM SIMD128 via SIMDe */
# define inline __inline__ /* circumvent a clang bug */
# include <arm_neon.h>
# undef inline
+# elif defined(__AVX2__)
+# include <immintrin.h>
+# elif defined(__SSE2__)
+# include <emmintrin.h>
# endif
-#elif defined(_MSC_VER)
+#endif
+
+#if defined(_MSC_VER)
# include <intrin.h>
#endif
@@ -2817,7 +3540,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src
* Note that these are actually implemented as macros.
*
* If this is not defined, it is detected automatically.
- * @ref XXH_X86DISPATCH overrides this.
+ * internal macro XXH_X86DISPATCH overrides this.
*/
enum XXH_VECTOR_TYPE /* fake enum */ {
XXH_SCALAR = 0, /*!< Portable scalar version */
@@ -2829,14 +3552,19 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
*/
XXH_AVX2 = 2, /*!< AVX2 for Haswell and Bulldozer */
XXH_AVX512 = 3, /*!< AVX512 for Skylake and Icelake */
- XXH_NEON = 4, /*!< NEON for most ARMv7-A and all AArch64 */
+ XXH_NEON = 4, /*!<
+ * NEON for most ARMv7-A, all AArch64, and WASM SIMD128
+ * via the SIMDeverywhere polyfill provided with the
+ * Emscripten SDK.
+ */
XXH_VSX = 5, /*!< VSX and ZVector for POWER8/z13 (64-bit) */
+ XXH_SVE = 6, /*!< SVE for some ARMv8-A and ARMv9-A */
};
/*!
* @ingroup tuning
* @brief Selects the minimum alignment for XXH3's accumulators.
*
- * When using SIMD, this should match the alignment reqired for said vector
+ * When using SIMD, this should match the alignment required for said vector
* type, so, for example, 32 for AVX2.
*
* Default: Auto detected.
@@ -2852,23 +3580,27 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
# define XXH_AVX512 3
# define XXH_NEON 4
# define XXH_VSX 5
+# define XXH_SVE 6
#endif
#ifndef XXH_VECTOR /* can be defined on command line */
-# if defined(__AVX512F__)
-# define XXH_VECTOR XXH_AVX512
-# elif defined(__AVX2__)
-# define XXH_VECTOR XXH_AVX2
-# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2))
-# define XXH_VECTOR XXH_SSE2
+# if defined(__ARM_FEATURE_SVE)
+# define XXH_VECTOR XXH_SVE
# elif ( \
defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \
- || defined(_M_ARM64) || defined(_M_ARM_ARMV7VE) /* msvc */ \
+ || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \
+ || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* wasm simd128 via SIMDe */ \
) && ( \
defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \
|| (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \
)
# define XXH_VECTOR XXH_NEON
+# elif defined(__AVX512F__)
+# define XXH_VECTOR XXH_AVX512
+# elif defined(__AVX2__)
+# define XXH_VECTOR XXH_AVX2
+# elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2))
+# define XXH_VECTOR XXH_SSE2
# elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \
|| (defined(__s390x__) && defined(__VEC__)) \
&& defined(__GNUC__) /* TODO: IBM XL */
@@ -2878,6 +3610,17 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
# endif
#endif
+/* __ARM_FEATURE_SVE is only supported by GCC & Clang. */
+#if (XXH_VECTOR == XXH_SVE) && !defined(__ARM_FEATURE_SVE)
+# ifdef _MSC_VER
+# pragma warning(once : 4606)
+# else
+# warning "__ARM_FEATURE_SVE isn't supported. Use SCALAR instead."
+# endif
+# undef XXH_VECTOR
+# define XXH_VECTOR XXH_SCALAR
+#endif
+
/*
* Controls the alignment of the accumulator,
* for compatibility with aligned vector loads, which are usually faster.
@@ -2897,16 +3640,26 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
# define XXH_ACC_ALIGN 16
# elif XXH_VECTOR == XXH_AVX512 /* avx512 */
# define XXH_ACC_ALIGN 64
+# elif XXH_VECTOR == XXH_SVE /* sve */
+# define XXH_ACC_ALIGN 64
# endif
#endif
#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \
|| XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512
# define XXH_SEC_ALIGN XXH_ACC_ALIGN
+#elif XXH_VECTOR == XXH_SVE
+# define XXH_SEC_ALIGN XXH_ACC_ALIGN
#else
# define XXH_SEC_ALIGN 8
#endif
+#if defined(__GNUC__) || defined(__clang__)
+# define XXH_ALIASING __attribute__((may_alias))
+#else
+# define XXH_ALIASING /* nothing */
+#endif
+
/*
* UGLY HACK:
* GCC usually generates the best code with -O3 for xxHash.
@@ -2930,111 +3683,130 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
*/
#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \
&& defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \
- && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */
+ && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */
# pragma GCC push_options
# pragma GCC optimize("-O2")
#endif
-
#if XXH_VECTOR == XXH_NEON
+
/*
- * NEON's setup for vmlal_u32 is a little more complicated than it is on
- * SSE2, AVX2, and VSX.
- *
- * While PMULUDQ and VMULEUW both perform a mask, VMLAL.U32 performs an upcast.
+ * UGLY HACK: While AArch64 GCC on Linux does not seem to care, on macOS, GCC -O3
+ * optimizes out the entire hashLong loop because of the aliasing violation.
*
- * To do the same operation, the 128-bit 'Q' register needs to be split into
- * two 64-bit 'D' registers, performing this operation::
- *
- * [ a | b ]
- * | '---------. .--------' |
- * | x |
- * | .---------' '--------. |
- * [ a & 0xFFFFFFFF | b & 0xFFFFFFFF ],[ a >> 32 | b >> 32 ]
- *
- * Due to significant changes in aarch64, the fastest method for aarch64 is
- * completely different than the fastest method for ARMv7-A.
- *
- * ARMv7-A treats D registers as unions overlaying Q registers, so modifying
- * D11 will modify the high half of Q5. This is similar to how modifying AH
- * will only affect bits 8-15 of AX on x86.
- *
- * VZIP takes two registers, and puts even lanes in one register and odd lanes
- * in the other.
+ * However, GCC is also inefficient at load-store optimization with vld1q/vst1q,
+ * so the only option is to mark it as aliasing.
+ */
+typedef uint64x2_t xxh_aliasing_uint64x2_t XXH_ALIASING;
+
+/*!
+ * @internal
+ * @brief `vld1q_u64` but faster and alignment-safe.
*
- * On ARMv7-A, this strangely modifies both parameters in place instead of
- * taking the usual 3-operand form.
+ * On AArch64, unaligned access is always safe, but on ARMv7-a, it is only
+ * *conditionally* safe (`vld1` has an alignment bit like `movdq[ua]` in x86).
*
- * Therefore, if we want to do this, we can simply use a D-form VZIP.32 on the
- * lower and upper halves of the Q register to end up with the high and low
- * halves where we want - all in one instruction.
+ * GCC for AArch64 sees `vld1q_u8` as an intrinsic instead of a load, so it
+ * prohibits load-store optimizations. Therefore, a direct dereference is used.
*
- * vzip.32 d10, d11 @ d10 = { d10[0], d11[0] }; d11 = { d10[1], d11[1] }
+ * Otherwise, `vld1q_u8` is used with `vreinterpretq_u8_u64` to do a safe
+ * unaligned load.
+ */
+#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__)
+XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) /* silence -Wcast-align */
+{
+ return *(xxh_aliasing_uint64x2_t const *)ptr;
+}
+#else
+XXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr)
+{
+ return vreinterpretq_u64_u8(vld1q_u8((uint8_t const*)ptr));
+}
+#endif
+
+/*!
+ * @internal
+ * @brief `vmlal_u32` on low and high halves of a vector.
*
- * Unfortunately we need inline assembly for this: Instructions modifying two
- * registers at once is not possible in GCC or Clang's IR, and they have to
- * create a copy.
+ * This is a workaround for AArch64 GCC < 11 which implemented arm_neon.h with
+ * inline assembly and were therefore incapable of merging the `vget_{low, high}_u32`
+ * with `vmlal_u32`.
+ */
+#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 11
+XXH_FORCE_INLINE uint64x2_t
+XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)
+{
+ /* Inline assembly is the only way */
+ __asm__("umlal %0.2d, %1.2s, %2.2s" : "+w" (acc) : "w" (lhs), "w" (rhs));
+ return acc;
+}
+XXH_FORCE_INLINE uint64x2_t
+XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)
+{
+ /* This intrinsic works as expected */
+ return vmlal_high_u32(acc, lhs, rhs);
+}
+#else
+/* Portable intrinsic versions */
+XXH_FORCE_INLINE uint64x2_t
+XXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)
+{
+ return vmlal_u32(acc, vget_low_u32(lhs), vget_low_u32(rhs));
+}
+/*! @copydoc XXH_vmlal_low_u32
+ * Assume the compiler converts this to vmlal_high_u32 on aarch64 */
+XXH_FORCE_INLINE uint64x2_t
+XXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)
+{
+ return vmlal_u32(acc, vget_high_u32(lhs), vget_high_u32(rhs));
+}
+#endif
+
+/*!
+ * @ingroup tuning
+ * @brief Controls the NEON to scalar ratio for XXH3
*
- * aarch64 requires a different approach.
+ * This can be set to 2, 4, 6, or 8.
*
- * In order to make it easier to write a decent compiler for aarch64, many
- * quirks were removed, such as conditional execution.
+ * ARM Cortex CPUs are _very_ sensitive to how their pipelines are used.
*
- * NEON was also affected by this.
+ * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but only 2 of those
+ * can be NEON. If you are only using NEON instructions, you are only using 2/3 of the CPU
+ * bandwidth.
*
- * aarch64 cannot access the high bits of a Q-form register, and writes to a
- * D-form register zero the high bits, similar to how writes to W-form scalar
- * registers (or DWORD registers on x86_64) work.
+ * This is even more noticeable on the more advanced cores like the Cortex-A76 which
+ * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once.
*
- * The formerly free vget_high intrinsics now require a vext (with a few
- * exceptions)
+ * Therefore, to make the most out of the pipeline, it is beneficial to run 6 NEON lanes
+ * and 2 scalar lanes, which is chosen by default.
*
- * Additionally, VZIP was replaced by ZIP1 and ZIP2, which are the equivalent
- * of PUNPCKL* and PUNPCKH* in SSE, respectively, in order to only modify one
- * operand.
+ * This does not apply to Apple processors or 32-bit processors, which run better with
+ * full NEON. These will default to 8. Additionally, size-optimized builds run 8 lanes.
*
- * The equivalent of the VZIP.32 on the lower and upper halves would be this
- * mess:
+ * This change benefits CPUs with large micro-op buffers without negatively affecting
+ * most other CPUs:
*
- * ext v2.4s, v0.4s, v0.4s, #2 // v2 = { v0[2], v0[3], v0[0], v0[1] }
- * zip1 v1.2s, v0.2s, v2.2s // v1 = { v0[0], v2[0] }
- * zip2 v0.2s, v0.2s, v1.2s // v0 = { v0[1], v2[1] }
+ * | Chipset | Dispatch type | NEON only | 6:2 hybrid | Diff. |
+ * |:----------------------|:--------------------|----------:|-----------:|------:|
+ * | Snapdragon 730 (A76) | 2 NEON/8 micro-ops | 8.8 GB/s | 10.1 GB/s | ~16% |
+ * | Snapdragon 835 (A73) | 2 NEON/3 micro-ops | 5.1 GB/s | 5.3 GB/s | ~5% |
+ * | Marvell PXA1928 (A53) | In-order dual-issue | 1.9 GB/s | 1.9 GB/s | 0% |
+ * | Apple M1 | 4 NEON/8 micro-ops | 37.3 GB/s | 36.1 GB/s | ~-3% |
*
- * Instead, we use a literal downcast, vmovn_u64 (XTN), and vshrn_n_u64 (SHRN):
+ * It also seems to fix some bad codegen on GCC, making it almost as fast as clang.
*
- * shrn v1.2s, v0.2d, #32 // v1 = (uint32x2_t)(v0 >> 32);
- * xtn v0.2s, v0.2d // v0 = (uint32x2_t)(v0 & 0xFFFFFFFF);
+ * When using WASM SIMD128, if this is 2 or 6, SIMDe will scalarize 2 of the lanes meaning
+ * it effectively becomes worse 4.
*
- * This is available on ARMv7-A, but is less efficient than a single VZIP.32.
+ * @see XXH3_accumulate_512_neon()
*/
-
-/*!
- * Function-like macro:
- * void XXH_SPLIT_IN_PLACE(uint64x2_t &in, uint32x2_t &outLo, uint32x2_t &outHi)
- * {
- * outLo = (uint32x2_t)(in & 0xFFFFFFFF);
- * outHi = (uint32x2_t)(in >> 32);
- * in = UNDEFINED;
- * }
- */
-# if !defined(XXH_NO_VZIP_HACK) /* define to disable */ \
- && defined(__GNUC__) \
- && !defined(__aarch64__) && !defined(__arm64__) && !defined(_M_ARM64)
-# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \
- do { \
- /* Undocumented GCC/Clang operand modifier: %e0 = lower D half, %f0 = upper D half */ \
- /* https://github.com/gcc-mirror/gcc/blob/38cf91e5/gcc/config/arm/arm.c#L22486 */ \
- /* https://github.com/llvm-mirror/llvm/blob/2c4ca683/lib/Target/ARM/ARMAsmPrinter.cpp#L399 */ \
- __asm__("vzip.32 %e0, %f0" : "+w" (in)); \
- (outLo) = vget_low_u32 (vreinterpretq_u32_u64(in)); \
- (outHi) = vget_high_u32(vreinterpretq_u32_u64(in)); \
- } while (0)
-# else
-# define XXH_SPLIT_IN_PLACE(in, outLo, outHi) \
- do { \
- (outLo) = vmovn_u64 (in); \
- (outHi) = vshrn_n_u64 ((in), 32); \
- } while (0)
+# ifndef XXH3_NEON_LANES
+# if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \
+ && !defined(__APPLE__) && XXH_SIZE_OPT <= 0
+# define XXH3_NEON_LANES 6
+# else
+# define XXH3_NEON_LANES XXH_ACC_NB
+# endif
# endif
#endif /* XXH_VECTOR == XXH_NEON */
@@ -3047,27 +3819,42 @@ enum XXH_VECTOR_TYPE /* fake enum */ {
* inconsistent intrinsics, spotty coverage, and multiple endiannesses.
*/
#if XXH_VECTOR == XXH_VSX
+/* Annoyingly, these headers _may_ define three macros: `bool`, `vector`,
+ * and `pixel`. This is a problem for obvious reasons.
+ *
+ * These keywords are unnecessary; the spec literally says they are
+ * equivalent to `__bool`, `__vector`, and `__pixel` and may be undef'd
+ * after including the header.
+ *
+ * We use pragma push_macro/pop_macro to keep the namespace clean. */
+# pragma push_macro("bool")
+# pragma push_macro("vector")
+# pragma push_macro("pixel")
+/* silence potential macro redefined warnings */
+# undef bool
+# undef vector
+# undef pixel
+
# if defined(__s390x__)
# include <s390intrin.h>
# else
-/* gcc's altivec.h can have the unwanted consequence to unconditionally
- * #define bool, vector, and pixel keywords,
- * with bad consequences for programs already using these keywords for other purposes.
- * The paragraph defining these macros is skipped when __APPLE_ALTIVEC__ is defined.
- * __APPLE_ALTIVEC__ is _generally_ defined automatically by the compiler,
- * but it seems that, in some cases, it isn't.
- * Force the build macro to be defined, so that keywords are not altered.
- */
-# if defined(__GNUC__) && !defined(__APPLE_ALTIVEC__)
-# define __APPLE_ALTIVEC__
-# endif
# include <altivec.h>
# endif
+/* Restore the original macro values, if applicable. */
+# pragma pop_macro("pixel")
+# pragma pop_macro("vector")
+# pragma pop_macro("bool")
+
typedef __vector unsigned long long xxh_u64x2;
typedef __vector unsigned char xxh_u8x16;
typedef __vector unsigned xxh_u32x4;
+/*
+ * UGLY HACK: Similar to aarch64 macOS GCC, s390x GCC has the same aliasing issue.
+ */
+typedef xxh_u64x2 xxh_aliasing_u64x2 XXH_ALIASING;
+
# ifndef XXH_VSX_BE
# if defined(__BIG_ENDIAN__) \
|| (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
@@ -3119,8 +3906,9 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr)
/* s390x is always big endian, no issue on this platform */
# define XXH_vec_mulo vec_mulo
# define XXH_vec_mule vec_mule
-# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw)
+# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) && !defined(__ibmxl__)
/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */
+ /* The IBM XL Compiler (which defined __clang__) only implements the vec_* operations */
# define XXH_vec_mulo __builtin_altivec_vmulouw
# define XXH_vec_mule __builtin_altivec_vmuleuw
# else
@@ -3141,13 +3929,28 @@ XXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b)
# endif /* XXH_vec_mulo, XXH_vec_mule */
#endif /* XXH_VECTOR == XXH_VSX */
+#if XXH_VECTOR == XXH_SVE
+#define ACCRND(acc, offset) \
+do { \
+ svuint64_t input_vec = svld1_u64(mask, xinput + offset); \
+ svuint64_t secret_vec = svld1_u64(mask, xsecret + offset); \
+ svuint64_t mixed = sveor_u64_x(mask, secret_vec, input_vec); \
+ svuint64_t swapped = svtbl_u64(input_vec, kSwap); \
+ svuint64_t mixed_lo = svextw_u64_x(mask, mixed); \
+ svuint64_t mixed_hi = svlsr_n_u64_x(mask, mixed, 32); \
+ svuint64_t mul = svmad_u64_x(mask, mixed_lo, mixed_hi, swapped); \
+ acc = svadd_u64_x(mask, acc, mul); \
+} while (0)
+#endif /* XXH_VECTOR == XXH_SVE */
/* prefetch
* can be disabled, by declaring XXH_NO_PREFETCH build macro */
#if defined(XXH_NO_PREFETCH)
# define XXH_PREFETCH(ptr) (void)(ptr) /* disabled */
#else
-# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */
+# if XXH_SIZE_OPT >= 1
+# define XXH_PREFETCH(ptr) (void)(ptr)
+# elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) /* _mm_prefetch() not defined outside of x86/x64 */
# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
# define XXH_PREFETCH(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )
@@ -3184,6 +3987,8 @@ XXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = {
0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,
};
+static const xxh_u64 PRIME_MX1 = 0x165667919E3779F9ULL; /*!< 0b0001011001010110011001111001000110011110001101110111100111111001 */
+static const xxh_u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL; /*!< 0b1001111110110010000111000110010100011110100110001101111100100101 */
#ifdef XXH_OLD_NAMES
# define kSecret XXH3_kSecret
@@ -3212,7 +4017,6 @@ XXH_mult32to64(xxh_u64 x, xxh_u64 y)
return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF);
}
#elif defined(_MSC_VER) && defined(_M_IX86)
-# include <intrin.h>
# define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y))
#else
/*
@@ -3252,7 +4056,7 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs)
* In that case it is best to use the portable one.
* https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677
*/
-#if defined(__GNUC__) && !defined(__wasm__) \
+#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \
&& defined(__SIZEOF_INT128__) \
|| (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128)
@@ -3269,7 +4073,7 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs)
*
* This compiles to single operand MUL on x64.
*/
-#elif defined(_M_X64) || defined(_M_IA64)
+#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC)
#ifndef _MSC_VER
# pragma intrinsic(_umul128)
@@ -3286,7 +4090,7 @@ XXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs)
*
* This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method.
*/
-#elif defined(_M_ARM64)
+#elif defined(_M_ARM64) || defined(_M_ARM64EC)
#ifndef _MSC_VER
# pragma intrinsic(__umulh)
@@ -3376,7 +4180,7 @@ XXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs)
}
/*! Seems to produce slightly better code on GCC for some reason. */
-XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)
+XXH_FORCE_INLINE XXH_CONSTF xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)
{
XXH_ASSERT(0 <= shift && shift < 64);
return v64 ^ (v64 >> shift);
@@ -3389,7 +4193,7 @@ XXH_FORCE_INLINE xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)
static XXH64_hash_t XXH3_avalanche(xxh_u64 h64)
{
h64 = XXH_xorshift64(h64, 37);
- h64 *= 0x165667919E3779F9ULL;
+ h64 *= PRIME_MX1;
h64 = XXH_xorshift64(h64, 32);
return h64;
}
@@ -3403,9 +4207,9 @@ static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len)
{
/* this mix is inspired by Pelle Evensen's rrmxmx */
h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24);
- h64 *= 0x9FB21C651E98DF25ULL;
+ h64 *= PRIME_MX2;
h64 ^= (h64 >> 35) + len ;
- h64 *= 0x9FB21C651E98DF25ULL;
+ h64 *= PRIME_MX2;
return XXH_xorshift64(h64, 28);
}
@@ -3443,7 +4247,7 @@ static XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len)
*
* This adds an extra layer of strength for custom secrets.
*/
-XXH_FORCE_INLINE XXH64_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(input != NULL);
@@ -3465,7 +4269,7 @@ XXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_h
}
}
-XXH_FORCE_INLINE XXH64_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(input != NULL);
@@ -3481,7 +4285,7 @@ XXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_h
}
}
-XXH_FORCE_INLINE XXH64_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(input != NULL);
@@ -3498,7 +4302,7 @@ XXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
}
}
-XXH_FORCE_INLINE XXH64_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(len <= 16);
@@ -3568,7 +4372,7 @@ XXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input,
}
/* For mid range keys, XXH3 uses a Mum-hash variant. */
-XXH_FORCE_INLINE XXH64_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
XXH64_hash_t seed)
@@ -3577,6 +4381,14 @@ XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
XXH_ASSERT(16 < len && len <= 128);
{ xxh_u64 acc = len * XXH_PRIME64_1;
+#if XXH_SIZE_OPT >= 1
+ /* Smaller and cleaner, but slightly slower. */
+ unsigned int i = (unsigned int)(len - 1) / 32;
+ do {
+ acc += XXH3_mix16B(input+16 * i, secret+32*i, seed);
+ acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed);
+ } while (i-- != 0);
+#else
if (len > 32) {
if (len > 64) {
if (len > 96) {
@@ -3591,14 +4403,14 @@ XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
}
acc += XXH3_mix16B(input+0, secret+0, seed);
acc += XXH3_mix16B(input+len-16, secret+16, seed);
-
+#endif
return XXH3_avalanche(acc);
}
}
#define XXH3_MIDSIZE_MAX 240
-XXH_NO_INLINE XXH64_hash_t
+XXH_NO_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
XXH64_hash_t seed)
@@ -3610,13 +4422,17 @@ XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
#define XXH3_MIDSIZE_LASTOFFSET 17
{ xxh_u64 acc = len * XXH_PRIME64_1;
- int const nbRounds = (int)len / 16;
- int i;
+ xxh_u64 acc_end;
+ unsigned int const nbRounds = (unsigned int)len / 16;
+ unsigned int i;
+ XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);
for (i=0; i<8; i++) {
acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed);
}
- acc = XXH3_avalanche(acc);
+ /* last bytes */
+ acc_end = XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed);
XXH_ASSERT(nbRounds >= 8);
+ acc = XXH3_avalanche(acc);
#if defined(__clang__) /* Clang */ \
&& (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \
&& !defined(XXH_ENABLE_AUTOVECTORIZE) /* Define to disable */
@@ -3643,11 +4459,13 @@ XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
#pragma clang loop vectorize(disable)
#endif
for (i=8 ; i < nbRounds; i++) {
- acc += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed);
+ /*
+ * Prevents clang for unrolling the acc loop and interleaving with this one.
+ */
+ XXH_COMPILER_GUARD(acc);
+ acc_end += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed);
}
- /* last bytes */
- acc += XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed);
- return XXH3_avalanche(acc);
+ return XXH3_avalanche(acc + acc_end);
}
}
@@ -3663,6 +4481,47 @@ XXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
# define ACC_NB XXH_ACC_NB
#endif
+#ifndef XXH_PREFETCH_DIST
+# ifdef __clang__
+# define XXH_PREFETCH_DIST 320
+# else
+# if (XXH_VECTOR == XXH_AVX512)
+# define XXH_PREFETCH_DIST 512
+# else
+# define XXH_PREFETCH_DIST 384
+# endif
+# endif /* __clang__ */
+#endif /* XXH_PREFETCH_DIST */
+
+/*
+ * These macros are to generate an XXH3_accumulate() function.
+ * The two arguments select the name suffix and target attribute.
+ *
+ * The name of this symbol is XXH3_accumulate_<name>() and it calls
+ * XXH3_accumulate_512_<name>().
+ *
+ * It may be useful to hand implement this function if the compiler fails to
+ * optimize the inline function.
+ */
+#define XXH3_ACCUMULATE_TEMPLATE(name) \
+void \
+XXH3_accumulate_##name(xxh_u64* XXH_RESTRICT acc, \
+ const xxh_u8* XXH_RESTRICT input, \
+ const xxh_u8* XXH_RESTRICT secret, \
+ size_t nbStripes) \
+{ \
+ size_t n; \
+ for (n = 0; n < nbStripes; n++ ) { \
+ const xxh_u8* const in = input + n*XXH_STRIPE_LEN; \
+ XXH_PREFETCH(in + XXH_PREFETCH_DIST); \
+ XXH3_accumulate_512_##name( \
+ acc, \
+ in, \
+ secret + n*XXH_SECRET_CONSUME_RATE); \
+ } \
+}
+
+
XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64)
{
if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64);
@@ -3683,6 +4542,7 @@ XXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64)
typedef long long xxh_i64;
#endif
+
/*
* XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized.
*
@@ -3730,7 +4590,7 @@ XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc,
/* data_key = data_vec ^ key_vec; */
__m512i const data_key = _mm512_xor_si512 (data_vec, key_vec);
/* data_key_lo = data_key >> 32; */
- __m512i const data_key_lo = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1));
+ __m512i const data_key_lo = _mm512_srli_epi64 (data_key, 32);
/* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */
__m512i const product = _mm512_mul_epu32 (data_key, data_key_lo);
/* xacc[0] += swap(data_vec); */
@@ -3740,6 +4600,7 @@ XXH3_accumulate_512_avx512(void* XXH_RESTRICT acc,
*xacc = _mm512_add_epi64(product, sum);
}
}
+XXH_FORCE_INLINE XXH_TARGET_AVX512 XXH3_ACCUMULATE_TEMPLATE(avx512)
/*
* XXH3_scrambleAcc: Scrambles the accumulators to improve mixing.
@@ -3773,13 +4634,12 @@ XXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
/* xacc[0] ^= (xacc[0] >> 47) */
__m512i const acc_vec = *xacc;
__m512i const shifted = _mm512_srli_epi64 (acc_vec, 47);
- __m512i const data_vec = _mm512_xor_si512 (acc_vec, shifted);
/* xacc[0] ^= secret; */
__m512i const key_vec = _mm512_loadu_si512 (secret);
- __m512i const data_key = _mm512_xor_si512 (data_vec, key_vec);
+ __m512i const data_key = _mm512_ternarylogic_epi32(key_vec, acc_vec, shifted, 0x96 /* key_vec ^ acc_vec ^ shifted */);
/* xacc[0] *= XXH_PRIME32_1; */
- __m512i const data_key_hi = _mm512_shuffle_epi32 (data_key, (_MM_PERM_ENUM)_MM_SHUFFLE(0, 3, 0, 1));
+ __m512i const data_key_hi = _mm512_srli_epi64 (data_key, 32);
__m512i const prod_lo = _mm512_mul_epu32 (data_key, prime32);
__m512i const prod_hi = _mm512_mul_epu32 (data_key_hi, prime32);
*xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32));
@@ -3794,7 +4654,8 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
XXH_ASSERT(((size_t)customSecret & 63) == 0);
(void)(&XXH_writeLE64);
{ int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i);
- __m512i const seed = _mm512_mask_set1_epi64(_mm512_set1_epi64((xxh_i64)seed64), 0xAA, (xxh_i64)(0U - seed64));
+ __m512i const seed_pos = _mm512_set1_epi64((xxh_i64)seed64);
+ __m512i const seed = _mm512_mask_sub_epi64(seed_pos, 0xAA, _mm512_set1_epi8(0), seed_pos);
const __m512i* const src = (const __m512i*) ((const void*) XXH3_kSecret);
__m512i* const dest = ( __m512i*) customSecret;
@@ -3802,14 +4663,7 @@ XXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */
XXH_ASSERT(((size_t)dest & 63) == 0);
for (i=0; i < nbRounds; ++i) {
- /* GCC has a bug, _mm512_stream_load_si512 accepts 'void*', not 'void const*',
- * this will warn "discards 'const' qualifier". */
- union {
- const __m512i* cp;
- void* p;
- } remote_const_void;
- remote_const_void.cp = src + i;
- dest[i] = _mm512_add_epi64(_mm512_stream_load_si512(remote_const_void.p), seed);
+ dest[i] = _mm512_add_epi64(_mm512_load_si512(src + i), seed);
} }
}
@@ -3845,7 +4699,7 @@ XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc,
/* data_key = data_vec ^ key_vec; */
__m256i const data_key = _mm256_xor_si256 (data_vec, key_vec);
/* data_key_lo = data_key >> 32; */
- __m256i const data_key_lo = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ __m256i const data_key_lo = _mm256_srli_epi64 (data_key, 32);
/* product = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */
__m256i const product = _mm256_mul_epu32 (data_key, data_key_lo);
/* xacc[i] += swap(data_vec); */
@@ -3855,6 +4709,7 @@ XXH3_accumulate_512_avx2( void* XXH_RESTRICT acc,
xacc[i] = _mm256_add_epi64(product, sum);
} }
}
+XXH_FORCE_INLINE XXH_TARGET_AVX2 XXH3_ACCUMULATE_TEMPLATE(avx2)
XXH_FORCE_INLINE XXH_TARGET_AVX2 void
XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
@@ -3877,7 +4732,7 @@ XXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
__m256i const data_key = _mm256_xor_si256 (data_vec, key_vec);
/* xacc[i] *= XXH_PRIME32_1; */
- __m256i const data_key_hi = _mm256_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));
+ __m256i const data_key_hi = _mm256_srli_epi64 (data_key, 32);
__m256i const prod_lo = _mm256_mul_epu32 (data_key, prime32);
__m256i const prod_hi = _mm256_mul_epu32 (data_key_hi, prime32);
xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32));
@@ -3909,12 +4764,12 @@ XXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTR
XXH_ASSERT(((size_t)dest & 31) == 0);
/* GCC -O2 need unroll loop manually */
- dest[0] = _mm256_add_epi64(_mm256_stream_load_si256(src+0), seed);
- dest[1] = _mm256_add_epi64(_mm256_stream_load_si256(src+1), seed);
- dest[2] = _mm256_add_epi64(_mm256_stream_load_si256(src+2), seed);
- dest[3] = _mm256_add_epi64(_mm256_stream_load_si256(src+3), seed);
- dest[4] = _mm256_add_epi64(_mm256_stream_load_si256(src+4), seed);
- dest[5] = _mm256_add_epi64(_mm256_stream_load_si256(src+5), seed);
+ dest[0] = _mm256_add_epi64(_mm256_load_si256(src+0), seed);
+ dest[1] = _mm256_add_epi64(_mm256_load_si256(src+1), seed);
+ dest[2] = _mm256_add_epi64(_mm256_load_si256(src+2), seed);
+ dest[3] = _mm256_add_epi64(_mm256_load_si256(src+3), seed);
+ dest[4] = _mm256_add_epi64(_mm256_load_si256(src+4), seed);
+ dest[5] = _mm256_add_epi64(_mm256_load_si256(src+5), seed);
}
}
@@ -3961,6 +4816,7 @@ XXH3_accumulate_512_sse2( void* XXH_RESTRICT acc,
xacc[i] = _mm_add_epi64(product, sum);
} }
}
+XXH_FORCE_INLINE XXH_TARGET_SSE2 XXH3_ACCUMULATE_TEMPLATE(sse2)
XXH_FORCE_INLINE XXH_TARGET_SSE2 void
XXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
@@ -4028,96 +4884,222 @@ XXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTR
#if (XXH_VECTOR == XXH_NEON)
+/* forward declarations for the scalar routines */
+XXH_FORCE_INLINE void
+XXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input,
+ void const* XXH_RESTRICT secret, size_t lane);
+
+XXH_FORCE_INLINE void
+XXH3_scalarScrambleRound(void* XXH_RESTRICT acc,
+ void const* XXH_RESTRICT secret, size_t lane);
+
+/*!
+ * @internal
+ * @brief The bulk processing loop for NEON and WASM SIMD128.
+ *
+ * The NEON code path is actually partially scalar when running on AArch64. This
+ * is to optimize the pipelining and can have up to 15% speedup depending on the
+ * CPU, and it also mitigates some GCC codegen issues.
+ *
+ * @see XXH3_NEON_LANES for configuring this and details about this optimization.
+ *
+ * NEON's 32-bit to 64-bit long multiply takes a half vector of 32-bit
+ * integers instead of the other platforms which mask full 64-bit vectors,
+ * so the setup is more complicated than just shifting right.
+ *
+ * Additionally, there is an optimization for 4 lanes at once noted below.
+ *
+ * Since, as stated, the most optimal amount of lanes for Cortexes is 6,
+ * there needs to be *three* versions of the accumulate operation used
+ * for the remaining 2 lanes.
+ *
+ * WASM's SIMD128 uses SIMDe's arm_neon.h polyfill because the intrinsics overlap
+ * nearly perfectly.
+ */
+
XXH_FORCE_INLINE void
XXH3_accumulate_512_neon( void* XXH_RESTRICT acc,
const void* XXH_RESTRICT input,
const void* XXH_RESTRICT secret)
{
XXH_ASSERT((((size_t)acc) & 15) == 0);
- {
- uint64x2_t* const xacc = (uint64x2_t *) acc;
+ XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0);
+ { /* GCC for darwin arm64 does not like aliasing here */
+ xxh_aliasing_uint64x2_t* const xacc = (xxh_aliasing_uint64x2_t*) acc;
/* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */
- uint8_t const* const xinput = (const uint8_t *) input;
- uint8_t const* const xsecret = (const uint8_t *) secret;
+ uint8_t const* xinput = (const uint8_t *) input;
+ uint8_t const* xsecret = (const uint8_t *) secret;
size_t i;
- for (i=0; i < XXH_STRIPE_LEN / sizeof(uint64x2_t); i++) {
+#ifdef __wasm_simd128__
+ /*
+ * On WASM SIMD128, Clang emits direct address loads when XXH3_kSecret
+ * is constant propagated, which results in it converting it to this
+ * inside the loop:
+ *
+ * a = v128.load(XXH3_kSecret + 0 + $secret_offset, offset = 0)
+ * b = v128.load(XXH3_kSecret + 16 + $secret_offset, offset = 0)
+ * ...
+ *
+ * This requires a full 32-bit address immediate (and therefore a 6 byte
+ * instruction) as well as an add for each offset.
+ *
+ * Putting an asm guard prevents it from folding (at the cost of losing
+ * the alignment hint), and uses the free offset in `v128.load` instead
+ * of adding secret_offset each time which overall reduces code size by
+ * about a kilobyte and improves performance.
+ */
+ XXH_COMPILER_GUARD(xsecret);
+#endif
+ /* Scalar lanes use the normal scalarRound routine */
+ for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {
+ XXH3_scalarRound(acc, input, secret, i);
+ }
+ i = 0;
+ /* 4 NEON lanes at a time. */
+ for (; i+1 < XXH3_NEON_LANES / 2; i+=2) {
/* data_vec = xinput[i]; */
- uint8x16_t data_vec = vld1q_u8(xinput + (i * 16));
+ uint64x2_t data_vec_1 = XXH_vld1q_u64(xinput + (i * 16));
+ uint64x2_t data_vec_2 = XXH_vld1q_u64(xinput + ((i+1) * 16));
/* key_vec = xsecret[i]; */
- uint8x16_t key_vec = vld1q_u8(xsecret + (i * 16));
- uint64x2_t data_key;
- uint32x2_t data_key_lo, data_key_hi;
- /* xacc[i] += swap(data_vec); */
- uint64x2_t const data64 = vreinterpretq_u64_u8(data_vec);
- uint64x2_t const swapped = vextq_u64(data64, data64, 1);
- xacc[i] = vaddq_u64 (xacc[i], swapped);
+ uint64x2_t key_vec_1 = XXH_vld1q_u64(xsecret + (i * 16));
+ uint64x2_t key_vec_2 = XXH_vld1q_u64(xsecret + ((i+1) * 16));
+ /* data_swap = swap(data_vec) */
+ uint64x2_t data_swap_1 = vextq_u64(data_vec_1, data_vec_1, 1);
+ uint64x2_t data_swap_2 = vextq_u64(data_vec_2, data_vec_2, 1);
/* data_key = data_vec ^ key_vec; */
- data_key = vreinterpretq_u64_u8(veorq_u8(data_vec, key_vec));
- /* data_key_lo = (uint32x2_t) (data_key & 0xFFFFFFFF);
- * data_key_hi = (uint32x2_t) (data_key >> 32);
- * data_key = UNDEFINED; */
- XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi);
- /* xacc[i] += (uint64x2_t) data_key_lo * (uint64x2_t) data_key_hi; */
- xacc[i] = vmlal_u32 (xacc[i], data_key_lo, data_key_hi);
+ uint64x2_t data_key_1 = veorq_u64(data_vec_1, key_vec_1);
+ uint64x2_t data_key_2 = veorq_u64(data_vec_2, key_vec_2);
+ /*
+ * If we reinterpret the 64x2 vectors as 32x4 vectors, we can use a
+ * de-interleave operation for 4 lanes in 1 step with `vuzpq_u32` to
+ * get one vector with the low 32 bits of each lane, and one vector
+ * with the high 32 bits of each lane.
+ *
+ * The intrinsic returns a double vector because the original ARMv7-a
+ * instruction modified both arguments in place. AArch64 and SIMD128 emit
+ * two instructions from this intrinsic.
+ *
+ * [ dk11L | dk11H | dk12L | dk12H ] -> [ dk11L | dk12L | dk21L | dk22L ]
+ * [ dk21L | dk21H | dk22L | dk22H ] -> [ dk11H | dk12H | dk21H | dk22H ]
+ */
+ uint32x4x2_t unzipped = vuzpq_u32(
+ vreinterpretq_u32_u64(data_key_1),
+ vreinterpretq_u32_u64(data_key_2)
+ );
+ /* data_key_lo = data_key & 0xFFFFFFFF */
+ uint32x4_t data_key_lo = unzipped.val[0];
+ /* data_key_hi = data_key >> 32 */
+ uint32x4_t data_key_hi = unzipped.val[1];
+ /*
+ * Then, we can split the vectors horizontally and multiply which, as for most
+ * widening intrinsics, have a variant that works on both high half vectors
+ * for free on AArch64. A similar instruction is available on SIMD128.
+ *
+ * sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi
+ */
+ uint64x2_t sum_1 = XXH_vmlal_low_u32(data_swap_1, data_key_lo, data_key_hi);
+ uint64x2_t sum_2 = XXH_vmlal_high_u32(data_swap_2, data_key_lo, data_key_hi);
+ /*
+ * Clang reorders
+ * a += b * c; // umlal swap.2d, dkl.2s, dkh.2s
+ * c += a; // add acc.2d, acc.2d, swap.2d
+ * to
+ * c += a; // add acc.2d, acc.2d, swap.2d
+ * c += b * c; // umlal acc.2d, dkl.2s, dkh.2s
+ *
+ * While it would make sense in theory since the addition is faster,
+ * for reasons likely related to umlal being limited to certain NEON
+ * pipelines, this is worse. A compiler guard fixes this.
+ */
+ XXH_COMPILER_GUARD_CLANG_NEON(sum_1);
+ XXH_COMPILER_GUARD_CLANG_NEON(sum_2);
+ /* xacc[i] = acc_vec + sum; */
+ xacc[i] = vaddq_u64(xacc[i], sum_1);
+ xacc[i+1] = vaddq_u64(xacc[i+1], sum_2);
+ }
+ /* Operate on the remaining NEON lanes 2 at a time. */
+ for (; i < XXH3_NEON_LANES / 2; i++) {
+ /* data_vec = xinput[i]; */
+ uint64x2_t data_vec = XXH_vld1q_u64(xinput + (i * 16));
+ /* key_vec = xsecret[i]; */
+ uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16));
+ /* acc_vec_2 = swap(data_vec) */
+ uint64x2_t data_swap = vextq_u64(data_vec, data_vec, 1);
+ /* data_key = data_vec ^ key_vec; */
+ uint64x2_t data_key = veorq_u64(data_vec, key_vec);
+ /* For two lanes, just use VMOVN and VSHRN. */
+ /* data_key_lo = data_key & 0xFFFFFFFF; */
+ uint32x2_t data_key_lo = vmovn_u64(data_key);
+ /* data_key_hi = data_key >> 32; */
+ uint32x2_t data_key_hi = vshrn_n_u64(data_key, 32);
+ /* sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi; */
+ uint64x2_t sum = vmlal_u32(data_swap, data_key_lo, data_key_hi);
+ /* Same Clang workaround as before */
+ XXH_COMPILER_GUARD_CLANG_NEON(sum);
+ /* xacc[i] = acc_vec + sum; */
+ xacc[i] = vaddq_u64 (xacc[i], sum);
}
}
}
+XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(neon)
XXH_FORCE_INLINE void
XXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
{
XXH_ASSERT((((size_t)acc) & 15) == 0);
- { uint64x2_t* xacc = (uint64x2_t*) acc;
+ { xxh_aliasing_uint64x2_t* xacc = (xxh_aliasing_uint64x2_t*) acc;
uint8_t const* xsecret = (uint8_t const*) secret;
- uint32x2_t prime = vdup_n_u32 (XXH_PRIME32_1);
size_t i;
- for (i=0; i < XXH_STRIPE_LEN/sizeof(uint64x2_t); i++) {
+ /* WASM uses operator overloads and doesn't need these. */
+#ifndef __wasm_simd128__
+ /* { prime32_1, prime32_1 } */
+ uint32x2_t const kPrimeLo = vdup_n_u32(XXH_PRIME32_1);
+ /* { 0, prime32_1, 0, prime32_1 } */
+ uint32x4_t const kPrimeHi = vreinterpretq_u32_u64(vdupq_n_u64((xxh_u64)XXH_PRIME32_1 << 32));
+#endif
+
+ /* AArch64 uses both scalar and neon at the same time */
+ for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {
+ XXH3_scalarScrambleRound(acc, secret, i);
+ }
+ for (i=0; i < XXH3_NEON_LANES / 2; i++) {
/* xacc[i] ^= (xacc[i] >> 47); */
uint64x2_t acc_vec = xacc[i];
- uint64x2_t shifted = vshrq_n_u64 (acc_vec, 47);
- uint64x2_t data_vec = veorq_u64 (acc_vec, shifted);
+ uint64x2_t shifted = vshrq_n_u64(acc_vec, 47);
+ uint64x2_t data_vec = veorq_u64(acc_vec, shifted);
/* xacc[i] ^= xsecret[i]; */
- uint8x16_t key_vec = vld1q_u8 (xsecret + (i * 16));
- uint64x2_t data_key = veorq_u64 (data_vec, vreinterpretq_u64_u8(key_vec));
-
+ uint64x2_t key_vec = XXH_vld1q_u64(xsecret + (i * 16));
+ uint64x2_t data_key = veorq_u64(data_vec, key_vec);
/* xacc[i] *= XXH_PRIME32_1 */
- uint32x2_t data_key_lo, data_key_hi;
- /* data_key_lo = (uint32x2_t) (xacc[i] & 0xFFFFFFFF);
- * data_key_hi = (uint32x2_t) (xacc[i] >> 32);
- * xacc[i] = UNDEFINED; */
- XXH_SPLIT_IN_PLACE(data_key, data_key_lo, data_key_hi);
- { /*
- * prod_hi = (data_key >> 32) * XXH_PRIME32_1;
- *
- * Avoid vmul_u32 + vshll_n_u32 since Clang 6 and 7 will
- * incorrectly "optimize" this:
- * tmp = vmul_u32(vmovn_u64(a), vmovn_u64(b));
- * shifted = vshll_n_u32(tmp, 32);
- * to this:
- * tmp = "vmulq_u64"(a, b); // no such thing!
- * shifted = vshlq_n_u64(tmp, 32);
- *
- * However, unlike SSE, Clang lacks a 64-bit multiply routine
- * for NEON, and it scalarizes two 64-bit multiplies instead.
- *
- * vmull_u32 has the same timing as vmul_u32, and it avoids
- * this bug completely.
- * See https://bugs.llvm.org/show_bug.cgi?id=39967
- */
- uint64x2_t prod_hi = vmull_u32 (data_key_hi, prime);
- /* xacc[i] = prod_hi << 32; */
- xacc[i] = vshlq_n_u64(prod_hi, 32);
- /* xacc[i] += (prod_hi & 0xFFFFFFFF) * XXH_PRIME32_1; */
- xacc[i] = vmlal_u32(xacc[i], data_key_lo, prime);
- }
- } }
+#ifdef __wasm_simd128__
+ /* SIMD128 has multiply by u64x2, use it instead of expanding and scalarizing */
+ xacc[i] = data_key * XXH_PRIME32_1;
+#else
+ /*
+ * Expanded version with portable NEON intrinsics
+ *
+ * lo(x) * lo(y) + (hi(x) * lo(y) << 32)
+ *
+ * prod_hi = hi(data_key) * lo(prime) << 32
+ *
+ * Since we only need 32 bits of this multiply a trick can be used, reinterpreting the vector
+ * as a uint32x4_t and multiplying by { 0, prime, 0, prime } to cancel out the unwanted bits
+ * and avoid the shift.
+ */
+ uint32x4_t prod_hi = vmulq_u32 (vreinterpretq_u32_u64(data_key), kPrimeHi);
+ /* Extract low bits for vmlal_u32 */
+ uint32x2_t data_key_lo = vmovn_u64(data_key);
+ /* xacc[i] = prod_hi + lo(data_key) * XXH_PRIME32_1; */
+ xacc[i] = vmlal_u32(vreinterpretq_u64_u32(prod_hi), data_key_lo, kPrimeLo);
+#endif
+ }
+ }
}
-
#endif
#if (XXH_VECTOR == XXH_VSX)
@@ -4128,23 +5110,23 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc,
const void* XXH_RESTRICT secret)
{
/* presumed aligned */
- unsigned long long* const xacc = (unsigned long long*) acc;
- xxh_u64x2 const* const xinput = (xxh_u64x2 const*) input; /* no alignment restriction */
- xxh_u64x2 const* const xsecret = (xxh_u64x2 const*) secret; /* no alignment restriction */
+ xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc;
+ xxh_u8 const* const xinput = (xxh_u8 const*) input; /* no alignment restriction */
+ xxh_u8 const* const xsecret = (xxh_u8 const*) secret; /* no alignment restriction */
xxh_u64x2 const v32 = { 32, 32 };
size_t i;
for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) {
/* data_vec = xinput[i]; */
- xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + i);
+ xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + 16*i);
/* key_vec = xsecret[i]; */
- xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i);
+ xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i);
xxh_u64x2 const data_key = data_vec ^ key_vec;
/* shuffled = (data_key << 32) | (data_key >> 32); */
xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32);
/* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */
xxh_u64x2 const product = XXH_vec_mulo((xxh_u32x4)data_key, shuffled);
/* acc_vec = xacc[i]; */
- xxh_u64x2 acc_vec = vec_xl(0, xacc + 2 * i);
+ xxh_u64x2 acc_vec = xacc[i];
acc_vec += product;
/* swap high and low halves */
@@ -4153,18 +5135,18 @@ XXH3_accumulate_512_vsx( void* XXH_RESTRICT acc,
#else
acc_vec += vec_xxpermdi(data_vec, data_vec, 2);
#endif
- /* xacc[i] = acc_vec; */
- vec_xst(acc_vec, 0, xacc + 2 * i);
+ xacc[i] = acc_vec;
}
}
+XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(vsx)
XXH_FORCE_INLINE void
XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
{
XXH_ASSERT((((size_t)acc) & 15) == 0);
- { xxh_u64x2* const xacc = (xxh_u64x2*) acc;
- const xxh_u64x2* const xsecret = (const xxh_u64x2*) secret;
+ { xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc;
+ const xxh_u8* const xsecret = (const xxh_u8*) secret;
/* constants */
xxh_u64x2 const v32 = { 32, 32 };
xxh_u64x2 const v47 = { 47, 47 };
@@ -4176,7 +5158,7 @@ XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47);
/* xacc[i] ^= xsecret[i]; */
- xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + i);
+ xxh_u64x2 const key_vec = XXH_vec_loadu(xsecret + 16*i);
xxh_u64x2 const data_key = data_vec ^ key_vec;
/* xacc[i] *= XXH_PRIME32_1 */
@@ -4190,40 +5172,233 @@ XXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
#endif
+#if (XXH_VECTOR == XXH_SVE)
+
+XXH_FORCE_INLINE void
+XXH3_accumulate_512_sve( void* XXH_RESTRICT acc,
+ const void* XXH_RESTRICT input,
+ const void* XXH_RESTRICT secret)
+{
+ uint64_t *xacc = (uint64_t *)acc;
+ const uint64_t *xinput = (const uint64_t *)(const void *)input;
+ const uint64_t *xsecret = (const uint64_t *)(const void *)secret;
+ svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1);
+ uint64_t element_count = svcntd();
+ if (element_count >= 8) {
+ svbool_t mask = svptrue_pat_b64(SV_VL8);
+ svuint64_t vacc = svld1_u64(mask, xacc);
+ ACCRND(vacc, 0);
+ svst1_u64(mask, xacc, vacc);
+ } else if (element_count == 2) { /* sve128 */
+ svbool_t mask = svptrue_pat_b64(SV_VL2);
+ svuint64_t acc0 = svld1_u64(mask, xacc + 0);
+ svuint64_t acc1 = svld1_u64(mask, xacc + 2);
+ svuint64_t acc2 = svld1_u64(mask, xacc + 4);
+ svuint64_t acc3 = svld1_u64(mask, xacc + 6);
+ ACCRND(acc0, 0);
+ ACCRND(acc1, 2);
+ ACCRND(acc2, 4);
+ ACCRND(acc3, 6);
+ svst1_u64(mask, xacc + 0, acc0);
+ svst1_u64(mask, xacc + 2, acc1);
+ svst1_u64(mask, xacc + 4, acc2);
+ svst1_u64(mask, xacc + 6, acc3);
+ } else {
+ svbool_t mask = svptrue_pat_b64(SV_VL4);
+ svuint64_t acc0 = svld1_u64(mask, xacc + 0);
+ svuint64_t acc1 = svld1_u64(mask, xacc + 4);
+ ACCRND(acc0, 0);
+ ACCRND(acc1, 4);
+ svst1_u64(mask, xacc + 0, acc0);
+ svst1_u64(mask, xacc + 4, acc1);
+ }
+}
+
+XXH_FORCE_INLINE void
+XXH3_accumulate_sve(xxh_u64* XXH_RESTRICT acc,
+ const xxh_u8* XXH_RESTRICT input,
+ const xxh_u8* XXH_RESTRICT secret,
+ size_t nbStripes)
+{
+ if (nbStripes != 0) {
+ uint64_t *xacc = (uint64_t *)acc;
+ const uint64_t *xinput = (const uint64_t *)(const void *)input;
+ const uint64_t *xsecret = (const uint64_t *)(const void *)secret;
+ svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1);
+ uint64_t element_count = svcntd();
+ if (element_count >= 8) {
+ svbool_t mask = svptrue_pat_b64(SV_VL8);
+ svuint64_t vacc = svld1_u64(mask, xacc + 0);
+ do {
+ /* svprfd(svbool_t, void *, enum svfprop); */
+ svprfd(mask, xinput + 128, SV_PLDL1STRM);
+ ACCRND(vacc, 0);
+ xinput += 8;
+ xsecret += 1;
+ nbStripes--;
+ } while (nbStripes != 0);
+
+ svst1_u64(mask, xacc + 0, vacc);
+ } else if (element_count == 2) { /* sve128 */
+ svbool_t mask = svptrue_pat_b64(SV_VL2);
+ svuint64_t acc0 = svld1_u64(mask, xacc + 0);
+ svuint64_t acc1 = svld1_u64(mask, xacc + 2);
+ svuint64_t acc2 = svld1_u64(mask, xacc + 4);
+ svuint64_t acc3 = svld1_u64(mask, xacc + 6);
+ do {
+ svprfd(mask, xinput + 128, SV_PLDL1STRM);
+ ACCRND(acc0, 0);
+ ACCRND(acc1, 2);
+ ACCRND(acc2, 4);
+ ACCRND(acc3, 6);
+ xinput += 8;
+ xsecret += 1;
+ nbStripes--;
+ } while (nbStripes != 0);
+
+ svst1_u64(mask, xacc + 0, acc0);
+ svst1_u64(mask, xacc + 2, acc1);
+ svst1_u64(mask, xacc + 4, acc2);
+ svst1_u64(mask, xacc + 6, acc3);
+ } else {
+ svbool_t mask = svptrue_pat_b64(SV_VL4);
+ svuint64_t acc0 = svld1_u64(mask, xacc + 0);
+ svuint64_t acc1 = svld1_u64(mask, xacc + 4);
+ do {
+ svprfd(mask, xinput + 128, SV_PLDL1STRM);
+ ACCRND(acc0, 0);
+ ACCRND(acc1, 4);
+ xinput += 8;
+ xsecret += 1;
+ nbStripes--;
+ } while (nbStripes != 0);
+
+ svst1_u64(mask, xacc + 0, acc0);
+ svst1_u64(mask, xacc + 4, acc1);
+ }
+ }
+}
+
+#endif
+
/* scalar variants - universal */
+#if defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__))
+/*
+ * In XXH3_scalarRound(), GCC and Clang have a similar codegen issue, where they
+ * emit an excess mask and a full 64-bit multiply-add (MADD X-form).
+ *
+ * While this might not seem like much, as AArch64 is a 64-bit architecture, only
+ * big Cortex designs have a full 64-bit multiplier.
+ *
+ * On the little cores, the smaller 32-bit multiplier is used, and full 64-bit
+ * multiplies expand to 2-3 multiplies in microcode. This has a major penalty
+ * of up to 4 latency cycles and 2 stall cycles in the multiply pipeline.
+ *
+ * Thankfully, AArch64 still provides the 32-bit long multiply-add (UMADDL) which does
+ * not have this penalty and does the mask automatically.
+ */
+XXH_FORCE_INLINE xxh_u64
+XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc)
+{
+ xxh_u64 ret;
+ /* note: %x = 64-bit register, %w = 32-bit register */
+ __asm__("umaddl %x0, %w1, %w2, %x3" : "=r" (ret) : "r" (lhs), "r" (rhs), "r" (acc));
+ return ret;
+}
+#else
+XXH_FORCE_INLINE xxh_u64
+XXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc)
+{
+ return XXH_mult32to64((xxh_u32)lhs, (xxh_u32)rhs) + acc;
+}
+#endif
+
+/*!
+ * @internal
+ * @brief Scalar round for @ref XXH3_accumulate_512_scalar().
+ *
+ * This is extracted to its own function because the NEON path uses a combination
+ * of NEON and scalar.
+ */
+XXH_FORCE_INLINE void
+XXH3_scalarRound(void* XXH_RESTRICT acc,
+ void const* XXH_RESTRICT input,
+ void const* XXH_RESTRICT secret,
+ size_t lane)
+{
+ xxh_u64* xacc = (xxh_u64*) acc;
+ xxh_u8 const* xinput = (xxh_u8 const*) input;
+ xxh_u8 const* xsecret = (xxh_u8 const*) secret;
+ XXH_ASSERT(lane < XXH_ACC_NB);
+ XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0);
+ {
+ xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8);
+ xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8);
+ xacc[lane ^ 1] += data_val; /* swap adjacent lanes */
+ xacc[lane] = XXH_mult32to64_add64(data_key /* & 0xFFFFFFFF */, data_key >> 32, xacc[lane]);
+ }
+}
+
+/*!
+ * @internal
+ * @brief Processes a 64 byte block of data using the scalar path.
+ */
XXH_FORCE_INLINE void
XXH3_accumulate_512_scalar(void* XXH_RESTRICT acc,
const void* XXH_RESTRICT input,
const void* XXH_RESTRICT secret)
{
- xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */
- const xxh_u8* const xinput = (const xxh_u8*) input; /* no alignment restriction */
- const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */
size_t i;
- XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0);
+ /* ARM GCC refuses to unroll this loop, resulting in a 24% slowdown on ARMv6. */
+#if defined(__GNUC__) && !defined(__clang__) \
+ && (defined(__arm__) || defined(__thumb2__)) \
+ && defined(__ARM_FEATURE_UNALIGNED) /* no unaligned access just wastes bytes */ \
+ && XXH_SIZE_OPT <= 0
+# pragma GCC unroll 8
+#endif
for (i=0; i < XXH_ACC_NB; i++) {
- xxh_u64 const data_val = XXH_readLE64(xinput + 8*i);
- xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + i*8);
- xacc[i ^ 1] += data_val; /* swap adjacent lanes */
- xacc[i] += XXH_mult32to64(data_key & 0xFFFFFFFF, data_key >> 32);
+ XXH3_scalarRound(acc, input, secret, i);
}
}
+XXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(scalar)
+/*!
+ * @internal
+ * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar().
+ *
+ * This is extracted to its own function because the NEON path uses a combination
+ * of NEON and scalar.
+ */
XXH_FORCE_INLINE void
-XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+XXH3_scalarScrambleRound(void* XXH_RESTRICT acc,
+ void const* XXH_RESTRICT secret,
+ size_t lane)
{
xxh_u64* const xacc = (xxh_u64*) acc; /* presumed aligned */
const xxh_u8* const xsecret = (const xxh_u8*) secret; /* no alignment restriction */
- size_t i;
XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0);
- for (i=0; i < XXH_ACC_NB; i++) {
- xxh_u64 const key64 = XXH_readLE64(xsecret + 8*i);
- xxh_u64 acc64 = xacc[i];
+ XXH_ASSERT(lane < XXH_ACC_NB);
+ {
+ xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8);
+ xxh_u64 acc64 = xacc[lane];
acc64 = XXH_xorshift64(acc64, 47);
acc64 ^= key64;
acc64 *= XXH_PRIME32_1;
- xacc[i] = acc64;
+ xacc[lane] = acc64;
+ }
+}
+
+/*!
+ * @internal
+ * @brief Scrambles the accumulators after a large chunk has been read
+ */
+XXH_FORCE_INLINE void
+XXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)
+{
+ size_t i;
+ for (i=0; i < XXH_ACC_NB; i++) {
+ XXH3_scalarScrambleRound(acc, secret, i);
}
}
@@ -4238,15 +5413,16 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
const xxh_u8* kSecretPtr = XXH3_kSecret;
XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0);
-#if defined(__clang__) && defined(__aarch64__)
+#if defined(__GNUC__) && defined(__aarch64__)
/*
* UGLY HACK:
- * Clang generates a bunch of MOV/MOVK pairs for aarch64, and they are
+ * GCC and Clang generate a bunch of MOV/MOVK pairs for aarch64, and they are
* placed sequentially, in order, at the top of the unrolled loop.
*
* While MOVK is great for generating constants (2 cycles for a 64-bit
- * constant compared to 4 cycles for LDR), long MOVK chains stall the
- * integer pipelines:
+ * constant compared to 4 cycles for LDR), it fights for bandwidth with
+ * the arithmetic instructions.
+ *
* I L S
* MOVK
* MOVK
@@ -4255,7 +5431,7 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
* ADD
* SUB STR
* STR
- * By forcing loads from memory (as the asm line causes Clang to assume
+ * By forcing loads from memory (as the asm line causes the compiler to assume
* that XXH3_kSecretPtr has been changed), the pipelines are used more
* efficiently:
* I L S
@@ -4263,23 +5439,20 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
* ADD LDR
* SUB STR
* STR
+ *
+ * See XXH3_NEON_LANES for details on the pipsline.
+ *
* XXH3_64bits_withSeed, len == 256, Snapdragon 835
* without hack: 2654.4 MB/s
* with hack: 3202.9 MB/s
*/
XXH_COMPILER_GUARD(kSecretPtr);
#endif
- /*
- * Note: in debug mode, this overrides the asm optimization
- * and Clang will emit MOVK chains again.
- */
- XXH_ASSERT(kSecretPtr == XXH3_kSecret);
-
{ int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16;
int i;
for (i=0; i < nbRounds; i++) {
/*
- * The asm hack causes Clang to assume that kSecretPtr aliases with
+ * The asm hack causes the compiler to assume that kSecretPtr aliases with
* customSecret, and on aarch64, this prevented LDP from merging two
* loads together for free. Putting the loads together before the stores
* properly generates LDP.
@@ -4292,7 +5465,7 @@ XXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)
}
-typedef void (*XXH3_f_accumulate_512)(void* XXH_RESTRICT, const void*, const void*);
+typedef void (*XXH3_f_accumulate)(xxh_u64* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, size_t);
typedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*);
typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64);
@@ -4300,82 +5473,63 @@ typedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64);
#if (XXH_VECTOR == XXH_AVX512)
#define XXH3_accumulate_512 XXH3_accumulate_512_avx512
+#define XXH3_accumulate XXH3_accumulate_avx512
#define XXH3_scrambleAcc XXH3_scrambleAcc_avx512
#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512
#elif (XXH_VECTOR == XXH_AVX2)
#define XXH3_accumulate_512 XXH3_accumulate_512_avx2
+#define XXH3_accumulate XXH3_accumulate_avx2
#define XXH3_scrambleAcc XXH3_scrambleAcc_avx2
#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2
#elif (XXH_VECTOR == XXH_SSE2)
#define XXH3_accumulate_512 XXH3_accumulate_512_sse2
+#define XXH3_accumulate XXH3_accumulate_sse2
#define XXH3_scrambleAcc XXH3_scrambleAcc_sse2
#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2
#elif (XXH_VECTOR == XXH_NEON)
#define XXH3_accumulate_512 XXH3_accumulate_512_neon
+#define XXH3_accumulate XXH3_accumulate_neon
#define XXH3_scrambleAcc XXH3_scrambleAcc_neon
#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
#elif (XXH_VECTOR == XXH_VSX)
#define XXH3_accumulate_512 XXH3_accumulate_512_vsx
+#define XXH3_accumulate XXH3_accumulate_vsx
#define XXH3_scrambleAcc XXH3_scrambleAcc_vsx
#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+#elif (XXH_VECTOR == XXH_SVE)
+#define XXH3_accumulate_512 XXH3_accumulate_512_sve
+#define XXH3_accumulate XXH3_accumulate_sve
+#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar
+#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+
#else /* scalar */
#define XXH3_accumulate_512 XXH3_accumulate_512_scalar
+#define XXH3_accumulate XXH3_accumulate_scalar
#define XXH3_scrambleAcc XXH3_scrambleAcc_scalar
#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
#endif
-
-
-#ifndef XXH_PREFETCH_DIST
-# ifdef __clang__
-# define XXH_PREFETCH_DIST 320
-# else
-# if (XXH_VECTOR == XXH_AVX512)
-# define XXH_PREFETCH_DIST 512
-# else
-# define XXH_PREFETCH_DIST 384
-# endif
-# endif /* __clang__ */
-#endif /* XXH_PREFETCH_DIST */
-
-/*
- * XXH3_accumulate()
- * Loops over XXH3_accumulate_512().
- * Assumption: nbStripes will not overflow the secret size
- */
-XXH_FORCE_INLINE void
-XXH3_accumulate( xxh_u64* XXH_RESTRICT acc,
- const xxh_u8* XXH_RESTRICT input,
- const xxh_u8* XXH_RESTRICT secret,
- size_t nbStripes,
- XXH3_f_accumulate_512 f_acc512)
-{
- size_t n;
- for (n = 0; n < nbStripes; n++ ) {
- const xxh_u8* const in = input + n*XXH_STRIPE_LEN;
- XXH_PREFETCH(in + XXH_PREFETCH_DIST);
- f_acc512(acc,
- in,
- secret + n*XXH_SECRET_CONSUME_RATE);
- }
-}
+#if XXH_SIZE_OPT >= 1 /* don't do SIMD for initialization */
+# undef XXH3_initCustomSecret
+# define XXH3_initCustomSecret XXH3_initCustomSecret_scalar
+#endif
XXH_FORCE_INLINE void
XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc,
const xxh_u8* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble)
{
size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE;
@@ -4387,7 +5541,7 @@ XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc,
XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);
for (n = 0; n < nb_blocks; n++) {
- XXH3_accumulate(acc, input + n*block_len, secret, nbStripesPerBlock, f_acc512);
+ f_acc(acc, input + n*block_len, secret, nbStripesPerBlock);
f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN);
}
@@ -4395,12 +5549,12 @@ XXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc,
XXH_ASSERT(len > XXH_STRIPE_LEN);
{ size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN;
XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE));
- XXH3_accumulate(acc, input + nb_blocks*block_len, secret, nbStripes, f_acc512);
+ f_acc(acc, input + nb_blocks*block_len, secret, nbStripes);
/* last stripe */
{ const xxh_u8* const p = input + len - XXH_STRIPE_LEN;
#define XXH_SECRET_LASTACC_START 7 /* not aligned on 8, last secret is different from acc & scrambler */
- f_acc512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START);
+ XXH3_accumulate_512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START);
} }
}
@@ -4445,12 +5599,12 @@ XXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secre
XXH_FORCE_INLINE XXH64_hash_t
XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len,
const void* XXH_RESTRICT secret, size_t secretSize,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble)
{
XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;
- XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc512, f_scramble);
+ XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc, f_scramble);
/* converge into final hash */
XXH_STATIC_ASSERT(sizeof(acc) == 64);
@@ -4464,13 +5618,15 @@ XXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len,
* It's important for performance to transmit secret's size (when it's static)
* so that the compiler can properly optimize the vectorized loop.
* This makes a big performance difference for "medium" keys (<1 KB) when using AVX instruction set.
+ * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE
+ * breaks -Og, this is XXH_NO_INLINE.
*/
-XXH_FORCE_INLINE XXH64_hash_t
+XXH3_WITH_SECRET_INLINE XXH64_hash_t
XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len,
XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)
{
(void)seed64;
- return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate_512, XXH3_scrambleAcc);
+ return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate, XXH3_scrambleAcc);
}
/*
@@ -4479,12 +5635,12 @@ XXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len,
* Note that inside this no_inline function, we do inline the internal loop,
* and provide a statically defined secret size to allow optimization of vector loop.
*/
-XXH_NO_INLINE XXH64_hash_t
+XXH_NO_INLINE XXH_PUREF XXH64_hash_t
XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len,
XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)
{
(void)seed64; (void)secret; (void)secretLen;
- return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate_512, XXH3_scrambleAcc);
+ return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate, XXH3_scrambleAcc);
}
/*
@@ -4501,18 +5657,20 @@ XXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len,
XXH_FORCE_INLINE XXH64_hash_t
XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len,
XXH64_hash_t seed,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble,
XXH3_f_initCustomSecret f_initSec)
{
+#if XXH_SIZE_OPT <= 0
if (seed == 0)
return XXH3_hashLong_64b_internal(input, len,
XXH3_kSecret, sizeof(XXH3_kSecret),
- f_acc512, f_scramble);
+ f_acc, f_scramble);
+#endif
{ XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];
f_initSec(secret, seed);
return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret),
- f_acc512, f_scramble);
+ f_acc, f_scramble);
}
}
@@ -4520,12 +5678,12 @@ XXH3_hashLong_64b_withSeed_internal(const void* input, size_t len,
* It's important for performance that XXH3_hashLong is not inlined.
*/
XXH_NO_INLINE XXH64_hash_t
-XXH3_hashLong_64b_withSeed(const void* input, size_t len,
- XXH64_hash_t seed, const xxh_u8* secret, size_t secretLen)
+XXH3_hashLong_64b_withSeed(const void* XXH_RESTRICT input, size_t len,
+ XXH64_hash_t seed, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)
{
(void)secret; (void)secretLen;
return XXH3_hashLong_64b_withSeed_internal(input, len, seed,
- XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret);
+ XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret);
}
@@ -4557,37 +5715,37 @@ XXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len,
/* === Public entry point === */
-/*! @ingroup xxh3_family */
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(const void* input, size_t len)
+/*! @ingroup XXH3_family */
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length)
{
- return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default);
+ return XXH3_64bits_internal(input, length, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH64_hash_t
-XXH3_64bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize)
+XXH3_64bits_withSecret(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize)
{
- return XXH3_64bits_internal(input, len, 0, secret, secretSize, XXH3_hashLong_64b_withSecret);
+ return XXH3_64bits_internal(input, length, 0, secret, secretSize, XXH3_hashLong_64b_withSecret);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH64_hash_t
-XXH3_64bits_withSeed(const void* input, size_t len, XXH64_hash_t seed)
+XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed)
{
- return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed);
+ return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed);
}
XXH_PUBLIC_API XXH64_hash_t
-XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed)
+XXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)
{
- if (len <= XXH3_MIDSIZE_MAX)
- return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL);
- return XXH3_hashLong_64b_withSecret(input, len, seed, (const xxh_u8*)secret, secretSize);
+ if (length <= XXH3_MIDSIZE_MAX)
+ return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL);
+ return XXH3_hashLong_64b_withSecret(input, length, seed, (const xxh_u8*)secret, secretSize);
}
/* === XXH3 streaming === */
-
+#ifndef XXH_NO_STREAM
/*
* Malloc's a pointer that is always aligned to align.
*
@@ -4611,7 +5769,7 @@ XXH3_64bits_withSecretandSeed(const void* input, size_t len, const void* secret,
*
* Align must be a power of 2 and 8 <= align <= 128.
*/
-static void* XXH_alignedMalloc(size_t s, size_t align)
+static XXH_MALLOCF void* XXH_alignedMalloc(size_t s, size_t align)
{
XXH_ASSERT(align <= 128 && align >= 8); /* range check */
XXH_ASSERT((align & (align-1)) == 0); /* power of 2 */
@@ -4653,7 +5811,13 @@ static void XXH_alignedFree(void* p)
XXH_free(base);
}
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
+/*!
+ * @brief Allocate an @ref XXH3_state_t.
+ *
+ * Must be freed with XXH3_freeState().
+ * @return An allocated XXH3_state_t on success, `NULL` on failure.
+ */
XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)
{
XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64);
@@ -4662,16 +5826,23 @@ XXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)
return state;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
+/*!
+ * @brief Frees an @ref XXH3_state_t.
+ *
+ * Must be allocated with XXH3_createState().
+ * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState().
+ * @return XXH_OK.
+ */
XXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr)
{
XXH_alignedFree(statePtr);
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API void
-XXH3_copyState(XXH3_state_t* dst_state, const XXH3_state_t* src_state)
+XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state)
{
XXH_memcpy(dst_state, src_state, sizeof(*dst_state));
}
@@ -4703,18 +5874,18 @@ XXH3_reset_internal(XXH3_state_t* statePtr,
statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_reset(XXH3_state_t* statePtr)
+XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr)
{
if (statePtr == NULL) return XXH_ERROR;
XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE);
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize)
+XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize)
{
if (statePtr == NULL) return XXH_ERROR;
XXH3_reset_internal(statePtr, 0, secret, secretSize);
@@ -4723,9 +5894,9 @@ XXH3_64bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed)
+XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed)
{
if (statePtr == NULL) return XXH_ERROR;
if (seed==0) return XXH3_64bits_reset(statePtr);
@@ -4735,9 +5906,9 @@ XXH3_64bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed)
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed64)
+XXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed64)
{
if (statePtr == NULL) return XXH_ERROR;
if (secret == NULL) return XXH_ERROR;
@@ -4747,35 +5918,61 @@ XXH3_64bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret,
return XXH_OK;
}
-/* Note : when XXH3_consumeStripes() is invoked,
- * there must be a guarantee that at least one more byte must be consumed from input
- * so that the function can blindly consume all stripes using the "normal" secret segment */
-XXH_FORCE_INLINE void
+/*!
+ * @internal
+ * @brief Processes a large input for XXH3_update() and XXH3_digest_long().
+ *
+ * Unlike XXH3_hashLong_internal_loop(), this can process data that overlaps a block.
+ *
+ * @param acc Pointer to the 8 accumulator lanes
+ * @param nbStripesSoFarPtr In/out pointer to the number of leftover stripes in the block*
+ * @param nbStripesPerBlock Number of stripes in a block
+ * @param input Input pointer
+ * @param nbStripes Number of stripes to process
+ * @param secret Secret pointer
+ * @param secretLimit Offset of the last block in @p secret
+ * @param f_acc Pointer to an XXH3_accumulate implementation
+ * @param f_scramble Pointer to an XXH3_scrambleAcc implementation
+ * @return Pointer past the end of @p input after processing
+ */
+XXH_FORCE_INLINE const xxh_u8 *
XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc,
size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock,
const xxh_u8* XXH_RESTRICT input, size_t nbStripes,
const xxh_u8* XXH_RESTRICT secret, size_t secretLimit,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble)
{
- XXH_ASSERT(nbStripes <= nbStripesPerBlock); /* can handle max 1 scramble per invocation */
- XXH_ASSERT(*nbStripesSoFarPtr < nbStripesPerBlock);
- if (nbStripesPerBlock - *nbStripesSoFarPtr <= nbStripes) {
- /* need a scrambling operation */
- size_t const nbStripesToEndofBlock = nbStripesPerBlock - *nbStripesSoFarPtr;
- size_t const nbStripesAfterBlock = nbStripes - nbStripesToEndofBlock;
- XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripesToEndofBlock, f_acc512);
- f_scramble(acc, secret + secretLimit);
- XXH3_accumulate(acc, input + nbStripesToEndofBlock * XXH_STRIPE_LEN, secret, nbStripesAfterBlock, f_acc512);
- *nbStripesSoFarPtr = nbStripesAfterBlock;
- } else {
- XXH3_accumulate(acc, input, secret + nbStripesSoFarPtr[0] * XXH_SECRET_CONSUME_RATE, nbStripes, f_acc512);
+ const xxh_u8* initialSecret = secret + *nbStripesSoFarPtr * XXH_SECRET_CONSUME_RATE;
+ /* Process full blocks */
+ if (nbStripes >= (nbStripesPerBlock - *nbStripesSoFarPtr)) {
+ /* Process the initial partial block... */
+ size_t nbStripesThisIter = nbStripesPerBlock - *nbStripesSoFarPtr;
+
+ do {
+ /* Accumulate and scramble */
+ f_acc(acc, input, initialSecret, nbStripesThisIter);
+ f_scramble(acc, secret + secretLimit);
+ input += nbStripesThisIter * XXH_STRIPE_LEN;
+ nbStripes -= nbStripesThisIter;
+ /* Then continue the loop with the full block size */
+ nbStripesThisIter = nbStripesPerBlock;
+ initialSecret = secret;
+ } while (nbStripes >= nbStripesPerBlock);
+ *nbStripesSoFarPtr = 0;
+ }
+ /* Process a partial block */
+ if (nbStripes > 0) {
+ f_acc(acc, input, initialSecret, nbStripes);
+ input += nbStripes * XXH_STRIPE_LEN;
*nbStripesSoFarPtr += nbStripes;
}
+ /* Return end pointer */
+ return input;
}
#ifndef XXH3_STREAM_USE_STACK
-# ifndef __clang__ /* clang doesn't need additional stack space */
+# if XXH_SIZE_OPT <= 0 && !defined(__clang__) /* clang doesn't need additional stack space */
# define XXH3_STREAM_USE_STACK 1
# endif
#endif
@@ -4785,7 +5982,7 @@ XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc,
XXH_FORCE_INLINE XXH_errorcode
XXH3_update(XXH3_state_t* XXH_RESTRICT const state,
const xxh_u8* XXH_RESTRICT input, size_t len,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble)
{
if (input==NULL) {
@@ -4801,7 +5998,8 @@ XXH3_update(XXH3_state_t* XXH_RESTRICT const state,
* when operating accumulators directly into state.
* Operating into stack space seems to enable proper optimization.
* clang, on the other hand, doesn't seem to need this trick */
- XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8]; memcpy(acc, state->acc, sizeof(acc));
+ XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8];
+ XXH_memcpy(acc, state->acc, sizeof(acc));
#else
xxh_u64* XXH_RESTRICT const acc = state->acc;
#endif
@@ -4809,7 +6007,7 @@ XXH3_update(XXH3_state_t* XXH_RESTRICT const state,
XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE);
/* small input : just fill in tmp buffer */
- if (state->bufferedSize + len <= XXH3_INTERNALBUFFER_SIZE) {
+ if (len <= XXH3_INTERNALBUFFER_SIZE - state->bufferedSize) {
XXH_memcpy(state->buffer + state->bufferedSize, input, len);
state->bufferedSize += (XXH32_hash_t)len;
return XXH_OK;
@@ -4831,57 +6029,20 @@ XXH3_update(XXH3_state_t* XXH_RESTRICT const state,
&state->nbStripesSoFar, state->nbStripesPerBlock,
state->buffer, XXH3_INTERNALBUFFER_STRIPES,
secret, state->secretLimit,
- f_acc512, f_scramble);
+ f_acc, f_scramble);
state->bufferedSize = 0;
}
XXH_ASSERT(input < bEnd);
-
- /* large input to consume : ingest per full block */
- if ((size_t)(bEnd - input) > state->nbStripesPerBlock * XXH_STRIPE_LEN) {
+ if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) {
size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN;
- XXH_ASSERT(state->nbStripesPerBlock >= state->nbStripesSoFar);
- /* join to current block's end */
- { size_t const nbStripesToEnd = state->nbStripesPerBlock - state->nbStripesSoFar;
- XXH_ASSERT(nbStripes <= nbStripes);
- XXH3_accumulate(acc, input, secret + state->nbStripesSoFar * XXH_SECRET_CONSUME_RATE, nbStripesToEnd, f_acc512);
- f_scramble(acc, secret + state->secretLimit);
- state->nbStripesSoFar = 0;
- input += nbStripesToEnd * XXH_STRIPE_LEN;
- nbStripes -= nbStripesToEnd;
- }
- /* consume per entire blocks */
- while(nbStripes >= state->nbStripesPerBlock) {
- XXH3_accumulate(acc, input, secret, state->nbStripesPerBlock, f_acc512);
- f_scramble(acc, secret + state->secretLimit);
- input += state->nbStripesPerBlock * XXH_STRIPE_LEN;
- nbStripes -= state->nbStripesPerBlock;
- }
- /* consume last partial block */
- XXH3_accumulate(acc, input, secret, nbStripes, f_acc512);
- input += nbStripes * XXH_STRIPE_LEN;
- XXH_ASSERT(input < bEnd); /* at least some bytes left */
- state->nbStripesSoFar = nbStripes;
- /* buffer predecessor of last partial stripe */
- XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN);
- XXH_ASSERT(bEnd - input <= XXH_STRIPE_LEN);
- } else {
- /* content to consume <= block size */
- /* Consume input by a multiple of internal buffer size */
- if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) {
- const xxh_u8* const limit = bEnd - XXH3_INTERNALBUFFER_SIZE;
- do {
- XXH3_consumeStripes(acc,
+ input = XXH3_consumeStripes(acc,
&state->nbStripesSoFar, state->nbStripesPerBlock,
- input, XXH3_INTERNALBUFFER_STRIPES,
- secret, state->secretLimit,
- f_acc512, f_scramble);
- input += XXH3_INTERNALBUFFER_SIZE;
- } while (input<limit);
- /* buffer predecessor of last partial stripe */
- XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN);
- }
- }
+ input, nbStripes,
+ secret, state->secretLimit,
+ f_acc, f_scramble);
+ XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN);
+ }
/* Some remaining input (always) : buffer it */
XXH_ASSERT(input < bEnd);
XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE);
@@ -4890,19 +6051,19 @@ XXH3_update(XXH3_state_t* XXH_RESTRICT const state,
state->bufferedSize = (XXH32_hash_t)(bEnd-input);
#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1
/* save stack accumulators into state */
- memcpy(state->acc, acc, sizeof(acc));
+ XXH_memcpy(state->acc, acc, sizeof(acc));
#endif
}
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_64bits_update(XXH3_state_t* state, const void* input, size_t len)
+XXH3_64bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)
{
return XXH3_update(state, (const xxh_u8*)input, len,
- XXH3_accumulate_512, XXH3_scrambleAcc);
+ XXH3_accumulate, XXH3_scrambleAcc);
}
@@ -4911,37 +6072,40 @@ XXH3_digest_long (XXH64_hash_t* acc,
const XXH3_state_t* state,
const unsigned char* secret)
{
+ xxh_u8 lastStripe[XXH_STRIPE_LEN];
+ const xxh_u8* lastStripePtr;
+
/*
* Digest on a local copy. This way, the state remains unaltered, and it can
* continue ingesting more input afterwards.
*/
XXH_memcpy(acc, state->acc, sizeof(state->acc));
if (state->bufferedSize >= XXH_STRIPE_LEN) {
+ /* Consume remaining stripes then point to remaining data in buffer */
size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN;
size_t nbStripesSoFar = state->nbStripesSoFar;
XXH3_consumeStripes(acc,
&nbStripesSoFar, state->nbStripesPerBlock,
state->buffer, nbStripes,
secret, state->secretLimit,
- XXH3_accumulate_512, XXH3_scrambleAcc);
- /* last stripe */
- XXH3_accumulate_512(acc,
- state->buffer + state->bufferedSize - XXH_STRIPE_LEN,
- secret + state->secretLimit - XXH_SECRET_LASTACC_START);
+ XXH3_accumulate, XXH3_scrambleAcc);
+ lastStripePtr = state->buffer + state->bufferedSize - XXH_STRIPE_LEN;
} else { /* bufferedSize < XXH_STRIPE_LEN */
- xxh_u8 lastStripe[XXH_STRIPE_LEN];
+ /* Copy to temp buffer */
size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize;
XXH_ASSERT(state->bufferedSize > 0); /* there is always some input buffered */
XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize);
XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize);
- XXH3_accumulate_512(acc,
- lastStripe,
- secret + state->secretLimit - XXH_SECRET_LASTACC_START);
+ lastStripePtr = lastStripe;
}
+ /* Last stripe */
+ XXH3_accumulate_512(acc,
+ lastStripePtr,
+ secret + state->secretLimit - XXH_SECRET_LASTACC_START);
}
-/*! @ingroup xxh3_family */
-XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state)
+/*! @ingroup XXH3_family */
+XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* state)
{
const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;
if (state->totalLen > XXH3_MIDSIZE_MAX) {
@@ -4957,7 +6121,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state)
return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen),
secret, state->secretLimit + XXH_STRIPE_LEN);
}
-
+#endif /* !XXH_NO_STREAM */
/* ==========================================
@@ -4977,7 +6141,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (const XXH3_state_t* state)
* fast for a _128-bit_ hash on 32-bit (it usually clears XXH64).
*/
-XXH_FORCE_INLINE XXH128_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
/* A doubled version of 1to3_64b with different constants. */
@@ -5006,7 +6170,7 @@ XXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
}
}
-XXH_FORCE_INLINE XXH128_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(input != NULL);
@@ -5026,14 +6190,14 @@ XXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_
m128.low64 ^= (m128.high64 >> 3);
m128.low64 = XXH_xorshift64(m128.low64, 35);
- m128.low64 *= 0x9FB21C651E98DF25ULL;
+ m128.low64 *= PRIME_MX2;
m128.low64 = XXH_xorshift64(m128.low64, 28);
m128.high64 = XXH3_avalanche(m128.high64);
return m128;
}
}
-XXH_FORCE_INLINE XXH128_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(input != NULL);
@@ -5108,7 +6272,7 @@ XXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64
/*
* Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN
*/
-XXH_FORCE_INLINE XXH128_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)
{
XXH_ASSERT(len <= 16);
@@ -5139,7 +6303,7 @@ XXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2,
}
-XXH_FORCE_INLINE XXH128_hash_t
+XXH_FORCE_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
XXH64_hash_t seed)
@@ -5150,6 +6314,16 @@ XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
{ XXH128_hash_t acc;
acc.low64 = len * XXH_PRIME64_1;
acc.high64 = 0;
+
+#if XXH_SIZE_OPT >= 1
+ {
+ /* Smaller, but slightly slower. */
+ unsigned int i = (unsigned int)(len - 1) / 32;
+ do {
+ acc = XXH128_mix32B(acc, input+16*i, input+len-16*(i+1), secret+32*i, seed);
+ } while (i-- != 0);
+ }
+#else
if (len > 32) {
if (len > 64) {
if (len > 96) {
@@ -5160,6 +6334,7 @@ XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed);
}
acc = XXH128_mix32B(acc, input, input+len-16, secret, seed);
+#endif
{ XXH128_hash_t h128;
h128.low64 = acc.low64 + acc.high64;
h128.high64 = (acc.low64 * XXH_PRIME64_1)
@@ -5172,7 +6347,7 @@ XXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
}
}
-XXH_NO_INLINE XXH128_hash_t
+XXH_NO_INLINE XXH_PUREF XXH128_hash_t
XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
XXH64_hash_t seed)
@@ -5181,25 +6356,34 @@ XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);
{ XXH128_hash_t acc;
- int const nbRounds = (int)len / 32;
- int i;
+ unsigned i;
acc.low64 = len * XXH_PRIME64_1;
acc.high64 = 0;
- for (i=0; i<4; i++) {
+ /*
+ * We set as `i` as offset + 32. We do this so that unchanged
+ * `len` can be used as upper bound. This reaches a sweet spot
+ * where both x86 and aarch64 get simple agen and good codegen
+ * for the loop.
+ */
+ for (i = 32; i < 160; i += 32) {
acc = XXH128_mix32B(acc,
- input + (32 * i),
- input + (32 * i) + 16,
- secret + (32 * i),
+ input + i - 32,
+ input + i - 16,
+ secret + i - 32,
seed);
}
acc.low64 = XXH3_avalanche(acc.low64);
acc.high64 = XXH3_avalanche(acc.high64);
- XXH_ASSERT(nbRounds >= 4);
- for (i=4 ; i < nbRounds; i++) {
+ /*
+ * NB: `i <= len` will duplicate the last 32-bytes if
+ * len % 32 was zero. This is an unfortunate necessity to keep
+ * the hash result stable.
+ */
+ for (i=160; i <= len; i += 32) {
acc = XXH128_mix32B(acc,
- input + (32 * i),
- input + (32 * i) + 16,
- secret + XXH3_MIDSIZE_STARTOFFSET + (32 * (i - 4)),
+ input + i - 32,
+ input + i - 16,
+ secret + XXH3_MIDSIZE_STARTOFFSET + i - 160,
seed);
}
/* last bytes */
@@ -5207,7 +6391,7 @@ XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
input + len - 16,
input + len - 32,
secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16,
- 0ULL - seed);
+ (XXH64_hash_t)0 - seed);
{ XXH128_hash_t h128;
h128.low64 = acc.low64 + acc.high64;
@@ -5224,12 +6408,12 @@ XXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,
XXH_FORCE_INLINE XXH128_hash_t
XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len,
const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble)
{
XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;
- XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc512, f_scramble);
+ XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc, f_scramble);
/* converge into final hash */
XXH_STATIC_ASSERT(sizeof(acc) == 64);
@@ -5247,47 +6431,50 @@ XXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len,
}
/*
- * It's important for performance that XXH3_hashLong is not inlined.
+ * It's important for performance that XXH3_hashLong() is not inlined.
*/
-XXH_NO_INLINE XXH128_hash_t
+XXH_NO_INLINE XXH_PUREF XXH128_hash_t
XXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len,
XXH64_hash_t seed64,
const void* XXH_RESTRICT secret, size_t secretLen)
{
(void)seed64; (void)secret; (void)secretLen;
return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret),
- XXH3_accumulate_512, XXH3_scrambleAcc);
+ XXH3_accumulate, XXH3_scrambleAcc);
}
/*
- * It's important for performance to pass @secretLen (when it's static)
+ * It's important for performance to pass @p secretLen (when it's static)
* to the compiler, so that it can properly optimize the vectorized loop.
+ *
+ * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE
+ * breaks -Og, this is XXH_NO_INLINE.
*/
-XXH_FORCE_INLINE XXH128_hash_t
+XXH3_WITH_SECRET_INLINE XXH128_hash_t
XXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len,
XXH64_hash_t seed64,
const void* XXH_RESTRICT secret, size_t secretLen)
{
(void)seed64;
return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen,
- XXH3_accumulate_512, XXH3_scrambleAcc);
+ XXH3_accumulate, XXH3_scrambleAcc);
}
XXH_FORCE_INLINE XXH128_hash_t
XXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len,
XXH64_hash_t seed64,
- XXH3_f_accumulate_512 f_acc512,
+ XXH3_f_accumulate f_acc,
XXH3_f_scrambleAcc f_scramble,
XXH3_f_initCustomSecret f_initSec)
{
if (seed64 == 0)
return XXH3_hashLong_128b_internal(input, len,
XXH3_kSecret, sizeof(XXH3_kSecret),
- f_acc512, f_scramble);
+ f_acc, f_scramble);
{ XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];
f_initSec(secret, seed64);
return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret),
- f_acc512, f_scramble);
+ f_acc, f_scramble);
}
}
@@ -5300,7 +6487,7 @@ XXH3_hashLong_128b_withSeed(const void* input, size_t len,
{
(void)secret; (void)secretLen;
return XXH3_hashLong_128b_withSeed_internal(input, len, seed64,
- XXH3_accumulate_512, XXH3_scrambleAcc, XXH3_initCustomSecret);
+ XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret);
}
typedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t,
@@ -5330,94 +6517,93 @@ XXH3_128bits_internal(const void* input, size_t len,
/* === Public XXH128 API === */
-/*! @ingroup xxh3_family */
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(const void* input, size_t len)
+/*! @ingroup XXH3_family */
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* input, size_t len)
{
return XXH3_128bits_internal(input, len, 0,
XXH3_kSecret, sizeof(XXH3_kSecret),
XXH3_hashLong_128b_default);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH128_hash_t
-XXH3_128bits_withSecret(const void* input, size_t len, const void* secret, size_t secretSize)
+XXH3_128bits_withSecret(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize)
{
return XXH3_128bits_internal(input, len, 0,
(const xxh_u8*)secret, secretSize,
XXH3_hashLong_128b_withSecret);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH128_hash_t
-XXH3_128bits_withSeed(const void* input, size_t len, XXH64_hash_t seed)
+XXH3_128bits_withSeed(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)
{
return XXH3_128bits_internal(input, len, seed,
XXH3_kSecret, sizeof(XXH3_kSecret),
XXH3_hashLong_128b_withSeed);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH128_hash_t
-XXH3_128bits_withSecretandSeed(const void* input, size_t len, const void* secret, size_t secretSize, XXH64_hash_t seed)
+XXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)
{
if (len <= XXH3_MIDSIZE_MAX)
return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL);
return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH128_hash_t
-XXH128(const void* input, size_t len, XXH64_hash_t seed)
+XXH128(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)
{
return XXH3_128bits_withSeed(input, len, seed);
}
/* === XXH3 128-bit streaming === */
-
+#ifndef XXH_NO_STREAM
/*
* All initialization and update functions are identical to 64-bit streaming variant.
* The only difference is the finalization routine.
*/
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_reset(XXH3_state_t* statePtr)
+XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr)
{
return XXH3_64bits_reset(statePtr);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_reset_withSecret(XXH3_state_t* statePtr, const void* secret, size_t secretSize)
+XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize)
{
return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_reset_withSeed(XXH3_state_t* statePtr, XXH64_hash_t seed)
+XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed)
{
return XXH3_64bits_reset_withSeed(statePtr, seed);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_reset_withSecretandSeed(XXH3_state_t* statePtr, const void* secret, size_t secretSize, XXH64_hash_t seed)
+XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)
{
return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed);
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_128bits_update(XXH3_state_t* state, const void* input, size_t len)
+XXH3_128bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)
{
- return XXH3_update(state, (const xxh_u8*)input, len,
- XXH3_accumulate_512, XXH3_scrambleAcc);
+ return XXH3_64bits_update(state, input, len);
}
-/*! @ingroup xxh3_family */
-XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state)
+/*! @ingroup XXH3_family */
+XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* state)
{
const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;
if (state->totalLen > XXH3_MIDSIZE_MAX) {
@@ -5441,13 +6627,13 @@ XXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (const XXH3_state_t* state)
return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen),
secret, state->secretLimit + XXH_STRIPE_LEN);
}
-
+#endif /* !XXH_NO_STREAM */
/* 128-bit utility functions */
#include <string.h> /* memcmp, memcpy */
/* return : 1 is equal, 0 if different */
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2)
{
/* note : XXH128_hash_t is compact, it has no padding byte */
@@ -5455,11 +6641,11 @@ XXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2)
}
/* This prototype is compatible with stdlib's qsort().
- * return : >0 if *h128_1 > *h128_2
- * <0 if *h128_1 < *h128_2
- * =0 if *h128_1 == *h128_2 */
-/*! @ingroup xxh3_family */
-XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2)
+ * @return : >0 if *h128_1 > *h128_2
+ * <0 if *h128_1 < *h128_2
+ * =0 if *h128_1 == *h128_2 */
+/*! @ingroup XXH3_family */
+XXH_PUBLIC_API int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2)
{
XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1;
XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2;
@@ -5471,9 +6657,9 @@ XXH_PUBLIC_API int XXH128_cmp(const void* h128_1, const void* h128_2)
/*====== Canonical representation ======*/
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API void
-XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash)
+XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash)
{
XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t));
if (XXH_CPU_LITTLE_ENDIAN) {
@@ -5484,9 +6670,9 @@ XXH128_canonicalFromHash(XXH128_canonical_t* dst, XXH128_hash_t hash)
XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64));
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH128_hash_t
-XXH128_hashFromCanonical(const XXH128_canonical_t* src)
+XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src)
{
XXH128_hash_t h;
h.high64 = XXH_readBE64(src);
@@ -5502,26 +6688,34 @@ XXH128_hashFromCanonical(const XXH128_canonical_t* src)
*/
#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x))
-static void XXH3_combine16(void* dst, XXH128_hash_t h128)
+XXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128)
{
XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 );
XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 );
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API XXH_errorcode
-XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSeed, size_t customSeedSize)
+XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize)
{
+#if (XXH_DEBUGLEVEL >= 1)
XXH_ASSERT(secretBuffer != NULL);
- if (secretBuffer == NULL) return XXH_ERROR;
XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);
+#else
+ /* production mode, assert() are disabled */
+ if (secretBuffer == NULL) return XXH_ERROR;
if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;
+#endif
+
if (customSeedSize == 0) {
customSeed = XXH3_kSecret;
customSeedSize = XXH_SECRET_DEFAULT_SIZE;
}
+#if (XXH_DEBUGLEVEL >= 1)
XXH_ASSERT(customSeed != NULL);
+#else
if (customSeed == NULL) return XXH_ERROR;
+#endif
/* Fill secretBuffer with a copy of customSeed - repeat as needed */
{ size_t pos = 0;
@@ -5545,9 +6739,9 @@ XXH3_generateSecret(void* secretBuffer, size_t secretSize, const void* customSee
return XXH_OK;
}
-/*! @ingroup xxh3_family */
+/*! @ingroup XXH3_family */
XXH_PUBLIC_API void
-XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed)
+XXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed)
{
XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];
XXH3_initCustomSecret(secret, seed);
@@ -5560,7 +6754,7 @@ XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed)
/* Pop our optimization override from above */
#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \
&& defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \
- && defined(__OPTIMIZE__) && !defined(__OPTIMIZE_SIZE__) /* respect -O0 and -Os */
+ && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */
# pragma GCC pop_options
#endif
@@ -5575,5 +6769,5 @@ XXH3_generateSecret_fromSeed(void* secretBuffer, XXH64_hash_t seed)
#if defined (__cplusplus)
-}
+} /* extern "C" */
#endif
diff --git a/dviware/dvisvgm/src/Font.cpp b/dviware/dvisvgm/src/Font.cpp
index 4645d33073..218dd30f82 100644
--- a/dviware/dvisvgm/src/Font.cpp
+++ b/dviware/dvisvgm/src/Font.cpp
@@ -454,14 +454,17 @@ bool PhysicalFont::getExactGlyphBox (int c, GlyphMetrics &metrics, bool vertical
BoundingBox charbox;
if (!getExactGlyphBox(c, charbox, cb))
return false;
- if ((metrics.wl = -charbox.minX()) < 0) metrics.wl=0;
- if ((metrics.wr = charbox.maxX()) < 0) metrics.wr=0;
- if ((metrics.h = charbox.maxY()) < 0) metrics.h=0;
- if ((metrics.d = -charbox.minY()) < 0) metrics.d=0;
+ metrics.wl = -charbox.minX();
+ metrics.wr = charbox.maxX();
+ metrics.h = charbox.maxY();
+ metrics.d = -charbox.minY();
if (vertical) { // vertical text orientation
if (verticalLayout()) { // font designed for vertical layout?
- metrics.wl = metrics.wr = (metrics.wl+metrics.wr)/2;
- metrics.d += metrics.h;
+ double wl = max(0.0, metrics.wl);
+ double wr = max(0.0, metrics.wr);
+ double h = max(0.0, metrics.h);
+ metrics.wl = metrics.wr = (wl+wr)/2;
+ metrics.d += h;
metrics.h = 0;
}
else {
diff --git a/dviware/dvisvgm/src/Makefile.am b/dviware/dvisvgm/src/Makefile.am
index 4ccab654f0..852f5c8f01 100644
--- a/dviware/dvisvgm/src/Makefile.am
+++ b/dviware/dvisvgm/src/Makefile.am
@@ -119,10 +119,9 @@ libdvisvgm_la_SOURCES = \
PreScanDVIReader.hpp PreScanDVIReader.cpp \
Process.hpp Process.cpp \
psdefs.cpp \
- PSFilter.hpp \
PSInterpreter.hpp PSInterpreter.cpp \
PSPattern.hpp PSPattern.cpp \
- PSPreviewFilter.hpp PSPreviewFilter.cpp \
+ PSPreviewHandler.hpp PSPreviewHandler.cpp \
PsSpecialHandler.hpp PsSpecialHandler.cpp \
RangeMap.hpp RangeMap.cpp \
ShadingPatch.hpp ShadingPatch.cpp \
diff --git a/dviware/dvisvgm/src/Makefile.in b/dviware/dvisvgm/src/Makefile.in
index a576da9bc4..c537e635e2 100644
--- a/dviware/dvisvgm/src/Makefile.in
+++ b/dviware/dvisvgm/src/Makefile.in
@@ -149,7 +149,7 @@ am_libdvisvgm_la_OBJECTS = BasicDVIReader.lo Bezier.lo \
PapersizeSpecialHandler.lo PathClipper.lo PDFHandler.lo \
PDFParser.lo PdfSpecialHandler.lo PDFToSVG.lo \
PreScanDVIReader.lo Process.lo psdefs.lo PSInterpreter.lo \
- PSPattern.lo PSPreviewFilter.lo PsSpecialHandler.lo \
+ PSPattern.lo PSPreviewHandler.lo PsSpecialHandler.lo \
RangeMap.lo ShadingPatch.lo SignalHandler.lo SourceInput.lo \
SpecialManager.lo StreamReader.lo StreamWriter.lo Subfont.lo \
SVGCharHandler.lo SVGCharHandlerFactory.lo \
@@ -217,7 +217,7 @@ am__depfiles_remade = ./$(DEPDIR)/BasicDVIReader.Plo \
./$(DEPDIR)/Opacity.Plo ./$(DEPDIR)/PDFHandler.Plo \
./$(DEPDIR)/PDFParser.Plo ./$(DEPDIR)/PDFToSVG.Plo \
./$(DEPDIR)/PSInterpreter.Plo ./$(DEPDIR)/PSPattern.Plo \
- ./$(DEPDIR)/PSPreviewFilter.Plo ./$(DEPDIR)/PageRanges.Plo \
+ ./$(DEPDIR)/PSPreviewHandler.Plo ./$(DEPDIR)/PageRanges.Plo \
./$(DEPDIR)/PageSize.Plo \
./$(DEPDIR)/PapersizeSpecialHandler.Plo \
./$(DEPDIR)/PathClipper.Plo ./$(DEPDIR)/PdfSpecialHandler.Plo \
@@ -602,10 +602,9 @@ libdvisvgm_la_SOURCES = \
PreScanDVIReader.hpp PreScanDVIReader.cpp \
Process.hpp Process.cpp \
psdefs.cpp \
- PSFilter.hpp \
PSInterpreter.hpp PSInterpreter.cpp \
PSPattern.hpp PSPattern.cpp \
- PSPreviewFilter.hpp PSPreviewFilter.cpp \
+ PSPreviewHandler.hpp PSPreviewHandler.cpp \
PsSpecialHandler.hpp PsSpecialHandler.cpp \
RangeMap.hpp RangeMap.cpp \
ShadingPatch.hpp ShadingPatch.cpp \
@@ -829,7 +828,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PDFToSVG.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSInterpreter.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPattern.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPreviewFilter.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSPreviewHandler.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageRanges.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PageSize.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PapersizeSpecialHandler.Plo@am__quote@ # am--include-marker
@@ -1166,7 +1165,7 @@ distclean: distclean-recursive
-rm -f ./$(DEPDIR)/PDFToSVG.Plo
-rm -f ./$(DEPDIR)/PSInterpreter.Plo
-rm -f ./$(DEPDIR)/PSPattern.Plo
- -rm -f ./$(DEPDIR)/PSPreviewFilter.Plo
+ -rm -f ./$(DEPDIR)/PSPreviewHandler.Plo
-rm -f ./$(DEPDIR)/PageRanges.Plo
-rm -f ./$(DEPDIR)/PageSize.Plo
-rm -f ./$(DEPDIR)/PapersizeSpecialHandler.Plo
@@ -1310,7 +1309,7 @@ maintainer-clean: maintainer-clean-recursive
-rm -f ./$(DEPDIR)/PDFToSVG.Plo
-rm -f ./$(DEPDIR)/PSInterpreter.Plo
-rm -f ./$(DEPDIR)/PSPattern.Plo
- -rm -f ./$(DEPDIR)/PSPreviewFilter.Plo
+ -rm -f ./$(DEPDIR)/PSPreviewHandler.Plo
-rm -f ./$(DEPDIR)/PageRanges.Plo
-rm -f ./$(DEPDIR)/PageSize.Plo
-rm -f ./$(DEPDIR)/PapersizeSpecialHandler.Plo
diff --git a/dviware/dvisvgm/src/PSFilter.hpp b/dviware/dvisvgm/src/PSFilter.hpp
deleted file mode 100644
index 17dcf0d93e..0000000000
--- a/dviware/dvisvgm/src/PSFilter.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*************************************************************************
-** PSFilter.hpp **
-** **
-** This file is part of dvisvgm -- a fast DVI to SVG converter **
-** Copyright (C) 2005-2023 Martin Gieseking <martin.gieseking@uos.de> **
-** **
-** This program is free software; you can redistribute it and/or **
-** modify it under the terms of the GNU General Public License as **
-** published by the Free Software Foundation; either version 3 of **
-** the License, or (at your option) any later version. **
-** **
-** This program is distributed in the hope that it will be useful, but **
-** WITHOUT ANY WARRANTY; without even the implied warranty of **
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
-** GNU General Public License for more details. **
-** **
-** You should have received a copy of the GNU General Public License **
-** along with this program; if not, see <http://www.gnu.org/licenses/>. **
-*************************************************************************/
-
-#ifndef PSFILTER_HPP
-#define PSFILTER_HPP
-
-class PSInterpreter;
-
-class PSFilter
-{
- public:
- explicit PSFilter (PSInterpreter &psi) : _psi(psi) {}
- virtual ~PSFilter () =default;
- virtual void execute (const char *code, size_t len) =0;
- virtual bool active () const =0;
-
- protected:
- PSInterpreter& psInterpreter () {return _psi;}
-
- private:
- PSInterpreter &_psi;
-};
-
-#endif
diff --git a/dviware/dvisvgm/src/PSInterpreter.cpp b/dviware/dvisvgm/src/PSInterpreter.cpp
index 1c20bb6bb4..cd24ec03b9 100644
--- a/dviware/dvisvgm/src/PSInterpreter.cpp
+++ b/dviware/dvisvgm/src/PSInterpreter.cpp
@@ -27,7 +27,6 @@
#include "FileSystem.hpp"
#include "InputReader.hpp"
#include "Message.hpp"
-#include "PSFilter.hpp"
#include "PSInterpreter.hpp"
#include "SignalHandler.hpp"
#include "utility.hpp"
@@ -67,7 +66,8 @@ void PSInterpreter::init () {
// as of GS 9.56.0. Since dvisvgm relies on the old PS-based interpreter for its
// PDF support, we try to disable the new one.
// https://www.ghostscript.com/doc/9.56.0/Use.htm#PDF_switches
- if (gsrev >= 9560)
+ // As of GS 10.02.0, option NEWPDF has been deprecated and has no effect any longer.
+ if (gsrev >= 9560 && gsrev < 10020)
gsargs.emplace_back("-dNEWPDF=false");
}
_gs.init(gsargs.size(), gsargs.data(), this);
@@ -81,16 +81,6 @@ void PSInterpreter::init () {
}
-/** Sets or replaces the filter applied to the PS code.
- * @param[in] filter the new filter being used
- * @return the previous, replaced filter (nullptr if there was none) */
-PSFilter* PSInterpreter::setFilter (PSFilter *filter) {
- PSFilter *prevFilter = _filter;
- _filter = filter;
- return prevFilter;
-}
-
-
PSActions* PSInterpreter::setActions (PSActions *actions) {
PSActions *old_actions = _actions;
_actions = actions;
@@ -136,15 +126,6 @@ bool PSInterpreter::execute (const char *str, size_t len, bool flush) {
complete = true;
}
- if (_filter && _filter->active()) {
- PSFilter *filter = _filter;
- _filter = nullptr; // prevent recursion when filter calls execute()
- filter->execute(str, len);
- if (filter->active()) // filter still active after execution?
- _filter = filter;
- return complete;
- }
-
// feed Ghostscript with code chunks that are not larger than 64KB
// => see documentation of gsapi_run_string_foo()
const char *p=str;
diff --git a/dviware/dvisvgm/src/PSInterpreter.hpp b/dviware/dvisvgm/src/PSInterpreter.hpp
index 6562e3bf98..c71c5af249 100644
--- a/dviware/dvisvgm/src/PSInterpreter.hpp
+++ b/dviware/dvisvgm/src/PSInterpreter.hpp
@@ -108,7 +108,6 @@ class PSInterpreter {
bool executeRaw (const std::string &str, int n);
bool active () const {return _mode != PS_QUIT;}
void limit (size_t max_bytes) {_bytesToRead = max_bytes;}
- PSFilter* setFilter (PSFilter *filter);
PSActions* setActions (PSActions *actions);
int pdfPageCount (const std::string &fname);
BoundingBox pdfPageBox (const std::string &fname, int pageno);
@@ -134,7 +133,6 @@ class PSInterpreter {
Ghostscript _gs;
Mode _mode; ///< current execution mode
PSActions *_actions=nullptr; ///< actions to be performed
- PSFilter *_filter=nullptr; ///< active filter used to process PS code
size_t _bytesToRead=0; ///< if > 0, maximal number of bytes to be processed by following calls of execute()
std::vector<char> _linebuf;
std::string _errorMessage; ///< text of error message
diff --git a/dviware/dvisvgm/src/PSPreviewFilter.cpp b/dviware/dvisvgm/src/PSPreviewHandler.cpp
index 960812a4e0..833890c3eb 100644
--- a/dviware/dvisvgm/src/PSPreviewFilter.cpp
+++ b/dviware/dvisvgm/src/PSPreviewHandler.cpp
@@ -1,5 +1,5 @@
/*************************************************************************
-** PSPreviewFilter.cpp **
+** PSPreviewHandler.cpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
** Copyright (C) 2005-2023 Martin Gieseking <martin.gieseking@uos.de> **
@@ -18,66 +18,53 @@
** along with this program; if not, see <http://www.gnu.org/licenses/>. **
*************************************************************************/
-#include <vector>
-#include "InputBuffer.hpp"
-#include "InputReader.hpp"
#include "PSInterpreter.hpp"
-#include "PSPreviewFilter.hpp"
-#include "SpecialActions.hpp"
-
+#include "PSPreviewHandler.hpp"
using namespace std;
+PSPreviewHandler::PSPreviewHandler (PSInterpreter &psi) : _psi(psi) {
+}
+
+
/** Activates this filter so that the PS code will be redirected through it if
* it's hooked into the PSInterpreter. */
-void PSPreviewFilter::activate () {
- if (_tightpage) // reactivate filter?
- _active = true;
- else { // first activation?
- _tightpage = _active = false;
- // try to retrieve version string of preview package set in the PS header section
- if (psInterpreter().executeRaw("SDict begin currentdict/preview@version known{preview@version}{0}ifelse end", 1))
- _version = psInterpreter().rawData()[0];
- // check if tightpage option was set
- if (_version != "0" && psInterpreter().executeRaw("SDict begin preview@tightpage end", 1)) {
- _tightpage = (psInterpreter().rawData()[0] == "true");
- _active = true;
- }
- }
+void PSPreviewHandler::init () {
+ // try to retrieve version string of preview package set in the PS header section
+ if (_psi.executeRaw("SDict begin currentdict/preview@version known{preview@version}{0}ifelse end", 1))
+ _version = _psi.rawData()[0];
+ // check if tightpage option was set
+ if (_version != "0" && _psi.executeRaw("SDict begin preview@tightpage end", 1))
+ _tightpage = (_psi.rawData()[0] == "true");
_boxExtents.clear();
}
-/** Tries to extract the bounding box information from a chunk of PostScript code.
- * @param[in] code pointer to buffer with PS code to filter
- * @param[in] len number of bytes in buffer */
-void PSPreviewFilter::execute (const char *code, size_t len) {
- // If the "tightpage" option was set in the TeX file, 7 integers representing the
- // extent of the bounding box are present at the begin of each page.
+/** Tries to extract the bounding box information from the PS operand stack.
+ @return true on success. */
+bool PSPreviewHandler::readDataFromStack () {
if (!_tightpage)
- psInterpreter().execute(code, len);
- else {
- // Read bounding box information pushed on the operand stack by the preview package.
- // It consists of 7 values in DVI units:
- // adj_left, adj_bottom, adj_right, adj_top, height, depth, width,
- // where the first 4 values are set by \PreviewBorder or \PreviewBbAdjust. They denote
- // the border adjustments to create additional space around the graphics.
- // The baseline of the tight box extends from (0,0) to (tight_width, 0).
- CharInputBuffer ib(code, len);
- BufferInputReader ir(ib);
- ir.skipSpace();
- int val;
- while (ir.parseInt(val) && _boxExtents.size() <= 7) {
- _boxExtents.push_back(val);
- ir.skipSpace();
- }
- }
- _active = false; // no further processing required
+ return false;
+
+ // Read bounding box information pushed on the operand stack by the preview package.
+ // It consists of 7 values in DVI units:
+ // adj_left, adj_bottom, adj_right, adj_top, height, depth, width,
+ // where the first 4 values are set by \PreviewBorder or \PreviewBbAdjust. They denote
+ // the border adjustments to create additional space around the graphics.
+ // The baseline of the tight box extends from (0,0) to (tight_width, 0).
+ const char *getOperands =
+ "count 7 sub neg dup 0 lt{pop 0}if{0}repeat\n" // ensure 7 operands on the stack
+ "7{dup type dup /integertype eq exch /realtype eq or not{pop 0}if cvi 7 1 roll} repeat"; // ensure integer operands
+ _psi.executeRaw(getOperands, 7);
+ _boxExtents.clear();
+ for (const string &str: _psi.rawData())
+ _boxExtents.push_back(stoi(str));
+ return true;
}
/** Returns the bounding box defined by the preview package. */
-bool PSPreviewFilter::getBoundingBox (BoundingBox &bbox) const {
+bool PSPreviewHandler::getBoundingBox (BoundingBox &bbox) const {
if (_boxExtents.size() < 7)
return false;
const double leftX = _boxExtents[0]*_dvi2bp;
@@ -87,18 +74,18 @@ bool PSPreviewFilter::getBoundingBox (BoundingBox &bbox) const {
/** Returns the box height in PS points, or -1 if no data was found or read yet. */
-double PSPreviewFilter::height () const {
+double PSPreviewHandler::height () const {
return _boxExtents.size() > 4 ? (_boxExtents[4]+_boxExtents[3])*_dvi2bp : -1;
}
/** Returns the box depth in PS points, or -1 if no data was found or read yet. */
-double PSPreviewFilter::depth () const {
+double PSPreviewHandler::depth () const {
return _boxExtents.size() > 5 ? (_boxExtents[5]-_boxExtents[1])*_dvi2bp : -1;
}
/** Returns the box width in PS points, or -1 if no data was found or read yet. */
-double PSPreviewFilter::width () const {
+double PSPreviewHandler::width () const {
return _boxExtents.size() > 6 ? (_boxExtents[6]+_boxExtents[2]-_boxExtents[0])*_dvi2bp : -1;
}
diff --git a/dviware/dvisvgm/src/PSPreviewFilter.hpp b/dviware/dvisvgm/src/PSPreviewHandler.hpp
index 24426529bf..4823aca3bc 100644
--- a/dviware/dvisvgm/src/PSPreviewFilter.hpp
+++ b/dviware/dvisvgm/src/PSPreviewHandler.hpp
@@ -1,5 +1,5 @@
/*************************************************************************
-** PSPreviewFilter.hpp **
+** PSPreviewHandler.hpp **
** **
** This file is part of dvisvgm -- a fast DVI to SVG converter **
** Copyright (C) 2005-2023 Martin Gieseking <martin.gieseking@uos.de> **
@@ -18,26 +18,23 @@
** along with this program; if not, see <http://www.gnu.org/licenses/>. **
*************************************************************************/
-#ifndef PSPREVIEWFILTER_HPP
-#define PSPREVIEWFILTER_HPP
+#ifndef PSPREVIEWHANDLER_HPP
+#define PSPREVIEWHANDLER_HPP
#include <string>
#include <vector>
#include "BoundingBox.hpp"
-#include "PSFilter.hpp"
-class SpecialActions;
+class PSInterpreter;
-class PSPreviewFilter : public PSFilter {
+class PSPreviewHandler {
public:
- explicit PSPreviewFilter (PSInterpreter &psi) : PSFilter(psi) {}
- void activate ();
- void execute (const char *code, size_t len) override;
- bool active () const override {return _active;}
- std::string version () const {return _version;}
- bool tightpage () const {return _tightpage;}
+ explicit PSPreviewHandler (PSInterpreter &psi);
+ void init ();
+ std::string version () const {return _version;}
+ bool tightpage () const {return _tightpage;}
+ bool readDataFromStack ();
void setDviScaleFactor (double dvi2bp) {_dvi2bp = dvi2bp;}
- void assignBorders (BoundingBox &bbox) const;
bool getBoundingBox (BoundingBox &bbox) const;
double height () const;
double depth () const;
@@ -45,10 +42,10 @@ class PSPreviewFilter : public PSFilter {
private:
std::string _version; ///< version string of preview package
- bool _active=false; ///< true if filter is active
bool _tightpage=false; ///< true if tightpage option was given
double _dvi2bp=1.0/65536.0; ///< factor to convert dvi units to PS points
std::vector<int> _boxExtents; ///< bounding box data set by the preview package (in DVI units)
+ PSInterpreter &_psi;
};
#endif
diff --git a/dviware/dvisvgm/src/PsSpecialHandler.cpp b/dviware/dvisvgm/src/PsSpecialHandler.cpp
index cb3a8a6bac..a2dc107215 100644
--- a/dviware/dvisvgm/src/PsSpecialHandler.cpp
+++ b/dviware/dvisvgm/src/PsSpecialHandler.cpp
@@ -28,7 +28,7 @@
#include "Message.hpp"
#include "PathClipper.hpp"
#include "PSPattern.hpp"
-#include "PSPreviewFilter.hpp"
+#include "PSPreviewHandler.hpp"
#include "PsSpecialHandler.hpp"
#include "SpecialActions.hpp"
#include "SVGElement.hpp"
@@ -47,7 +47,7 @@ string PsSpecialHandler::BITMAP_FORMAT;
bool PsSpecialHandler::EMBED_BITMAP_DATA = false;
-PsSpecialHandler::PsSpecialHandler () : _psi(this), _previewFilter(_psi)
+PsSpecialHandler::PsSpecialHandler () : _psi(this), _previewHandler(_psi)
{
_psi.setImageDevice(BITMAP_FORMAT);
}
@@ -123,9 +123,8 @@ void PsSpecialHandler::enterBodySection () {
// Check for information generated by preview.sty. If the tightpage options
// was set, don't execute the bop-hook but allow the PS filter to read
// the bbox data present at the beginning of the page.
- _psi.setFilter(&_previewFilter);
- _previewFilter.activate();
- if (!_previewFilter.tightpage())
+ _previewHandler.init();
+ if (!_previewHandler.tightpage())
_psi.execute("userdict/bop-hook known{bop-hook}if\n", false);
}
}
@@ -155,9 +154,7 @@ void PsSpecialHandler::executeAndSync (istream &is, bool updatePos) {
_actions->getColor().getRGB(r, g, b);
ostringstream oss;
oss << '\n' << r << ' ' << g << ' ' << b << " setrgbcolor ";
- PSFilter *filter = _psi.setFilter(nullptr); // don't apply any filters here
_psi.execute(oss.str(), false);
- _psi.setFilter(filter);
}
_psi.execute(is);
if (updatePos) {
@@ -540,14 +537,15 @@ void PsSpecialHandler::dviBeginPage (unsigned int pageno, SpecialActions &action
void PsSpecialHandler::dviEndPage (unsigned, SpecialActions &actions) {
+ _previewHandler.readDataFromStack();
BoundingBox bbox;
- if (_previewFilter.getBoundingBox(bbox)) { // is there any data written by preview package?
+ if (_previewHandler.getBoundingBox(bbox)) { // is there any data written by preview package?
double w=0, h=0, d=0;
if (actions.getBBoxFormatString() == "preview" || actions.getBBoxFormatString() == "min") {
if (actions.getBBoxFormatString() == "preview") {
- w = max(0.0, _previewFilter.width());
- h = max(0.0, _previewFilter.height());
- d = max(0.0, _previewFilter.depth());
+ w = max(0.0, _previewHandler.width());
+ h = max(0.0, _previewHandler.height());
+ d = max(0.0, _previewHandler.depth());
actions.bbox() = bbox;
Message::mstream() << "\napplying bounding box set by";
}
@@ -557,7 +555,7 @@ void PsSpecialHandler::dviEndPage (unsigned, SpecialActions &actions) {
d = max(0.0, actions.bbox().maxY());
Message::mstream() << "\ncomputing extents based on data set by";
}
- Message::mstream() << " preview package (version " << _previewFilter.version() << ")\n";
+ Message::mstream() << " preview package (version " << _previewHandler.version() << ")\n";
// apply page transformations to box extents
Matrix pagetrans = actions.getPageTransformation();
diff --git a/dviware/dvisvgm/src/PsSpecialHandler.hpp b/dviware/dvisvgm/src/PsSpecialHandler.hpp
index fb44e4bfa4..90285a2b0e 100644
--- a/dviware/dvisvgm/src/PsSpecialHandler.hpp
+++ b/dviware/dvisvgm/src/PsSpecialHandler.hpp
@@ -31,7 +31,7 @@
#include "PSInterpreter.hpp"
#include "Opacity.hpp"
#include "PSPattern.hpp"
-#include "PSPreviewFilter.hpp"
+#include "PSPreviewHandler.hpp"
#include "SpecialHandler.hpp"
class PSPattern;
@@ -97,7 +97,7 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions {
const char* name () const override {return handlerName();}
static const char* handlerName () {return "ps";}
std::vector<const char*> prefixes () const override;
- void setDviScaleFactor (double dvi2bp) override {_previewFilter.setDviScaleFactor(dvi2bp);}
+ void setDviScaleFactor (double dvi2bp) override {_previewHandler.setDviScaleFactor(dvi2bp);}
void enterBodySection ();
PSInterpreter& psInterpreter () {return _psi;}
@@ -180,7 +180,7 @@ class PsSpecialHandler : public SpecialHandler, protected PSActions {
PSInterpreter _psi;
PDFHandler _pdfHandler;
SpecialActions *_actions=nullptr;
- PSPreviewFilter _previewFilter; ///< filter to extract information generated by the preview package
+ PSPreviewHandler _previewHandler; ///< extracts information generated by the preview package
PsSection _psSection=PS_NONE; ///< current section processed (nothing yet, headers, or body specials)
XMLElement *_xmlnode=nullptr; ///< if != 0, created SVG elements are appended to this node
XMLElement *_savenode=nullptr; ///< pointer to temporaryly store _xmlnode
diff --git a/dviware/dvisvgm/src/SVGCharPathHandler.cpp b/dviware/dvisvgm/src/SVGCharPathHandler.cpp
index 2c753d2e5c..dc0c0724bb 100644
--- a/dviware/dvisvgm/src/SVGCharPathHandler.cpp
+++ b/dviware/dvisvgm/src/SVGCharPathHandler.cpp
@@ -95,7 +95,9 @@ void SVGCharPathHandler::appendChar (uint32_t c, double x, double y) {
// the exact location in vertical mode.
GlyphMetrics exact_metrics;
physicalFont->getExactGlyphBox(c, exact_metrics, false, nullptr);
- y += exact_metrics.h + (metrics.d - exact_metrics.h - exact_metrics.d) / 2;
+ double ed = max(0.0, exact_metrics.d);
+ double eh = max(0.0, exact_metrics.h);
+ y += eh + (metrics.d - eh - ed) / 2;
}
}
}
diff --git a/dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp b/dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp
index 28d9a64346..2cd59558b0 100644
--- a/dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp
+++ b/dviware/dvisvgm/src/optimizer/ClipPathReassigner.cpp
@@ -71,6 +71,7 @@ void ClipPathReassigner::execute (XMLElement *defs, XMLElement *context) {
}
// replace clip path references
vector<XMLElement*> descendants;
+ defs->getDescendants(nullptr, "clip-path", descendants);
context->getDescendants(nullptr, "clip-path", descendants);
for (auto &mapEntry : clipPathMap) {
vector<XMLElement*> &identicalClipPathElements = mapEntry.second;
diff --git a/dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp b/dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp
index 889e011571..1554dc9894 100644
--- a/dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp
+++ b/dviware/dvisvgm/src/optimizer/SVGOptimizer.cpp
@@ -21,6 +21,7 @@
#include <algorithm>
#include <array>
#include <map>
+#include <set>
#include "SVGOptimizer.hpp"
#include "../SVGTree.hpp"
@@ -30,7 +31,6 @@
#include "RedundantElementRemover.hpp"
#include "TextSimplifier.hpp"
#include "TransformSimplifier.hpp"
-#include "WSNodeRemover.hpp"
using namespace std;
@@ -51,23 +51,41 @@ SVGOptimizer::SVGOptimizer (SVGTree *svg) : _svg(svg) {
void SVGOptimizer::execute () {
if (!_svg || MODULE_SEQUENCE == "none")
return;
- if (MODULE_SEQUENCE.empty())
- MODULE_SEQUENCE = "remove-clippath"; // default behaviour of previous dvisvgm releases
+
+ vector<string> names = util::split(MODULE_SEQUENCE, ",", true);
+ set<string> removedNames;
+ if (names.empty())
+ names.emplace_back("remove-clippaths"); // default behaviour of previous dvisvgm releases
else {
- if (MODULE_SEQUENCE == "all") {
- for (const auto &entry: _moduleEntries)
- entry.module->execute(_svg->defsNode(), _svg->pageNode());
+ auto it = names.begin();
+ if (*it == "all" || (!it->empty() && it->at(0) == '-')) {
+ if (*it == "all")
+ it = names.erase(it);
+ // add names of all optimizer modules
+ for (const auto &moduleEntry : _moduleEntries) {
+ it = names.insert(it, moduleEntry.modname);
+ ++it;
+ }
+ }
+ }
+ // create sequence of module names to be considered
+ for (auto it=names.begin(); it != names.end();) {
+ if ((*it)[0] == '-') {
+ removedNames.insert(it->substr(1));
+ it = names.erase(it);
}
else {
- vector<string> names = util::split(MODULE_SEQUENCE, ",");
- auto it = find_if(names.begin(), names.end(), [](const string &name) {
- return name == "simplify-transform";
- });
- GroupCollapser::COMBINE_TRANSFORMS = (it != names.end());
- for (const string &name: names) {
- if (OptimizerModule *module = getModule(name))
- module->execute(_svg->defsNode(), _svg->pageNode());
- }
+ if ((*it)[0] == '+')
+ *it = it->substr(1);
+ ++it;
+ }
+ }
+ GroupCollapser::COMBINE_TRANSFORMS = (find(names.begin(), names.end(), "simplify-transform") != names.end());
+ // execute optimizer modules
+ for (const string &name: names) {
+ if (removedNames.find(name) == removedNames.end()) {
+ if (OptimizerModule *module = getModule(name))
+ module->execute(_svg->defsNode(), _svg->pageNode());
}
}
}
@@ -93,11 +111,13 @@ void SVGOptimizer::listModules (ostream &os) const {
* @return true if all names are known */
bool SVGOptimizer::checkModuleString (string &namestr, vector<string> &unknownNames) const {
unknownNames.clear();
- if (namestr.empty() || namestr == "all" || namestr == "none")
+ if (namestr.empty() || namestr == "none" || namestr == "all" || namestr.substr(0,4) == "all,")
return true;
vector<string> givenNames = util::split(namestr, ",");
- for (const string &name : givenNames) {
- if (!getModule(name))
+ for (string name : givenNames) {
+ if (name[0] == '-' || name[0] == '+')
+ name = name.substr(1);
+ if (!name.empty() && !getModule(name))
unknownNames.emplace_back(name);
}
return unknownNames.empty();
diff --git a/dviware/dvisvgm/src/options.xml b/dviware/dvisvgm/src/options.xml
index bd7867970f..70fafe4c37 100644
--- a/dviware/dvisvgm/src/options.xml
+++ b/dviware/dvisvgm/src/options.xml
@@ -21,197 +21,197 @@
<!DOCTYPE cmdline SYSTEM "options.dtd">
<cmdline class="CommandLine">
- <program>
- <usage>[options] dvifile</usage>
- <usage>--eps [options] epsfile</usage>
- <usage>--pdf [options] pdffile</usage>
- <description>This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG.</description>
- <copyright>Copyright (C) 2005-2023 Martin Gieseking &lt;martin.gieseking@uos.de></copyright>
- </program>
- <options>
- <section title="Input options">
- <option long="page" short="p">
- <arg type="string" name="ranges" default="1"/>
- <description>choose page(s) to convert</description>
- </option>
- <option long="fontmap" short="m">
- <arg type="string" name="filenames"/>
- <description>evaluate (additional) font map files</description>
- </option>
- <option long="eps" short="E" if="!defined(DISABLE_GS)">
- <description>convert EPS file to SVG</description>
- </option>
- <option long="pdf" short="P" if="!defined(DISABLE_GS)">
- <description>convert PDF file to SVG</description>
- </option>
- <option long="stdin">
- <description>read input file from stdin</description>
- </option>
- </section>
- <section title="SVG output options">
- <option long="bbox" short="b">
- <arg type="string" name="size" default="min"/>
- <description>set size of bounding box</description>
- </option>
- <option long="bitmap-format" short="B" if="!defined(DISABLE_GS)">
- <arg type="string" name="fmt" default="jpeg"/>
- <description>set format used to embed PS/EPS bitmaps</description>
- </option>
- <option long="clipjoin" short="j" if="!defined(DISABLE_GS)">
- <description>compute intersection of clipping paths</description>
- </option>
- <option long="colornames">
- <description>prefer color names to RGB values if possible</description>
- </option>
- <option long="comments">
- <description>add comments with additional information</description>
- </option>
- <option long="currentcolor">
- <arg type="string" name="color" default="#000" optional="yes"/>
- <description>replace given color with 'currentColor'</description>
- </option>
- <option long="embed-bitmaps">
- <description>prevent references to external bitmap files</description>
- </option>
- <option long="font-format" short="f" if="!defined(DISABLE_WOFF)">
- <arg type="string" name="format" default="svg"/>
- <description>set file format of embedded fonts</description>
- </option>
- <option long="grad-overlap" if="!defined(DISABLE_GS)">
- <description>create overlapping color gradient segments</description>
- </option>
- <option long="grad-segments" if="!defined(DISABLE_GS)">
- <arg type="int" name="number" default="20"/>
- <description>number of color gradient segments per row</description>
- </option>
- <option long="grad-simplify" if="!defined(DISABLE_GS)">
- <arg type="double" name="delta" default="0.05"/>
- <description>reduce level of detail for small segments</description>
- </option>
- <option long="linkmark" short="L">
- <arg type="string" name="style" default="box"/>
- <description>select how to mark hyperlinked areas</description>
- </option>
- <option long="optimize" short="O">
- <arg name="modules" type="string" default="all" optional="yes"/>
- <description>perform several SVG optimizations</description>
- </option>
- <option long="output" short="o">
- <arg type="string" name="pattern"/>
- <description>set name pattern of output files</description>
- </option>
- <option long="precision" short="d">
- <arg type="int" name="number" default="0"/>
- <description>set number of decimal points (0-6)</description>
- </option>
- <option long="relative" short="R">
- <description>create relative path commands</description>
- </option>
- <option long="stdout" short="s">
- <description>write SVG output to stdout</description>
- </option>
- <option long="tmpdir">
- <arg type="string" name="path" optional="yes"/>
- <description>set/print the directory for temporary files</description>
- </option>
- <option long="no-fonts" short="n">
- <arg type="int" name="variant" default="0" optional="yes"/>
- <description>draw glyphs by using path elements</description>
- </option>
- <option long="no-merge">
- <description>don't merge adjacent text elements</description>
- </option>
- <option long="no-styles">
- <description>don't use CSS styles to reference fonts</description>
- </option>
- <option long="zip" short="z">
- <arg type="int" name="level" default="9" optional="yes"/>
- <description>create compressed .svgz file</description>
- </option>
- </section>
- <section title="SVG transformations">
- <option long="rotate" short="r">
- <arg type="double" name="angle"/>
- <description>rotate page content clockwise</description>
- </option>
- <option long="scale" short="c">
- <arg type="string" name="sx[,sy]"/>
- <description>scale page content</description>
- </option>
- <option long="translate" short="t">
- <arg type="string" name="tx[,ty]"/>
- <description>shift page content</description>
- </option>
- <option long="transform" short="T">
- <arg type="string" name="commands"/>
- <description>transform page content</description>
- </option>
- <option long="zoom" short="Z">
- <arg type="double" name="factor" default="1.0"/>
- <description>zoom page content</description>
- </option>
- </section>
- <section title="Processing options">
- <option long="cache" short="C">
- <arg type="string" name="dir" optional="yes"/>
- <description>set/print path of cache directory</description>
- </option>
- <option long="debug-glyphs" if="defined(TTFDEBUG)">
- <description>create PS files for all glyphs converted to TTF</description>
- </option>
- <option long="exact-bbox" short="e">
- <description>compute exact glyph bounding boxes</description>
- </option>
- <option long="keep">
- <description>keep temporary files</description>
- </option>
- <option long="libgs" if="!defined(HAVE_LIBGS) &amp;&amp; !defined(DISABLE_GS)">
- <arg name="filename" type="string"/>
- <description>set name of Ghostscript shared library</description>
- </option>
- <option long="mag" short="M">
- <arg type="double" name="factor" default="4"/>
- <description>magnification of Metafont output</description>
- </option>
- <option long="no-mktexmf">
- <description>don't try to create missing fonts</description>
- </option>
- <option long="no-specials" short="S">
- <arg type="string" name="prefixes" optional="yes"/>
- <description>don't process [selected] specials</description>
- </option>
- <option long="page-hashes" short="H">
- <arg type="string" name="params" optional="yes" default="xxh64"/>
- <description>activate usage of page hashes</description>
- </option>
- <option long="trace-all" short="a">
- <arg name="retrace" type="bool" optional="yes" default="false"/>
- <description>trace all glyphs of bitmap fonts</description>
- </option>
- </section>
- <section title="Message options">
- <option long="color">
- <description>colorize messages</description>
- </option>
- <option long="help" short="h">
- <arg name="mode" type="int" optional="yes" default="0"/>
- <description>print this summary of options and exit</description>
- </option>
- <option long="list-specials" short="l">
- <description>print supported special sets and exit</description>
- </option>
- <option long="progress">
- <arg name="delay" type="double" optional="yes" default="0.5"/>
- <description>enable progress indicator</description>
- </option>
- <option long="verbosity" short="v">
- <arg type="unsigned" name="level" default="7"/>
- <description>set verbosity level (0-7)</description>
- </option>
- <option long="version" short="V">
- <arg type="bool" name="extended" optional="yes" default="false"/>
- <description>print version and exit</description>
- </option>
- </section>
- </options>
+ <program>
+ <usage>[options] dvifile</usage>
+ <usage>--eps [options] epsfile</usage>
+ <usage>--pdf [options] pdffile</usage>
+ <description>This program converts DVI files, as created by TeX/LaTeX, as well as\nEPS and PDF files to the XML-based scalable vector graphics format SVG.</description>
+ <copyright>Copyright (C) 2005-2023 Martin Gieseking &lt;martin.gieseking@uos.de></copyright>
+ </program>
+ <options>
+ <section title="Input options">
+ <option long="page" short="p">
+ <arg type="string" name="ranges" default="1"/>
+ <description>choose page(s) to convert</description>
+ </option>
+ <option long="fontmap" short="m">
+ <arg type="string" name="filenames"/>
+ <description>evaluate (additional) font map files</description>
+ </option>
+ <option long="eps" short="E" if="!defined(DISABLE_GS)">
+ <description>convert EPS file to SVG</description>
+ </option>
+ <option long="pdf" short="P" if="!defined(DISABLE_GS)">
+ <description>convert PDF file to SVG</description>
+ </option>
+ <option long="stdin">
+ <description>read input file from stdin</description>
+ </option>
+ </section>
+ <section title="SVG output options">
+ <option long="bbox" short="b">
+ <arg type="string" name="size" default="min"/>
+ <description>set size of bounding box</description>
+ </option>
+ <option long="bitmap-format" short="B" if="!defined(DISABLE_GS)">
+ <arg type="string" name="fmt" default="jpeg"/>
+ <description>set format used to embed PS/EPS bitmaps</description>
+ </option>
+ <option long="clipjoin" short="j" if="!defined(DISABLE_GS)">
+ <description>compute intersection of clipping paths</description>
+ </option>
+ <option long="colornames">
+ <description>prefer color names to RGB values if possible</description>
+ </option>
+ <option long="comments">
+ <description>add comments with additional information</description>
+ </option>
+ <option long="currentcolor">
+ <arg type="string" name="color" default="#000" optional="yes"/>
+ <description>replace given color with 'currentColor'</description>
+ </option>
+ <option long="embed-bitmaps">
+ <description>prevent references to external bitmap files</description>
+ </option>
+ <option long="font-format" short="f" if="!defined(DISABLE_WOFF)">
+ <arg type="string" name="format" default="svg"/>
+ <description>set file format of embedded fonts</description>
+ </option>
+ <option long="grad-overlap" if="!defined(DISABLE_GS)">
+ <description>create overlapping color gradient segments</description>
+ </option>
+ <option long="grad-segments" if="!defined(DISABLE_GS)">
+ <arg type="int" name="number" default="20"/>
+ <description>number of color gradient segments per row</description>
+ </option>
+ <option long="grad-simplify" if="!defined(DISABLE_GS)">
+ <arg type="double" name="delta" default="0.05"/>
+ <description>reduce level of detail for small segments</description>
+ </option>
+ <option long="linkmark" short="L">
+ <arg type="string" name="style" default="box"/>
+ <description>select how to mark hyperlinked areas</description>
+ </option>
+ <option long="optimize" short="O">
+ <arg name="modules" type="string" default="all" optional="yes"/>
+ <description>perform several SVG optimizations</description>
+ </option>
+ <option long="output" short="o">
+ <arg type="string" name="pattern"/>
+ <description>set name pattern of output files</description>
+ </option>
+ <option long="precision" short="d">
+ <arg type="int" name="number" default="0"/>
+ <description>set number of decimal points (0-6)</description>
+ </option>
+ <option long="relative" short="R">
+ <description>create relative path commands</description>
+ </option>
+ <option long="stdout" short="s">
+ <description>write SVG output to stdout</description>
+ </option>
+ <option long="tmpdir">
+ <arg type="string" name="path" optional="yes"/>
+ <description>set/print the directory for temporary files</description>
+ </option>
+ <option long="no-fonts" short="n">
+ <arg type="int" name="variant" default="0" optional="yes"/>
+ <description>draw glyphs by using path elements</description>
+ </option>
+ <option long="no-merge">
+ <description>don't merge adjacent text elements</description>
+ </option>
+ <option long="no-styles">
+ <description>don't use CSS styles to reference fonts</description>
+ </option>
+ <option long="zip" short="z">
+ <arg type="int" name="level" default="9" optional="yes"/>
+ <description>create compressed .svgz file</description>
+ </option>
+ </section>
+ <section title="SVG transformations">
+ <option long="rotate" short="r">
+ <arg type="double" name="angle"/>
+ <description>rotate page content clockwise</description>
+ </option>
+ <option long="scale" short="c">
+ <arg type="string" name="sx[,sy]"/>
+ <description>scale page content</description>
+ </option>
+ <option long="translate" short="t">
+ <arg type="string" name="tx[,ty]"/>
+ <description>shift page content</description>
+ </option>
+ <option long="transform" short="T">
+ <arg type="string" name="commands"/>
+ <description>transform page content</description>
+ </option>
+ <option long="zoom" short="Z">
+ <arg type="double" name="factor" default="1.0"/>
+ <description>zoom page content</description>
+ </option>
+ </section>
+ <section title="Processing options">
+ <option long="cache" short="C">
+ <arg type="string" name="dir" optional="yes"/>
+ <description>set/print path of cache directory</description>
+ </option>
+ <option long="debug-glyphs" if="defined(TTFDEBUG)">
+ <description>create PS files for all glyphs converted to TTF</description>
+ </option>
+ <option long="exact-bbox" short="e">
+ <description>compute exact glyph bounding boxes</description>
+ </option>
+ <option long="keep">
+ <description>keep temporary files</description>
+ </option>
+ <option long="libgs" if="!defined(HAVE_LIBGS) &amp;&amp; !defined(DISABLE_GS)">
+ <arg name="filename" type="string"/>
+ <description>set name of Ghostscript shared library</description>
+ </option>
+ <option long="mag" short="M">
+ <arg type="double" name="factor" default="4"/>
+ <description>magnification of Metafont output</description>
+ </option>
+ <option long="no-mktexmf">
+ <description>don't try to create missing fonts</description>
+ </option>
+ <option long="no-specials" short="S">
+ <arg type="string" name="prefixes" optional="yes"/>
+ <description>don't process [selected] specials</description>
+ </option>
+ <option long="page-hashes" short="H">
+ <arg type="string" name="params" optional="yes" default="xxh64"/>
+ <description>activate usage of page hashes</description>
+ </option>
+ <option long="trace-all" short="a">
+ <arg name="retrace" type="bool" optional="yes" default="false"/>
+ <description>trace all glyphs of bitmap fonts</description>
+ </option>
+ </section>
+ <section title="Message options">
+ <option long="color">
+ <description>colorize messages</description>
+ </option>
+ <option long="help" short="h">
+ <arg name="mode" type="int" optional="yes" default="0"/>
+ <description>print this summary of options and exit</description>
+ </option>
+ <option long="list-specials" short="l">
+ <description>print supported special sets and exit</description>
+ </option>
+ <option long="progress">
+ <arg name="delay" type="double" optional="yes" default="0.5"/>
+ <description>enable progress indicator</description>
+ </option>
+ <option long="verbosity" short="v">
+ <arg type="unsigned" name="level" default="7"/>
+ <description>set verbosity level (0-7)</description>
+ </option>
+ <option long="version" short="V">
+ <arg type="bool" name="extended" optional="yes" default="false"/>
+ <description>print version and exit</description>
+ </option>
+ </section>
+ </options>
</cmdline>
diff --git a/dviware/dvisvgm/src/psdefs.cpp b/dviware/dvisvgm/src/psdefs.cpp
index e3a8372671..fdbdabba41 100644
--- a/dviware/dvisvgm/src/psdefs.cpp
+++ b/dviware/dvisvgm/src/psdefs.cpp
@@ -35,131 +35,130 @@ const char *PSInterpreter::PSDEFS =
"tshapealpha known not{@SD/.setshapealpha{pop}put}if @SD/.setblendmode known no"
"t{@SD/.setblendmode{pop}put}if @SD/prseq{-1 1{-1 roll =only( )print}for(\\n)pr"
"int}put @SD/prcmd{( )exch(\\ndvi.)3{print}repeat prseq}put @SD/cvxall{{cvx}for"
-"all}put @SD/defpr{[exch[/copy @SD]cvxall 5 -1 roll dup 6 1 roll[/get/exec]cvxa"
-"ll 6 -1 roll dup 7 1 roll 4 -1 roll dup 5 1 roll dup length string cvs/prcmd c"
-"vx]cvx def}put @SD/querypos{{currentpoint}stopped{$error/newerror false put}{2"
-"(querypos)prcmd}ifelse}put @SD/applyscalevals{1 0 dtransform exch dup mul exch"
-" dup mul add sqrt 0 1 dtransform exch dup mul exch dup mul add sqrt 1 0 dtrans"
-"form dup mul exch dup dup mul 3 -1 roll add dup 0 eq{pop}{sqrt div}ifelse 3(ap"
-"plyscalevals)prcmd}put @SD/prpath{{2(moveto)prcmd}{2(lineto)prcmd}{6(curveto)p"
-"rcmd}{0(closepath)prcmd}pathforall}put @SD/nulldevice{@GD/@nulldev true put :n"
-"ulldevice 1 1(setnulldevice)prcmd}put @SD/charpath{/@dodraw false store :charp"
-"ath/@dodraw true store}put @SD/stringwidth{/@dodraw false store :stringwidth/@"
-"dodraw true store}put @SD/show{@dodraw @GD/@nulldev get not and{dup :gsave cur"
-"rentpoint 2{50 mul exch}repeat :newpath moveto 50 50/scale sysexec true charpa"
-"th fill :grestore/@dodraw false store :show/@dodraw true store}{:show}ifelse}p"
-"ut @SD/varxyshow{dup 0 ge{<</chr 3 -1 roll string/prc 5 -1 roll/arr 7 -1 roll/"
-"str 9 -1 roll/idx 0>>begin 0 chr length str length 1 sub{str exch chr length g"
-"etinterval/chr exch store :gsave chr show :grestore currentpoint prc moveto/id"
-"x idx 1 add store}for end}{pop pop show}ifelse}put @SD/xyshow{dup dup type/arr"
-"aytype eq exch length 0 gt and{dup length 2 idiv 2 index length exch idiv}{-1}"
-"ifelse{exch arr idx 2 mul get add exch arr idx 2 mul 1 add get add}exch varxys"
-"how}put @SD/xshow{dup dup type/arraytype eq exch length 0 gt and{dup length 2 "
-"index length exch idiv}{-1}ifelse{exch arr idx get add exch}exch varxyshow}put"
-" @SD/yshow{dup dup type/arraytype eq exch length 0 gt and{dup length 2 index l"
-"ength exch idiv}{-1}ifelse{arr idx get add}exch varxyshow}put @SD/awidthshow{{"
-"1 string dup 0 5 index put :gsave show :grestore pop 0 rmoveto 3 index eq{4 in"
-"dex 4 index rmoveto}if 1 index 1 index rmoveto}exch cshow 5{pop}repeat}put @SD"
-"/widthshow{0 0 3 -1 roll awidthshow}put @SD/ashow{0 0 0 6 3 roll awidthshow}pu"
-"t @SD/newpath{:newpath 1 1(newpath)prcmd}put @SD/stroke{@dodraw @GD/@nulldev g"
-"et not and{prcolor 0 1(newpath)prcmd prpath 0(stroke)prcmd :newpath}{:stroke}i"
-"felse}put @SD/fill{@dodraw @GD/@nulldev get not and{prcolor 0 1(newpath)prcmd "
-"prpath 0(fill)prcmd :newpath}{:fill}ifelse}put @SD/eofill{@dodraw @GD/@nulldev"
-" get not and{prcolor 0 1(newpath)prcmd prpath 0(eofill)prcmd :newpath}{:eofill"
-"}ifelse}put/.fillstroke{:gsave fill :grestore .swapcolors stroke .swapcolors}b"
-"ind def/.eofillstroke{:gsave eofill :grestore .swapcolors stroke .swapcolors}b"
-"ind def @SD/clip{:clip @GD/@nulldev get not{0 1(newpath)prcmd prpath 0(clip)pr"
-"cmd}if}put @SD/eoclip{:eoclip @GD/@nulldev get not{0 1(newpath)prcmd prpath 0("
-"eoclip)prcmd}if}put @SD/shfill{begin currentdict/ShadingType known currentdict"
-"/ColorSpace known and currentdict/DataSource known and currentdict/Function kn"
-"own not and ShadingType 4 ge{DataSource type/arraytype eq{<</DeviceGray 1/Devi"
-"ceRGB 3/DeviceCMYK 4/bgknown currentdict/Background known/bbknown currentdict/"
-"BBox known>>begin currentdict ColorSpace known{ShadingType ColorSpace load bgk"
-"nown{1 Background aload pop}{0}ifelse bbknown{1 BBox aload pop}{0}ifelse Shadi"
-"ngType 5 eq{VerticesPerRow}if DataSource aload length 4 add bgknown{ColorSpace"
-" load add}if bbknown{4 add}if ShadingType 5 eq{1 add}if(shfill)prcmd}if end}if"
-"}if end}put @SD/image{dup type/dicttype eq{dup}{<</Width 6 index/Height 7 inde"
-"x/colorimg false>>}ifelse @execimg}put @SD/colorimage{<<2 index{/Width 2 index"
-" 8 add index/Height 4 index 9 add index}{/Width 8 index/Height 9 index}ifelse/"
-"colorimg true>>@execimg}put/@imgbase(./)def/@imgdevice(jpeg)def/@execimg{@GD/@"
-"imgcnt 2 copy .knownget{1 add}{1}ifelse put begin<</imgdev null/imgid @GD/@img"
-"cnt get/ispng @imgdevice 0 3 getinterval(png)eq dup/suffix exch{(.png)}{(.jpg)"
-"}ifelse/colorimg currentdict/colorimg .knownget dup{pop}if/colordev 1 index cu"
-"rrentcolorspace dup length 1 ne exch 0 get/DeviceGray ne or or>>begin @imgdevi"
-"ce(png)ne @imgdevice(jpeg)ne and{@imgdevice cvn}{colordev{ispng{/png16m}{/jpeg"
-"}ifelse}{ispng{/pnggray}{/jpeggray}ifelse}ifelse}ifelse dup devicedict exch kn"
-"own{:gsave/imgdev exch finddevice def mark/OutputFile @imgbase imgid 20 string"
-" cvs strconcat suffix strconcat/PageSize[Width Height]/UseFastColor true ispng"
-"{@imgdevice(pngmonod)eq{/MinFeatureSize where{pop/MinFeatureSize MinFeatureSiz"
-"e}if}if}{/JPEGQ where{pop/JPEGQ JPEGQ}if}ifelse imgdev putdeviceprops setdevic"
-"e[Width 0 0 Height neg 0 Height]/setmatrix sysexec colorimg{:colorimage}{:imag"
-"e}ifelse/copypage sysexec mark/OutputFile()imgdev putdeviceprops pop :grestore"
-" imgid Width Height 3(image)prcmd}{pop colorimg{:colorimage}{:image}ifelse}ife"
-"lse end end}def/@rect{4 -2 roll moveto exch dup 0 rlineto exch 0 exch rlineto "
-"neg 0 rlineto closepath}bind def/@rectcc{4 -2 roll moveto 2 copy 0 lt exch 0 l"
-"t xor{dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto}{exch dup 0 rlineto"
-" exch 0 exch rlineto neg 0 rlineto}ifelse closepath}bind def @SD/rectclip{:new"
-"path dup type/arraytype eq{aload length 4 idiv{@rectcc}repeat}{@rectcc}ifelse "
-"clip :newpath}put @SD/rectfill{:gsave :newpath dup type/arraytype eq{aload len"
-"gth 4 idiv{@rectcc}repeat}{@rectcc}ifelse fill :grestore}put @SD/rectstroke{gs"
-"ave :newpath dup type/arraytype eq{aload length 4 idiv{@rect}repeat}{@rect}ife"
-"lse stroke grestore}put false setglobal @SD readonly pop/initclip 0 defpr/clip"
-"path 0 defpr/sysexec{@SD exch get exec}def/adddot{dup length 1 add string dup "
-"0 46 put dup 3 -1 roll 1 exch putinterval}def/setlinewidth{dup/setlinewidth sy"
-"sexec 1(setlinewidth)prcmd}def/setlinecap 1 defpr/setlinejoin 1 defpr/setmiter"
-"limit 1 defpr/setdash{mark 3 1 roll 2 copy/setdash sysexec exch aload length 1"
-" add -1 roll counttomark(setdash)prcmd pop}def/@setpagedevice{pop<<>>/setpaged"
-"evice sysexec matrix setmatrix newpath 0(setpagedevice)prcmd}def/@checknulldev"
-"{@GD/@nulldev get{currentpagedevice maxlength 0 ne{@GD/@nulldev false put 0 1("
-"setnulldevice)prcmd}if}if}def/prcolor{currentcolorspace @setcolorspace current"
-"rgbcolor 3(setrgbcolor)prcmd}def/printgstate{@dodraw @GD/@nulldev get not and{"
-"matrix currentmatrix aload pop 6(setmatrix)prcmd applyscalevals currentlinewid"
-"th 1(setlinewidth)prcmd currentlinecap 1(setlinecap)prcmd currentlinejoin 1(se"
-"tlinejoin)prcmd currentmiterlimit 1(setmiterlimit)prcmd revision dup 952 lt{po"
-"p}{.currentblendmode .setblendmode 952 eq{.currentopacityalpha .setopacityalph"
-"a .currentshapealpha .setshapealpha}{.currentalphaisshape{1}{0}ifelse 1(setalp"
-"haisshape)prcmd .currentstrokeconstantalpha 1(setstrokeconstantalpha)prcmd .cu"
-"rrentfillconstantalpha 1(setfillconstantalpha)prcmd}ifelse}ifelse prcolor curr"
-"entdash mark 3 1 roll exch aload length 1 add -1 roll counttomark(setdash)prcm"
-"d pop}if}def/strconcat{exch dup length 2 index length add string dup dup 4 2 r"
-"oll copy length 4 -1 roll putinterval}def/setgstate{/setgstate sysexec printgs"
-"tate}def/save{@UD begin/@saveID vmstatus pop pop def end :save @saveID 1(save)"
-"prcmd}def/restore{:restore @checknulldev printgstate @UD/@saveID known{@UD beg"
-"in @saveID end}{0}ifelse 1(restore)prcmd}def/gsave 0 defpr/grestore{:grestore "
-"@checknulldev printgstate 0(grestore)prcmd}def/grestoreall{:grestoreall @check"
-"nulldev setstate 0(grestoreall)prcmd}def/rotate{dup type/arraytype ne @dodraw "
-"and{dup 1(rotate)prcmd}if/rotate sysexec applyscalevals}def/scale{dup type/arr"
-"aytype ne @dodraw and{2 copy 2(scale)prcmd}if/scale sysexec applyscalevals}def"
-"/translate{dup type/arraytype ne @dodraw and{2 copy 2(translate)prcmd}if/trans"
-"late sysexec}def/setmatrix{dup/setmatrix sysexec @dodraw{aload pop 6(setmatrix"
-")prcmd applyscalevals}{pop}ifelse}def/initmatrix{matrix setmatrix}def/concat{m"
-"atrix currentmatrix matrix concatmatrix setmatrix}def/makepattern{gsave<</mx 3"
-" -1 roll>>begin<</XUID[1000000 @patcnt]>>copy mx/makepattern sysexec dup begin"
-" PatternType 2 lt{PatternType @patcnt BBox aload pop XStep YStep PaintType mx "
-"aload pop 15(makepattern)prcmd :newpath matrix setmatrix dup PaintProc 0 1(mak"
-"epattern)prcmd @GD/@patcnt @patcnt 1 add put}if end end grestore}def/setpatter"
-"n{dup begin PatternType end 1 eq{begin PaintType 1 eq{XUID aload pop exch pop "
-"1}{:gsave[currentcolorspace aload length -1 roll pop]/setcolorspace sysexec/se"
-"tcolor sysexec XUID aload pop exch pop currentrgbcolor :grestore 4}ifelse(setp"
-"attern)prcmd currentcolorspace 0 get/Pattern ne{[/Pattern currentcolorspace]/s"
-"etcolorspace sysexec}if currentcolorspace @setcolorspace end}{/setpattern syse"
-"xec}ifelse}def/setcolor{dup type/dicttype eq{setpattern}{/setcolor sysexec/cur"
-"rentrgbcolor sysexec setrgbcolor}ifelse}def/setcolorspace{dup/setcolorspace sy"
-"sexec @setcolorspace}def/@setcolorspace{dup type/arraytype eq{0 get}if/Pattern"
-" eq{1}{0}ifelse 1(setcolorspace)prcmd}def/setgray 1 defpr/setcmykcolor 4 defpr"
-"/sethsbcolor 3 defpr/setrgbcolor 3 defpr/.setalphaisshape{@SD/.setalphaisshape"
-" known{dup/.setalphaisshape sysexec}if{1}{0}ifelse 1(setalphaisshape)prcmd}bin"
-"d def/.setfillconstantalpha{@SD/.setfillconstantalpha known{dup/.setfillconsta"
-"ntalpha sysexec}if 1(setfillconstantalpha)prcmd}bind def/.setstrokeconstantalp"
-"ha{@SD/.setstrokeconstantalpha known{dup/.setstrokeconstantalpha sysexec}if 1("
-"setstrokeconstantalpha)prcmd}bind def/.setopacityalpha{false .setalphaisshape "
-"dup .setfillconstantalpha .setstrokeconstantalpha}bind def/.setshapealpha{true"
-" .setalphaisshape dup .setfillconstantalpha .setstrokeconstantalpha}bind def/."
-"setblendmode{dup/.setblendmode sysexec<</Normal 0/Compatible 0/Multiply 1/Scre"
-"en 2/Overlay 3/SoftLight 4/HardLight 5/ColorDodge 6/ColorBurn 7/Darken 8/Light"
-"en 9/Difference 10/Exclusion 11/Hue 12/Saturation 13/Color 14/Luminosity 15/Co"
-"mpatibleOverprint 16>>exch get 1(setblendmode)prcmd}def/@pdfpagecount{(r)file "
-"runpdfbegin pdfpagecount runpdfend}def/@pdfpagebox{(r)file runpdfbegin dup dup"
-" 1 lt exch pdfpagecount gt or{pop}{pdfgetpage/MediaBox pget pop aload pop}ifel"
-"se runpdfend}def DELAYBIND{.bindnow}if ";
+"all}put @SD/defpr{[exch/copy cvx @SD 4 index[/get/exec]cvxall 5 index 3 index "
+"dup length string cvs/prcmd cvx]cvx bind def}put @SD/querypos{{currentpoint}st"
+"opped{$error/newerror false put}{2(querypos)prcmd}ifelse}put @SD/applyscaleval"
+"s{1 0 dtransform exch dup mul exch dup mul add sqrt 0 1 dtransform exch dup mu"
+"l exch dup mul add sqrt 1 0 dtransform dup mul exch dup dup mul 3 -1 roll add "
+"dup 0 eq{pop}{sqrt div}ifelse 3(applyscalevals)prcmd}put @SD/prpath{{2(moveto)"
+"prcmd}{2(lineto)prcmd}{6(curveto)prcmd}{0(closepath)prcmd}pathforall}put @SD/n"
+"ulldevice{@GD/@nulldev true put :nulldevice 1 1(setnulldevice)prcmd}put @SD/ch"
+"arpath{/@dodraw false store :charpath/@dodraw true store}put @SD/stringwidth{/"
+"@dodraw false store :stringwidth/@dodraw true store}put @SD/show{@dodraw @GD/@"
+"nulldev get not and{dup :gsave currentpoint 2{50 mul exch}repeat :newpath move"
+"to 50 50/scale sysexec true charpath fill :grestore/@dodraw false store :show/"
+"@dodraw true store}{:show}ifelse}put @SD/varxyshow{dup 0 ge{<</chr 3 -1 roll s"
+"tring/prc 5 -1 roll/arr 7 -1 roll/str 9 -1 roll/idx 0>>begin 0 chr length str "
+"length 1 sub{str exch chr length getinterval/chr exch store :gsave chr show :g"
+"restore currentpoint prc moveto/idx idx 1 add store}for end}{pop pop show}ifel"
+"se}put @SD/xyshow{dup dup type/arraytype eq exch length 0 gt and{dup length 2 "
+"idiv 2 index length exch idiv}{-1}ifelse{exch arr idx 2 mul get add exch arr i"
+"dx 2 mul 1 add get add}exch varxyshow}put @SD/xshow{dup dup type/arraytype eq "
+"exch length 0 gt and{dup length 2 index length exch idiv}{-1}ifelse{exch arr i"
+"dx get add exch}exch varxyshow}put @SD/yshow{dup dup type/arraytype eq exch le"
+"ngth 0 gt and{dup length 2 index length exch idiv}{-1}ifelse{arr idx get add}e"
+"xch varxyshow}put @SD/awidthshow{{1 string dup 0 5 index put :gsave show :gres"
+"tore pop 0 rmoveto 3 index eq{4 index 4 index rmoveto}if 1 index 1 index rmove"
+"to}exch cshow 5{pop}repeat}put @SD/widthshow{0 0 3 -1 roll awidthshow}put @SD/"
+"ashow{0 0 0 6 3 roll awidthshow}put @SD/newpath{:newpath 1 1(newpath)prcmd}put"
+" @SD/stroke{@dodraw @GD/@nulldev get not and{prcolor 0 1(newpath)prcmd prpath "
+"0(stroke)prcmd :newpath}{:stroke}ifelse}put @SD/fill{@dodraw @GD/@nulldev get "
+"not and{prcolor 0 1(newpath)prcmd prpath 0(fill)prcmd :newpath}{:fill}ifelse}p"
+"ut @SD/eofill{@dodraw @GD/@nulldev get not and{prcolor 0 1(newpath)prcmd prpat"
+"h 0(eofill)prcmd :newpath}{:eofill}ifelse}put/.fillstroke{:gsave fill :grestor"
+"e .swapcolors stroke .swapcolors}bind def/.eofillstroke{:gsave eofill :grestor"
+"e .swapcolors stroke .swapcolors}bind def @SD/clip{:clip @GD/@nulldev get not{"
+"0 1(newpath)prcmd prpath 0(clip)prcmd}if}put @SD/eoclip{:eoclip @GD/@nulldev g"
+"et not{0 1(newpath)prcmd prpath 0(eoclip)prcmd}if}put @SD/shfill{begin current"
+"dict/ShadingType known currentdict/ColorSpace known and currentdict/DataSource"
+" known and currentdict/Function known not and ShadingType 4 ge{DataSource type"
+"/arraytype eq{<</DeviceGray 1/DeviceRGB 3/DeviceCMYK 4/bgknown currentdict/Bac"
+"kground known/bbknown currentdict/BBox known>>begin currentdict ColorSpace kno"
+"wn{ShadingType ColorSpace load bgknown{1 Background aload pop}{0}ifelse bbknow"
+"n{1 BBox aload pop}{0}ifelse ShadingType 5 eq{VerticesPerRow}if DataSource alo"
+"ad length 4 add bgknown{ColorSpace load add}if bbknown{4 add}if ShadingType 5 "
+"eq{1 add}if(shfill)prcmd}if end}if}if end}put @SD/image{dup type/dicttype eq{d"
+"up}{<</Width 6 index/Height 7 index/colorimg false>>}ifelse @execimg}put @SD/c"
+"olorimage{<<2 index{/Width 2 index 8 add index/Height 4 index 9 add index}{/Wi"
+"dth 8 index/Height 9 index}ifelse/colorimg true>>@execimg}put/@imgbase(./)def/"
+"@imgdevice(jpeg)def/@execimg{@GD/@imgcnt 2 copy .knownget{1 add}{1}ifelse put "
+"begin<</imgdev null/imgid @GD/@imgcnt get/ispng @imgdevice 0 3 getinterval(png"
+")eq dup/suffix exch{(.png)}{(.jpg)}ifelse/colorimg currentdict/colorimg .known"
+"get dup{pop}if/colordev 1 index currentcolorspace dup length 1 ne exch 0 get/D"
+"eviceGray ne or or>>begin @imgdevice(png)ne @imgdevice(jpeg)ne and{@imgdevice "
+"cvn}{colordev{ispng{/png16m}{/jpeg}ifelse}{ispng{/pnggray}{/jpeggray}ifelse}if"
+"else}ifelse dup devicedict exch known{:gsave/imgdev exch finddevice def mark/O"
+"utputFile @imgbase imgid 20 string cvs strconcat suffix strconcat/PageSize[Wid"
+"th Height]/UseFastColor true ispng{@imgdevice(pngmonod)eq{/MinFeatureSize wher"
+"e{pop/MinFeatureSize MinFeatureSize}if}if}{/JPEGQ where{pop/JPEGQ JPEGQ}if}ife"
+"lse imgdev putdeviceprops setdevice[Width 0 0 Height neg 0 Height]/setmatrix s"
+"ysexec colorimg{:colorimage}{:image}ifelse/copypage sysexec mark/OutputFile()i"
+"mgdev putdeviceprops pop :grestore imgid Width Height 3(image)prcmd}{pop color"
+"img{:colorimage}{:image}ifelse}ifelse end end}def/@rect{4 -2 roll moveto exch "
+"dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def/@rectcc{4 -"
+"2 roll moveto 2 copy 0 lt exch 0 lt xor{dup 0 exch rlineto exch 0 rlineto neg "
+"0 exch rlineto}{exch dup 0 rlineto exch 0 exch rlineto neg 0 rlineto}ifelse cl"
+"osepath}bind def @SD/rectclip{:newpath dup type/arraytype eq{aload length 4 id"
+"iv{@rectcc}repeat}{@rectcc}ifelse clip :newpath}put @SD/rectfill{:gsave :newpa"
+"th dup type/arraytype eq{aload length 4 idiv{@rectcc}repeat}{@rectcc}ifelse fi"
+"ll :grestore}put @SD/rectstroke{gsave :newpath dup type/arraytype eq{aload len"
+"gth 4 idiv{@rect}repeat}{@rect}ifelse stroke grestore}put false setglobal @SD "
+"readonly pop/initclip 0 defpr/clippath 0 defpr/sysexec{@SD exch get exec}def/a"
+"dddot{dup length 1 add string dup 0 46 put dup 3 -1 roll 1 exch putinterval}de"
+"f/setlinewidth{dup/setlinewidth sysexec 1(setlinewidth)prcmd}def/setlinecap 1 "
+"defpr/setlinejoin 1 defpr/setmiterlimit 1 defpr/setdash{mark 3 1 roll 2 copy/s"
+"etdash sysexec exch aload length 1 add -1 roll counttomark(setdash)prcmd pop}d"
+"ef/@setpagedevice{pop<<>>/setpagedevice sysexec matrix setmatrix newpath 0(set"
+"pagedevice)prcmd}def/@checknulldev{@GD/@nulldev get{currentpagedevice maxlengt"
+"h 0 ne{@GD/@nulldev false put 0 1(setnulldevice)prcmd}if}if}def/prcolor{curren"
+"tcolorspace @setcolorspace currentrgbcolor 3(setrgbcolor)prcmd}def/printgstate"
+"{@dodraw @GD/@nulldev get not and{matrix currentmatrix aload pop 6(setmatrix)p"
+"rcmd applyscalevals currentlinewidth 1(setlinewidth)prcmd currentlinecap 1(set"
+"linecap)prcmd currentlinejoin 1(setlinejoin)prcmd currentmiterlimit 1(setmiter"
+"limit)prcmd revision dup 952 lt{pop}{.currentblendmode .setblendmode 952 eq{.c"
+"urrentopacityalpha .setopacityalpha .currentshapealpha .setshapealpha}{.curren"
+"talphaisshape{1}{0}ifelse 1(setalphaisshape)prcmd .currentstrokeconstantalpha "
+"1(setstrokeconstantalpha)prcmd .currentfillconstantalpha 1(setfillconstantalph"
+"a)prcmd}ifelse}ifelse prcolor currentdash mark 3 1 roll exch aload length 1 ad"
+"d -1 roll counttomark(setdash)prcmd pop}if}def/strconcat{exch dup length 2 ind"
+"ex length add string dup dup 4 2 roll copy length 4 -1 roll putinterval}def/se"
+"tgstate{/setgstate sysexec printgstate}def/save{@UD begin/@saveID vmstatus pop"
+" pop def end :save @saveID 1(save)prcmd}def/restore{:restore @checknulldev pri"
+"ntgstate @UD/@saveID known{@UD begin @saveID end}{0}ifelse 1(restore)prcmd}def"
+"/gsave 0 defpr/grestore{:grestore @checknulldev printgstate 0(grestore)prcmd}d"
+"ef/grestoreall{:grestoreall @checknulldev setstate 0(grestoreall)prcmd}def/rot"
+"ate{dup type/arraytype ne @dodraw and{dup 1(rotate)prcmd}if/rotate sysexec app"
+"lyscalevals}def/scale{dup type/arraytype ne @dodraw and{2 copy 2(scale)prcmd}i"
+"f/scale sysexec applyscalevals}def/translate{dup type/arraytype ne @dodraw and"
+"{2 copy 2(translate)prcmd}if/translate sysexec}def/setmatrix{dup/setmatrix sys"
+"exec @dodraw{aload pop 6(setmatrix)prcmd applyscalevals}{pop}ifelse}def/initma"
+"trix{matrix setmatrix}def/concat{matrix currentmatrix matrix concatmatrix setm"
+"atrix}def/makepattern{gsave<</mx 3 -1 roll>>begin<</XUID[1000000 @patcnt]>>cop"
+"y mx/makepattern sysexec dup begin PatternType 2 lt{PatternType @patcnt BBox a"
+"load pop XStep YStep PaintType mx aload pop 15(makepattern)prcmd :newpath matr"
+"ix setmatrix dup PaintProc 0 1(makepattern)prcmd @GD/@patcnt @patcnt 1 add put"
+"}if end end grestore}def/setpattern{dup begin PatternType end 1 eq{begin Paint"
+"Type 1 eq{XUID aload pop exch pop 1}{:gsave[currentcolorspace aload length -1 "
+"roll pop]/setcolorspace sysexec/setcolor sysexec XUID aload pop exch pop curre"
+"ntrgbcolor :grestore 4}ifelse(setpattern)prcmd currentcolorspace 0 get/Pattern"
+" ne{[/Pattern currentcolorspace]/setcolorspace sysexec}if currentcolorspace @s"
+"etcolorspace end}{/setpattern sysexec}ifelse}def/setcolor{dup type/dicttype eq"
+"{setpattern}{/setcolor sysexec/currentrgbcolor sysexec setrgbcolor}ifelse}def/"
+"setcolorspace{dup/setcolorspace sysexec @setcolorspace}def/@setcolorspace{dup "
+"type/arraytype eq{0 get}if/Pattern eq{1}{0}ifelse 1(setcolorspace)prcmd}def/se"
+"tgray 1 defpr/setcmykcolor 4 defpr/sethsbcolor 3 defpr/setrgbcolor 3 defpr/.se"
+"talphaisshape{@SD/.setalphaisshape known{dup/.setalphaisshape sysexec}if{1}{0}"
+"ifelse 1(setalphaisshape)prcmd}bind def/.setfillconstantalpha{@SD/.setfillcons"
+"tantalpha known{dup/.setfillconstantalpha sysexec}if 1(setfillconstantalpha)pr"
+"cmd}bind def/.setstrokeconstantalpha{@SD/.setstrokeconstantalpha known{dup/.se"
+"tstrokeconstantalpha sysexec}if 1(setstrokeconstantalpha)prcmd}bind def/.setop"
+"acityalpha{false .setalphaisshape dup .setfillconstantalpha .setstrokeconstant"
+"alpha}bind def/.setshapealpha{true .setalphaisshape dup .setfillconstantalpha "
+".setstrokeconstantalpha}bind def/.setblendmode{dup/.setblendmode sysexec<</Nor"
+"mal 0/Compatible 0/Multiply 1/Screen 2/Overlay 3/SoftLight 4/HardLight 5/Color"
+"Dodge 6/ColorBurn 7/Darken 8/Lighten 9/Difference 10/Exclusion 11/Hue 12/Satur"
+"ation 13/Color 14/Luminosity 15/CompatibleOverprint 16>>exch get 1(setblendmod"
+"e)prcmd}def/@pdfpagecount{(r)file runpdfbegin pdfpagecount runpdfend}def/@pdfp"
+"agebox{(r)file runpdfbegin dup dup 1 lt exch pdfpagecount gt or{pop}{pdfgetpag"
+"e/MediaBox pget pop aload pop}ifelse runpdfend}def DELAYBIND{.bindnow}if ";
diff --git a/dviware/dvisvgm/src/utility.cpp b/dviware/dvisvgm/src/utility.cpp
index 8492cbdeed..3ffa376435 100644
--- a/dviware/dvisvgm/src/utility.cpp
+++ b/dviware/dvisvgm/src/utility.cpp
@@ -150,12 +150,13 @@ string util::replace (string str, const string &find, const string &repl) {
* returns the substrings.
* @param[in] str string to split
* @param[in] sep separator to look for
+ * @param[in] allowEmptyResult if true, the result vector is empty if str is empty; otherwise an empty string is inserted
* @return the substrings between the separators */
-vector<string> util::split (const string &str, const string &sep) {
+vector<string> util::split (const string &str, const string &sep, bool allowEmptyResult) {
vector<string> parts;
- if (str.empty() || sep.empty())
+ if ((str.empty() && !allowEmptyResult) || sep.empty())
parts.push_back(str);
- else {
+ else if (!str.empty()) {
string::size_type left=0;
while (left <= str.length()) {
auto right = str.find(sep, left);
diff --git a/dviware/dvisvgm/src/utility.hpp b/dviware/dvisvgm/src/utility.hpp
index ee272e22ec..9058baaa58 100644
--- a/dviware/dvisvgm/src/utility.hpp
+++ b/dviware/dvisvgm/src/utility.hpp
@@ -69,7 +69,7 @@ std::string replace (std::string str, const std::string &find, const std::string
std::string to_string (double val);
std::string mimetype (const std::string &fname);
-std::vector<std::string> split (const std::string &str, const std::string &sep);
+std::vector<std::string> split (const std::string &str, const std::string &sep, bool allowEmptyResult=false);
int ilog10 (int n);
bool read_double (std::istream &is, double &value);
diff --git a/dviware/dvisvgm/tests/UtilityTest.cpp b/dviware/dvisvgm/tests/UtilityTest.cpp
index f5fda4a35b..c118aee8f9 100644
--- a/dviware/dvisvgm/tests/UtilityTest.cpp
+++ b/dviware/dvisvgm/tests/UtilityTest.cpp
@@ -80,6 +80,9 @@ TEST(UtilityTest, split) {
ASSERT_EQ(parts.size(), 1u);
EXPECT_EQ(parts[0], "");
+ parts = split("", ",", true);
+ ASSERT_EQ(parts.size(), 0u);
+
parts = split("abcde", "");
ASSERT_EQ(parts.size(), 1u);
EXPECT_EQ(parts[0], "abcde");
diff --git a/dviware/dvisvgm/tests/normalize.xsl b/dviware/dvisvgm/tests/normalize.xsl
index 89df7ea746..b521173e6a 100644
--- a/dviware/dvisvgm/tests/normalize.xsl
+++ b/dviware/dvisvgm/tests/normalize.xsl
@@ -21,115 +21,115 @@
** of the GNU general public license version 3 or later. **
***********************************************************************-->
<xsl:stylesheet version="1.0"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:exsl="http://exslt.org/common"
- xmlns:str="http://exslt.org/strings"
- xmlns:mg="my-namespace"
- extension-element-prefixes="exsl str"
- exclude-result-prefixes="svg xlink exsl str mg">
-
- <xsl:key name="path-by-id" match="/svg:defs/svg:path" use="@id"/>
-
-
- <xsl:variable name="styles-rtf">
- <xsl:for-each select="str:tokenize(/*/svg:style[@type='text/css'], '&#10;')">
- <xsl:sort select="substring-after(., ' ')"/>
- <mg:style new-id="f{position()}" id="{substring-before(substring-after(., '.'), ' ')}">
- <xsl:value-of select="substring-after(., ' ')"/>
- </mg:style>
- </xsl:for-each>
- </xsl:variable>
-
- <xsl:variable name="styles" select="exsl:node-set($styles-rtf)/mg:style"/>
-
- <xsl:variable name="num-paths" select="count(/*/svg:defs/svg:path)"/>
-
- <xsl:variable name="defs-rtf">
- <xsl:for-each select="/*/svg:defs/svg:path">
- <xsl:sort select="@d"/>
- <mg:path id="{@id}" new-id="g{position()}"/>
- </xsl:for-each>
- <xsl:for-each select="/*/svg:defs/svg:use">
- <xsl:sort select="concat(key('path-by-id', substring(@xlink:href, 2))/@d, @transform)"/>
- <mg:use id="{@id}" new-id="g{position()+$num-paths}"/>
- </xsl:for-each>
- </xsl:variable>
-
- <xsl:variable name="defs" select="exsl:node-set($defs-rtf)"/>
-
-
- <xsl:template match="*|@*">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
- </xsl:template>
-
-
- <xsl:template match="svg:defs[svg:path]">
- <xsl:copy>
- <xsl:apply-templates select="svg:path">
- <xsl:sort select="@d"/>
- </xsl:apply-templates>
- <xsl:apply-templates select="svg:use">
- <xsl:sort select="$defs/mg:use[@id=current()/@id]/@new-id"/>
- </xsl:apply-templates>
- </xsl:copy>
- </xsl:template>
-
-
- <xsl:template match="svg:defs[svg:font]">
- <xsl:copy>
- <xsl:apply-templates>
- <xsl:sort select="@id"/>
- </xsl:apply-templates>
- </xsl:copy>
- </xsl:template>
-
-
- <xsl:template match="svg:defs/svg:path">
- <path id="{$defs/mg:path[@id=current()/@id]/@new-id}" d="{@d}"/>
- </xsl:template>
-
-
- <xsl:template match="svg:defs/text()"/>
-
-
- <xsl:template match="svg:use">
- <xsl:variable name="href" select="substring(@xlink:href, 2)"/>
- <xsl:copy>
- <xsl:apply-templates select="@*"/>
- <xsl:if test="ancestor::svg:defs">
- <xsl:attribute name="id">
- <xsl:value-of select="$defs/mg:use[@id=current()/@id]/@new-id"/>
- </xsl:attribute>
- </xsl:if>
- <xsl:attribute name="xlink:href">
- <xsl:value-of select="concat('#', $defs/*[@id=$href]/@new-id)"/>
- </xsl:attribute>
- </xsl:copy>
- </xsl:template>
-
-
- <xsl:template match="svg:style[@type='text/css']">
- <style type="text/css">
- <xsl:for-each select="$styles">
- <xsl:value-of select="concat('text.f', position(), ' ', ., '&#10;')"/>
- </xsl:for-each>
- </style>
- </xsl:template>
-
-
- <xsl:template match="svg:text">
- <xsl:copy>
- <xsl:copy-of select="@*"/>
- <xsl:attribute name="class">
- <xsl:value-of select="$styles[@id=current()/@class]/@new-id"/>
- </xsl:attribute>
- <xsl:apply-templates/>
- </xsl:copy>
- </xsl:template>
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:str="http://exslt.org/strings"
+ xmlns:mg="my-namespace"
+ extension-element-prefixes="exsl str"
+ exclude-result-prefixes="svg xlink exsl str mg">
+
+ <xsl:key name="path-by-id" match="/svg:defs/svg:path" use="@id"/>
+
+
+ <xsl:variable name="styles-rtf">
+ <xsl:for-each select="str:tokenize(/*/svg:style[@type='text/css'], '&#10;')">
+ <xsl:sort select="substring-after(., ' ')"/>
+ <mg:style new-id="f{position()}" id="{substring-before(substring-after(., '.'), ' ')}">
+ <xsl:value-of select="substring-after(., ' ')"/>
+ </mg:style>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="styles" select="exsl:node-set($styles-rtf)/mg:style"/>
+
+ <xsl:variable name="num-paths" select="count(/*/svg:defs/svg:path)"/>
+
+ <xsl:variable name="defs-rtf">
+ <xsl:for-each select="/*/svg:defs/svg:path">
+ <xsl:sort select="@d"/>
+ <mg:path id="{@id}" new-id="g{position()}"/>
+ </xsl:for-each>
+ <xsl:for-each select="/*/svg:defs/svg:use">
+ <xsl:sort select="concat(key('path-by-id', substring(@xlink:href, 2))/@d, @transform)"/>
+ <mg:use id="{@id}" new-id="g{position()+$num-paths}"/>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="defs" select="exsl:node-set($defs-rtf)"/>
+
+
+ <xsl:template match="*|@*">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+
+
+ <xsl:template match="svg:defs[svg:path]">
+ <xsl:copy>
+ <xsl:apply-templates select="svg:path">
+ <xsl:sort select="@d"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="svg:use">
+ <xsl:sort select="$defs/mg:use[@id=current()/@id]/@new-id"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+ </xsl:template>
+
+
+ <xsl:template match="svg:defs[svg:font]">
+ <xsl:copy>
+ <xsl:apply-templates>
+ <xsl:sort select="@id"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+ </xsl:template>
+
+
+ <xsl:template match="svg:defs/svg:path">
+ <path id="{$defs/mg:path[@id=current()/@id]/@new-id}" d="{@d}"/>
+ </xsl:template>
+
+
+ <xsl:template match="svg:defs/text()"/>
+
+
+ <xsl:template match="svg:use">
+ <xsl:variable name="href" select="substring(@xlink:href, 2)"/>
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:if test="ancestor::svg:defs">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$defs/mg:use[@id=current()/@id]/@new-id"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="xlink:href">
+ <xsl:value-of select="concat('#', $defs/*[@id=$href]/@new-id)"/>
+ </xsl:attribute>
+ </xsl:copy>
+ </xsl:template>
+
+
+ <xsl:template match="svg:style[@type='text/css']">
+ <style type="text/css">
+ <xsl:for-each select="$styles">
+ <xsl:value-of select="concat('text.f', position(), ' ', ., '&#10;')"/>
+ </xsl:for-each>
+ </style>
+ </xsl:template>
+
+
+ <xsl:template match="svg:text">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:attribute name="class">
+ <xsl:value-of select="$styles[@id=current()/@class]/@new-id"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
</xsl:stylesheet>
diff --git a/fonts/newtx/README b/fonts/newtx/README
index fa87745c61..ac852001a7 100644
--- a/fonts/newtx/README
+++ b/fonts/newtx/README
@@ -1,10 +1,14 @@
This package, initially based on txfonts, provides many fixes and enhancements to the txfonts package, splitting it into two separate packages---newtxtext and newtxmath, which may be run independently of one another. It provides scaling, improved metrics, and other options. In particular, newtxmath offers a libertine option which substitutes Linux Libertine (provided with TeXLive and MikTeX) italic and Greek letters for the default Times letters, providing a good match for the Libertine text font, which is heavier than Computer Modern but lighter than Times, and in my experience, looks very sharp and clear on the screen.
-Current version: 1.733 2023-11-08
+Current version: 1.734 2023-11-14
This material is subject to the LaTeX Project Public License. See http://www.ctan.org/license/lppl1.3
for the details of that license.
+Changes in version 1.734
+Option thmslshape to newtxtext was failing because I had messed up ztmrsl.{pfb,afm}
+in a recent version. Corrected. (Thanks Matthew Bertucci.)
+
Changes in version 1.733
Version 1.732 did not contain the most recent versions of the sty files. Corrected.
diff --git a/fonts/newtx/afm/TeXGyreTermesX-Slanted.afm b/fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
index 7f7b39aea9..5f22df29a5 100644
--- a/fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
+++ b/fonts/newtx/afm/TeXGyreTermesX-Slanted.afm
@@ -1,6 +1,6 @@
StartFontMetrics 2.0
-Comment Generated by FontForge 20201107
-Comment Creation Date: Sat Jan 8 12:22:26 2022
+Comment Generated by FontForge 20230101
+Comment Creation Date: Tue Nov 14 16:01:05 2023
FontName TeXGyreTermesX-Slanted
FullName TeXGyreTermesX Slanted
FamilyName TeXGyreTermesX
@@ -8,7 +8,7 @@ Weight Regular
Notice (Copyright 2006, 2009 for TeX Gyre extensions by B. Jackowski and J.M. Nowacki (on behalf of TeX users groups). This work is released under the GUST Font License -- see http://tug.org/fonts/licenses/G)
Comment UST-FONT-LICENSE.txt for details.
Comment
-Comment Copyright (c) 2015--2021 Michael Sharpe, released under the equivalent LPPL license. (Modified all small cap glyphs to larger size, renamed originals as petite caps, added superior letters and figures
+Comment Copyright (c) 2015--2023 Michael Sharpe, released under the equivalent LPPL license. (Modified all small cap glyphs to larger size, renamed originals as petite caps, added superior letters and figures
Comment . Changed positions of dots above i, j, ij, iogonek and idotbelow to match URW precursors.)
ItalicAngle -15
IsFixedPitch false
@@ -21,7 +21,7 @@ CapHeight 662
XHeight 450
Ascender 662
Descender -217
-StartCharMetrics 1514
+StartCharMetrics 1720
C 0 ; WX 250 ; N space ; B 0 0 0 0 ;
C 1 ; WX 333 ; N exclam ; B 139 -9 402 676 ;
C 2 ; WX 408 ; N quotedbl ; B 224 431 503 676 ;
@@ -124,7 +124,7 @@ C 98 ; WX 500 ; N sterling ; B 23 -8 607 676 ;
C 99 ; WX 500 ; N currency ; B 7 58 670 602 ;
C 100 ; WX 500 ; N yen ; B 65 0 689 662 ;
C 101 ; WX 200 ; N brokenbar ; B 25 -156 310 662 ;
-C 102 ; WX 500 ; N section ; B 88 -148 535 676 ;
+C 102 ; WX 500 ; N uni00A7 ; B 88 -148 535 676 ;
C 103 ; WX 333 ; N dieresis ; B 173 541 476 640 ;
C 104 ; WX 760 ; N copyright ; B 107 -14 833 686 ;
C 105 ; WX 276 ; N ordfeminine ; B 98 349 390 676 ;
@@ -135,14 +135,14 @@ C 109 ; WX 760 ; N registered ; B 107 -14 833 686 ;
C 110 ; WX 333 ; N macron ; B 162 563 487 617 ;
C 111 ; WX 400 ; N degree ; B 194 390 492 676 ;
C 112 ; WX 564 ; N plusminus ; B 40 0 618 558 ;
-C 113 ; WX 300 ; N two.superior ; B 78 270 434 676 ;
-C 114 ; WX 300 ; N three.superior ; B 96 262 426 676 ;
+C 113 ; WX 300 ; N two.superior.alt ; B 78 270 434 676 ;
+C 114 ; WX 300 ; N three.superior.alt ; B 96 262 426 676 ;
C 115 ; WX 333 ; N acute ; B 228 504 491 675 ;
C 116 ; WX 500 ; N uni00B5 ; B -9 -218 551 450 ;
-C 117 ; WX 453 ; N paragraph ; B 43 -154 627 662 ;
+C 117 ; WX 453 ; N uni00B6 ; B 43 -154 627 662 ;
C 118 ; WX 250 ; N periodcentered ; B 134 194 250 306 ;
C 119 ; WX 333 ; N cedilla ; B -1 -215 229 5 ;
-C 120 ; WX 300 ; N one.superior ; B 129 270 371 676 ;
+C 120 ; WX 300 ; N one.superior.alt ; B 129 270 371 676 ;
C 121 ; WX 310 ; N ordmasculine ; B 100 349 455 676 ;
C 122 ; WX 500 ; N guillemotright ; B 55 33 515 411 ;
C 123 ; WX 750 ; N onequarter ; B 109 -14 818 676 ;
@@ -390,15 +390,15 @@ C -1 ; WX 278 ; N uni021B ; B 33 -281 376 579 ;
C -1 ; WX 278 ; N uni0237 ; B -116 -218 315 460 ;
C -1 ; WX 444 ; N ereversed ; B 67 -10 494 460 ;
C -1 ; WX 444 ; N schwa ; B 84 -10 500 460 ;
-C -1 ; WX 354 ; N h.superior ; B 78 270 435 680 ;
-C -1 ; WX 201 ; N j.superior ; B -1 132 322 691 ;
-C -1 ; WX 230 ; N r.superior ; B 75 270 370 546 ;
-C -1 ; WX 513 ; N w.superior ; B 155 262 641 540 ;
-C -1 ; WX 367 ; N y.superior ; B 68 129 497 544 ;
+C -1 ; WX 354 ; N h.superior.alt ; B 78 270 435 680 ;
+C -1 ; WX 201 ; N j.superior.alt ; B -1 132 322 691 ;
+C -1 ; WX 230 ; N r.superior.alt ; B 75 270 370 546 ;
+C -1 ; WX 513 ; N w.superior.alt ; B 155 262 641 540 ;
+C -1 ; WX 367 ; N y.superior.alt ; B 68 129 497 544 ;
C -1 ; WX 354 ; N ringhalfright ; B 154 321 454 650 ;
C -1 ; WX 354 ; N ringhalfleft ; B 160 321 461 650 ;
-C -1 ; WX 387 ; N less.superior ; B 149 266 488 574 ;
-C -1 ; WX 387 ; N greater.superior ; B 116 271 452 569 ;
+C -1 ; WX 387 ; N less.superior.alt ; B 149 266 488 574 ;
+C -1 ; WX 387 ; N greater.superior.alt ; B 116 271 452 569 ;
C -1 ; WX 333 ; N circumflex ; B 147 507 458 674 ;
C -1 ; WX 333 ; N caron ; B 192 507 503 674 ;
C -1 ; WX 333 ; N breve ; B 195 512 486 669 ;
@@ -407,8 +407,8 @@ C -1 ; WX 333 ; N ring ; B 221 491 428 690 ;
C -1 ; WX 333 ; N ogonek ; B 34 -245 228 17 ;
C -1 ; WX 333 ; N tilde ; B 145 537 503 643 ;
C -1 ; WX 333 ; N hungarumlaut ; B 172 505 602 676 ;
-C -1 ; WX 274 ; N s.superior ; B 106 264 364 545 ;
-C -1 ; WX 364 ; N x.superior ; B 83 270 466 540 ;
+C -1 ; WX 274 ; N s.superior.alt ; B 106 264 364 545 ;
+C -1 ; WX 364 ; N x.superior.alt ; B 83 270 466 540 ;
C -1 ; WX 0 ; N uni0300 ; B -202 504 -13 675 ;
C -1 ; WX 0 ; N uni0301 ; B -160 504 103 675 ;
C -1 ; WX 0 ; N uni0302 ; B -241 507 70 674 ;
@@ -485,42 +485,42 @@ C -1 ; WX 694 ; N uni03D6 ; B 89 -14 730 570 ;
C -1 ; WX 521 ; N uni03F1 ; B 57 -250 554 460 ;
C -1 ; WX 466 ; N uni03F5 ; B 94 -14 522 464 ;
C -1 ; WX 667 ; N baht ; B 17 -83 698 745 ;
-C -1 ; WX 519 ; N A.superior ; B 82 270 585 676 ;
-C -1 ; WX 479 ; N B.superior ; B 83 270 558 667 ;
-C -1 ; WX 510 ; N D.superior ; B 83 270 619 667 ;
-C -1 ; WX 427 ; N E.superior ; B 80 270 561 667 ;
-C -1 ; WX 505 ; N G.superior ; B 137 262 628 676 ;
-C -1 ; WX 504 ; N H.superior ; B 84 270 670 667 ;
-C -1 ; WX 234 ; N I.superior ; B 84 270 402 667 ;
-C -1 ; WX 287 ; N J.superior ; B 88 262 455 667 ;
-C -1 ; WX 527 ; N K.superior ; B 94 270 659 667 ;
-C -1 ; WX 415 ; N L.superior ; B 80 270 510 667 ;
-C -1 ; WX 657 ; N M.superior ; B 80 270 820 667 ;
-C -1 ; WX 536 ; N N.superior ; B 80 263 706 667 ;
-C -1 ; WX 507 ; N O.superior ; B 140 262 619 676 ;
-C -1 ; WX 397 ; N P.superior ; B 82 270 540 667 ;
-C -1 ; WX 495 ; N R.superior ; B 83 270 567 667 ;
-C -1 ; WX 430 ; N T.superior ; B 159 270 592 667 ;
-C -1 ; WX 502 ; N U.superior ; B 170 262 670 667 ;
-C -1 ; WX 670 ; N W.superior ; B 177 263 842 667 ;
-C -1 ; WX 318 ; N a.superior ; B 109 264 403 546 ;
-C -1 ; WX 354 ; N b.superior ; B 125 264 452 680 ;
-C -1 ; WX 355 ; N d.superior ; B 118 264 488 680 ;
-C -1 ; WX 301 ; N e.superior ; B 116 264 395 546 ;
-C -1 ; WX 367 ; N g.superior ; B 69 139 489 546 ;
-C -1 ; WX 356 ; N k.superior ; B 77 270 479 689 ;
-C -1 ; WX 550 ; N m.superior ; B 82 270 628 546 ;
-C -1 ; WX 356 ; N o.superior ; B 122 264 452 546 ;
-C -1 ; WX 354 ; N p.superior ; B 41 140 453 546 ;
-C -1 ; WX 221 ; N t.superior ; B 141 264 351 620 ;
-C -1 ; WX 353 ; N u.superior ; B 134 264 445 540 ;
-C -1 ; WX 360 ; N v.superior ; B 153 262 491 540 ;
-C -1 ; WX 465 ; N C.superior ; B 135 262 608 676 ;
-C -1 ; WX 318 ; N c.superior ; B 117 264 419 546 ;
-C -1 ; WX 230 ; N f.superior ; B 85 270 435 680 ;
-C -1 ; WX 417 ; N ae.superior ; B 108 264 509 547 ;
-C -1 ; WX 194 ; N l.superior ; B 86 270 314 680 ;
-C -1 ; WX 340 ; N z.superior ; B 90 270 468 540 ;
+C -1 ; WX 519 ; N A.superior.alt ; B 82 270 585 676 ;
+C -1 ; WX 479 ; N B.superior.alt ; B 83 270 558 667 ;
+C -1 ; WX 510 ; N D.superior.alt ; B 83 270 619 667 ;
+C -1 ; WX 427 ; N E.superior.alt ; B 80 270 561 667 ;
+C -1 ; WX 505 ; N G.superior.alt ; B 137 262 628 676 ;
+C -1 ; WX 504 ; N H.superior.alt ; B 84 270 670 667 ;
+C -1 ; WX 234 ; N I.superior.alt ; B 84 270 402 667 ;
+C -1 ; WX 287 ; N J.superior.alt ; B 88 262 455 667 ;
+C -1 ; WX 527 ; N K.superior.alt ; B 94 270 659 667 ;
+C -1 ; WX 415 ; N L.superior.alt ; B 80 270 510 667 ;
+C -1 ; WX 657 ; N M.superior.alt ; B 80 270 820 667 ;
+C -1 ; WX 536 ; N N.superior.alt ; B 80 263 706 667 ;
+C -1 ; WX 507 ; N O.superior.alt ; B 140 262 619 676 ;
+C -1 ; WX 397 ; N P.superior.alt ; B 82 270 540 667 ;
+C -1 ; WX 495 ; N R.superior.alt ; B 83 270 567 667 ;
+C -1 ; WX 430 ; N T.superior.alt ; B 159 270 592 667 ;
+C -1 ; WX 502 ; N U.superior.alt ; B 170 262 670 667 ;
+C -1 ; WX 670 ; N W.superior.alt ; B 177 263 842 667 ;
+C -1 ; WX 318 ; N a.superior.alt ; B 109 264 403 546 ;
+C -1 ; WX 354 ; N b.superior.alt ; B 125 264 452 680 ;
+C -1 ; WX 355 ; N d.superior.alt ; B 118 264 488 680 ;
+C -1 ; WX 301 ; N e.superior.alt ; B 116 264 395 546 ;
+C -1 ; WX 367 ; N g.superior.alt ; B 69 139 489 546 ;
+C -1 ; WX 356 ; N k.superior.alt ; B 77 270 479 689 ;
+C -1 ; WX 550 ; N m.superior.alt ; B 82 270 628 546 ;
+C -1 ; WX 356 ; N o.superior.alt ; B 122 264 452 546 ;
+C -1 ; WX 354 ; N p.superior.alt ; B 41 140 453 546 ;
+C -1 ; WX 221 ; N t.superior.alt ; B 141 264 351 620 ;
+C -1 ; WX 353 ; N u.superior.alt ; B 134 264 445 540 ;
+C -1 ; WX 360 ; N v.superior.alt ; B 153 262 491 540 ;
+C -1 ; WX 465 ; N C.superior.alt ; B 135 262 608 676 ;
+C -1 ; WX 318 ; N c.superior.alt ; B 117 264 419 546 ;
+C -1 ; WX 230 ; N f.superior.alt ; B 85 270 435 680 ;
+C -1 ; WX 417 ; N ae.superior.alt ; B 108 264 509 547 ;
+C -1 ; WX 194 ; N l.superior.alt ; B 86 270 314 680 ;
+C -1 ; WX 340 ; N z.superior.alt ; B 90 270 468 540 ;
C -1 ; WX 722 ; N Ddotbelow ; B 16 -191 788 662 ;
C -1 ; WX 500 ; N ddotbelow ; B 71 -191 606 683 ;
C -1 ; WX 722 ; N Dlinebelow ; B 16 -167 788 662 ;
@@ -658,15 +658,15 @@ C -1 ; WX 333 ; N uni2010 ; B 96 194 359 257 ;
C -1 ; WX 333 ; N uni2011 ; B 96 194 359 257 ;
C -1 ; WX 500 ; N endash ; B 54 201 567 250 ;
C -1 ; WX 1000 ; N emdash ; B 54 201 1067 250 ;
-C -1 ; WX 564 ; N dblverticalbar ; B 141 -156 558 662 ;
+C -1 ; WX 564 ; N uni2016 ; B 141 -156 558 662 ;
C -1 ; WX 333 ; N quoteleft ; B 251 433 412 676 ;
C -1 ; WX 333 ; N quoteright ; B 218 433 379 676 ;
C -1 ; WX 333 ; N quotesinglbase ; B 64 -141 225 102 ;
C -1 ; WX 444 ; N quotedblleft ; B 179 433 572 676 ;
C -1 ; WX 444 ; N quotedblright ; B 169 433 562 676 ;
C -1 ; WX 444 ; N quotedblbase ; B 30 -141 423 102 ;
-C -1 ; WX 500 ; N dagger ; B 176 -149 565 676 ;
-C -1 ; WX 500 ; N daggerdbl ; B 76 -153 564 676 ;
+C -1 ; WX 500 ; N uni2020 ; B 176 -149 565 676 ;
+C -1 ; WX 500 ; N uni2021 ; B 76 -153 564 676 ;
C -1 ; WX 350 ; N bullet ; B 124 196 404 466 ;
C -1 ; WX 1000 ; N ellipsis ; B 121 -11 902 100 ;
C -1 ; WX 1000 ; N perthousand ; B 132 -13 1046 676 ;
@@ -682,16 +682,16 @@ C -1 ; WX 330 ; N quillbracketleft ; B 23 -173 470 672 ;
C -1 ; WX 330 ; N quillbracketright ; B -6 -173 441 672 ;
C -1 ; WX 500 ; N discount ; B 50 0 627 662 ;
C -1 ; WX 500 ; N uni2054 ; B -26 -217 413 -105 ;
-C -1 ; WX 359 ; N zero.superior ; B 132 262 480 676 ;
-C -1 ; WX 200 ; N i.superior ; B 82 270 310 680 ;
-C -1 ; WX 356 ; N four.superior ; B 105 270 471 681 ;
-C -1 ; WX 335 ; N five.superior ; B 100 262 473 684 ;
-C -1 ; WX 377 ; N six.superior ; B 134 262 510 680 ;
-C -1 ; WX 365 ; N seven.superior ; B 164 265 510 667 ;
-C -1 ; WX 376 ; N eight.superior ; B 131 262 483 676 ;
-C -1 ; WX 377 ; N nine.superior ; B 117 254 493 672 ;
-C -1 ; WX 376 ; N equal.superior ; B 119 343 483 496 ;
-C -1 ; WX 354 ; N n.superior ; B 84 270 432 546 ;
+C -1 ; WX 359 ; N zero.superior.alt ; B 132 262 480 676 ;
+C -1 ; WX 200 ; N i.superior.alt ; B 82 270 310 680 ;
+C -1 ; WX 356 ; N four.superior.alt ; B 105 270 471 681 ;
+C -1 ; WX 335 ; N five.superior.alt ; B 100 262 473 684 ;
+C -1 ; WX 377 ; N six.superior.alt ; B 134 262 510 680 ;
+C -1 ; WX 365 ; N seven.superior.alt ; B 164 265 510 667 ;
+C -1 ; WX 376 ; N eight.superior.alt ; B 131 262 483 676 ;
+C -1 ; WX 377 ; N nine.superior.alt ; B 117 254 493 672 ;
+C -1 ; WX 376 ; N equal.superior.alt ; B 119 343 483 496 ;
+C -1 ; WX 354 ; N n.superior.alt ; B 84 270 432 546 ;
C -1 ; WX 667 ; N colonmonetary ; B 99 -83 792 745 ;
C -1 ; WX 500 ; N lira ; B 23 -8 607 676 ;
C -1 ; WX 722 ; N naira ; B 12 -11 884 662 ;
@@ -719,7 +719,7 @@ C -1 ; WX 713 ; N summation ; B -19 -123 823 752 ;
C -1 ; WX 564 ; N minus ; B 98 217 600 283 ;
C -1 ; WX 564 ; N minusplus ; B 80 -58 658 500 ;
C -1 ; WX 0 ; N fraction.alt ; B -339 -14 345 676 ;
-C -1 ; WX 516 ; N asterisk.math ; B 78 3 571 497 ;
+C -1 ; WX 516 ; N uni2217 ; B 78 3 571 497 ;
C -1 ; WX 549 ; N radical ; B 119 -65 771 924 ;
C -1 ; WX 833 ; N infinity ; B 179 107 814 491 ;
C -1 ; WX 564 ; N anglearc ; B 117 -34 621 534 ;
@@ -742,7 +742,7 @@ C -1 ; WX 344 ; N dblbracketleft ; B -2 -156 481 662 ;
C -1 ; WX 344 ; N dblbracketright ; B -2 -156 481 662 ;
C -1 ; WX 564 ; N lessequal.slant ; B 115 -70 641 586 ;
C -1 ; WX 564 ; N greaterequal.slant ; B 46 -70 586 586 ;
-C -1 ; WX 519 ; N V.superior ; B 184 263 682 667 ;
+C -1 ; WX 519 ; N V.superior.alt ; B 184 263 682 667 ;
C -1 ; WX 556 ; N abreveacute.sc ; B 26 0 673 838 ;
C -1 ; WX 556 ; N abrevedotbelow.sc ; B 26 -191 610 709 ;
C -1 ; WX 556 ; N abrevegrave.sc ; B 26 0 618 838 ;
@@ -942,7 +942,7 @@ C -1 ; WX 1000 ; N leaf ; B 21 -59 1157 721 ;
C -1 ; WX 333 ; N macron.ts1 ; B 162 563 487 617 ;
C -1 ; WX 722 ; N Oogonekacute ; B 108 -245 793 851 ;
C -1 ; WX 500 ; N oogonekacute ; B 80 -245 575 675 ;
-C -1 ; WX 428 ; N paragraph.alt ; B 105 -154 565 662 ;
+C -1 ; WX 428 ; N uni00B6.alt ; B 105 -154 565 662 ;
C -1 ; WX 336 ; N perthousandzero ; B 38 0 346 371 ;
C -1 ; WX 408 ; N quotedblbase.ts1 ; B 73 -133 352 112 ;
C -1 ; WX 180 ; N quotesinglbase.ts1 ; B 44 -133 154 112 ;
@@ -971,16 +971,16 @@ C -1 ; WX 611 ; N T_uni0308 ; B 149 0 764 832 ;
C -1 ; WX 722 ; N Orogate ; B 108 -162 793 824 ;
C -1 ; WX 500 ; N orogate ; B 79 -162 543 608 ;
C -1 ; WX 571 ; N orogate.sc ; B 80 -162 590 604 ;
-C -1 ; WX 500 ; N zero.slash ; B 93 -14 586 676 ;
-C -1 ; WX 532 ; N zero.prop ; B 109 -14 602 676 ;
-C -1 ; WX 525 ; N two.prop ; B 40 0 575 676 ;
-C -1 ; WX 469 ; N three.prop ; B 50 -14 545 676 ;
-C -1 ; WX 500 ; N four.prop ; B 65 0 559 676 ;
-C -1 ; WX 486 ; N five.prop ; B 51 -14 628 688 ;
-C -1 ; WX 514 ; N six.prop ; B 99 -14 635 684 ;
-C -1 ; WX 469 ; N seven.prop ; B 158 -8 626 662 ;
-C -1 ; WX 469 ; N eight.prop ; B 74 -14 556 676 ;
-C -1 ; WX 509 ; N nine.prop ; B 63 -22 590 676 ;
+C -1 ; WX 508 ; N zero.slash ; B 97 -14 590 676 ;
+C -1 ; WX 508 ; N zero.prop ; B 97 -14 590 676 ;
+C -1 ; WX 501 ; N two.prop ; B 28 0 563 676 ;
+C -1 ; WX 445 ; N three.prop ; B 38 -14 533 676 ;
+C -1 ; WX 516 ; N four.prop ; B 73 0 567 676 ;
+C -1 ; WX 462 ; N five.prop ; B 39 -14 616 688 ;
+C -1 ; WX 490 ; N six.prop ; B 87 -14 623 684 ;
+C -1 ; WX 485 ; N seven.prop ; B 166 -8 634 662 ;
+C -1 ; WX 445 ; N eight.prop ; B 62 -14 544 676 ;
+C -1 ; WX 485 ; N nine.prop ; B 51 -22 578 676 ;
C -1 ; WX 500 ; N zero.taboldstyle ; B 74 -20 550 470 ;
C -1 ; WX 500 ; N one.taboldstyle ; B 118 0 425 471 ;
C -1 ; WX 500 ; N two.taboldstyle ; B 30 0 522 470 ;
@@ -991,69 +991,69 @@ C -1 ; WX 500 ; N six.taboldstyle ; B 93 -14 629 684 ;
C -1 ; WX 500 ; N seven.taboldstyle ; B 103 -214 571 456 ;
C -1 ; WX 500 ; N eight.taboldstyle ; B 90 -14 572 676 ;
C -1 ; WX 500 ; N nine.taboldstyle ; B -2 -228 524 470 ;
-C -1 ; WX 556 ; N abreve.sc ; B 26 0 610 709 ;
-C -1 ; WX 556 ; N amacron.sc ; B 26 0 611 657 ;
-C -1 ; WX 556 ; N aogonek.sc ; B 26 -245 534 495 ;
-C -1 ; WX 668 ; N aeacute.sc ; B 16 0 745 715 ;
-C -1 ; WX 500 ; N cacute.sc ; B 78 -10 612 715 ;
-C -1 ; WX 500 ; N ccaron.sc ; B 78 -10 623 714 ;
-C -1 ; WX 500 ; N ccircumflex.sc ; B 78 -10 590 714 ;
-C -1 ; WX 500 ; N cdotaccent.sc ; B 78 -10 590 681 ;
-C -1 ; WX 556 ; N dcaron.sc ; B 27 0 600 714 ;
-C -1 ; WX 500 ; N ebreve.sc ; B 24 0 575 709 ;
-C -1 ; WX 500 ; N ecaron.sc ; B 24 0 589 714 ;
-C -1 ; WX 500 ; N edotaccent.sc ; B 24 0 550 681 ;
-C -1 ; WX 500 ; N emacron.sc ; B 24 0 556 657 ;
-C -1 ; WX 561 ; N eng.sc ; B 24 -238 666 486 ;
-C -1 ; WX 500 ; N eogonek.sc ; B 24 -245 550 486 ;
-C -1 ; WX 556 ; N gbreve.sc ; B 80 -10 617 709 ;
-C -1 ; WX 556 ; N gcircumflex.sc ; B 80 -10 606 714 ;
-C -1 ; WX 556 ; N gcommaaccent.sc ; B 80 -281 606 497 ;
-C -1 ; WX 556 ; N gdotaccent.sc ; B 80 -10 606 681 ;
-C -1 ; WX 563 ; N hbar.sc ; B 13 0 647 486 ;
-C -1 ; WX 611 ; N hcircumflex.sc ; B 28 0 706 675 ;
-C -1 ; WX 278 ; N ibreve.sc ; B 28 0 470 709 ;
-C -1 ; WX 614 ; N ij.sc ; B 39 -10 705 486 ;
-C -1 ; WX 278 ; N imacron.sc ; B 28 0 471 657 ;
-C -1 ; WX 278 ; N iogonek.sc ; B 14 -245 380 486 ;
-C -1 ; WX 278 ; N itilde.sc ; B 28 0 487 683 ;
-C -1 ; WX 333 ; N jcircumflex.sc ; B 32 -10 487 714 ;
-C -1 ; WX 556 ; N kcommaaccent.sc ; B 28 -281 640 486 ;
-C -1 ; WX 500 ; N lacute.sc ; B 26 0 503 715 ;
-C -1 ; WX 500 ; N lcaron.sc ; B 26 0 507 490 ;
-C -1 ; WX 500 ; N lcommaaccent.sc ; B 26 -281 503 486 ;
-C -1 ; WX 500 ; N ldot.sc ; B 26 0 503 486 ;
-C -1 ; WX 611 ; N nacute.sc ; B 22 -8 708 715 ;
-C -1 ; WX 611 ; N ncaron.sc ; B 22 -8 708 714 ;
-C -1 ; WX 611 ; N ncommaaccent.sc ; B 22 -281 708 486 ;
-C -1 ; WX 556 ; N obreve.sc ; B 83 -10 606 709 ;
-C -1 ; WX 556 ; N ohungarumlaut.sc ; B 83 -10 721 716 ;
-C -1 ; WX 556 ; N omacron.sc ; B 83 -10 607 657 ;
-C -1 ; WX 557 ; N oslashacute.sc ; B 38 -59 649 759 ;
-C -1 ; WX 500 ; N racute.sc ; B 16 0 569 715 ;
-C -1 ; WX 500 ; N rcaron.sc ; B 16 0 580 714 ;
-C -1 ; WX 500 ; N rcommaaccent.sc ; B 16 -281 519 486 ;
-C -1 ; WX 389 ; N sacute.sc ; B 43 -10 538 715 ;
-C -1 ; WX 389 ; N scedilla.sc ; B 43 -215 459 497 ;
-C -1 ; WX 389 ; N scircumflex.sc ; B 43 -10 505 714 ;
-C -1 ; WX 500 ; N tcaron.sc ; B 126 0 588 714 ;
-C -1 ; WX 611 ; N ubreve.sc ; B 136 -10 714 709 ;
-C -1 ; WX 611 ; N uhungarumlaut.sc ; B 136 -10 747 716 ;
-C -1 ; WX 611 ; N umacron.sc ; B 136 -10 714 657 ;
-C -1 ; WX 611 ; N uogonek.sc ; B 136 -245 714 486 ;
-C -1 ; WX 611 ; N uring.sc ; B 136 -10 714 730 ;
-C -1 ; WX 611 ; N utilde.sc ; B 136 -10 714 683 ;
-C -1 ; WX 778 ; N wacute.sc ; B 134 -8 899 715 ;
-C -1 ; WX 778 ; N wcircumflex.sc ; B 134 -8 899 714 ;
-C -1 ; WX 778 ; N wdieresis.sc ; B 134 -8 899 680 ;
-C -1 ; WX 778 ; N wgrave.sc ; B 134 -8 899 715 ;
-C -1 ; WX 556 ; N ycircumflex.sc ; B 157 0 659 714 ;
-C -1 ; WX 556 ; N ygrave.sc ; B 157 0 659 715 ;
-C -1 ; WX 556 ; N zacute.sc ; B 36 0 618 715 ;
-C -1 ; WX 556 ; N zdotaccent.sc ; B 36 0 618 681 ;
-C -1 ; WX 278 ; N idotaccent.sc ; B 28 0 380 681 ;
+C -1 ; WX 576 ; N abreve.sc ; B 36 0 620 709 ;
+C -1 ; WX 576 ; N amacron.sc ; B 36 0 621 657 ;
+C -1 ; WX 576 ; N aogonek.sc ; B 36 -245 544 495 ;
+C -1 ; WX 688 ; N aeacute.sc ; B 26 0 755 715 ;
+C -1 ; WX 520 ; N cacute.sc ; B 88 -10 622 715 ;
+C -1 ; WX 520 ; N ccaron.sc ; B 88 -10 633 714 ;
+C -1 ; WX 520 ; N ccircumflex.sc ; B 88 -10 600 714 ;
+C -1 ; WX 520 ; N cdotaccent.sc ; B 88 -10 600 681 ;
+C -1 ; WX 576 ; N dcaron.sc ; B 37 0 610 714 ;
+C -1 ; WX 520 ; N ebreve.sc ; B 34 0 585 709 ;
+C -1 ; WX 520 ; N ecaron.sc ; B 34 0 599 714 ;
+C -1 ; WX 520 ; N edotaccent.sc ; B 34 0 560 681 ;
+C -1 ; WX 520 ; N emacron.sc ; B 34 0 566 657 ;
+C -1 ; WX 581 ; N eng.sc ; B 34 -238 676 486 ;
+C -1 ; WX 520 ; N eogonek.sc ; B 34 -245 560 486 ;
+C -1 ; WX 576 ; N gbreve.sc ; B 90 -10 627 709 ;
+C -1 ; WX 576 ; N gcircumflex.sc ; B 90 -10 616 714 ;
+C -1 ; WX 576 ; N gcommaaccent.sc ; B 90 -281 616 497 ;
+C -1 ; WX 576 ; N gdotaccent.sc ; B 90 -10 616 681 ;
+C -1 ; WX 583 ; N hbar.sc ; B 23 0 657 486 ;
+C -1 ; WX 631 ; N hcircumflex.sc ; B 38 0 716 675 ;
+C -1 ; WX 298 ; N ibreve.sc ; B 38 0 480 709 ;
+C -1 ; WX 634 ; N ij.sc ; B 49 -10 715 486 ;
+C -1 ; WX 298 ; N imacron.sc ; B 38 0 481 657 ;
+C -1 ; WX 298 ; N iogonek.sc ; B 24 -245 390 486 ;
+C -1 ; WX 298 ; N itilde.sc ; B 38 0 497 683 ;
+C -1 ; WX 353 ; N jcircumflex.sc ; B 42 -10 497 714 ;
+C -1 ; WX 576 ; N kcommaaccent.sc ; B 38 -281 650 486 ;
+C -1 ; WX 520 ; N lacute.sc ; B 36 0 513 715 ;
+C -1 ; WX 520 ; N lcaron.sc ; B 36 0 517 490 ;
+C -1 ; WX 520 ; N lcommaaccent.sc ; B 36 -281 513 486 ;
+C -1 ; WX 520 ; N ldot.sc ; B 36 0 513 486 ;
+C -1 ; WX 631 ; N nacute.sc ; B 32 -8 718 715 ;
+C -1 ; WX 631 ; N ncaron.sc ; B 32 -8 718 714 ;
+C -1 ; WX 631 ; N ncommaaccent.sc ; B 32 -281 718 486 ;
+C -1 ; WX 576 ; N obreve.sc ; B 93 -10 616 709 ;
+C -1 ; WX 576 ; N ohungarumlaut.sc ; B 93 -10 731 716 ;
+C -1 ; WX 576 ; N omacron.sc ; B 93 -10 617 657 ;
+C -1 ; WX 577 ; N oslashacute.sc ; B 48 -59 659 759 ;
+C -1 ; WX 520 ; N racute.sc ; B 26 0 579 715 ;
+C -1 ; WX 520 ; N rcaron.sc ; B 26 0 590 714 ;
+C -1 ; WX 520 ; N rcommaaccent.sc ; B 26 -281 529 486 ;
+C -1 ; WX 409 ; N sacute.sc ; B 53 -10 548 715 ;
+C -1 ; WX 409 ; N scedilla.sc ; B 53 -215 469 497 ;
+C -1 ; WX 409 ; N scircumflex.sc ; B 53 -10 515 714 ;
+C -1 ; WX 520 ; N tcaron.sc ; B 136 0 598 714 ;
+C -1 ; WX 631 ; N ubreve.sc ; B 146 -10 724 709 ;
+C -1 ; WX 631 ; N uhungarumlaut.sc ; B 146 -10 757 716 ;
+C -1 ; WX 631 ; N umacron.sc ; B 146 -10 724 657 ;
+C -1 ; WX 631 ; N uogonek.sc ; B 146 -245 724 486 ;
+C -1 ; WX 631 ; N uring.sc ; B 146 -10 724 730 ;
+C -1 ; WX 631 ; N utilde.sc ; B 146 -10 724 683 ;
+C -1 ; WX 798 ; N wacute.sc ; B 144 -8 909 715 ;
+C -1 ; WX 798 ; N wcircumflex.sc ; B 144 -8 909 714 ;
+C -1 ; WX 798 ; N wdieresis.sc ; B 144 -8 909 680 ;
+C -1 ; WX 798 ; N wgrave.sc ; B 144 -8 909 715 ;
+C -1 ; WX 576 ; N ycircumflex.sc ; B 167 0 669 714 ;
+C -1 ; WX 576 ; N ygrave.sc ; B 167 0 669 715 ;
+C -1 ; WX 576 ; N zacute.sc ; B 46 0 628 715 ;
+C -1 ; WX 576 ; N zdotaccent.sc ; B 46 0 628 681 ;
+C -1 ; WX 298 ; N idotaccent.sc ; B 38 0 390 681 ;
C -1 ; WX 278 ; N dotlessj ; B -116 -218 315 460 ;
-C -1 ; WX 323 ; N one.prop ; B 27 0 389 676 ;
+C -1 ; WX 331 ; N one.prop ; B 31 0 393 676 ;
C -1 ; WX 750 ; N threequartersemdash ; B 54 201 817 250 ;
C -1 ; WX 556 ; N dollar.oldstyle ; B 69 -83 628 745 ;
C -1 ; WX 532 ; N zero.oldstyle ; B 90 -20 566 470 ;
@@ -1066,64 +1066,64 @@ C -1 ; WX 514 ; N six.oldstyle ; B 99 -14 635 684 ;
C -1 ; WX 509 ; N seven.oldstyle ; B 123 -214 591 456 ;
C -1 ; WX 469 ; N eight.oldstyle ; B 74 -14 556 676 ;
C -1 ; WX 509 ; N nine.oldstyle ; B 8 -228 534 470 ;
-C -1 ; WX 556 ; N a.sc ; B 26 0 534 495 ;
-C -1 ; WX 500 ; N b.sc ; B 27 0 536 486 ;
-C -1 ; WX 500 ; N c.sc ; B 78 -10 590 497 ;
-C -1 ; WX 556 ; N d.sc ; B 27 0 600 486 ;
-C -1 ; WX 500 ; N e.sc ; B 24 0 550 486 ;
-C -1 ; WX 445 ; N f.sc ; B 24 0 558 486 ;
-C -1 ; WX 556 ; N g.sc ; B 80 -10 606 497 ;
-C -1 ; WX 611 ; N h.sc ; B 28 0 706 486 ;
-C -1 ; WX 278 ; N i.sc ; B 28 0 380 486 ;
-C -1 ; WX 333 ; N j.sc ; B 32 -10 435 486 ;
-C -1 ; WX 556 ; N k.sc ; B 28 0 640 486 ;
-C -1 ; WX 500 ; N l.sc ; B 26 0 503 486 ;
-C -1 ; WX 667 ; N m.sc ; B 16 0 780 486 ;
-C -1 ; WX 611 ; N n.sc ; B 22 -8 708 486 ;
-C -1 ; WX 556 ; N o.sc ; B 83 -10 597 497 ;
-C -1 ; WX 444 ; N p.sc ; B 21 0 527 486 ;
-C -1 ; WX 556 ; N q.sc ; B 83 -130 596 496 ;
-C -1 ; WX 500 ; N r.sc ; B 16 0 519 486 ;
-C -1 ; WX 389 ; N s.sc ; B 43 -10 459 497 ;
-C -1 ; WX 500 ; N t.sc ; B 126 0 588 486 ;
-C -1 ; WX 611 ; N u.sc ; B 136 -10 714 486 ;
-C -1 ; WX 556 ; N v.sc ; B 153 -8 653 486 ;
-C -1 ; WX 778 ; N w.sc ; B 134 -8 899 486 ;
-C -1 ; WX 556 ; N x.sc ; B 23 0 653 486 ;
-C -1 ; WX 556 ; N y.sc ; B 157 0 659 486 ;
-C -1 ; WX 556 ; N z.sc ; B 36 0 618 486 ;
+C -1 ; WX 576 ; N a.sc ; B 36 0 544 495 ;
+C -1 ; WX 520 ; N b.sc ; B 37 0 546 486 ;
+C -1 ; WX 520 ; N c.sc ; B 88 -10 600 497 ;
+C -1 ; WX 576 ; N d.sc ; B 37 0 610 486 ;
+C -1 ; WX 520 ; N e.sc ; B 34 0 560 486 ;
+C -1 ; WX 465 ; N f.sc ; B 34 0 568 486 ;
+C -1 ; WX 576 ; N g.sc ; B 90 -10 616 497 ;
+C -1 ; WX 631 ; N h.sc ; B 38 0 716 486 ;
+C -1 ; WX 298 ; N i.sc ; B 38 0 390 486 ;
+C -1 ; WX 353 ; N j.sc ; B 42 -10 445 486 ;
+C -1 ; WX 576 ; N k.sc ; B 38 0 650 486 ;
+C -1 ; WX 520 ; N l.sc ; B 36 0 513 486 ;
+C -1 ; WX 687 ; N m.sc ; B 26 0 790 486 ;
+C -1 ; WX 631 ; N n.sc ; B 32 -8 718 486 ;
+C -1 ; WX 576 ; N o.sc ; B 93 -10 607 497 ;
+C -1 ; WX 464 ; N p.sc ; B 31 0 537 486 ;
+C -1 ; WX 576 ; N q.sc ; B 93 -130 606 496 ;
+C -1 ; WX 520 ; N r.sc ; B 26 0 529 486 ;
+C -1 ; WX 409 ; N s.sc ; B 53 -10 469 497 ;
+C -1 ; WX 520 ; N t.sc ; B 136 0 598 486 ;
+C -1 ; WX 631 ; N u.sc ; B 146 -10 724 486 ;
+C -1 ; WX 576 ; N v.sc ; B 163 -8 663 486 ;
+C -1 ; WX 798 ; N w.sc ; B 144 -8 909 486 ;
+C -1 ; WX 576 ; N x.sc ; B 33 0 663 486 ;
+C -1 ; WX 576 ; N y.sc ; B 167 0 669 486 ;
+C -1 ; WX 576 ; N z.sc ; B 46 0 628 486 ;
C -1 ; WX 444 ; N cent.oldstyle ; B 71 -83 497 533 ;
-C -1 ; WX 556 ; N agrave.sc ; B 26 0 534 715 ;
-C -1 ; WX 556 ; N aacute.sc ; B 26 0 615 715 ;
-C -1 ; WX 556 ; N acircumflex.sc ; B 26 0 582 714 ;
-C -1 ; WX 556 ; N atilde.sc ; B 26 0 627 683 ;
-C -1 ; WX 556 ; N adieresis.sc ; B 26 0 600 680 ;
-C -1 ; WX 556 ; N aring.sc ; B 26 0 552 730 ;
-C -1 ; WX 668 ; N ae.sc ; B 16 0 745 486 ;
-C -1 ; WX 500 ; N ccedilla.sc ; B 78 -215 590 497 ;
-C -1 ; WX 500 ; N egrave.sc ; B 24 0 550 715 ;
-C -1 ; WX 500 ; N eacute.sc ; B 24 0 560 715 ;
-C -1 ; WX 500 ; N ecircumflex.sc ; B 24 0 550 714 ;
-C -1 ; WX 500 ; N edieresis.sc ; B 24 0 550 680 ;
-C -1 ; WX 278 ; N igrave.sc ; B 28 0 380 715 ;
-C -1 ; WX 278 ; N iacute.sc ; B 28 0 475 715 ;
-C -1 ; WX 278 ; N icircumflex.sc ; B 28 0 442 714 ;
-C -1 ; WX 278 ; N idieresis.sc ; B 28 0 460 680 ;
-C -1 ; WX 556 ; N eth.sc ; B 27 0 600 486 ;
-C -1 ; WX 611 ; N ntilde.sc ; B 22 -8 708 683 ;
-C -1 ; WX 556 ; N ograve.sc ; B 83 -10 597 715 ;
-C -1 ; WX 556 ; N oacute.sc ; B 83 -10 611 715 ;
-C -1 ; WX 556 ; N ocircumflex.sc ; B 83 -10 597 714 ;
-C -1 ; WX 556 ; N otilde.sc ; B 83 -10 623 683 ;
-C -1 ; WX 556 ; N odieresis.sc ; B 83 -10 597 680 ;
-C -1 ; WX 557 ; N oslash.sc ; B 38 -59 649 541 ;
-C -1 ; WX 611 ; N ugrave.sc ; B 136 -10 714 715 ;
-C -1 ; WX 611 ; N uacute.sc ; B 136 -10 714 715 ;
-C -1 ; WX 611 ; N ucircumflex.sc ; B 136 -10 714 714 ;
-C -1 ; WX 611 ; N udieresis.sc ; B 136 -10 714 680 ;
-C -1 ; WX 556 ; N yacute.sc ; B 157 0 659 715 ;
-C -1 ; WX 437 ; N thorn.sc ; B 27 0 495 486 ;
-C -1 ; WX 556 ; N ydieresis.sc ; B 157 0 659 680 ;
+C -1 ; WX 576 ; N agrave.sc ; B 36 0 544 715 ;
+C -1 ; WX 576 ; N aacute.sc ; B 36 0 625 715 ;
+C -1 ; WX 576 ; N acircumflex.sc ; B 36 0 592 714 ;
+C -1 ; WX 576 ; N atilde.sc ; B 36 0 637 683 ;
+C -1 ; WX 576 ; N adieresis.sc ; B 36 0 610 680 ;
+C -1 ; WX 576 ; N aring.sc ; B 36 0 562 730 ;
+C -1 ; WX 688 ; N ae.sc ; B 26 0 755 486 ;
+C -1 ; WX 520 ; N ccedilla.sc ; B 88 -215 600 497 ;
+C -1 ; WX 520 ; N egrave.sc ; B 34 0 560 715 ;
+C -1 ; WX 520 ; N eacute.sc ; B 34 0 570 715 ;
+C -1 ; WX 520 ; N ecircumflex.sc ; B 34 0 560 714 ;
+C -1 ; WX 520 ; N edieresis.sc ; B 34 0 560 680 ;
+C -1 ; WX 298 ; N igrave.sc ; B 38 0 390 715 ;
+C -1 ; WX 298 ; N iacute.sc ; B 38 0 485 715 ;
+C -1 ; WX 298 ; N icircumflex.sc ; B 38 0 452 714 ;
+C -1 ; WX 298 ; N idieresis.sc ; B 38 0 470 680 ;
+C -1 ; WX 576 ; N eth.sc ; B 37 0 610 486 ;
+C -1 ; WX 631 ; N ntilde.sc ; B 32 -8 718 683 ;
+C -1 ; WX 576 ; N ograve.sc ; B 93 -10 607 715 ;
+C -1 ; WX 576 ; N oacute.sc ; B 93 -10 621 715 ;
+C -1 ; WX 576 ; N ocircumflex.sc ; B 93 -10 607 714 ;
+C -1 ; WX 576 ; N otilde.sc ; B 93 -10 633 683 ;
+C -1 ; WX 576 ; N odieresis.sc ; B 93 -10 607 680 ;
+C -1 ; WX 577 ; N oslash.sc ; B 48 -59 659 541 ;
+C -1 ; WX 631 ; N ugrave.sc ; B 146 -10 724 715 ;
+C -1 ; WX 631 ; N uacute.sc ; B 146 -10 724 715 ;
+C -1 ; WX 631 ; N ucircumflex.sc ; B 146 -10 724 714 ;
+C -1 ; WX 631 ; N udieresis.sc ; B 146 -10 724 680 ;
+C -1 ; WX 576 ; N yacute.sc ; B 167 0 669 715 ;
+C -1 ; WX 457 ; N thorn.sc ; B 37 0 505 486 ;
+C -1 ; WX 576 ; N ydieresis.sc ; B 167 0 669 680 ;
C -1 ; WX 600 ; N ff ; B 32 0 818 683 ; L l ffl ; L i ffi ;
C -1 ; WX 556 ; N fi ; B 32 0 610 683 ;
C -1 ; WX 556 ; N fl ; B 32 0 639 683 ;
@@ -1159,15 +1159,15 @@ C -1 ; WX 333 ; N quoteright.dup ; B 218 433 379 676 ;
C -1 ; WX 667 ; N Rcedilla ; B 17 -281 684 662 ;
C -1 ; WX 333 ; N rcedilla ; B 4 -281 447 460 ;
C -1 ; WX 333 ; N tilde.dup ; B 145 537 503 643 ;
-C -1 ; WX 611 ; N hdotbelow.sc ; B 28 -191 706 486 ;
-C -1 ; WX 333 ; N jcaron.sc ; B 32 -10 531 714 ;
-C -1 ; WX 500 ; N ldotbelow.sc ; B 26 -191 503 486 ;
-C -1 ; WX 500 ; N ldotbelowmacron.sc ; B 26 -191 503 653 ;
-C -1 ; WX 667 ; N mdotbelow.sc ; B 16 -191 780 486 ;
-C -1 ; WX 611 ; N ndotaccent.sc ; B 22 -8 708 681 ;
-C -1 ; WX 611 ; N ndotbelow.sc ; B 22 -191 708 486 ;
-C -1 ; WX 500 ; N rdotbelow.sc ; B 16 -191 519 486 ;
-C -1 ; WX 500 ; N rdotbelowmacron.sc ; B 16 -191 564 653 ;
+C -1 ; WX 631 ; N hdotbelow.sc ; B 38 -191 716 486 ;
+C -1 ; WX 353 ; N jcaron.sc ; B 42 -10 541 714 ;
+C -1 ; WX 520 ; N ldotbelow.sc ; B 36 -191 513 486 ;
+C -1 ; WX 520 ; N ldotbelowmacron.sc ; B 36 -191 520 653 ;
+C -1 ; WX 687 ; N mdotbelow.sc ; B 26 -191 790 486 ;
+C -1 ; WX 631 ; N ndotaccent.sc ; B 32 -8 718 681 ;
+C -1 ; WX 631 ; N ndotbelow.sc ; B 32 -191 718 486 ;
+C -1 ; WX 520 ; N rdotbelow.sc ; B 26 -191 529 486 ;
+C -1 ; WX 520 ; N rdotbelowmacron.sc ; B 26 -191 574 653 ;
C -1 ; WX 244 ; N exclam.pc ; B 96 -6 296 478 ;
C -1 ; WX 305 ; N quotedbl.pc ; B 152 271 375 480 ;
C -1 ; WX 392 ; N numbersign.pc ; B 41 0 473 452 ;
@@ -1232,12 +1232,12 @@ C -1 ; WX 376 ; N sterling.pc ; B 16 -6 449 460 ;
C -1 ; WX 378 ; N currency.pc ; B 3 26 492 411 ;
C -1 ; WX 382 ; N yen.pc ; B 42 0 512 450 ;
C -1 ; WX 147 ; N brokenbar.pc ; B 18 -106 223 450 ;
-C -1 ; WX 378 ; N section.pc ; B 66 -103 394 461 ;
+C -1 ; WX 378 ; N uni00A7.pc ; B 66 -103 394 461 ;
C -1 ; WX 544 ; N copyright.pc ; B 73 -10 593 466 ;
C -1 ; WX 553 ; N registered.pc ; B 73 -10 602 466 ;
C -1 ; WX 284 ; N degree.pc ; B 132 261 347 462 ;
C -1 ; WX 394 ; N plusminus.pc ; B 27 0 432 384 ;
-C -1 ; WX 342 ; N paragraph.pc ; B 40 -108 461 452 ;
+C -1 ; WX 342 ; N uni00B6.pc ; B 40 -108 461 452 ;
C -1 ; WX 343 ; N questiondown.pc ; B 2 -157 286 320 ;
C -1 ; WX 565 ; N agrave.pc ; B 27 0 542 675 ;
C -1 ; WX 565 ; N aacute.pc ; B 27 0 604 675 ;
@@ -1319,7 +1319,7 @@ C -1 ; WX 524 ; N rcaron.pc ; B 28 0 570 674 ;
C -1 ; WX 429 ; N sacute.pc ; B 59 -9 527 675 ;
C -1 ; WX 429 ; N scircumflex.pc ; B 59 -9 494 674 ;
C -1 ; WX 429 ; N scedilla.pc ; B 39 -215 462 456 ;
-C -1 ; WX 429 ; N scaron.pc ; B 59 -281 462 456 ;
+C -1 ; WX 429 ; N scaron.pc ; B 59 -9 536 674 ;
C -1 ; WX 453 ; N tcedilla.pc ; B 54 -215 555 446 ;
C -1 ; WX 453 ; N tcaron.pc ; B 100 0 563 674 ;
C -1 ; WX 565 ; N utilde.pc ; B 122 -9 656 643 ;
@@ -1438,72 +1438,278 @@ C -1 ; WX 279 ; N imacron.alt.pc ; B 29 0 404 617 ;
C -1 ; WX 571 ; N orogate.pc ; B 80 -162 590 604 ;
C -1 ; WX 468 ; N l_uni0303.pc ; B 25 0 491 643 ;
C -1 ; WX 565 ; N ubrevebelowinverted.pc ; B 90 -209 656 446 ;
-C -1 ; WX 200 ; N colon.superior ; B 134 263 279 545 ;
-C -1 ; WX 216 ; N semicolon.superior ; B 133 185 292 545 ;
-C -1 ; WX 330 ; N question.superior ; B 201 265 471 676 ;
-C -1 ; WX 640 ; N at.superior ; B 195 262 704 676 ;
-C -1 ; WX 390 ; N F.superior ; B 80 270 561 667 ;
-C -1 ; WX 511 ; N Q.superior ; B 141 160 623 679 ;
-C -1 ; WX 395 ; N S.superior ; B 118 261 498 676 ;
-C -1 ; WX 522 ; N X.superior ; B 79 270 682 667 ;
-C -1 ; WX 522 ; N Y.superior ; B 190 270 689 667 ;
-C -1 ; WX 458 ; N Z.superior ; B 78 270 628 667 ;
-C -1 ; WX 232 ; N bracketleft.superior ; B 105 173 390 670 ;
-C -1 ; WX 202 ; N backslash.superior ; B 173 262 279 676 ;
-C -1 ; WX 232 ; N bracketright.superior ; B 69 173 354 670 ;
-C -1 ; WX 364 ; N asciicircum.superior ; B 134 440 467 675 ;
-C -1 ; WX 333 ; N underscore.superior ; B 51 189 395 230 ;
-C -1 ; WX 221 ; N grave.superior ; B 187 554 308 692 ;
-C -1 ; WX 354 ; N q.superior ; B 114 140 451 547 ;
-C -1 ; WX 330 ; N braceleft.superior ; B 179 159 426 679 ;
-C -1 ; WX 142 ; N bar.superior ; B 92 176 277 667 ;
-C -1 ; WX 330 ; N braceright.superior ; B 130 159 376 679 ;
-C -1 ; WX 306 ; N egrave.superior ; B 117 264 400 680 ;
-C -1 ; WX 306 ; N eacute.superior ; B 117 264 445 680 ;
-C -1 ; WX 355 ; N ntilde.superior ; B 84 270 477 666 ;
-C -1 ; WX 360 ; N asciitilde.superior ; B 138 374 450 469 ;
-C -1 ; WX 236 ; N exclamdown.superior ; B 108 122 290 556 ;
-C -1 ; WX 234 ; N exclam.superior ; B 155 265 334 676 ;
-C -1 ; WX 295 ; N quotedbl.superior ; B 207 501 427 703 ;
-C -1 ; WX 382 ; N numbersign.superior ; B 108 270 527 667 ;
-C -1 ; WX 365 ; N dollar.superior ; B 112 218 480 707 ;
-C -1 ; WX 604 ; N percent.superior ; B 175 262 684 681 ;
-C -1 ; WX 579 ; N ampersand.superior ; B 118 262 679 676 ;
-C -1 ; WX 229 ; N quoteright.superior ; B 205 518 324 687 ;
-C -1 ; WX 232 ; N parenleft.superior ; B 133 159 391 679 ;
-C -1 ; WX 232 ; N parenright.superior ; B 64 159 324 679 ;
-C -1 ; WX 335 ; N asterisk.superior ; B 179 419 454 679 ;
-C -1 ; WX 377 ; N plus.superior ; B 125 270 477 577 ;
-C -1 ; WX 175 ; N comma.superior ; B 101 185 220 354 ;
-C -1 ; WX 258 ; N hyphen.superior ; B 126 378 342 430 ;
-C -1 ; WX 181 ; N period.superior ; B 126 263 220 354 ;
-C -1 ; WX 200 ; N slash.superior ; B 64 262 387 676 ;
-C -1 ; WX 334 ; N zero.inferior ; B 35 -168 383 246 ;
-C -1 ; WX 275 ; N one.inferior ; B 32 -160 274 246 ;
-C -1 ; WX 275 ; N two.inferior ; B -19 -160 336 246 ;
-C -1 ; WX 275 ; N three.inferior ; B -2 -168 329 246 ;
-C -1 ; WX 331 ; N four.inferior ; B 8 -160 374 251 ;
-C -1 ; WX 310 ; N five.inferior ; B 3 -168 376 254 ;
-C -1 ; WX 352 ; N six.inferior ; B 37 -168 413 250 ;
-C -1 ; WX 340 ; N seven.inferior ; B 67 -165 412 237 ;
-C -1 ; WX 351 ; N eight.inferior ; B 33 -168 386 246 ;
-C -1 ; WX 352 ; N nine.inferior ; B 20 -176 396 242 ;
+C -1 ; WX 200 ; N colon.superior.alt ; B 134 263 279 545 ;
+C -1 ; WX 216 ; N semicolon.superior.alt ; B 133 185 292 545 ;
+C -1 ; WX 330 ; N question.superior.alt ; B 201 265 471 676 ;
+C -1 ; WX 628 ; N at.superior.alt ; B 193 262 692 676 ;
+C -1 ; WX 390 ; N F.superior.alt ; B 80 270 561 667 ;
+C -1 ; WX 511 ; N Q.superior.alt ; B 141 160 623 679 ;
+C -1 ; WX 395 ; N S.superior.alt ; B 118 261 498 676 ;
+C -1 ; WX 522 ; N X.superior.alt ; B 79 270 682 667 ;
+C -1 ; WX 522 ; N Y.superior.alt ; B 190 270 689 667 ;
+C -1 ; WX 458 ; N Z.superior.alt ; B 78 270 628 667 ;
+C -1 ; WX 232 ; N bracketleft.superior.alt ; B 105 173 390 670 ;
+C -1 ; WX 202 ; N backslash.superior.alt ; B 173 262 279 676 ;
+C -1 ; WX 232 ; N bracketright.superior.alt ; B 69 173 354 670 ;
+C -1 ; WX 364 ; N asciicircum.superior.alt ; B 134 440 467 675 ;
+C -1 ; WX 333 ; N underscore.superior.alt ; B 51 189 395 230 ;
+C -1 ; WX 221 ; N grave.superior.alt ; B 187 554 308 692 ;
+C -1 ; WX 354 ; N q.superior.alt ; B 114 140 451 547 ;
+C -1 ; WX 330 ; N braceleft.superior.alt ; B 179 159 426 679 ;
+C -1 ; WX 142 ; N bar.superior.alt ; B 92 176 277 667 ;
+C -1 ; WX 330 ; N braceright.superior.alt ; B 130 159 376 679 ;
+C -1 ; WX 306 ; N egrave.superior.alt ; B 117 264 400 680 ;
+C -1 ; WX 306 ; N eacute.superior.alt ; B 117 264 445 680 ;
+C -1 ; WX 355 ; N ntilde.superior.alt ; B 84 270 477 666 ;
+C -1 ; WX 360 ; N asciitilde.superior.alt ; B 138 374 450 469 ;
+C -1 ; WX 236 ; N exclamdown.superior.alt ; B 108 122 290 556 ;
+C -1 ; WX 234 ; N exclam.superior.alt ; B 155 265 334 676 ;
+C -1 ; WX 295 ; N quotedbl.superior.alt ; B 207 501 427 703 ;
+C -1 ; WX 382 ; N numbersign.superior.alt ; B 108 270 527 667 ;
+C -1 ; WX 365 ; N dollar.superior.alt ; B 112 218 480 707 ;
+C -1 ; WX 604 ; N percent.superior.alt ; B 175 262 684 681 ;
+C -1 ; WX 579 ; N ampersand.superior.alt ; B 118 262 679 676 ;
+C -1 ; WX 229 ; N quoteright.superior.alt ; B 205 518 324 687 ;
+C -1 ; WX 232 ; N parenleft.superior.alt ; B 133 159 391 679 ;
+C -1 ; WX 232 ; N parenright.superior.alt ; B 64 159 324 679 ;
+C -1 ; WX 335 ; N asterisk.superior.alt ; B 179 419 454 679 ;
+C -1 ; WX 377 ; N plus.superior.alt ; B 125 270 477 577 ;
+C -1 ; WX 175 ; N comma.superior.alt ; B 101 185 220 354 ;
+C -1 ; WX 258 ; N hyphen.superior.alt ; B 126 378 342 430 ;
+C -1 ; WX 181 ; N period.superior.alt ; B 126 263 220 354 ;
+C -1 ; WX 200 ; N slash.superior.alt ; B 64 262 387 676 ;
+C -1 ; WX 359 ; N zero.inferior.alt ; B 17 -168 365 246 ;
+C -1 ; WX 300 ; N one.inferior.alt ; B 14 -160 256 246 ;
+C -1 ; WX 300 ; N two.inferior.alt ; B -37 -160 319 246 ;
+C -1 ; WX 300 ; N three.inferior.alt ; B -20 -168 311 246 ;
+C -1 ; WX 356 ; N four.inferior.alt ; B -10 -160 356 251 ;
+C -1 ; WX 335 ; N five.inferior.alt ; B -15 -168 358 254 ;
+C -1 ; WX 377 ; N six.inferior.alt ; B 19 -168 395 250 ;
+C -1 ; WX 365 ; N seven.inferior.alt ; B 49 -165 395 237 ;
+C -1 ; WX 376 ; N eight.inferior.alt ; B 16 -168 368 246 ;
+C -1 ; WX 377 ; N nine.inferior.alt ; B 2 -176 378 242 ;
C -1 ; WX 620 ; N uni1E9E ; B 12 -9 746 683 ;
C -1 ; WX 1060 ; N uni1E9E.ss06 ; B 67 -14 1157 676 ;
C -1 ; WX 858 ; N germandbls.pc.ss06 ; B 59 -9 891 456 ;
C -1 ; WX 503 ; N uni1E9E.c2pc ; B 11 -7 567 460 ;
C -1 ; WX 789 ; N germandbls.sc.ss06 ; B 43 -10 848 497 ;
C -1 ; WX 474 ; N uni1E9E.c2sc ; B 8 -6 565 501 ;
-C -1 ; WX 359 ; N zero.dnom ; B 60 -8 408 406 ;
-C -1 ; WX 300 ; N one.dnom ; B 57 0 299 406 ;
-C -1 ; WX 300 ; N two.dnom ; B 6 0 361 406 ;
-C -1 ; WX 300 ; N three.dnom ; B 23 -8 354 406 ;
-C -1 ; WX 356 ; N four.dnom ; B 33 0 399 411 ;
-C -1 ; WX 335 ; N five.dnom ; B 28 -8 401 414 ;
-C -1 ; WX 377 ; N six.dnom ; B 62 -8 438 410 ;
-C -1 ; WX 365 ; N seven.dnom ; B 92 -5 437 397 ;
-C -1 ; WX 376 ; N eight.dnom ; B 58 -8 411 406 ;
-C -1 ; WX 377 ; N nine.dnom ; B 45 -16 421 402 ;
+C -1 ; WX 359 ; N zero.dnom ; B 63 -8 403 406 ;
+C -1 ; WX 244 ; N one.dnom ; B 36 0 267 406 ;
+C -1 ; WX 326 ; N two.dnom ; B 20 0 376 406 ;
+C -1 ; WX 323 ; N three.dnom ; B 31 -8 361 406 ;
+C -1 ; WX 350 ; N four.dnom ; B 37 0 372 405 ;
+C -1 ; WX 333 ; N five.dnom ; B 35 -8 411 416 ;
+C -1 ; WX 358 ; N six.dnom ; B 61 -14 421 416 ;
+C -1 ; WX 347 ; N seven.dnom ; B 108 -15 426 390 ;
+C -1 ; WX 326 ; N eight.dnom ; B 47 -8 371 406 ;
+C -1 ; WX 358 ; N nine.dnom ; B 38 -14 399 416 ;
+C -1 ; WX 760 ; N uni24B6 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24B7 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24B8 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24B9 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BA ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BB ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BC ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BD ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BE ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24BF ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C0 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C1 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C2 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C3 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C4 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C5 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C6 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C7 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C8 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24C9 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CA ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CB ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CC ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CD ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CE ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24CF ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D0 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D1 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D2 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D3 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D4 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D5 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D6 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D7 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D8 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24D9 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DA ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DB ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DC ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DD ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DE ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24DF ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E0 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E1 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E2 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E3 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E4 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E5 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E6 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E7 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E8 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24E9 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni24EA ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2460 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2461 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2462 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2463 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2464 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2465 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2466 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2467 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2468 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2469 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246A ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246B ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246C ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246D ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246E ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni246F ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2470 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2471 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2472 ; B 107 -14 833 686 ;
+C -1 ; WX 760 ; N uni2473 ; B 107 -14 833 686 ;
+C -1 ; WX 278 ; N i.TRK ; B 16 0 360 683 ;
+C -1 ; WX 355 ; N uni00A7.sups.alt ; B 136 181 436 675 ;
+C -1 ; WX 321 ; N uni00B6.sups.alt ; B 110 178 498 667 ;
+C -1 ; WX 388 ; N uni2016.sups.alt ; B 167 168 445 667 ;
+C -1 ; WX 348 ; N uni2020.sups.alt ; B 181 173 456 675 ;
+C -1 ; WX 347 ; N uni2021.sups.alt ; B 123 177 455 675 ;
+C -1 ; WX 349 ; N uni2217.sups.alt ; B 152 378 482 680 ;
+C -1 ; WX 359 ; N zero.numr ; B 135 262 475 676 ;
+C -1 ; WX 244 ; N one.numr ; B 108 270 339 676 ;
+C -1 ; WX 326 ; N two.numr ; B 92 270 448 676 ;
+C -1 ; WX 323 ; N three.numr ; B 103 262 433 676 ;
+C -1 ; WX 350 ; N four.numr ; B 109 270 444 675 ;
+C -1 ; WX 333 ; N five.numr ; B 107 262 484 686 ;
+C -1 ; WX 358 ; N six.numr ; B 133 256 494 686 ;
+C -1 ; WX 347 ; N seven.numr ; B 180 255 498 660 ;
+C -1 ; WX 326 ; N eight.numr ; B 119 262 443 676 ;
+C -1 ; WX 358 ; N nine.numr ; B 111 256 471 686 ;
+C -1 ; WX 254 ; N exclam.sups ; B 167 244 372 737 ;
+C -1 ; WX 315 ; N quotedbl.sups ; B 222 531 452 737 ;
+C -1 ; WX 376 ; N numbersign.sups ; B 110 250 529 727 ;
+C -1 ; WX 384 ; N dollar.sups ; B 108 183 512 774 ;
+C -1 ; WX 637 ; N percent.sups ; B 186 241 713 737 ;
+C -1 ; WX 584 ; N ampersand.sups ; B 119 239 688 737 ;
+C -1 ; WX 252 ; N parenleft.sups ; B 134 108 424 738 ;
+C -1 ; WX 252 ; N parenright.sups ; B 55 108 346 738 ;
+C -1 ; WX 366 ; N asterisk.sups ; B 188 436 495 737 ;
+C -1 ; WX 412 ; N plus.sups ; B 135 248 508 612 ;
+C -1 ; WX 189 ; N comma.sups ; B 96 148 227 342 ;
+C -1 ; WX 267 ; N hyphen.sups ; B 129 381 353 443 ;
+C -1 ; WX 196 ; N period.sups ; B 125 242 228 341 ;
+C -1 ; WX 213 ; N slash.sups ; B 58 240 417 737 ;
+C -1 ; WX 439 ; N zero.sups ; B 161 234 538 728 ;
+C -1 ; WX 307 ; N one.sups ; B 117 250 392 733 ;
+C -1 ; WX 437 ; N two.sups ; B 116 250 522 727 ;
+C -1 ; WX 390 ; N three.sups ; B 118 232 491 731 ;
+C -1 ; WX 441 ; N four.sups ; B 142 250 522 734 ;
+C -1 ; WX 384 ; N five.sups ; B 119 232 533 742 ;
+C -1 ; WX 425 ; N six.sups ; B 154 234 559 737 ;
+C -1 ; WX 398 ; N seven.sups ; B 207 235 546 722 ;
+C -1 ; WX 392 ; N eight.sups ; B 135 234 501 728 ;
+C -1 ; WX 423 ; N nine.sups ; B 130 226 529 728 ;
+C -1 ; WX 215 ; N colon.sups ; B 133 242 300 580 ;
+C -1 ; WX 219 ; N semicolon.sups ; B 123 148 299 580 ;
+C -1 ; WX 413 ; N less.sups ; B 154 245 523 616 ;
+C -1 ; WX 402 ; N equal.sups ; B 119 338 514 521 ;
+C -1 ; WX 413 ; N greater.sups ; B 113 250 479 610 ;
+C -1 ; WX 353 ; N question.sups ; B 214 244 505 737 ;
+C -1 ; WX 680 ; N at.sups ; B 208 240 750 737 ;
+C -1 ; WX 550 ; N A.sups ; B 77 250 613 735 ;
+C -1 ; WX 507 ; N B.sups ; B 79 250 595 727 ;
+C -1 ; WX 494 ; N C.sups ; B 139 240 650 737 ;
+C -1 ; WX 539 ; N D.sups ; B 78 250 655 727 ;
+C -1 ; WX 459 ; N E.sups ; B 75 250 605 727 ;
+C -1 ; WX 419 ; N F.sups ; B 75 250 605 727 ;
+C -1 ; WX 540 ; N G.sups ; B 141 240 667 737 ;
+C -1 ; WX 539 ; N H.sups ; B 80 250 720 727 ;
+C -1 ; WX 253 ; N I.sups ; B 80 250 436 727 ;
+C -1 ; WX 306 ; N J.sups ; B 85 240 489 727 ;
+C -1 ; WX 554 ; N K.sups ; B 91 250 700 727 ;
+C -1 ; WX 448 ; N L.sups ; B 75 250 542 727 ;
+C -1 ; WX 691 ; N M.sups ; B 75 250 868 727 ;
+C -1 ; WX 562 ; N N.sups ; B 76 242 747 727 ;
+C -1 ; WX 540 ; N O.sups ; B 144 240 658 737 ;
+C -1 ; WX 423 ; N P.sups ; B 78 250 578 727 ;
+C -1 ; WX 541 ; N Q.sups ; B 143 118 658 737 ;
+C -1 ; WX 510 ; N R.sups ; B 79 250 598 727 ;
+C -1 ; WX 421 ; N S.sups ; B 117 240 536 737 ;
+C -1 ; WX 460 ; N T.sups ; B 171 250 638 727 ;
+C -1 ; WX 532 ; N U.sups ; B 175 240 716 727 ;
+C -1 ; WX 527 ; N V.sups ; B 200 242 705 727 ;
+C -1 ; WX 707 ; N W.sups ; B 193 242 894 727 ;
+C -1 ; WX 548 ; N X.sups ; B 74 250 725 727 ;
+C -1 ; WX 532 ; N Y.sups ; B 204 250 715 727 ;
+C -1 ; WX 484 ; N Z.sups ; B 77 250 665 727 ;
+C -1 ; WX 250 ; N bracketleft.sups ; B 98 134 422 727 ;
+C -1 ; WX 213 ; N backslash.sups ; B 191 240 284 737 ;
+C -1 ; WX 250 ; N bracketright.sups ; B 60 134 384 727 ;
+C -1 ; WX 385 ; N asciicircum.sups ; B 137 447 489 727 ;
+C -1 ; WX 357 ; N underscore.sups ; B 41 152 411 203 ;
+C -1 ; WX 233 ; N grave.sups ; B 198 589 326 736 ;
+C -1 ; WX 341 ; N a.sups ; B 109 243 424 581 ;
+C -1 ; WX 380 ; N b.sups ; B 126 243 479 745 ;
+C -1 ; WX 342 ; N c.sups ; B 118 243 447 581 ;
+C -1 ; WX 379 ; N d.sups ; B 118 243 526 745 ;
+C -1 ; WX 328 ; N e.sups ; B 117 243 424 581 ;
+C -1 ; WX 252 ; N f.sups ; B 81 250 475 745 ;
+C -1 ; WX 390 ; N g.sups ; B 62 89 517 581 ;
+C -1 ; WX 379 ; N h.sups ; B 73 250 461 745 ;
+C -1 ; WX 216 ; N i.sups ; B 78 250 343 745 ;
+C -1 ; WX 216 ; N j.sups ; B -15 90 353 745 ;
+C -1 ; WX 386 ; N k.sups ; B 72 250 515 747 ;
+C -1 ; WX 213 ; N l.sups ; B 82 250 345 746 ;
+C -1 ; WX 586 ; N m.sups ; B 78 250 667 581 ;
+C -1 ; WX 378 ; N n.sups ; B 80 250 459 581 ;
+C -1 ; WX 381 ; N o.sups ; B 124 243 479 581 ;
+C -1 ; WX 381 ; N p.sups ; B 28 90 482 581 ;
+C -1 ; WX 380 ; N q.sups ; B 116 90 483 582 ;
+C -1 ; WX 251 ; N r.sups ; B 71 250 399 581 ;
+C -1 ; WX 299 ; N s.sups ; B 103 243 395 580 ;
+C -1 ; WX 213 ; N t.sups ; B 131 243 350 667 ;
+C -1 ; WX 380 ; N u.sups ; B 135 243 476 574 ;
+C -1 ; WX 383 ; N v.sups ; B 161 240 522 574 ;
+C -1 ; WX 516 ; N w.sups ; B 163 240 651 574 ;
+C -1 ; WX 387 ; N x.sups ; B 79 250 490 574 ;
+C -1 ; WX 389 ; N y.sups ; B 55 89 526 574 ;
+C -1 ; WX 359 ; N z.sups ; B 91 250 492 574 ;
+C -1 ; WX 361 ; N braceleft.sups ; B 185 116 468 740 ;
+C -1 ; WX 156 ; N bar.sups ; B 80 125 305 727 ;
+C -1 ; WX 361 ; N braceright.sups ; B 122 116 406 740 ;
+C -1 ; WX 388 ; N asciitilde.sups ; B 138 368 480 488 ;
+C -1 ; WX 254 ; N exclamdown.sups ; B 99 68 308 580 ;
+C -1 ; WX 385 ; N uni00A7.sups ; B 132 140 474 737 ;
+C -1 ; WX 355 ; N uni00B6.sups ; B 106 136 548 727 ;
+C -1 ; WX 500 ; N ae.sups ; B 110 243 589 582 ;
+C -1 ; WX 328 ; N egrave.sups ; B 117 243 424 736 ;
+C -1 ; WX 328 ; N eacute.sups ; B 117 243 479 736 ;
+C -1 ; WX 378 ; N ntilde.sups ; B 80 250 514 721 ;
+C -1 ; WX 421 ; N uni2016.sups ; B 161 125 488 727 ;
+C -1 ; WX 247 ; N quoteright.sups ; B 218 543 349 737 ;
+C -1 ; WX 374 ; N uni2020.sups ; B 190 130 488 737 ;
+C -1 ; WX 375 ; N uni2021.sups ; B 121 134 489 737 ;
+C -1 ; WX 379 ; N uni2217.sups ; B 120 243 488 617 ;
+C -1 ; WX 382 ; N zero.slash.sups ; B 134 240 512 737 ;
+C -1 ; WX 439 ; N zero.inferior ; B 35 -236 412 258 ;
+C -1 ; WX 307 ; N one.inferior ; B -9 -220 266 263 ;
+C -1 ; WX 437 ; N two.inferior ; B -10 -220 396 257 ;
+C -1 ; WX 390 ; N three.inferior ; B -8 -238 365 261 ;
+C -1 ; WX 441 ; N four.inferior ; B 16 -220 396 264 ;
+C -1 ; WX 384 ; N five.inferior ; B -7 -238 407 272 ;
+C -1 ; WX 425 ; N six.inferior ; B 28 -236 434 267 ;
+C -1 ; WX 398 ; N seven.inferior ; B 81 -235 421 252 ;
+C -1 ; WX 392 ; N eight.inferior ; B 9 -236 375 258 ;
+C -1 ; WX 423 ; N nine.inferior ; B 4 -244 403 258 ;
C -1 ; WX 500 ; N zero.up ; B 24 -14 476 676 ;
C -1 ; WX 500 ; N one.up ; B 111 0 394 676 ;
C -1 ; WX 500 ; N two.up ; B 30 0 475 676 ;
@@ -1515,11 +1721,11 @@ C -1 ; WX 500 ; N seven.up ; B 20 -8 449 662 ;
C -1 ; WX 500 ; N eight.up ; B 56 -14 445 676 ;
C -1 ; WX 500 ; N nine.up ; B 30 -22 459 676 ;
C -1 ; WX 373 ; N exclam.up ; B 160 -9 267 676 ;
-C -1 ; WX 399 ; N parenleft.up ; B 94 -177 350 676 ;
-C -1 ; WX 438 ; N parenright.up ; B 99 -177 355 676 ;
+C -1 ; WX 399 ; N parenleft.up ; B 114 -177 370 676 ;
+C -1 ; WX 438 ; N parenright.up ; B 199 -177 455 676 ;
C -1 ; WX 489 ; N question.up ; B 98 -8 444 676 ;
-C -1 ; WX 398 ; N bracketleft.up ; B 154 -156 365 662 ;
-C -1 ; WX 423 ; N bracketright.up ; B 114 -156 325 662 ;
+C -1 ; WX 398 ; N bracketleft.up ; B 204 -156 415 662 ;
+C -1 ; WX 423 ; N bracketright.up ; B 184 -156 395 662 ;
C -1 ; WX 402 ; N braceleft.up ; B 70 -181 330 680 ;
C -1 ; WX 400 ; N braceright.up ; B 70 -181 332 680 ;
C -1 ; WX 333 ; N exclamdown.up ; B 96 -226 203 459 ;
@@ -1538,7 +1744,7 @@ C -1 ; WX 469 ; N eight.osfup ; B 40 -14 429 676 ;
C -1 ; WX 509 ; N nine.osfup ; B 40 -228 469 470 ;
EndCharMetrics
StartKernData
-StartKernPairs 21124
+StartKernPairs 21301
KPX comma quoteright -55
KPX comma quotedblright -30
KPX hyphen A -25
@@ -1561,23 +1767,41 @@ KPX hyphen Wgrave -60
KPX hyphen Wacute -60
KPX hyphen Wdieresis -60
KPX hyphen amacron.sc -25
+KPX hyphen amacron.sc -25
+KPX hyphen aogonek.sc -25
KPX hyphen aogonek.sc -25
KPX hyphen aeacute.sc -25
+KPX hyphen aeacute.sc -25
KPX hyphen tcaron.sc -75
+KPX hyphen tcaron.sc -75
+KPX hyphen wacute.sc -60
KPX hyphen wacute.sc -60
KPX hyphen wcircumflex.sc -60
+KPX hyphen wcircumflex.sc -60
+KPX hyphen wdieresis.sc -60
KPX hyphen wdieresis.sc -60
KPX hyphen wgrave.sc -60
+KPX hyphen wgrave.sc -60
KPX hyphen ycircumflex.sc -110
+KPX hyphen ycircumflex.sc -110
+KPX hyphen a.sc -25
KPX hyphen a.sc -25
KPX hyphen t.sc -75
+KPX hyphen t.sc -75
+KPX hyphen v.sc -80
KPX hyphen v.sc -80
KPX hyphen w.sc -60
+KPX hyphen w.sc -60
KPX hyphen y.sc -110
+KPX hyphen y.sc -110
+KPX hyphen adieresis.sc -25
KPX hyphen adieresis.sc -25
KPX hyphen aring.sc -25
+KPX hyphen aring.sc -25
+KPX hyphen ae.sc -25
KPX hyphen ae.sc -25
KPX hyphen ydieresis.sc -110
+KPX hyphen ydieresis.sc -110
KPX hyphen a.pc -25
KPX hyphen t.pc -75
KPX hyphen v.pc -80
@@ -1597,24 +1821,6 @@ KPX hyphen uni021B.pc -75
KPX hyphen wgrave.pc -60
KPX hyphen wacute.pc -60
KPX hyphen wdieresis.pc -60
-KPX hyphen a.sc -25
-KPX hyphen t.sc -75
-KPX hyphen v.sc -80
-KPX hyphen w.sc -60
-KPX hyphen y.sc -110
-KPX hyphen adieresis.sc -25
-KPX hyphen aring.sc -25
-KPX hyphen ae.sc -25
-KPX hyphen ydieresis.sc -110
-KPX hyphen amacron.sc -25
-KPX hyphen aogonek.sc -25
-KPX hyphen tcaron.sc -75
-KPX hyphen wcircumflex.sc -60
-KPX hyphen ycircumflex.sc -110
-KPX hyphen aeacute.sc -25
-KPX hyphen wgrave.sc -60
-KPX hyphen wacute.sc -60
-KPX hyphen wdieresis.sc -60
KPX A hyphen -25
KPX A C -55
KPX A G -55
@@ -1717,45 +1923,86 @@ KPX A quoteright -115
KPX A quotedblright -90
KPX A guilsinglleft -75
KPX A gacute.sc -45
+KPX A gacute.sc -45
KPX A gcaron.sc -45
+KPX A gcaron.sc -45
+KPX A oogonek.sc -50
KPX A oogonek.sc -50
KPX A cacute.sc -45
+KPX A cacute.sc -45
KPX A ccaron.sc -45
+KPX A ccaron.sc -45
+KPX A ccircumflex.sc -45
KPX A ccircumflex.sc -45
KPX A cdotaccent.sc -45
+KPX A cdotaccent.sc -45
+KPX A gbreve.sc -45
KPX A gbreve.sc -45
KPX A gcircumflex.sc -45
+KPX A gcircumflex.sc -45
+KPX A gcommaaccent.sc -45
KPX A gcommaaccent.sc -45
KPX A gdotaccent.sc -45
+KPX A gdotaccent.sc -45
+KPX A obreve.sc -50
KPX A obreve.sc -50
KPX A ohungarumlaut.sc -50
+KPX A ohungarumlaut.sc -50
KPX A omacron.sc -50
+KPX A omacron.sc -50
+KPX A tcaron.sc -45
KPX A tcaron.sc -45
KPX A ubreve.sc -50
+KPX A ubreve.sc -50
+KPX A uhungarumlaut.sc -50
KPX A uhungarumlaut.sc -50
KPX A umacron.sc -50
+KPX A umacron.sc -50
+KPX A uogonek.sc -50
KPX A uogonek.sc -50
KPX A uring.sc -50
+KPX A uring.sc -50
+KPX A wacute.sc -95
KPX A wacute.sc -95
KPX A wcircumflex.sc -95
+KPX A wcircumflex.sc -95
KPX A wdieresis.sc -95
+KPX A wdieresis.sc -95
+KPX A wgrave.sc -95
KPX A wgrave.sc -95
KPX A ycircumflex.sc -65
+KPX A ycircumflex.sc -65
+KPX A c.sc -45
KPX A c.sc -45
KPX A g.sc -45
+KPX A g.sc -45
+KPX A o.sc -50
KPX A o.sc -50
KPX A q.sc -50
+KPX A q.sc -50
+KPX A t.sc -45
KPX A t.sc -45
KPX A u.sc -50
+KPX A u.sc -50
KPX A v.sc -110
+KPX A v.sc -110
+KPX A w.sc -95
KPX A w.sc -95
KPX A y.sc -65
+KPX A y.sc -65
+KPX A ccedilla.sc -45
KPX A ccedilla.sc -45
KPX A ograve.sc -50
+KPX A ograve.sc -50
+KPX A odieresis.sc -50
KPX A odieresis.sc -50
KPX A oslash.sc -50
+KPX A oslash.sc -50
+KPX A ucircumflex.sc -50
KPX A ucircumflex.sc -50
KPX A udieresis.sc -50
+KPX A udieresis.sc -50
+KPX A ydieresis.sc -65
KPX A ydieresis.sc -65
KPX A c.pc -45
KPX A g.pc -45
@@ -1799,47 +2046,6 @@ KPX A uni021B.pc -45
KPX A wgrave.pc -95
KPX A wacute.pc -95
KPX A wdieresis.pc -95
-KPX A c.sc -45
-KPX A g.sc -45
-KPX A o.sc -50
-KPX A q.sc -50
-KPX A t.sc -45
-KPX A u.sc -50
-KPX A v.sc -110
-KPX A w.sc -95
-KPX A y.sc -65
-KPX A ccedilla.sc -45
-KPX A ograve.sc -50
-KPX A odieresis.sc -50
-KPX A oslash.sc -50
-KPX A ucircumflex.sc -50
-KPX A udieresis.sc -50
-KPX A ydieresis.sc -65
-KPX A cacute.sc -45
-KPX A ccircumflex.sc -45
-KPX A cdotaccent.sc -45
-KPX A ccaron.sc -45
-KPX A gcircumflex.sc -45
-KPX A gbreve.sc -45
-KPX A gdotaccent.sc -45
-KPX A gcommaaccent.sc -45
-KPX A omacron.sc -50
-KPX A obreve.sc -50
-KPX A ohungarumlaut.sc -50
-KPX A tcaron.sc -45
-KPX A umacron.sc -50
-KPX A ubreve.sc -50
-KPX A uring.sc -50
-KPX A uhungarumlaut.sc -50
-KPX A uogonek.sc -50
-KPX A wcircumflex.sc -95
-KPX A ycircumflex.sc -65
-KPX A gcaron.sc -45
-KPX A oogonek.sc -50
-KPX A gacute.sc -45
-KPX A wgrave.sc -95
-KPX A wacute.sc -95
-KPX A wdieresis.sc -95
KPX B A -50
KPX B O -25
KPX B V -65
@@ -1898,62 +2104,119 @@ KPX B Ohornhookabove -25
KPX B Ohorntilde -25
KPX B Ohorndotbelow -25
KPX B abreveacute.sc -40
+KPX B abreveacute.sc -40
KPX B abrevedotbelow.sc -40
+KPX B abrevedotbelow.sc -40
+KPX B abrevegrave.sc -40
KPX B abrevegrave.sc -40
KPX B abrevehookabove.sc -40
+KPX B abrevehookabove.sc -40
KPX B abrevetilde.sc -40
+KPX B abrevetilde.sc -40
+KPX B acircumflexacute.sc -40
KPX B acircumflexacute.sc -40
KPX B acircumflexdotbelow.sc -40
+KPX B acircumflexdotbelow.sc -40
+KPX B acircumflexgrave.sc -40
KPX B acircumflexgrave.sc -40
KPX B acircumflexhookabove.sc -40
+KPX B acircumflexhookabove.sc -40
+KPX B acircumflextilde.sc -40
KPX B acircumflextilde.sc -40
KPX B adotbelow.sc -40
+KPX B adotbelow.sc -40
+KPX B ahookabove.sc -40
KPX B ahookabove.sc -40
KPX B ocircumflexacute.sc -20
+KPX B ocircumflexacute.sc -20
KPX B ocircumflexdotbelow.sc -20
+KPX B ocircumflexdotbelow.sc -20
+KPX B ocircumflexgrave.sc -20
KPX B ocircumflexgrave.sc -20
KPX B ocircumflexhookabove.sc -20
+KPX B ocircumflexhookabove.sc -20
+KPX B ocircumflextilde.sc -20
KPX B ocircumflextilde.sc -20
KPX B odotbelow.sc -20
+KPX B odotbelow.sc -20
+KPX B oe.sc -15
KPX B oe.sc -15
KPX B ohookabove.sc -20
+KPX B ohookabove.sc -20
+KPX B ohornacute.sc -20
KPX B ohornacute.sc -20
KPX B ohorndotbelow.sc -20
+KPX B ohorndotbelow.sc -20
KPX B ohorngrave.sc -20
+KPX B ohorngrave.sc -20
+KPX B ohornhookabove.sc -20
KPX B ohornhookabove.sc -20
KPX B ohorntilde.sc -20
+KPX B ohorntilde.sc -20
+KPX B oogonek.sc -20
KPX B oogonek.sc -20
KPX B abreve.sc -40
+KPX B abreve.sc -40
+KPX B amacron.sc -40
KPX B amacron.sc -40
KPX B aogonek.sc -40
+KPX B aogonek.sc -40
+KPX B aeacute.sc -40
KPX B aeacute.sc -40
KPX B obreve.sc -20
+KPX B obreve.sc -20
KPX B ohungarumlaut.sc -20
+KPX B ohungarumlaut.sc -20
+KPX B omacron.sc -20
KPX B omacron.sc -20
KPX B wacute.sc -50
+KPX B wacute.sc -50
+KPX B wcircumflex.sc -50
KPX B wcircumflex.sc -50
KPX B wdieresis.sc -50
+KPX B wdieresis.sc -50
KPX B wgrave.sc -50
+KPX B wgrave.sc -50
+KPX B ycircumflex.sc -60
KPX B ycircumflex.sc -60
KPX B a.sc -40
+KPX B a.sc -40
+KPX B o.sc -20
KPX B o.sc -20
KPX B v.sc -55
+KPX B v.sc -55
KPX B w.sc -50
+KPX B w.sc -50
+KPX B y.sc -60
KPX B y.sc -60
KPX B agrave.sc -40
+KPX B agrave.sc -40
+KPX B aacute.sc -40
KPX B aacute.sc -40
KPX B acircumflex.sc -40
+KPX B acircumflex.sc -40
+KPX B atilde.sc -40
KPX B atilde.sc -40
KPX B adieresis.sc -40
+KPX B adieresis.sc -40
+KPX B aring.sc -40
KPX B aring.sc -40
KPX B ae.sc -40
+KPX B ae.sc -40
KPX B ograve.sc -20
+KPX B ograve.sc -20
+KPX B oacute.sc -20
KPX B oacute.sc -20
KPX B ocircumflex.sc -20
+KPX B ocircumflex.sc -20
+KPX B otilde.sc -20
KPX B otilde.sc -20
KPX B odieresis.sc -20
+KPX B odieresis.sc -20
+KPX B oslash.sc -20
KPX B oslash.sc -20
KPX B ydieresis.sc -60
+KPX B ydieresis.sc -60
KPX B a.pc -40
KPX B o.pc -20
KPX B v.pc -55
@@ -2011,63 +2274,6 @@ KPX B ohorngrave.pc -20
KPX B ohornhookabove.pc -20
KPX B ohorntilde.pc -20
KPX B ohorndotbelow.pc -20
-KPX B a.sc -40
-KPX B o.sc -20
-KPX B v.sc -55
-KPX B w.sc -50
-KPX B y.sc -60
-KPX B agrave.sc -40
-KPX B aacute.sc -40
-KPX B acircumflex.sc -40
-KPX B atilde.sc -40
-KPX B adieresis.sc -40
-KPX B aring.sc -40
-KPX B ae.sc -40
-KPX B ograve.sc -20
-KPX B oacute.sc -20
-KPX B ocircumflex.sc -20
-KPX B otilde.sc -20
-KPX B odieresis.sc -20
-KPX B oslash.sc -20
-KPX B ydieresis.sc -60
-KPX B amacron.sc -40
-KPX B abreve.sc -40
-KPX B aogonek.sc -40
-KPX B omacron.sc -20
-KPX B obreve.sc -20
-KPX B ohungarumlaut.sc -20
-KPX B oe.sc -15
-KPX B wcircumflex.sc -50
-KPX B ycircumflex.sc -60
-KPX B oogonek.sc -20
-KPX B aeacute.sc -40
-KPX B wgrave.sc -50
-KPX B wacute.sc -50
-KPX B wdieresis.sc -50
-KPX B adotbelow.sc -40
-KPX B ahookabove.sc -40
-KPX B acircumflexacute.sc -40
-KPX B acircumflexgrave.sc -40
-KPX B acircumflexhookabove.sc -40
-KPX B acircumflextilde.sc -40
-KPX B acircumflexdotbelow.sc -40
-KPX B abreveacute.sc -40
-KPX B abrevegrave.sc -40
-KPX B abrevehookabove.sc -40
-KPX B abrevetilde.sc -40
-KPX B abrevedotbelow.sc -40
-KPX B odotbelow.sc -20
-KPX B ohookabove.sc -20
-KPX B ocircumflexacute.sc -20
-KPX B ocircumflexgrave.sc -20
-KPX B ocircumflexhookabove.sc -20
-KPX B ocircumflextilde.sc -20
-KPX B ocircumflexdotbelow.sc -20
-KPX B ohornacute.sc -20
-KPX B ohorngrave.sc -20
-KPX B ohornhookabove.sc -20
-KPX B ohorntilde.sc -20
-KPX B ohorndotbelow.sc -20
KPX C A -25
KPX C O -10
KPX C Agrave -25
@@ -2116,52 +2322,99 @@ KPX C Ohornhookabove -10
KPX C Ohorntilde -10
KPX C Ohorndotbelow -10
KPX C abreveacute.sc -20
+KPX C abreveacute.sc -20
KPX C abrevedotbelow.sc -20
+KPX C abrevedotbelow.sc -20
+KPX C abrevegrave.sc -20
KPX C abrevegrave.sc -20
KPX C abrevehookabove.sc -20
+KPX C abrevehookabove.sc -20
+KPX C abrevetilde.sc -20
KPX C abrevetilde.sc -20
KPX C acircumflexacute.sc -20
+KPX C acircumflexacute.sc -20
+KPX C acircumflexdotbelow.sc -20
KPX C acircumflexdotbelow.sc -20
KPX C acircumflexgrave.sc -20
+KPX C acircumflexgrave.sc -20
KPX C acircumflexhookabove.sc -20
+KPX C acircumflexhookabove.sc -20
+KPX C acircumflextilde.sc -20
KPX C acircumflextilde.sc -20
KPX C adotbelow.sc -20
+KPX C adotbelow.sc -20
+KPX C ahookabove.sc -20
KPX C ahookabove.sc -20
KPX C ocircumflexacute.sc -10
+KPX C ocircumflexacute.sc -10
+KPX C ocircumflexdotbelow.sc -10
KPX C ocircumflexdotbelow.sc -10
KPX C ocircumflexgrave.sc -10
+KPX C ocircumflexgrave.sc -10
+KPX C ocircumflexhookabove.sc -10
KPX C ocircumflexhookabove.sc -10
KPX C ocircumflextilde.sc -10
+KPX C ocircumflextilde.sc -10
KPX C odotbelow.sc -10
+KPX C odotbelow.sc -10
+KPX C ohookabove.sc -10
KPX C ohookabove.sc -10
KPX C ohornacute.sc -10
+KPX C ohornacute.sc -10
+KPX C ohorndotbelow.sc -10
KPX C ohorndotbelow.sc -10
KPX C ohorngrave.sc -10
+KPX C ohorngrave.sc -10
+KPX C ohornhookabove.sc -10
KPX C ohornhookabove.sc -10
KPX C ohorntilde.sc -10
+KPX C ohorntilde.sc -10
+KPX C oogonek.sc -10
KPX C oogonek.sc -10
KPX C abreve.sc -20
+KPX C abreve.sc -20
KPX C amacron.sc -20
+KPX C amacron.sc -20
+KPX C aogonek.sc -20
KPX C aogonek.sc -20
KPX C aeacute.sc -15
+KPX C aeacute.sc -15
+KPX C obreve.sc -10
KPX C obreve.sc -10
KPX C ohungarumlaut.sc -10
+KPX C ohungarumlaut.sc -10
+KPX C omacron.sc -10
KPX C omacron.sc -10
KPX C a.sc -20
+KPX C a.sc -20
+KPX C o.sc -10
KPX C o.sc -10
KPX C agrave.sc -20
+KPX C agrave.sc -20
KPX C aacute.sc -20
+KPX C aacute.sc -20
+KPX C acircumflex.sc -20
KPX C acircumflex.sc -20
KPX C atilde.sc -20
+KPX C atilde.sc -20
+KPX C adieresis.sc -20
KPX C adieresis.sc -20
KPX C aring.sc -20
+KPX C aring.sc -20
+KPX C ae.sc -15
KPX C ae.sc -15
KPX C ograve.sc -10
+KPX C ograve.sc -10
+KPX C oacute.sc -10
KPX C oacute.sc -10
KPX C ocircumflex.sc -10
+KPX C ocircumflex.sc -10
KPX C otilde.sc -10
+KPX C otilde.sc -10
+KPX C odieresis.sc -10
KPX C odieresis.sc -10
KPX C oslash.sc -10
+KPX C oslash.sc -10
KPX C a.pc -20
KPX C o.pc -10
KPX C agrave.pc -20
@@ -2209,53 +2462,6 @@ KPX C ohorngrave.pc -10
KPX C ohornhookabove.pc -10
KPX C ohorntilde.pc -10
KPX C ohorndotbelow.pc -10
-KPX C a.sc -20
-KPX C o.sc -10
-KPX C agrave.sc -20
-KPX C aacute.sc -20
-KPX C acircumflex.sc -20
-KPX C atilde.sc -20
-KPX C adieresis.sc -20
-KPX C aring.sc -20
-KPX C ae.sc -15
-KPX C ograve.sc -10
-KPX C oacute.sc -10
-KPX C ocircumflex.sc -10
-KPX C otilde.sc -10
-KPX C odieresis.sc -10
-KPX C oslash.sc -10
-KPX C amacron.sc -20
-KPX C abreve.sc -20
-KPX C aogonek.sc -20
-KPX C omacron.sc -10
-KPX C obreve.sc -10
-KPX C ohungarumlaut.sc -10
-KPX C oogonek.sc -10
-KPX C aeacute.sc -15
-KPX C adotbelow.sc -20
-KPX C ahookabove.sc -20
-KPX C acircumflexacute.sc -20
-KPX C acircumflexgrave.sc -20
-KPX C acircumflexhookabove.sc -20
-KPX C acircumflextilde.sc -20
-KPX C acircumflexdotbelow.sc -20
-KPX C abreveacute.sc -20
-KPX C abrevegrave.sc -20
-KPX C abrevehookabove.sc -20
-KPX C abrevetilde.sc -20
-KPX C abrevedotbelow.sc -20
-KPX C odotbelow.sc -10
-KPX C ohookabove.sc -10
-KPX C ocircumflexacute.sc -10
-KPX C ocircumflexgrave.sc -10
-KPX C ocircumflexhookabove.sc -10
-KPX C ocircumflextilde.sc -10
-KPX C ocircumflexdotbelow.sc -10
-KPX C ohornacute.sc -10
-KPX C ohorngrave.sc -10
-KPX C ohornhookabove.sc -10
-KPX C ohorntilde.sc -10
-KPX C ohorndotbelow.sc -10
KPX D A -65
KPX D J -40
KPX D V -70
@@ -2290,39 +2496,73 @@ KPX D Abrevegrave -65
KPX D Abrevehookabove -65
KPX D Abrevedotbelow -65
KPX D abreveacute.sc -55
+KPX D abreveacute.sc -55
+KPX D abrevedotbelow.sc -55
KPX D abrevedotbelow.sc -55
KPX D abrevegrave.sc -55
+KPX D abrevegrave.sc -55
+KPX D abrevehookabove.sc -55
KPX D abrevehookabove.sc -55
KPX D acircumflexacute.sc -55
+KPX D acircumflexacute.sc -55
KPX D acircumflexdotbelow.sc -55
+KPX D acircumflexdotbelow.sc -55
+KPX D acircumflexgrave.sc -55
KPX D acircumflexgrave.sc -55
KPX D acircumflexhookabove.sc -55
+KPX D acircumflexhookabove.sc -55
+KPX D acircumflextilde.sc -55
KPX D acircumflextilde.sc -55
KPX D adotbelow.sc -55
+KPX D adotbelow.sc -55
+KPX D ahookabove.sc -55
KPX D ahookabove.sc -55
KPX D jacute.sc -35
+KPX D jacute.sc -35
KPX D Jacute -40
KPX D abreve.sc -55
+KPX D abreve.sc -55
+KPX D amacron.sc -55
KPX D amacron.sc -55
KPX D aogonek.sc -55
+KPX D aogonek.sc -55
+KPX D jcircumflex.sc -35
KPX D jcircumflex.sc -35
KPX D wacute.sc -45
+KPX D wacute.sc -45
+KPX D wcircumflex.sc -45
KPX D wcircumflex.sc -45
KPX D wdieresis.sc -45
+KPX D wdieresis.sc -45
+KPX D wgrave.sc -45
KPX D wgrave.sc -45
KPX D ycircumflex.sc -65
+KPX D ycircumflex.sc -65
+KPX D a.sc -55
KPX D a.sc -55
KPX D j.sc -35
+KPX D j.sc -35
KPX D v.sc -60
+KPX D v.sc -60
+KPX D w.sc -45
KPX D w.sc -45
KPX D x.sc -55
+KPX D x.sc -55
+KPX D y.sc -65
KPX D y.sc -65
KPX D agrave.sc -55
+KPX D agrave.sc -55
+KPX D aacute.sc -55
KPX D aacute.sc -55
KPX D acircumflex.sc -55
+KPX D acircumflex.sc -55
+KPX D atilde.sc -55
KPX D atilde.sc -55
KPX D adieresis.sc -55
+KPX D adieresis.sc -55
KPX D aring.sc -55
+KPX D aring.sc -55
+KPX D ydieresis.sc -65
KPX D ydieresis.sc -65
KPX D a.pc -55
KPX D j.pc -35
@@ -2358,40 +2598,6 @@ KPX D abrevegrave.pc -55
KPX D abrevehookabove.pc -55
KPX D abrevedotbelow.pc -55
KPX D jacute.pc -35
-KPX D a.sc -55
-KPX D j.sc -35
-KPX D v.sc -60
-KPX D w.sc -45
-KPX D x.sc -55
-KPX D y.sc -65
-KPX D agrave.sc -55
-KPX D aacute.sc -55
-KPX D acircumflex.sc -55
-KPX D atilde.sc -55
-KPX D adieresis.sc -55
-KPX D aring.sc -55
-KPX D ydieresis.sc -65
-KPX D amacron.sc -55
-KPX D abreve.sc -55
-KPX D aogonek.sc -55
-KPX D jcircumflex.sc -35
-KPX D wcircumflex.sc -45
-KPX D ycircumflex.sc -65
-KPX D wgrave.sc -45
-KPX D wacute.sc -45
-KPX D wdieresis.sc -45
-KPX D adotbelow.sc -55
-KPX D ahookabove.sc -55
-KPX D acircumflexacute.sc -55
-KPX D acircumflexgrave.sc -55
-KPX D acircumflexhookabove.sc -55
-KPX D acircumflextilde.sc -55
-KPX D acircumflexdotbelow.sc -55
-KPX D abreveacute.sc -55
-KPX D abrevegrave.sc -55
-KPX D abrevehookabove.sc -55
-KPX D abrevedotbelow.sc -55
-KPX D jacute.sc -35
KPX F comma -50
KPX F period -60
KPX F A -70
@@ -2481,26 +2687,45 @@ KPX F uhornhookabove -5
KPX F uhorntilde -5
KPX F uhorndotbelow -5
KPX F abrevedotbelow.sc -30
+KPX F abrevedotbelow.sc -30
KPX F acircumflexdotbelow.sc -30
+KPX F acircumflexdotbelow.sc -30
+KPX F ahookabove.sc -30
KPX F ahookabove.sc -30
KPX F jacute.sc -10
+KPX F jacute.sc -10
+KPX F oe.sc -15
KPX F oe.sc -15
KPX F Jacute -15
KPX F jacute -15
KPX F abreve.sc -30
+KPX F abreve.sc -30
+KPX F amacron.sc -30
KPX F amacron.sc -30
KPX F aogonek.sc -60
+KPX F aogonek.sc -60
+KPX F aeacute.sc -25
KPX F aeacute.sc -25
KPX F jcircumflex.sc -5
+KPX F jcircumflex.sc -5
KPX F a.sc -60
+KPX F a.sc -60
+KPX F j.sc -15
KPX F j.sc -15
KPX F agrave.sc -30
+KPX F agrave.sc -30
+KPX F aacute.sc -45
KPX F aacute.sc -45
KPX F acircumflex.sc -30
+KPX F acircumflex.sc -30
+KPX F atilde.sc -30
KPX F atilde.sc -30
KPX F adieresis.sc -30
+KPX F adieresis.sc -30
+KPX F aring.sc -30
KPX F aring.sc -30
KPX F ae.sc -25
+KPX F ae.sc -25
KPX F a.pc -60
KPX F j.pc -15
KPX F agrave.pc -30
@@ -2520,25 +2745,6 @@ KPX F ahookabove.pc -30
KPX F acircumflexdotbelow.pc -30
KPX F abrevedotbelow.pc -30
KPX F jacute.pc -10
-KPX F a.sc -60
-KPX F j.sc -15
-KPX F agrave.sc -30
-KPX F aacute.sc -45
-KPX F acircumflex.sc -30
-KPX F atilde.sc -30
-KPX F adieresis.sc -30
-KPX F aring.sc -30
-KPX F ae.sc -25
-KPX F amacron.sc -30
-KPX F abreve.sc -30
-KPX F aogonek.sc -60
-KPX F jcircumflex.sc -5
-KPX F oe.sc -15
-KPX F aeacute.sc -25
-KPX F ahookabove.sc -30
-KPX F acircumflexdotbelow.sc -30
-KPX F abrevedotbelow.sc -30
-KPX F jacute.sc -10
KPX G A -25
KPX G T -20
KPX G V -25
@@ -2576,39 +2782,74 @@ KPX G Abrevehookabove -25
KPX G Abrevetilde -25
KPX G Abrevedotbelow -25
KPX G abreveacute.sc -20
+KPX G abreveacute.sc -20
KPX G abrevedotbelow.sc -20
+KPX G abrevedotbelow.sc -20
+KPX G abrevegrave.sc -20
KPX G abrevegrave.sc -20
KPX G abrevehookabove.sc -20
+KPX G abrevehookabove.sc -20
+KPX G abrevetilde.sc -20
KPX G abrevetilde.sc -20
KPX G acircumflexacute.sc -20
+KPX G acircumflexacute.sc -20
+KPX G acircumflexdotbelow.sc -20
KPX G acircumflexdotbelow.sc -20
KPX G acircumflexgrave.sc -20
+KPX G acircumflexgrave.sc -20
KPX G acircumflexhookabove.sc -20
+KPX G acircumflexhookabove.sc -20
+KPX G acircumflextilde.sc -20
KPX G acircumflextilde.sc -20
KPX G adotbelow.sc -20
+KPX G adotbelow.sc -20
+KPX G ahookabove.sc -20
KPX G ahookabove.sc -20
KPX G abreve.sc -20
+KPX G abreve.sc -20
KPX G amacron.sc -20
+KPX G amacron.sc -20
+KPX G aogonek.sc -20
KPX G aogonek.sc -20
KPX G aeacute.sc -15
+KPX G aeacute.sc -15
+KPX G tcaron.sc -15
KPX G tcaron.sc -15
KPX G wacute.sc -15
+KPX G wacute.sc -15
KPX G wcircumflex.sc -15
+KPX G wcircumflex.sc -15
+KPX G wdieresis.sc -15
KPX G wdieresis.sc -15
KPX G wgrave.sc -15
+KPX G wgrave.sc -15
+KPX G ycircumflex.sc -20
KPX G ycircumflex.sc -20
KPX G a.sc -20
+KPX G a.sc -20
+KPX G t.sc -15
KPX G t.sc -15
KPX G v.sc -20
+KPX G v.sc -20
+KPX G w.sc -15
KPX G w.sc -15
KPX G y.sc -20
+KPX G y.sc -20
KPX G agrave.sc -20
+KPX G agrave.sc -20
+KPX G aacute.sc -20
KPX G aacute.sc -20
KPX G acircumflex.sc -20
+KPX G acircumflex.sc -20
+KPX G atilde.sc -20
KPX G atilde.sc -20
KPX G adieresis.sc -20
+KPX G adieresis.sc -20
+KPX G aring.sc -20
KPX G aring.sc -20
KPX G ae.sc -15
+KPX G ae.sc -15
+KPX G ydieresis.sc -20
KPX G ydieresis.sc -20
KPX G a.pc -20
KPX G t.pc -15
@@ -2646,41 +2887,6 @@ KPX G abrevegrave.pc -20
KPX G abrevehookabove.pc -20
KPX G abrevetilde.pc -20
KPX G abrevedotbelow.pc -20
-KPX G a.sc -20
-KPX G t.sc -15
-KPX G v.sc -20
-KPX G w.sc -15
-KPX G y.sc -20
-KPX G agrave.sc -20
-KPX G aacute.sc -20
-KPX G acircumflex.sc -20
-KPX G atilde.sc -20
-KPX G adieresis.sc -20
-KPX G aring.sc -20
-KPX G ae.sc -15
-KPX G ydieresis.sc -20
-KPX G amacron.sc -20
-KPX G abreve.sc -20
-KPX G aogonek.sc -20
-KPX G tcaron.sc -15
-KPX G wcircumflex.sc -15
-KPX G ycircumflex.sc -20
-KPX G aeacute.sc -15
-KPX G wgrave.sc -15
-KPX G wacute.sc -15
-KPX G wdieresis.sc -15
-KPX G adotbelow.sc -20
-KPX G ahookabove.sc -20
-KPX G acircumflexacute.sc -20
-KPX G acircumflexgrave.sc -20
-KPX G acircumflexhookabove.sc -20
-KPX G acircumflextilde.sc -20
-KPX G acircumflexdotbelow.sc -20
-KPX G abreveacute.sc -20
-KPX G abrevegrave.sc -20
-KPX G abrevehookabove.sc -20
-KPX G abrevetilde.sc -20
-KPX G abrevedotbelow.sc -20
KPX J A -55
KPX J Adieresis -55
KPX J Aring -55
@@ -2689,12 +2895,19 @@ KPX J Amacron -55
KPX J Aogonek -55
KPX J AEacute -45
KPX J amacron.sc -45
+KPX J amacron.sc -45
+KPX J aogonek.sc -45
KPX J aogonek.sc -45
KPX J aeacute.sc -40
+KPX J aeacute.sc -40
+KPX J a.sc -45
KPX J a.sc -45
KPX J adieresis.sc -45
+KPX J adieresis.sc -45
+KPX J aring.sc -45
KPX J aring.sc -45
KPX J ae.sc -40
+KPX J ae.sc -40
KPX J a.pc -45
KPX J adieresis.pc -45
KPX J aring.pc -45
@@ -2702,13 +2915,6 @@ KPX J ae.pc -40
KPX J amacron.pc -45
KPX J aogonek.pc -45
KPX J aeacute.pc -40
-KPX J a.sc -45
-KPX J adieresis.sc -45
-KPX J aring.sc -45
-KPX J ae.sc -40
-KPX J amacron.sc -45
-KPX J aogonek.sc -45
-KPX J aeacute.sc -40
KPX K hyphen -65
KPX K C -45
KPX K G -50
@@ -2771,25 +2977,46 @@ KPX K ygrave -85
KPX K ydotbelow -85
KPX K ytilde -85
KPX K gacute.sc -40
+KPX K gacute.sc -40
KPX K gcaron.sc -40
+KPX K gcaron.sc -40
+KPX K oe.sc -40
KPX K oe.sc -40
KPX K oogonek.sc -40
+KPX K oogonek.sc -40
+KPX K cacute.sc -40
KPX K cacute.sc -40
KPX K ccaron.sc -40
+KPX K ccaron.sc -40
KPX K ccircumflex.sc -40
+KPX K ccircumflex.sc -40
+KPX K cdotaccent.sc -40
KPX K cdotaccent.sc -40
KPX K gbreve.sc -40
+KPX K gbreve.sc -40
+KPX K gcircumflex.sc -40
KPX K gcircumflex.sc -40
KPX K gcommaaccent.sc -40
+KPX K gcommaaccent.sc -40
+KPX K gdotaccent.sc -40
KPX K gdotaccent.sc -40
KPX K obreve.sc -40
+KPX K obreve.sc -40
+KPX K ohungarumlaut.sc -40
KPX K ohungarumlaut.sc -40
KPX K omacron.sc -40
+KPX K omacron.sc -40
KPX K c.sc -40
+KPX K c.sc -40
+KPX K g.sc -40
KPX K g.sc -40
KPX K o.sc -40
+KPX K o.sc -40
+KPX K ccedilla.sc -40
KPX K ccedilla.sc -40
KPX K odieresis.sc -40
+KPX K odieresis.sc -40
+KPX K oslash.sc -40
KPX K oslash.sc -40
KPX K c.pc -40
KPX K g.pc -40
@@ -2812,27 +3039,6 @@ KPX K oe.pc -40
KPX K gcaron.pc -40
KPX K oogonek.pc -40
KPX K gacute.pc -40
-KPX K c.sc -40
-KPX K g.sc -40
-KPX K o.sc -40
-KPX K ccedilla.sc -40
-KPX K odieresis.sc -40
-KPX K oslash.sc -40
-KPX K cacute.sc -40
-KPX K ccircumflex.sc -40
-KPX K cdotaccent.sc -40
-KPX K ccaron.sc -40
-KPX K gcircumflex.sc -40
-KPX K gbreve.sc -40
-KPX K gdotaccent.sc -40
-KPX K gcommaaccent.sc -40
-KPX K omacron.sc -40
-KPX K obreve.sc -40
-KPX K ohungarumlaut.sc -40
-KPX K oe.sc -40
-KPX K gcaron.sc -40
-KPX K oogonek.sc -40
-KPX K gacute.sc -40
KPX L hyphen 25
KPX L T -75
KPX L U -25
@@ -2872,35 +3078,65 @@ KPX L Uhorndotbelow -25
KPX L quoteright -125
KPX L quotedblright -100
KPX L udotbelow.sc -20
+KPX L udotbelow.sc -20
+KPX L uhookabove.sc -20
KPX L uhookabove.sc -20
KPX L uhornacute.sc -20
+KPX L uhornacute.sc -20
+KPX L uhorndotbelow.sc -20
KPX L uhorndotbelow.sc -20
KPX L uhorngrave.sc -20
+KPX L uhorngrave.sc -20
+KPX L uhornhookabove.sc -20
KPX L uhornhookabove.sc -20
KPX L uhorntilde.sc -20
+KPX L uhorntilde.sc -20
+KPX L tcaron.sc -65
KPX L tcaron.sc -65
KPX L ubreve.sc -20
+KPX L ubreve.sc -20
KPX L uhungarumlaut.sc -20
+KPX L uhungarumlaut.sc -20
+KPX L umacron.sc -20
KPX L umacron.sc -20
KPX L uogonek.sc -20
+KPX L uogonek.sc -20
+KPX L uring.sc -20
KPX L uring.sc -20
KPX L utilde.sc -20
+KPX L utilde.sc -20
+KPX L wacute.sc -75
KPX L wacute.sc -75
KPX L wcircumflex.sc -75
+KPX L wcircumflex.sc -75
+KPX L wdieresis.sc -75
KPX L wdieresis.sc -75
KPX L wgrave.sc -75
+KPX L wgrave.sc -75
KPX L ycircumflex.sc -85
+KPX L ycircumflex.sc -85
+KPX L t.sc -65
KPX L t.sc -65
KPX L u.sc -20
+KPX L u.sc -20
+KPX L v.sc -95
KPX L v.sc -95
KPX L w.sc -75
+KPX L w.sc -75
+KPX L y.sc -85
KPX L y.sc -85
KPX L ugrave.sc -20
+KPX L ugrave.sc -20
+KPX L uacute.sc -20
KPX L uacute.sc -20
KPX L ucircumflex.sc -20
+KPX L ucircumflex.sc -20
KPX L udieresis.sc -20
+KPX L udieresis.sc -20
+KPX L yacute.sc -85
KPX L yacute.sc -85
KPX L ydieresis.sc -85
+KPX L ydieresis.sc -85
KPX L t.pc -65
KPX L u.pc -20
KPX L v.pc -95
@@ -2932,36 +3168,6 @@ KPX L uhorngrave.pc -20
KPX L uhornhookabove.pc -20
KPX L uhorntilde.pc -20
KPX L uhorndotbelow.pc -20
-KPX L t.sc -65
-KPX L u.sc -20
-KPX L v.sc -95
-KPX L w.sc -75
-KPX L y.sc -85
-KPX L ugrave.sc -20
-KPX L uacute.sc -20
-KPX L ucircumflex.sc -20
-KPX L udieresis.sc -20
-KPX L yacute.sc -85
-KPX L ydieresis.sc -85
-KPX L tcaron.sc -65
-KPX L utilde.sc -20
-KPX L umacron.sc -20
-KPX L ubreve.sc -20
-KPX L uring.sc -20
-KPX L uhungarumlaut.sc -20
-KPX L uogonek.sc -20
-KPX L wcircumflex.sc -75
-KPX L ycircumflex.sc -85
-KPX L wgrave.sc -75
-KPX L wacute.sc -75
-KPX L wdieresis.sc -75
-KPX L udotbelow.sc -20
-KPX L uhookabove.sc -20
-KPX L uhornacute.sc -20
-KPX L uhorngrave.sc -20
-KPX L uhornhookabove.sc -20
-KPX L uhorntilde.sc -20
-KPX L uhorndotbelow.sc -20
KPX N comma -15
KPX N period -20
KPX N A -30
@@ -3102,62 +3308,120 @@ KPX N uhornhookabove -25
KPX N uhorntilde -25
KPX N uhorndotbelow -25
KPX N abreveacute.sc -25
+KPX N abreveacute.sc -25
KPX N abrevedotbelow.sc -25
+KPX N abrevedotbelow.sc -25
+KPX N abrevegrave.sc -25
KPX N abrevegrave.sc -25
KPX N acircumflexacute.sc -25
+KPX N acircumflexacute.sc -25
KPX N acircumflexdotbelow.sc -25
+KPX N acircumflexdotbelow.sc -25
+KPX N acircumflexgrave.sc -25
KPX N acircumflexgrave.sc -25
KPX N acircumflexhookabove.sc -25
+KPX N acircumflexhookabove.sc -25
+KPX N acircumflextilde.sc -25
KPX N acircumflextilde.sc -25
KPX N adotbelow.sc -25
+KPX N adotbelow.sc -25
+KPX N ahookabove.sc -25
KPX N ahookabove.sc -25
KPX N gacute.sc -15
+KPX N gacute.sc -15
+KPX N gcaron.sc -15
KPX N gcaron.sc -15
KPX N ocircumflexacute.sc -15
+KPX N ocircumflexacute.sc -15
KPX N ocircumflexdotbelow.sc -15
+KPX N ocircumflexdotbelow.sc -15
+KPX N ocircumflexgrave.sc -15
KPX N ocircumflexgrave.sc -15
KPX N ocircumflexhookabove.sc -15
+KPX N ocircumflexhookabove.sc -15
+KPX N ocircumflextilde.sc -15
KPX N ocircumflextilde.sc -15
KPX N odotbelow.sc -15
+KPX N odotbelow.sc -15
+KPX N ohookabove.sc -15
KPX N ohookabove.sc -15
KPX N ohornacute.sc -15
+KPX N ohornacute.sc -15
+KPX N ohorndotbelow.sc -15
KPX N ohorndotbelow.sc -15
KPX N ohorngrave.sc -15
+KPX N ohorngrave.sc -15
KPX N ohornhookabove.sc -15
+KPX N ohornhookabove.sc -15
+KPX N ohorntilde.sc -15
KPX N ohorntilde.sc -15
KPX N oogonek.sc -15
+KPX N oogonek.sc -15
+KPX N abreve.sc -25
KPX N abreve.sc -25
KPX N amacron.sc -25
+KPX N amacron.sc -25
+KPX N aogonek.sc -25
KPX N aogonek.sc -25
KPX N aeacute.sc -15
+KPX N aeacute.sc -15
+KPX N cacute.sc -15
KPX N cacute.sc -15
KPX N ccaron.sc -15
+KPX N ccaron.sc -15
KPX N ccircumflex.sc -15
+KPX N ccircumflex.sc -15
+KPX N cdotaccent.sc -15
KPX N cdotaccent.sc -15
KPX N gbreve.sc -15
+KPX N gbreve.sc -15
+KPX N gcircumflex.sc -15
KPX N gcircumflex.sc -15
KPX N gcommaaccent.sc -15
+KPX N gcommaaccent.sc -15
+KPX N gdotaccent.sc -15
KPX N gdotaccent.sc -15
KPX N obreve.sc -15
+KPX N obreve.sc -15
+KPX N ohungarumlaut.sc -15
KPX N ohungarumlaut.sc -15
KPX N omacron.sc -15
+KPX N omacron.sc -15
KPX N a.sc -25
+KPX N a.sc -25
+KPX N c.sc -15
KPX N c.sc -15
KPX N g.sc -15
+KPX N g.sc -15
+KPX N o.sc -15
KPX N o.sc -15
KPX N agrave.sc -25
+KPX N agrave.sc -25
KPX N aacute.sc -25
+KPX N aacute.sc -25
+KPX N acircumflex.sc -25
KPX N acircumflex.sc -25
KPX N atilde.sc -25
+KPX N atilde.sc -25
+KPX N adieresis.sc -25
KPX N adieresis.sc -25
KPX N aring.sc -25
+KPX N aring.sc -25
KPX N ae.sc -15
+KPX N ae.sc -15
+KPX N ccedilla.sc -15
KPX N ccedilla.sc -15
KPX N ograve.sc -15
+KPX N ograve.sc -15
+KPX N oacute.sc -15
KPX N oacute.sc -15
KPX N ocircumflex.sc -15
+KPX N ocircumflex.sc -15
+KPX N otilde.sc -15
KPX N otilde.sc -15
KPX N odieresis.sc -15
+KPX N odieresis.sc -15
+KPX N oslash.sc -15
KPX N oslash.sc -15
KPX N a.pc -25
KPX N c.pc -15
@@ -3217,64 +3481,6 @@ KPX N ohorngrave.pc -15
KPX N ohornhookabove.pc -15
KPX N ohorntilde.pc -15
KPX N ohorndotbelow.pc -15
-KPX N a.sc -25
-KPX N c.sc -15
-KPX N g.sc -15
-KPX N o.sc -15
-KPX N agrave.sc -25
-KPX N aacute.sc -25
-KPX N acircumflex.sc -25
-KPX N atilde.sc -25
-KPX N adieresis.sc -25
-KPX N aring.sc -25
-KPX N ae.sc -15
-KPX N ccedilla.sc -15
-KPX N ograve.sc -15
-KPX N oacute.sc -15
-KPX N ocircumflex.sc -15
-KPX N otilde.sc -15
-KPX N odieresis.sc -15
-KPX N oslash.sc -15
-KPX N amacron.sc -25
-KPX N abreve.sc -25
-KPX N aogonek.sc -25
-KPX N cacute.sc -15
-KPX N ccircumflex.sc -15
-KPX N cdotaccent.sc -15
-KPX N ccaron.sc -15
-KPX N gcircumflex.sc -15
-KPX N gbreve.sc -15
-KPX N gdotaccent.sc -15
-KPX N gcommaaccent.sc -15
-KPX N omacron.sc -15
-KPX N obreve.sc -15
-KPX N ohungarumlaut.sc -15
-KPX N gcaron.sc -15
-KPX N oogonek.sc -15
-KPX N gacute.sc -15
-KPX N aeacute.sc -15
-KPX N adotbelow.sc -25
-KPX N ahookabove.sc -25
-KPX N acircumflexacute.sc -25
-KPX N acircumflexgrave.sc -25
-KPX N acircumflexhookabove.sc -25
-KPX N acircumflextilde.sc -25
-KPX N acircumflexdotbelow.sc -25
-KPX N abreveacute.sc -25
-KPX N abrevegrave.sc -25
-KPX N abrevedotbelow.sc -25
-KPX N odotbelow.sc -15
-KPX N ohookabove.sc -15
-KPX N ocircumflexacute.sc -15
-KPX N ocircumflexgrave.sc -15
-KPX N ocircumflexhookabove.sc -15
-KPX N ocircumflextilde.sc -15
-KPX N ocircumflexdotbelow.sc -15
-KPX N ohornacute.sc -15
-KPX N ohorngrave.sc -15
-KPX N ohornhookabove.sc -15
-KPX N ohorntilde.sc -15
-KPX N ohorndotbelow.sc -15
KPX O A -60
KPX O V -70
KPX O W -55
@@ -3304,33 +3510,61 @@ KPX O Abrevehookabove -60
KPX O Abrevetilde -60
KPX O Abrevedotbelow -60
KPX O abreveacute.sc -50
+KPX O abreveacute.sc -50
+KPX O abrevedotbelow.sc -50
KPX O abrevedotbelow.sc -50
KPX O abrevegrave.sc -50
+KPX O abrevegrave.sc -50
+KPX O abrevehookabove.sc -50
KPX O abrevehookabove.sc -50
KPX O abrevetilde.sc -50
+KPX O abrevetilde.sc -50
+KPX O adotbelow.sc -50
KPX O adotbelow.sc -50
KPX O ahookabove.sc -50
+KPX O ahookabove.sc -50
KPX O abreve.sc -50
+KPX O abreve.sc -50
+KPX O amacron.sc -50
KPX O amacron.sc -50
KPX O aogonek.sc -50
+KPX O aogonek.sc -50
+KPX O aeacute.sc -40
KPX O aeacute.sc -40
KPX O wacute.sc -45
+KPX O wacute.sc -45
+KPX O wcircumflex.sc -45
KPX O wcircumflex.sc -45
KPX O wdieresis.sc -45
+KPX O wdieresis.sc -45
+KPX O wgrave.sc -45
KPX O wgrave.sc -45
KPX O ycircumflex.sc -60
+KPX O ycircumflex.sc -60
KPX O a.sc -50
+KPX O a.sc -50
+KPX O v.sc -60
KPX O v.sc -60
KPX O w.sc -45
+KPX O w.sc -45
+KPX O x.sc -45
KPX O x.sc -45
KPX O y.sc -60
+KPX O y.sc -60
+KPX O agrave.sc -50
KPX O agrave.sc -50
KPX O aacute.sc -50
+KPX O aacute.sc -50
+KPX O atilde.sc -50
KPX O atilde.sc -50
KPX O adieresis.sc -50
+KPX O adieresis.sc -50
KPX O aring.sc -50
+KPX O aring.sc -50
+KPX O ae.sc -40
KPX O ae.sc -40
KPX O ydieresis.sc -60
+KPX O ydieresis.sc -60
KPX O a.pc -50
KPX O v.pc -60
KPX O w.pc -45
@@ -3359,34 +3593,6 @@ KPX O abrevegrave.pc -50
KPX O abrevehookabove.pc -50
KPX O abrevetilde.pc -50
KPX O abrevedotbelow.pc -50
-KPX O a.sc -50
-KPX O v.sc -60
-KPX O w.sc -45
-KPX O x.sc -45
-KPX O y.sc -60
-KPX O agrave.sc -50
-KPX O aacute.sc -50
-KPX O atilde.sc -50
-KPX O adieresis.sc -50
-KPX O aring.sc -50
-KPX O ae.sc -40
-KPX O ydieresis.sc -60
-KPX O amacron.sc -50
-KPX O abreve.sc -50
-KPX O aogonek.sc -50
-KPX O wcircumflex.sc -45
-KPX O ycircumflex.sc -60
-KPX O aeacute.sc -40
-KPX O wgrave.sc -45
-KPX O wacute.sc -45
-KPX O wdieresis.sc -45
-KPX O adotbelow.sc -50
-KPX O ahookabove.sc -50
-KPX O abreveacute.sc -50
-KPX O abrevegrave.sc -50
-KPX O abrevehookabove.sc -50
-KPX O abrevetilde.sc -50
-KPX O abrevedotbelow.sc -50
KPX P comma -95
KPX P hyphen -40
KPX P period -100
@@ -3427,16 +3633,27 @@ KPX P oogonek -25
KPX P AEacute -90
KPX P aeacute -20
KPX P jacute.sc -40
+KPX P jacute.sc -40
KPX P Jacute -50
KPX P amacron.sc -75
+KPX P amacron.sc -75
KPX P aogonek.sc -75
+KPX P aogonek.sc -75
+KPX P aeacute.sc -75
KPX P aeacute.sc -75
KPX P jcircumflex.sc -40
+KPX P jcircumflex.sc -40
KPX P a.sc -75
+KPX P a.sc -75
+KPX P j.sc -40
KPX P j.sc -40
KPX P aacute.sc -75
+KPX P aacute.sc -75
+KPX P adieresis.sc -75
KPX P adieresis.sc -75
KPX P aring.sc -75
+KPX P aring.sc -75
+KPX P ae.sc -75
KPX P ae.sc -75
KPX P a.pc -75
KPX P j.pc -40
@@ -3449,17 +3666,6 @@ KPX P aogonek.pc -75
KPX P jcircumflex.pc -40
KPX P aeacute.pc -75
KPX P jacute.pc -40
-KPX P a.sc -75
-KPX P j.sc -40
-KPX P aacute.sc -75
-KPX P adieresis.sc -75
-KPX P aring.sc -75
-KPX P ae.sc -75
-KPX P amacron.sc -75
-KPX P aogonek.sc -75
-KPX P jcircumflex.sc -40
-KPX P aeacute.sc -75
-KPX P jacute.sc -40
KPX R hyphen -50
KPX R C -40
KPX R G -45
@@ -3592,70 +3798,136 @@ KPX R uhorntilde -25
KPX R Uhorndotbelow -55
KPX R uhorndotbelow -25
KPX R gacute.sc -40
+KPX R gacute.sc -40
KPX R gcaron.sc -40
+KPX R gcaron.sc -40
+KPX R ocircumflexacute.sc -40
KPX R ocircumflexacute.sc -40
KPX R ocircumflexdotbelow.sc -40
+KPX R ocircumflexdotbelow.sc -40
+KPX R ocircumflexgrave.sc -40
KPX R ocircumflexgrave.sc -40
KPX R ocircumflexhookabove.sc -40
+KPX R ocircumflexhookabove.sc -40
+KPX R ocircumflextilde.sc -40
KPX R ocircumflextilde.sc -40
KPX R odotbelow.sc -40
+KPX R odotbelow.sc -40
+KPX R oe.sc -35
KPX R oe.sc -35
KPX R ohookabove.sc -40
+KPX R ohookabove.sc -40
KPX R ohornacute.sc -40
+KPX R ohornacute.sc -40
+KPX R ohorndotbelow.sc -40
KPX R ohorndotbelow.sc -40
KPX R ohorngrave.sc -40
+KPX R ohorngrave.sc -40
+KPX R ohornhookabove.sc -40
KPX R ohornhookabove.sc -40
KPX R ohorntilde.sc -40
+KPX R ohorntilde.sc -40
+KPX R oogonek.sc -40
KPX R oogonek.sc -40
KPX R udotbelow.sc -45
+KPX R udotbelow.sc -45
+KPX R uhookabove.sc -45
KPX R uhookabove.sc -45
KPX R uhornacute.sc -45
+KPX R uhornacute.sc -45
KPX R uhorndotbelow.sc -45
+KPX R uhorndotbelow.sc -45
+KPX R uhorngrave.sc -45
KPX R uhorngrave.sc -45
KPX R uhornhookabove.sc -45
+KPX R uhornhookabove.sc -45
+KPX R uhorntilde.sc -45
KPX R uhorntilde.sc -45
KPX R cacute.sc -35
+KPX R cacute.sc -35
+KPX R ccaron.sc -35
KPX R ccaron.sc -35
KPX R ccircumflex.sc -35
+KPX R ccircumflex.sc -35
+KPX R cdotaccent.sc -35
KPX R cdotaccent.sc -35
KPX R gbreve.sc -40
+KPX R gbreve.sc -40
KPX R gcircumflex.sc -40
+KPX R gcircumflex.sc -40
+KPX R gcommaaccent.sc -40
KPX R gcommaaccent.sc -40
KPX R gdotaccent.sc -40
+KPX R gdotaccent.sc -40
+KPX R obreve.sc -40
KPX R obreve.sc -40
KPX R ohungarumlaut.sc -40
+KPX R ohungarumlaut.sc -40
+KPX R omacron.sc -40
KPX R omacron.sc -40
KPX R tcaron.sc -30
+KPX R tcaron.sc -30
+KPX R ubreve.sc -45
KPX R ubreve.sc -45
KPX R uhungarumlaut.sc -45
+KPX R uhungarumlaut.sc -45
KPX R umacron.sc -45
+KPX R umacron.sc -45
+KPX R uogonek.sc -45
KPX R uogonek.sc -45
KPX R uring.sc -45
+KPX R uring.sc -45
+KPX R utilde.sc -45
KPX R utilde.sc -45
KPX R wacute.sc -60
+KPX R wacute.sc -60
+KPX R wcircumflex.sc -60
KPX R wcircumflex.sc -60
KPX R wdieresis.sc -60
+KPX R wdieresis.sc -60
+KPX R wgrave.sc -60
KPX R wgrave.sc -60
KPX R ycircumflex.sc -65
+KPX R ycircumflex.sc -65
KPX R c.sc -35
+KPX R c.sc -35
+KPX R g.sc -40
KPX R g.sc -40
KPX R o.sc -40
+KPX R o.sc -40
+KPX R t.sc -30
KPX R t.sc -30
KPX R u.sc -45
+KPX R u.sc -45
+KPX R v.sc -65
KPX R v.sc -65
KPX R w.sc -60
+KPX R w.sc -60
+KPX R y.sc -65
KPX R y.sc -65
KPX R ccedilla.sc -35
+KPX R ccedilla.sc -35
KPX R ograve.sc -40
+KPX R ograve.sc -40
+KPX R oacute.sc -40
KPX R oacute.sc -40
KPX R ocircumflex.sc -40
+KPX R ocircumflex.sc -40
+KPX R otilde.sc -40
KPX R otilde.sc -40
KPX R odieresis.sc -40
+KPX R odieresis.sc -40
+KPX R oslash.sc -40
KPX R oslash.sc -40
KPX R ugrave.sc -45
+KPX R ugrave.sc -45
+KPX R uacute.sc -45
KPX R uacute.sc -45
KPX R ucircumflex.sc -45
+KPX R ucircumflex.sc -45
KPX R udieresis.sc -45
+KPX R udieresis.sc -45
+KPX R ydieresis.sc -65
KPX R ydieresis.sc -65
KPX R c.pc -35
KPX R g.pc -40
@@ -3724,72 +3996,6 @@ KPX R uhorngrave.pc -45
KPX R uhornhookabove.pc -45
KPX R uhorntilde.pc -45
KPX R uhorndotbelow.pc -45
-KPX R c.sc -35
-KPX R g.sc -40
-KPX R o.sc -40
-KPX R t.sc -30
-KPX R u.sc -45
-KPX R v.sc -65
-KPX R w.sc -60
-KPX R y.sc -65
-KPX R ccedilla.sc -35
-KPX R ograve.sc -40
-KPX R oacute.sc -40
-KPX R ocircumflex.sc -40
-KPX R otilde.sc -40
-KPX R odieresis.sc -40
-KPX R oslash.sc -40
-KPX R ugrave.sc -45
-KPX R uacute.sc -45
-KPX R ucircumflex.sc -45
-KPX R udieresis.sc -45
-KPX R ydieresis.sc -65
-KPX R cacute.sc -35
-KPX R ccircumflex.sc -35
-KPX R cdotaccent.sc -35
-KPX R ccaron.sc -35
-KPX R gcircumflex.sc -40
-KPX R gbreve.sc -40
-KPX R gdotaccent.sc -40
-KPX R gcommaaccent.sc -40
-KPX R omacron.sc -40
-KPX R obreve.sc -40
-KPX R ohungarumlaut.sc -40
-KPX R oe.sc -35
-KPX R tcaron.sc -30
-KPX R utilde.sc -45
-KPX R umacron.sc -45
-KPX R ubreve.sc -45
-KPX R uring.sc -45
-KPX R uhungarumlaut.sc -45
-KPX R uogonek.sc -45
-KPX R wcircumflex.sc -60
-KPX R ycircumflex.sc -65
-KPX R gcaron.sc -40
-KPX R oogonek.sc -40
-KPX R gacute.sc -40
-KPX R wgrave.sc -60
-KPX R wacute.sc -60
-KPX R wdieresis.sc -60
-KPX R odotbelow.sc -40
-KPX R ohookabove.sc -40
-KPX R ocircumflexacute.sc -40
-KPX R ocircumflexgrave.sc -40
-KPX R ocircumflexhookabove.sc -40
-KPX R ocircumflextilde.sc -40
-KPX R ocircumflexdotbelow.sc -40
-KPX R ohornacute.sc -40
-KPX R ohorngrave.sc -40
-KPX R ohornhookabove.sc -40
-KPX R ohorntilde.sc -40
-KPX R ohorndotbelow.sc -40
-KPX R udotbelow.sc -45
-KPX R uhookabove.sc -45
-KPX R uhornacute.sc -45
-KPX R uhorngrave.sc -45
-KPX R uhornhookabove.sc -45
-KPX R uhorntilde.sc -45
-KPX R uhorndotbelow.sc -45
KPX S A -35
KPX S T -20
KPX S V -25
@@ -3829,38 +4035,72 @@ KPX S Abrevegrave -35
KPX S Abrevetilde -35
KPX S Abrevedotbelow -35
KPX S abreveacute.sc -30
+KPX S abreveacute.sc -30
+KPX S abrevedotbelow.sc -30
KPX S abrevedotbelow.sc -30
KPX S abrevegrave.sc -30
+KPX S abrevegrave.sc -30
+KPX S abrevetilde.sc -30
KPX S abrevetilde.sc -30
KPX S acircumflexacute.sc -30
+KPX S acircumflexacute.sc -30
KPX S acircumflexdotbelow.sc -30
+KPX S acircumflexdotbelow.sc -30
+KPX S acircumflexgrave.sc -30
KPX S acircumflexgrave.sc -30
KPX S acircumflexhookabove.sc -30
+KPX S acircumflexhookabove.sc -30
+KPX S acircumflextilde.sc -30
KPX S acircumflextilde.sc -30
KPX S adotbelow.sc -30
+KPX S adotbelow.sc -30
+KPX S ahookabove.sc -30
KPX S ahookabove.sc -30
KPX S abreve.sc -30
+KPX S abreve.sc -30
+KPX S amacron.sc -30
KPX S amacron.sc -30
KPX S aogonek.sc -30
+KPX S aogonek.sc -30
KPX S aeacute.sc -25
+KPX S aeacute.sc -25
+KPX S tcaron.sc -15
KPX S tcaron.sc -15
KPX S wacute.sc -15
+KPX S wacute.sc -15
+KPX S wcircumflex.sc -15
KPX S wcircumflex.sc -15
KPX S wdieresis.sc -15
+KPX S wdieresis.sc -15
+KPX S wgrave.sc -15
KPX S wgrave.sc -15
KPX S ycircumflex.sc -25
+KPX S ycircumflex.sc -25
+KPX S a.sc -30
KPX S a.sc -30
KPX S t.sc -15
+KPX S t.sc -15
KPX S v.sc -20
+KPX S v.sc -20
+KPX S w.sc -15
KPX S w.sc -15
KPX S y.sc -25
+KPX S y.sc -25
+KPX S agrave.sc -30
KPX S agrave.sc -30
KPX S aacute.sc -30
+KPX S aacute.sc -30
+KPX S acircumflex.sc -30
KPX S acircumflex.sc -30
KPX S atilde.sc -30
+KPX S atilde.sc -30
+KPX S adieresis.sc -30
KPX S adieresis.sc -30
KPX S aring.sc -30
+KPX S aring.sc -30
KPX S ae.sc -25
+KPX S ae.sc -25
+KPX S ydieresis.sc -25
KPX S ydieresis.sc -25
KPX S a.pc -30
KPX S t.pc -15
@@ -3897,40 +4137,6 @@ KPX S abreveacute.pc -30
KPX S abrevegrave.pc -30
KPX S abrevetilde.pc -30
KPX S abrevedotbelow.pc -30
-KPX S a.sc -30
-KPX S t.sc -15
-KPX S v.sc -20
-KPX S w.sc -15
-KPX S y.sc -25
-KPX S agrave.sc -30
-KPX S aacute.sc -30
-KPX S acircumflex.sc -30
-KPX S atilde.sc -30
-KPX S adieresis.sc -30
-KPX S aring.sc -30
-KPX S ae.sc -25
-KPX S ydieresis.sc -25
-KPX S amacron.sc -30
-KPX S abreve.sc -30
-KPX S aogonek.sc -30
-KPX S tcaron.sc -15
-KPX S wcircumflex.sc -15
-KPX S ycircumflex.sc -25
-KPX S aeacute.sc -25
-KPX S wgrave.sc -15
-KPX S wacute.sc -15
-KPX S wdieresis.sc -15
-KPX S adotbelow.sc -30
-KPX S ahookabove.sc -30
-KPX S acircumflexacute.sc -30
-KPX S acircumflexgrave.sc -30
-KPX S acircumflexhookabove.sc -30
-KPX S acircumflextilde.sc -30
-KPX S acircumflexdotbelow.sc -30
-KPX S abreveacute.sc -30
-KPX S abrevegrave.sc -30
-KPX S abrevetilde.sc -30
-KPX S abrevedotbelow.sc -30
KPX T comma -75
KPX T hyphen -75
KPX T period -80
@@ -4091,40 +4297,73 @@ KPX T yhookabove -50
KPX T ytilde -50
KPX T guilsinglleft -125
KPX T abrevedotbelow.sc -25
+KPX T abrevedotbelow.sc -25
+KPX T acircumflexdotbelow.sc -25
KPX T acircumflexdotbelow.sc -25
KPX T adotbelow.sc -45
+KPX T adotbelow.sc -45
+KPX T ahookabove.sc -25
KPX T ahookabove.sc -25
KPX T jacute.sc -15
+KPX T jacute.sc -15
+KPX T oe.sc -40
KPX T oe.sc -40
KPX T yhookabove.sc 5
+KPX T yhookabove.sc 5
+KPX T ytilde.sc 5
KPX T ytilde.sc 5
KPX T Jacute -20
KPX T jacute -20
KPX T abreve.sc -25
+KPX T abreve.sc -25
KPX T amacron.sc -25
+KPX T amacron.sc -25
+KPX T aogonek.sc -45
KPX T aogonek.sc -45
KPX T aeacute.sc -80
+KPX T aeacute.sc -80
+KPX T jcircumflex.sc -10
KPX T jcircumflex.sc -10
KPX T wacute.sc 15
+KPX T wacute.sc 15
KPX T wcircumflex.sc 10
+KPX T wcircumflex.sc 10
+KPX T wdieresis.sc 10
KPX T wdieresis.sc 10
KPX T wgrave.sc 10
+KPX T wgrave.sc 10
+KPX T ycircumflex.sc 5
KPX T ycircumflex.sc 5
KPX T ygrave.sc 5
+KPX T ygrave.sc 5
KPX T a.sc -45
+KPX T a.sc -45
+KPX T j.sc -15
KPX T j.sc -15
KPX T v.sc 15
+KPX T v.sc 15
+KPX T w.sc 15
KPX T w.sc 15
KPX T y.sc 10
+KPX T y.sc 10
+KPX T agrave.sc -25
KPX T agrave.sc -25
KPX T aacute.sc -35
+KPX T aacute.sc -35
+KPX T acircumflex.sc -25
KPX T acircumflex.sc -25
KPX T atilde.sc -25
+KPX T atilde.sc -25
KPX T adieresis.sc -25
+KPX T adieresis.sc -25
+KPX T aring.sc -25
KPX T aring.sc -25
KPX T ae.sc -80
+KPX T ae.sc -80
+KPX T yacute.sc 5
KPX T yacute.sc 5
KPX T ydieresis.sc 5
+KPX T ydieresis.sc 5
KPX T a.pc -45
KPX T j.pc -15
KPX T v.pc 15
@@ -4158,39 +4397,6 @@ KPX T ygrave.pc 5
KPX T yhookabove.pc 5
KPX T ytilde.pc 5
KPX T jacute.pc -15
-KPX T a.sc -45
-KPX T j.sc -15
-KPX T v.sc 15
-KPX T w.sc 15
-KPX T y.sc 10
-KPX T agrave.sc -25
-KPX T aacute.sc -35
-KPX T acircumflex.sc -25
-KPX T atilde.sc -25
-KPX T adieresis.sc -25
-KPX T aring.sc -25
-KPX T ae.sc -80
-KPX T yacute.sc 5
-KPX T ydieresis.sc 5
-KPX T amacron.sc -25
-KPX T abreve.sc -25
-KPX T aogonek.sc -45
-KPX T jcircumflex.sc -10
-KPX T oe.sc -40
-KPX T wcircumflex.sc 10
-KPX T ycircumflex.sc 5
-KPX T aeacute.sc -80
-KPX T wgrave.sc 10
-KPX T wacute.sc 15
-KPX T wdieresis.sc 10
-KPX T adotbelow.sc -45
-KPX T ahookabove.sc -25
-KPX T acircumflexdotbelow.sc -25
-KPX T abrevedotbelow.sc -25
-KPX T ygrave.sc 5
-KPX T yhookabove.sc 5
-KPX T ytilde.sc 5
-KPX T jacute.sc -15
KPX U comma -30
KPX U period -35
KPX U A -65
@@ -4229,21 +4435,37 @@ KPX U Abrevegrave -65
KPX U Abrevehookabove -65
KPX U Abrevedotbelow -65
KPX U abrevedotbelow.sc -25
+KPX U abrevedotbelow.sc -25
+KPX U acircumflexdotbelow.sc -25
KPX U acircumflexdotbelow.sc -25
KPX U adotbelow.sc -55
+KPX U adotbelow.sc -55
+KPX U ahookabove.sc -25
KPX U ahookabove.sc -25
KPX U abreve.sc -25
+KPX U abreve.sc -25
+KPX U amacron.sc -25
KPX U amacron.sc -25
KPX U aogonek.sc -55
+KPX U aogonek.sc -55
KPX U aeacute.sc -50
+KPX U aeacute.sc -50
+KPX U a.sc -55
KPX U a.sc -55
KPX U agrave.sc -25
+KPX U agrave.sc -25
+KPX U aacute.sc -40
KPX U aacute.sc -40
KPX U acircumflex.sc -25
+KPX U acircumflex.sc -25
+KPX U atilde.sc -25
KPX U atilde.sc -25
KPX U adieresis.sc -25
+KPX U adieresis.sc -25
+KPX U aring.sc -25
KPX U aring.sc -25
KPX U ae.sc -50
+KPX U ae.sc -50
KPX U a.pc -55
KPX U agrave.pc -25
KPX U aacute.pc -40
@@ -4260,22 +4482,14 @@ KPX U adotbelow.pc -55
KPX U ahookabove.pc -25
KPX U acircumflexdotbelow.pc -25
KPX U abrevedotbelow.pc -25
-KPX U a.sc -55
-KPX U agrave.sc -25
-KPX U aacute.sc -40
-KPX U acircumflex.sc -25
-KPX U atilde.sc -25
-KPX U adieresis.sc -25
-KPX U aring.sc -25
-KPX U ae.sc -50
-KPX U amacron.sc -25
-KPX U abreve.sc -25
-KPX U aogonek.sc -55
-KPX U aeacute.sc -50
-KPX U adotbelow.sc -55
-KPX U ahookabove.sc -25
-KPX U acircumflexdotbelow.sc -25
-KPX U abrevedotbelow.sc -25
+KPX V zcaron -67
+KPX V scircumflex -66
+KPX V scedilla -66
+KPX V scaron -66
+KPX V cdotaccent -67
+KPX V ccircumflex -67
+KPX V ccedilla -67
+KPX V ccaron -67
KPX V comma -105
KPX V hyphen -70
KPX V period -110
@@ -4287,13 +4501,16 @@ KPX V G -65
KPX V O -65
KPX V S -45
KPX V a -90
+KPX V c -125
KPX V e -85
KPX V g -100
KPX V i -20
KPX V o -90
KPX V r -55
+KPX V s -125
KPX V u -50
KPX V y -55
+KPX V z -120
KPX V guillemotleft -110
KPX V Agrave -125
KPX V Aacute -125
@@ -4340,6 +4557,7 @@ KPX V abreve -45
KPX V Aogonek -125
KPX V aogonek -90
KPX V Cacute -65
+KPX V cacute -125
KPX V Ccircumflex -65
KPX V Cdotaccent -65
KPX V Ccaron -65
@@ -4369,6 +4587,7 @@ KPX V racute -40
KPX V rcommaaccent -55
KPX V rcaron -30
KPX V Sacute -45
+KPX V sacute -125
KPX V Scircumflex -45
KPX V Scedilla -45
KPX V Scaron -45
@@ -4379,6 +4598,8 @@ KPX V uring -25
KPX V uhungarumlaut -25
KPX V uogonek -50
KPX V ycircumflex -30
+KPX V zacute -120
+KPX V zdotaccent -120
KPX V Gcaron -65
KPX V gcaron -50
KPX V Oogonek -65
@@ -4441,59 +4662,113 @@ KPX V yhookabove -30
KPX V ytilde -30
KPX V guilsinglleft -120
KPX V abrevedotbelow.sc -50
+KPX V abrevedotbelow.sc -50
+KPX V acircumflexdotbelow.sc -50
KPX V acircumflexdotbelow.sc -50
KPX V adotbelow.sc -105
+KPX V adotbelow.sc -105
+KPX V ahookabove.sc -50
KPX V ahookabove.sc -50
KPX V gacute.sc -40
+KPX V gacute.sc -40
+KPX V gcaron.sc -25
KPX V gcaron.sc -25
KPX V ocircumflexdotbelow.sc -25
+KPX V ocircumflexdotbelow.sc -25
+KPX V odotbelow.sc -55
KPX V odotbelow.sc -55
KPX V oe.sc -40
+KPX V oe.sc -40
+KPX V ohookabove.sc -25
KPX V ohookabove.sc -25
KPX V ohornacute.sc -25
+KPX V ohornacute.sc -25
KPX V ohorndotbelow.sc -25
+KPX V ohorndotbelow.sc -25
+KPX V ohorngrave.sc -25
KPX V ohorngrave.sc -25
KPX V ohornhookabove.sc -25
+KPX V ohornhookabove.sc -25
+KPX V ohorntilde.sc -25
KPX V ohorntilde.sc -25
KPX V oogonek.sc -55
+KPX V oogonek.sc -55
+KPX V scaron.sc -20
KPX V scaron.sc -20
KPX V abreve.sc -50
+KPX V abreve.sc -50
+KPX V amacron.sc -50
KPX V amacron.sc -50
KPX V aogonek.sc -105
+KPX V aogonek.sc -105
KPX V aeacute.sc -80
+KPX V aeacute.sc -80
+KPX V cacute.sc -40
KPX V cacute.sc -40
KPX V ccaron.sc -25
+KPX V ccaron.sc -25
+KPX V ccircumflex.sc -25
KPX V ccircumflex.sc -25
KPX V cdotaccent.sc -25
+KPX V cdotaccent.sc -25
+KPX V gbreve.sc -25
KPX V gbreve.sc -25
KPX V gcircumflex.sc -25
+KPX V gcircumflex.sc -25
+KPX V gcommaaccent.sc -55
KPX V gcommaaccent.sc -55
KPX V gdotaccent.sc -25
+KPX V gdotaccent.sc -25
KPX V obreve.sc -25
+KPX V obreve.sc -25
+KPX V ohungarumlaut.sc -25
KPX V ohungarumlaut.sc -25
KPX V omacron.sc -25
+KPX V omacron.sc -25
+KPX V sacute.sc -30
KPX V sacute.sc -30
KPX V scedilla.sc -40
+KPX V scedilla.sc -40
+KPX V scircumflex.sc -20
KPX V scircumflex.sc -20
KPX V a.sc -105
+KPX V a.sc -105
+KPX V c.sc -55
KPX V c.sc -55
KPX V g.sc -55
+KPX V g.sc -55
KPX V o.sc -55
+KPX V o.sc -55
+KPX V s.sc -40
KPX V s.sc -40
KPX V agrave.sc -50
+KPX V agrave.sc -50
+KPX V aacute.sc -80
KPX V aacute.sc -80
KPX V acircumflex.sc -50
+KPX V acircumflex.sc -50
+KPX V atilde.sc -50
KPX V atilde.sc -50
KPX V adieresis.sc -50
+KPX V adieresis.sc -50
+KPX V aring.sc -50
KPX V aring.sc -50
KPX V ae.sc -80
+KPX V ae.sc -80
KPX V ccedilla.sc -55
+KPX V ccedilla.sc -55
+KPX V ograve.sc -25
KPX V ograve.sc -25
KPX V oacute.sc -40
+KPX V oacute.sc -40
+KPX V ocircumflex.sc -25
KPX V ocircumflex.sc -25
KPX V otilde.sc -25
+KPX V otilde.sc -25
+KPX V odieresis.sc -25
KPX V odieresis.sc -25
KPX V oslash.sc -55
+KPX V oslash.sc -55
KPX V a.pc -105
KPX V c.pc -55
KPX V g.pc -55
@@ -4549,60 +4824,14 @@ KPX V ohorngrave.pc -25
KPX V ohornhookabove.pc -25
KPX V ohorntilde.pc -25
KPX V ohorndotbelow.pc -25
-KPX V a.sc -105
-KPX V c.sc -55
-KPX V g.sc -55
-KPX V o.sc -55
-KPX V s.sc -40
-KPX V agrave.sc -50
-KPX V aacute.sc -80
-KPX V acircumflex.sc -50
-KPX V atilde.sc -50
-KPX V adieresis.sc -50
-KPX V aring.sc -50
-KPX V ae.sc -80
-KPX V ccedilla.sc -55
-KPX V ograve.sc -25
-KPX V oacute.sc -40
-KPX V ocircumflex.sc -25
-KPX V otilde.sc -25
-KPX V odieresis.sc -25
-KPX V oslash.sc -55
-KPX V amacron.sc -50
-KPX V abreve.sc -50
-KPX V aogonek.sc -105
-KPX V cacute.sc -40
-KPX V ccircumflex.sc -25
-KPX V cdotaccent.sc -25
-KPX V ccaron.sc -25
-KPX V gcircumflex.sc -25
-KPX V gbreve.sc -25
-KPX V gdotaccent.sc -25
-KPX V gcommaaccent.sc -55
-KPX V omacron.sc -25
-KPX V obreve.sc -25
-KPX V ohungarumlaut.sc -25
-KPX V oe.sc -40
-KPX V sacute.sc -30
-KPX V scircumflex.sc -20
-KPX V scedilla.sc -40
-KPX V scaron.sc -20
-KPX V gcaron.sc -25
-KPX V oogonek.sc -55
-KPX V gacute.sc -40
-KPX V aeacute.sc -80
-KPX V adotbelow.sc -105
-KPX V ahookabove.sc -50
-KPX V acircumflexdotbelow.sc -50
-KPX V abrevedotbelow.sc -50
-KPX V odotbelow.sc -55
-KPX V ohookabove.sc -25
-KPX V ocircumflexdotbelow.sc -25
-KPX V ohornacute.sc -25
-KPX V ohorngrave.sc -25
-KPX V ohornhookabove.sc -25
-KPX V ohorntilde.sc -25
-KPX V ohorndotbelow.sc -25
+KPX W zcaron -53
+KPX W scircumflex -60
+KPX W scedilla -60
+KPX W scaron -60
+KPX W cdotaccent -53
+KPX W ccircumflex -53
+KPX W ccedilla -53
+KPX W ccaron -53
KPX W comma -90
KPX W hyphen -55
KPX W period -95
@@ -4615,13 +4844,16 @@ KPX W O -55
KPX W S -40
KPX W T 15
KPX W a -80
+KPX W c -105
KPX W e -70
KPX W g -90
KPX W i -15
KPX W o -75
KPX W r -45
+KPX W s -100
KPX W u -45
KPX W y -45
+KPX W z -100
KPX W guillemotleft -95
KPX W Adieresis -115
KPX W Aring -115
@@ -4659,6 +4891,7 @@ KPX W abreve -40
KPX W Aogonek -115
KPX W aogonek -80
KPX W Cacute -55
+KPX W cacute -105
KPX W Ccircumflex -55
KPX W Cdotaccent -55
KPX W Ccaron -55
@@ -4688,6 +4921,7 @@ KPX W racute -35
KPX W rcommaaccent -45
KPX W rcaron -25
KPX W Sacute -40
+KPX W sacute -100
KPX W Scircumflex -40
KPX W Scedilla -40
KPX W Scaron -40
@@ -4699,6 +4933,8 @@ KPX W uring -25
KPX W uhungarumlaut -25
KPX W uogonek -45
KPX W ycircumflex -25
+KPX W zacute -100
+KPX W zdotaccent -100
KPX W Gcaron -55
KPX W gcaron -45
KPX W Oogonek -55
@@ -4734,59 +4970,113 @@ KPX W yhookabove -25
KPX W ytilde -25
KPX W guilsinglleft -105
KPX W abrevedotbelow.sc -50
+KPX W abrevedotbelow.sc -50
+KPX W acircumflexdotbelow.sc -50
KPX W acircumflexdotbelow.sc -50
KPX W ahookabove.sc -50
+KPX W ahookabove.sc -50
KPX W gacute.sc -35
+KPX W gacute.sc -35
+KPX W gcaron.sc -25
KPX W gcaron.sc -25
KPX W ocircumflexdotbelow.sc -25
+KPX W ocircumflexdotbelow.sc -25
+KPX W oe.sc -40
KPX W oe.sc -40
KPX W ohookabove.sc -25
+KPX W ohookabove.sc -25
+KPX W ohornacute.sc -25
KPX W ohornacute.sc -25
KPX W ohorndotbelow.sc -25
+KPX W ohorndotbelow.sc -25
+KPX W ohorngrave.sc -25
KPX W ohorngrave.sc -25
KPX W ohornhookabove.sc -25
+KPX W ohornhookabove.sc -25
KPX W ohorntilde.sc -25
+KPX W ohorntilde.sc -25
+KPX W oogonek.sc -45
KPX W oogonek.sc -45
KPX W scaron.sc -15
+KPX W scaron.sc -15
+KPX W abreve.sc -50
KPX W abreve.sc -50
KPX W amacron.sc -50
+KPX W amacron.sc -50
+KPX W aogonek.sc -95
KPX W aogonek.sc -95
KPX W aeacute.sc -80
+KPX W aeacute.sc -80
+KPX W cacute.sc -35
KPX W cacute.sc -35
KPX W ccaron.sc -25
+KPX W ccaron.sc -25
KPX W ccircumflex.sc -25
+KPX W ccircumflex.sc -25
+KPX W cdotaccent.sc -25
KPX W cdotaccent.sc -25
KPX W gbreve.sc -25
+KPX W gbreve.sc -25
+KPX W gcircumflex.sc -25
KPX W gcircumflex.sc -25
KPX W gcommaaccent.sc -45
+KPX W gcommaaccent.sc -45
KPX W gdotaccent.sc -25
+KPX W gdotaccent.sc -25
+KPX W obreve.sc -25
KPX W obreve.sc -25
KPX W ohungarumlaut.sc -25
+KPX W ohungarumlaut.sc -25
+KPX W omacron.sc -25
KPX W omacron.sc -25
KPX W sacute.sc -25
+KPX W sacute.sc -25
KPX W scedilla.sc -35
+KPX W scedilla.sc -35
+KPX W scircumflex.sc -15
KPX W scircumflex.sc -15
KPX W tcaron.sc 5
+KPX W tcaron.sc 5
+KPX W a.sc -95
KPX W a.sc -95
KPX W c.sc -45
+KPX W c.sc -45
+KPX W g.sc -45
KPX W g.sc -45
KPX W o.sc -45
+KPX W o.sc -45
+KPX W s.sc -35
KPX W s.sc -35
KPX W t.sc 15
+KPX W t.sc 15
KPX W agrave.sc -50
+KPX W agrave.sc -50
+KPX W aacute.sc -70
KPX W aacute.sc -70
KPX W acircumflex.sc -50
+KPX W acircumflex.sc -50
+KPX W atilde.sc -50
KPX W atilde.sc -50
KPX W adieresis.sc -50
+KPX W adieresis.sc -50
+KPX W aring.sc -50
KPX W aring.sc -50
KPX W ae.sc -80
+KPX W ae.sc -80
+KPX W ccedilla.sc -45
KPX W ccedilla.sc -45
KPX W ograve.sc -25
+KPX W ograve.sc -25
KPX W oacute.sc -35
+KPX W oacute.sc -35
+KPX W ocircumflex.sc -25
KPX W ocircumflex.sc -25
KPX W otilde.sc -25
+KPX W otilde.sc -25
+KPX W odieresis.sc -25
KPX W odieresis.sc -25
KPX W oslash.sc -45
+KPX W oslash.sc -45
KPX W a.pc -95
KPX W c.pc -45
KPX W g.pc -45
@@ -4843,60 +5133,6 @@ KPX W ohorngrave.pc -25
KPX W ohornhookabove.pc -25
KPX W ohorntilde.pc -25
KPX W ohorndotbelow.pc -25
-KPX W a.sc -95
-KPX W c.sc -45
-KPX W g.sc -45
-KPX W o.sc -45
-KPX W s.sc -35
-KPX W t.sc 15
-KPX W agrave.sc -50
-KPX W aacute.sc -70
-KPX W acircumflex.sc -50
-KPX W atilde.sc -50
-KPX W adieresis.sc -50
-KPX W aring.sc -50
-KPX W ae.sc -80
-KPX W ccedilla.sc -45
-KPX W ograve.sc -25
-KPX W oacute.sc -35
-KPX W ocircumflex.sc -25
-KPX W otilde.sc -25
-KPX W odieresis.sc -25
-KPX W oslash.sc -45
-KPX W amacron.sc -50
-KPX W abreve.sc -50
-KPX W aogonek.sc -95
-KPX W cacute.sc -35
-KPX W ccircumflex.sc -25
-KPX W cdotaccent.sc -25
-KPX W ccaron.sc -25
-KPX W gcircumflex.sc -25
-KPX W gbreve.sc -25
-KPX W gdotaccent.sc -25
-KPX W gcommaaccent.sc -45
-KPX W omacron.sc -25
-KPX W obreve.sc -25
-KPX W ohungarumlaut.sc -25
-KPX W oe.sc -40
-KPX W sacute.sc -25
-KPX W scircumflex.sc -15
-KPX W scedilla.sc -35
-KPX W scaron.sc -15
-KPX W tcaron.sc 5
-KPX W gcaron.sc -25
-KPX W oogonek.sc -45
-KPX W gacute.sc -35
-KPX W aeacute.sc -80
-KPX W ahookabove.sc -50
-KPX W acircumflexdotbelow.sc -50
-KPX W abrevedotbelow.sc -50
-KPX W ohookabove.sc -25
-KPX W ocircumflexdotbelow.sc -25
-KPX W ohornacute.sc -25
-KPX W ohorngrave.sc -25
-KPX W ohornhookabove.sc -25
-KPX W ohorntilde.sc -25
-KPX W ohorndotbelow.sc -25
KPX X hyphen -55
KPX X C -55
KPX X O -60
@@ -4987,33 +5223,62 @@ KPX X uhorngrave -30
KPX X uhornhookabove -30
KPX X uhorndotbelow -30
KPX X ocircumflexacute.sc -50
+KPX X ocircumflexacute.sc -50
+KPX X ocircumflexdotbelow.sc -50
KPX X ocircumflexdotbelow.sc -50
KPX X ocircumflexgrave.sc -50
+KPX X ocircumflexgrave.sc -50
+KPX X ocircumflexhookabove.sc -50
KPX X ocircumflexhookabove.sc -50
KPX X odotbelow.sc -50
+KPX X odotbelow.sc -50
KPX X ohookabove.sc -50
+KPX X ohookabove.sc -50
+KPX X ohornacute.sc -50
KPX X ohornacute.sc -50
KPX X ohorndotbelow.sc -50
+KPX X ohorndotbelow.sc -50
+KPX X ohorngrave.sc -50
KPX X ohorngrave.sc -50
KPX X ohornhookabove.sc -50
+KPX X ohornhookabove.sc -50
+KPX X ohorntilde.sc -50
KPX X ohorntilde.sc -50
KPX X oogonek.sc -50
+KPX X oogonek.sc -50
+KPX X cacute.sc -45
KPX X cacute.sc -45
KPX X ccaron.sc -45
+KPX X ccaron.sc -45
KPX X ccircumflex.sc -45
+KPX X ccircumflex.sc -45
+KPX X cdotaccent.sc -45
KPX X cdotaccent.sc -45
KPX X obreve.sc -50
+KPX X obreve.sc -50
+KPX X ohungarumlaut.sc -50
KPX X ohungarumlaut.sc -50
KPX X omacron.sc -50
+KPX X omacron.sc -50
+KPX X c.sc -45
KPX X c.sc -45
KPX X o.sc -50
+KPX X o.sc -50
+KPX X q.sc -50
KPX X q.sc -50
KPX X ccedilla.sc -45
+KPX X ccedilla.sc -45
KPX X ograve.sc -50
+KPX X ograve.sc -50
+KPX X oacute.sc -50
KPX X oacute.sc -50
KPX X ocircumflex.sc -50
+KPX X ocircumflex.sc -50
+KPX X otilde.sc -50
KPX X otilde.sc -50
KPX X odieresis.sc -50
+KPX X odieresis.sc -50
+KPX X oslash.sc -50
KPX X oslash.sc -50
KPX X c.pc -45
KPX X o.pc -50
@@ -5044,35 +5309,14 @@ KPX X ohorngrave.pc -50
KPX X ohornhookabove.pc -50
KPX X ohorntilde.pc -50
KPX X ohorndotbelow.pc -50
-KPX X c.sc -45
-KPX X o.sc -50
-KPX X q.sc -50
-KPX X ccedilla.sc -45
-KPX X ograve.sc -50
-KPX X oacute.sc -50
-KPX X ocircumflex.sc -50
-KPX X otilde.sc -50
-KPX X odieresis.sc -50
-KPX X oslash.sc -50
-KPX X cacute.sc -45
-KPX X ccircumflex.sc -45
-KPX X cdotaccent.sc -45
-KPX X ccaron.sc -45
-KPX X omacron.sc -50
-KPX X obreve.sc -50
-KPX X ohungarumlaut.sc -50
-KPX X oogonek.sc -50
-KPX X odotbelow.sc -50
-KPX X ohookabove.sc -50
-KPX X ocircumflexacute.sc -50
-KPX X ocircumflexgrave.sc -50
-KPX X ocircumflexhookabove.sc -50
-KPX X ocircumflexdotbelow.sc -50
-KPX X ohornacute.sc -50
-KPX X ohorngrave.sc -50
-KPX X ohornhookabove.sc -50
-KPX X ohorntilde.sc -50
-KPX X ohorndotbelow.sc -50
+KPX Y zcaron -67
+KPX Y scircumflex -67
+KPX Y scedilla -67
+KPX Y scaron -67
+KPX Y cdotaccent -67
+KPX Y ccircumflex -67
+KPX Y ccedilla -67
+KPX Y ccaron -67
KPX Y comma -95
KPX Y hyphen -100
KPX Y period -105
@@ -5086,13 +5330,16 @@ KPX Y O -70
KPX Y S -45
KPX Y T 15
KPX Y a -100
+KPX Y c -133
KPX Y e -105
KPX Y g -110
KPX Y i -15
KPX Y o -105
KPX Y p -90
+KPX Y s -112
KPX Y u -80
KPX Y v -85
+KPX Y z -93
KPX Y guillemotleft -135
KPX Y Adieresis -75
KPX Y Aring -75
@@ -5128,6 +5375,7 @@ KPX Y abreve -50
KPX Y Aogonek -75
KPX Y aogonek -100
KPX Y Cacute -70
+KPX Y cacute -133
KPX Y Ccircumflex -70
KPX Y Cdotaccent -70
KPX Y Ccaron -70
@@ -5155,6 +5403,7 @@ KPX Y ohungarumlaut -55
KPX Y OE -55
KPX Y oe -75
KPX Y Sacute -45
+KPX Y sacute -112
KPX Y Scircumflex -45
KPX Y Scedilla -45
KPX Y Scaron -45
@@ -5165,6 +5414,8 @@ KPX Y ubreve -40
KPX Y uring -40
KPX Y uhungarumlaut -40
KPX Y uogonek -80
+KPX Y zacute -93
+KPX Y zdotaccent -93
KPX Y Gcaron -70
KPX Y gcaron -55
KPX Y Oogonek -70
@@ -5196,61 +5447,117 @@ KPX Y uhorntilde -40
KPX Y uhorndotbelow -40
KPX Y guilsinglleft -145
KPX Y abrevedotbelow.sc -30
+KPX Y abrevedotbelow.sc -30
KPX Y acircumflexdotbelow.sc -30
+KPX Y acircumflexdotbelow.sc -30
+KPX Y ahookabove.sc -30
KPX Y ahookabove.sc -30
KPX Y gacute.sc -45
+KPX Y gacute.sc -45
+KPX Y gcaron.sc -30
KPX Y gcaron.sc -30
KPX Y jacute.sc -25
+KPX Y jacute.sc -25
+KPX Y ocircumflexdotbelow.sc -30
KPX Y ocircumflexdotbelow.sc -30
KPX Y oe.sc -40
+KPX Y oe.sc -40
+KPX Y ohookabove.sc -30
KPX Y ohookabove.sc -30
KPX Y ohornacute.sc -30
+KPX Y ohornacute.sc -30
KPX Y ohorndotbelow.sc -30
+KPX Y ohorndotbelow.sc -30
+KPX Y ohorngrave.sc -30
KPX Y ohorngrave.sc -30
KPX Y ohornhookabove.sc -30
+KPX Y ohornhookabove.sc -30
+KPX Y ohorntilde.sc -30
KPX Y ohorntilde.sc -30
KPX Y oogonek.sc -60
+KPX Y oogonek.sc -60
+KPX Y scaron.sc -20
KPX Y scaron.sc -20
KPX Y Jacute -30
KPX Y abreve.sc -30
+KPX Y abreve.sc -30
+KPX Y amacron.sc -30
KPX Y amacron.sc -30
KPX Y aogonek.sc -65
+KPX Y aogonek.sc -65
KPX Y aeacute.sc -80
+KPX Y aeacute.sc -80
+KPX Y cacute.sc -45
KPX Y cacute.sc -45
KPX Y ccaron.sc -30
+KPX Y ccaron.sc -30
+KPX Y ccircumflex.sc -30
KPX Y ccircumflex.sc -30
KPX Y cdotaccent.sc -30
+KPX Y cdotaccent.sc -30
+KPX Y gbreve.sc -30
KPX Y gbreve.sc -30
KPX Y gcircumflex.sc -30
+KPX Y gcircumflex.sc -30
+KPX Y gcommaaccent.sc -60
KPX Y gcommaaccent.sc -60
KPX Y gdotaccent.sc -30
+KPX Y gdotaccent.sc -30
KPX Y obreve.sc -30
+KPX Y obreve.sc -30
+KPX Y ohungarumlaut.sc -30
KPX Y ohungarumlaut.sc -30
KPX Y omacron.sc -30
+KPX Y omacron.sc -30
+KPX Y sacute.sc -30
KPX Y sacute.sc -30
KPX Y scedilla.sc -40
+KPX Y scedilla.sc -40
+KPX Y scircumflex.sc -20
KPX Y scircumflex.sc -20
KPX Y tcaron.sc 5
+KPX Y tcaron.sc 5
+KPX Y a.sc -65
KPX Y a.sc -65
KPX Y c.sc -60
+KPX Y c.sc -60
KPX Y g.sc -60
+KPX Y g.sc -60
+KPX Y j.sc -25
KPX Y j.sc -25
KPX Y o.sc -60
+KPX Y o.sc -60
+KPX Y s.sc -40
KPX Y s.sc -40
KPX Y t.sc 15
+KPX Y t.sc 15
+KPX Y agrave.sc -30
KPX Y agrave.sc -30
KPX Y aacute.sc -45
+KPX Y aacute.sc -45
+KPX Y acircumflex.sc -30
KPX Y acircumflex.sc -30
KPX Y atilde.sc -30
+KPX Y atilde.sc -30
KPX Y adieresis.sc -30
+KPX Y adieresis.sc -30
+KPX Y aring.sc -30
KPX Y aring.sc -30
KPX Y ae.sc -80
+KPX Y ae.sc -80
+KPX Y ccedilla.sc -60
KPX Y ccedilla.sc -60
KPX Y ograve.sc -30
+KPX Y ograve.sc -30
+KPX Y oacute.sc -45
KPX Y oacute.sc -45
KPX Y ocircumflex.sc -30
+KPX Y ocircumflex.sc -30
+KPX Y otilde.sc -30
KPX Y otilde.sc -30
KPX Y odieresis.sc -30
+KPX Y odieresis.sc -30
+KPX Y oslash.sc -60
KPX Y oslash.sc -60
KPX Y a.pc -65
KPX Y c.pc -60
@@ -5310,62 +5617,6 @@ KPX Y ohornhookabove.pc -30
KPX Y ohorntilde.pc -30
KPX Y ohorndotbelow.pc -30
KPX Y jacute.pc -25
-KPX Y a.sc -65
-KPX Y c.sc -60
-KPX Y g.sc -60
-KPX Y j.sc -25
-KPX Y o.sc -60
-KPX Y s.sc -40
-KPX Y t.sc 15
-KPX Y agrave.sc -30
-KPX Y aacute.sc -45
-KPX Y acircumflex.sc -30
-KPX Y atilde.sc -30
-KPX Y adieresis.sc -30
-KPX Y aring.sc -30
-KPX Y ae.sc -80
-KPX Y ccedilla.sc -60
-KPX Y ograve.sc -30
-KPX Y oacute.sc -45
-KPX Y ocircumflex.sc -30
-KPX Y otilde.sc -30
-KPX Y odieresis.sc -30
-KPX Y oslash.sc -60
-KPX Y amacron.sc -30
-KPX Y abreve.sc -30
-KPX Y aogonek.sc -65
-KPX Y cacute.sc -45
-KPX Y ccircumflex.sc -30
-KPX Y cdotaccent.sc -30
-KPX Y ccaron.sc -30
-KPX Y gcircumflex.sc -30
-KPX Y gbreve.sc -30
-KPX Y gdotaccent.sc -30
-KPX Y gcommaaccent.sc -60
-KPX Y omacron.sc -30
-KPX Y obreve.sc -30
-KPX Y ohungarumlaut.sc -30
-KPX Y oe.sc -40
-KPX Y sacute.sc -30
-KPX Y scircumflex.sc -20
-KPX Y scedilla.sc -40
-KPX Y scaron.sc -20
-KPX Y tcaron.sc 5
-KPX Y gcaron.sc -30
-KPX Y oogonek.sc -60
-KPX Y gacute.sc -45
-KPX Y aeacute.sc -80
-KPX Y ahookabove.sc -30
-KPX Y acircumflexdotbelow.sc -30
-KPX Y abrevedotbelow.sc -30
-KPX Y ohookabove.sc -30
-KPX Y ocircumflexdotbelow.sc -30
-KPX Y ohornacute.sc -30
-KPX Y ohorngrave.sc -30
-KPX Y ohornhookabove.sc -30
-KPX Y ohorntilde.sc -30
-KPX Y ohorndotbelow.sc -30
-KPX Y jacute.sc -25
KPX Z v -50
KPX Z y -50
KPX Z ydieresis -50
@@ -5973,10 +6224,6 @@ KPX y ecircumflexgrave -35
KPX y ecircumflexhookabove -35
KPX y ecircumflextilde -35
KPX y ecircumflexdotbelow -35
-KPX two.superior fraction.alt 90
-KPX three.superior fraction.alt 75
-KPX one.superior fraction -20
-KPX one.superior fraction.alt 60
KPX guillemotright A -60
KPX guillemotright T -115
KPX guillemotright V -115
@@ -6003,14 +6250,14 @@ KPX Agrave o -40
KPX Agrave u -30
KPX Agrave y -85
KPX Agrave o.sc -50
+KPX Agrave o.sc -50
+KPX Agrave u.sc -50
KPX Agrave u.sc -50
KPX Agrave y.sc -65
+KPX Agrave y.sc -65
KPX Agrave o.pc -50
KPX Agrave u.pc -50
KPX Agrave y.pc -65
-KPX Agrave o.sc -50
-KPX Agrave u.sc -50
-KPX Agrave y.sc -65
KPX Aacute C -55
KPX Aacute O -60
KPX Aacute T -55
@@ -6022,40 +6269,40 @@ KPX Aacute t -20
KPX Aacute u -30
KPX Aacute y -85
KPX Aacute c.sc -45
+KPX Aacute c.sc -45
KPX Aacute o.sc -50
+KPX Aacute o.sc -50
+KPX Aacute t.sc -45
KPX Aacute t.sc -45
KPX Aacute u.sc -50
+KPX Aacute u.sc -50
+KPX Aacute y.sc -65
KPX Aacute y.sc -65
KPX Aacute c.pc -45
KPX Aacute o.pc -50
KPX Aacute t.pc -45
KPX Aacute u.pc -50
KPX Aacute y.pc -65
-KPX Aacute c.sc -45
-KPX Aacute o.sc -50
-KPX Aacute t.sc -45
-KPX Aacute u.sc -50
-KPX Aacute y.sc -65
KPX Acircumflex U -60
KPX Acircumflex Y -80
KPX Acircumflex u -30
KPX Acircumflex y -85
KPX Acircumflex u.sc -50
+KPX Acircumflex u.sc -50
+KPX Acircumflex y.sc -65
KPX Acircumflex y.sc -65
KPX Acircumflex u.pc -50
KPX Acircumflex y.pc -65
-KPX Acircumflex u.sc -50
-KPX Acircumflex y.sc -65
KPX Atilde O -60
KPX Atilde Y -80
KPX Atilde o -40
KPX Atilde y -85
KPX Atilde o.sc -50
+KPX Atilde o.sc -50
+KPX Atilde y.sc -65
KPX Atilde y.sc -65
KPX Atilde o.pc -50
KPX Atilde y.pc -65
-KPX Atilde o.sc -50
-KPX Atilde y.sc -65
KPX Adieresis hyphen -25
KPX Adieresis C -55
KPX Adieresis G -55
@@ -6154,44 +6401,84 @@ KPX Adieresis quoteright -115
KPX Adieresis quotedblright -90
KPX Adieresis guilsinglleft -75
KPX Adieresis gacute.sc -45
+KPX Adieresis gacute.sc -45
KPX Adieresis gcaron.sc -45
+KPX Adieresis gcaron.sc -45
+KPX Adieresis oogonek.sc -50
KPX Adieresis oogonek.sc -50
KPX Adieresis cacute.sc -45
+KPX Adieresis cacute.sc -45
+KPX Adieresis ccaron.sc -45
KPX Adieresis ccaron.sc -45
KPX Adieresis ccircumflex.sc -45
+KPX Adieresis ccircumflex.sc -45
+KPX Adieresis cdotaccent.sc -45
KPX Adieresis cdotaccent.sc -45
KPX Adieresis gbreve.sc -45
+KPX Adieresis gbreve.sc -45
+KPX Adieresis gcircumflex.sc -45
KPX Adieresis gcircumflex.sc -45
KPX Adieresis gcommaaccent.sc -45
+KPX Adieresis gcommaaccent.sc -45
KPX Adieresis gdotaccent.sc -45
+KPX Adieresis gdotaccent.sc -45
+KPX Adieresis obreve.sc -50
KPX Adieresis obreve.sc -50
KPX Adieresis ohungarumlaut.sc -50
+KPX Adieresis ohungarumlaut.sc -50
+KPX Adieresis omacron.sc -50
KPX Adieresis omacron.sc -50
KPX Adieresis tcaron.sc -45
+KPX Adieresis tcaron.sc -45
KPX Adieresis ubreve.sc -50
+KPX Adieresis ubreve.sc -50
+KPX Adieresis uhungarumlaut.sc -50
KPX Adieresis uhungarumlaut.sc -50
KPX Adieresis umacron.sc -50
+KPX Adieresis umacron.sc -50
+KPX Adieresis uogonek.sc -50
KPX Adieresis uogonek.sc -50
KPX Adieresis uring.sc -50
+KPX Adieresis uring.sc -50
KPX Adieresis wacute.sc -95
+KPX Adieresis wacute.sc -95
+KPX Adieresis wcircumflex.sc -95
KPX Adieresis wcircumflex.sc -95
KPX Adieresis wdieresis.sc -95
+KPX Adieresis wdieresis.sc -95
+KPX Adieresis wgrave.sc -95
KPX Adieresis wgrave.sc -95
KPX Adieresis ycircumflex.sc -65
+KPX Adieresis ycircumflex.sc -65
+KPX Adieresis c.sc -45
KPX Adieresis c.sc -45
KPX Adieresis g.sc -45
+KPX Adieresis g.sc -45
+KPX Adieresis o.sc -50
KPX Adieresis o.sc -50
KPX Adieresis q.sc -50
+KPX Adieresis q.sc -50
KPX Adieresis t.sc -45
+KPX Adieresis t.sc -45
+KPX Adieresis u.sc -50
KPX Adieresis u.sc -50
KPX Adieresis v.sc -110
+KPX Adieresis v.sc -110
+KPX Adieresis w.sc -95
KPX Adieresis w.sc -95
KPX Adieresis y.sc -65
+KPX Adieresis y.sc -65
+KPX Adieresis ccedilla.sc -45
KPX Adieresis ccedilla.sc -45
KPX Adieresis odieresis.sc -50
+KPX Adieresis odieresis.sc -50
+KPX Adieresis oslash.sc -50
KPX Adieresis oslash.sc -50
KPX Adieresis ucircumflex.sc -50
+KPX Adieresis ucircumflex.sc -50
KPX Adieresis udieresis.sc -50
+KPX Adieresis udieresis.sc -50
+KPX Adieresis ydieresis.sc -65
KPX Adieresis ydieresis.sc -65
KPX Adieresis c.pc -45
KPX Adieresis g.pc -45
@@ -6234,46 +6521,6 @@ KPX Adieresis uni021B.pc -45
KPX Adieresis wgrave.pc -95
KPX Adieresis wacute.pc -95
KPX Adieresis wdieresis.pc -95
-KPX Adieresis c.sc -45
-KPX Adieresis g.sc -45
-KPX Adieresis o.sc -50
-KPX Adieresis q.sc -50
-KPX Adieresis t.sc -45
-KPX Adieresis u.sc -50
-KPX Adieresis v.sc -110
-KPX Adieresis w.sc -95
-KPX Adieresis y.sc -65
-KPX Adieresis ccedilla.sc -45
-KPX Adieresis odieresis.sc -50
-KPX Adieresis oslash.sc -50
-KPX Adieresis ucircumflex.sc -50
-KPX Adieresis udieresis.sc -50
-KPX Adieresis ydieresis.sc -65
-KPX Adieresis cacute.sc -45
-KPX Adieresis ccircumflex.sc -45
-KPX Adieresis cdotaccent.sc -45
-KPX Adieresis ccaron.sc -45
-KPX Adieresis gcircumflex.sc -45
-KPX Adieresis gbreve.sc -45
-KPX Adieresis gdotaccent.sc -45
-KPX Adieresis gcommaaccent.sc -45
-KPX Adieresis omacron.sc -50
-KPX Adieresis obreve.sc -50
-KPX Adieresis ohungarumlaut.sc -50
-KPX Adieresis tcaron.sc -45
-KPX Adieresis umacron.sc -50
-KPX Adieresis ubreve.sc -50
-KPX Adieresis uring.sc -50
-KPX Adieresis uhungarumlaut.sc -50
-KPX Adieresis uogonek.sc -50
-KPX Adieresis wcircumflex.sc -95
-KPX Adieresis ycircumflex.sc -65
-KPX Adieresis gcaron.sc -45
-KPX Adieresis oogonek.sc -50
-KPX Adieresis gacute.sc -45
-KPX Adieresis wgrave.sc -95
-KPX Adieresis wacute.sc -95
-KPX Adieresis wdieresis.sc -95
KPX Aring hyphen -25
KPX Aring C -55
KPX Aring G -55
@@ -6372,45 +6619,85 @@ KPX Aring quoteright -115
KPX Aring quotedblright -90
KPX Aring guilsinglleft -75
KPX Aring gacute.sc -45
+KPX Aring gacute.sc -45
+KPX Aring gcaron.sc -45
KPX Aring gcaron.sc -45
KPX Aring oogonek.sc -50
+KPX Aring oogonek.sc -50
KPX Aring cacute.sc -45
+KPX Aring cacute.sc -45
+KPX Aring ccaron.sc -45
KPX Aring ccaron.sc -45
KPX Aring ccircumflex.sc -45
+KPX Aring ccircumflex.sc -45
+KPX Aring cdotaccent.sc -45
KPX Aring cdotaccent.sc -45
KPX Aring gbreve.sc -45
+KPX Aring gbreve.sc -45
KPX Aring gcircumflex.sc -45
+KPX Aring gcircumflex.sc -45
+KPX Aring gcommaaccent.sc -45
KPX Aring gcommaaccent.sc -45
KPX Aring gdotaccent.sc -45
+KPX Aring gdotaccent.sc -45
+KPX Aring obreve.sc -50
KPX Aring obreve.sc -50
KPX Aring ohungarumlaut.sc -50
+KPX Aring ohungarumlaut.sc -50
KPX Aring omacron.sc -50
+KPX Aring omacron.sc -50
+KPX Aring tcaron.sc -45
KPX Aring tcaron.sc -45
KPX Aring ubreve.sc -50
+KPX Aring ubreve.sc -50
+KPX Aring uhungarumlaut.sc -50
KPX Aring uhungarumlaut.sc -50
KPX Aring umacron.sc -50
+KPX Aring umacron.sc -50
+KPX Aring uogonek.sc -50
KPX Aring uogonek.sc -50
KPX Aring uring.sc -50
+KPX Aring uring.sc -50
+KPX Aring wacute.sc -95
KPX Aring wacute.sc -95
KPX Aring wcircumflex.sc -95
+KPX Aring wcircumflex.sc -95
KPX Aring wdieresis.sc -95
+KPX Aring wdieresis.sc -95
+KPX Aring wgrave.sc -95
KPX Aring wgrave.sc -95
KPX Aring ycircumflex.sc -65
+KPX Aring ycircumflex.sc -65
+KPX Aring c.sc -45
KPX Aring c.sc -45
KPX Aring g.sc -45
+KPX Aring g.sc -45
+KPX Aring o.sc -50
KPX Aring o.sc -50
KPX Aring q.sc -50
+KPX Aring q.sc -50
+KPX Aring t.sc -45
KPX Aring t.sc -45
KPX Aring u.sc -50
+KPX Aring u.sc -50
KPX Aring v.sc -110
+KPX Aring v.sc -110
+KPX Aring w.sc -95
KPX Aring w.sc -95
KPX Aring y.sc -65
+KPX Aring y.sc -65
+KPX Aring ccedilla.sc -45
KPX Aring ccedilla.sc -45
KPX Aring odieresis.sc -50
+KPX Aring odieresis.sc -50
+KPX Aring oslash.sc -50
KPX Aring oslash.sc -50
KPX Aring ucircumflex.sc -50
+KPX Aring ucircumflex.sc -50
+KPX Aring udieresis.sc -50
KPX Aring udieresis.sc -50
KPX Aring ydieresis.sc -65
+KPX Aring ydieresis.sc -65
KPX Aring c.pc -45
KPX Aring g.pc -45
KPX Aring o.pc -50
@@ -6452,46 +6739,6 @@ KPX Aring uni021B.pc -45
KPX Aring wgrave.pc -95
KPX Aring wacute.pc -95
KPX Aring wdieresis.pc -95
-KPX Aring c.sc -45
-KPX Aring g.sc -45
-KPX Aring o.sc -50
-KPX Aring q.sc -50
-KPX Aring t.sc -45
-KPX Aring u.sc -50
-KPX Aring v.sc -110
-KPX Aring w.sc -95
-KPX Aring y.sc -65
-KPX Aring ccedilla.sc -45
-KPX Aring odieresis.sc -50
-KPX Aring oslash.sc -50
-KPX Aring ucircumflex.sc -50
-KPX Aring udieresis.sc -50
-KPX Aring ydieresis.sc -65
-KPX Aring cacute.sc -45
-KPX Aring ccircumflex.sc -45
-KPX Aring cdotaccent.sc -45
-KPX Aring ccaron.sc -45
-KPX Aring gcircumflex.sc -45
-KPX Aring gbreve.sc -45
-KPX Aring gdotaccent.sc -45
-KPX Aring gcommaaccent.sc -45
-KPX Aring omacron.sc -50
-KPX Aring obreve.sc -50
-KPX Aring ohungarumlaut.sc -50
-KPX Aring tcaron.sc -45
-KPX Aring umacron.sc -50
-KPX Aring ubreve.sc -50
-KPX Aring uring.sc -50
-KPX Aring uhungarumlaut.sc -50
-KPX Aring uogonek.sc -50
-KPX Aring wcircumflex.sc -95
-KPX Aring ycircumflex.sc -65
-KPX Aring gcaron.sc -45
-KPX Aring oogonek.sc -50
-KPX Aring gacute.sc -45
-KPX Aring wgrave.sc -95
-KPX Aring wacute.sc -95
-KPX Aring wdieresis.sc -95
KPX Ccedilla A -25
KPX Ccedilla O -10
KPX Ccedilla Adieresis -25
@@ -6507,19 +6754,33 @@ KPX Ccedilla Ohungarumlaut -10
KPX Ccedilla Oogonek -10
KPX Ccedilla AEacute -15
KPX Ccedilla oogonek.sc -10
+KPX Ccedilla oogonek.sc -10
+KPX Ccedilla amacron.sc -20
KPX Ccedilla amacron.sc -20
KPX Ccedilla aogonek.sc -20
+KPX Ccedilla aogonek.sc -20
+KPX Ccedilla aeacute.sc -15
KPX Ccedilla aeacute.sc -15
KPX Ccedilla obreve.sc -10
+KPX Ccedilla obreve.sc -10
KPX Ccedilla ohungarumlaut.sc -10
+KPX Ccedilla ohungarumlaut.sc -10
+KPX Ccedilla omacron.sc -10
KPX Ccedilla omacron.sc -10
KPX Ccedilla a.sc -20
+KPX Ccedilla a.sc -20
+KPX Ccedilla o.sc -10
KPX Ccedilla o.sc -10
KPX Ccedilla adieresis.sc -20
+KPX Ccedilla adieresis.sc -20
+KPX Ccedilla aring.sc -20
KPX Ccedilla aring.sc -20
KPX Ccedilla ae.sc -15
+KPX Ccedilla ae.sc -15
+KPX Ccedilla odieresis.sc -10
KPX Ccedilla odieresis.sc -10
KPX Ccedilla oslash.sc -10
+KPX Ccedilla oslash.sc -10
KPX Ccedilla a.pc -20
KPX Ccedilla o.pc -10
KPX Ccedilla adieresis.pc -20
@@ -6534,20 +6795,6 @@ KPX Ccedilla obreve.pc -10
KPX Ccedilla ohungarumlaut.pc -10
KPX Ccedilla oogonek.pc -10
KPX Ccedilla aeacute.pc -15
-KPX Ccedilla a.sc -20
-KPX Ccedilla o.sc -10
-KPX Ccedilla adieresis.sc -20
-KPX Ccedilla aring.sc -20
-KPX Ccedilla ae.sc -15
-KPX Ccedilla odieresis.sc -10
-KPX Ccedilla oslash.sc -10
-KPX Ccedilla amacron.sc -20
-KPX Ccedilla aogonek.sc -20
-KPX Ccedilla omacron.sc -10
-KPX Ccedilla obreve.sc -10
-KPX Ccedilla ohungarumlaut.sc -10
-KPX Ccedilla oogonek.sc -10
-KPX Ccedilla aeacute.sc -15
KPX Ntilde comma -15
KPX Ntilde period -20
KPX Ntilde A -30
@@ -6607,32 +6854,59 @@ KPX Ntilde Gacute -20
KPX Ntilde AEacute -20
KPX Ntilde aeacute -25
KPX Ntilde gacute.sc -15
+KPX Ntilde gacute.sc -15
KPX Ntilde gcaron.sc -15
+KPX Ntilde gcaron.sc -15
+KPX Ntilde oogonek.sc -15
KPX Ntilde oogonek.sc -15
KPX Ntilde amacron.sc -25
+KPX Ntilde amacron.sc -25
KPX Ntilde aogonek.sc -25
+KPX Ntilde aogonek.sc -25
+KPX Ntilde aeacute.sc -15
KPX Ntilde aeacute.sc -15
KPX Ntilde cacute.sc -15
+KPX Ntilde cacute.sc -15
+KPX Ntilde ccaron.sc -15
KPX Ntilde ccaron.sc -15
KPX Ntilde ccircumflex.sc -15
+KPX Ntilde ccircumflex.sc -15
+KPX Ntilde cdotaccent.sc -15
KPX Ntilde cdotaccent.sc -15
KPX Ntilde gbreve.sc -15
+KPX Ntilde gbreve.sc -15
+KPX Ntilde gcircumflex.sc -15
KPX Ntilde gcircumflex.sc -15
KPX Ntilde gcommaaccent.sc -15
+KPX Ntilde gcommaaccent.sc -15
KPX Ntilde gdotaccent.sc -15
+KPX Ntilde gdotaccent.sc -15
+KPX Ntilde obreve.sc -15
KPX Ntilde obreve.sc -15
KPX Ntilde ohungarumlaut.sc -15
+KPX Ntilde ohungarumlaut.sc -15
+KPX Ntilde omacron.sc -15
KPX Ntilde omacron.sc -15
KPX Ntilde a.sc -25
+KPX Ntilde a.sc -25
+KPX Ntilde c.sc -15
KPX Ntilde c.sc -15
KPX Ntilde g.sc -15
+KPX Ntilde g.sc -15
+KPX Ntilde o.sc -15
KPX Ntilde o.sc -15
KPX Ntilde adieresis.sc -25
+KPX Ntilde adieresis.sc -25
KPX Ntilde aring.sc -25
+KPX Ntilde aring.sc -25
+KPX Ntilde ae.sc -15
KPX Ntilde ae.sc -15
KPX Ntilde ccedilla.sc -15
+KPX Ntilde ccedilla.sc -15
+KPX Ntilde odieresis.sc -15
KPX Ntilde odieresis.sc -15
KPX Ntilde oslash.sc -15
+KPX Ntilde oslash.sc -15
KPX Ntilde a.pc -25
KPX Ntilde c.pc -15
KPX Ntilde g.pc -15
@@ -6660,41 +6934,14 @@ KPX Ntilde gcaron.pc -15
KPX Ntilde oogonek.pc -15
KPX Ntilde gacute.pc -15
KPX Ntilde aeacute.pc -15
-KPX Ntilde a.sc -25
-KPX Ntilde c.sc -15
-KPX Ntilde g.sc -15
-KPX Ntilde o.sc -15
-KPX Ntilde adieresis.sc -25
-KPX Ntilde aring.sc -25
-KPX Ntilde ae.sc -15
-KPX Ntilde ccedilla.sc -15
-KPX Ntilde odieresis.sc -15
-KPX Ntilde oslash.sc -15
-KPX Ntilde amacron.sc -25
-KPX Ntilde aogonek.sc -25
-KPX Ntilde cacute.sc -15
-KPX Ntilde ccircumflex.sc -15
-KPX Ntilde cdotaccent.sc -15
-KPX Ntilde ccaron.sc -15
-KPX Ntilde gcircumflex.sc -15
-KPX Ntilde gbreve.sc -15
-KPX Ntilde gdotaccent.sc -15
-KPX Ntilde gcommaaccent.sc -15
-KPX Ntilde omacron.sc -15
-KPX Ntilde obreve.sc -15
-KPX Ntilde ohungarumlaut.sc -15
-KPX Ntilde gcaron.sc -15
-KPX Ntilde oogonek.sc -15
-KPX Ntilde gacute.sc -15
-KPX Ntilde aeacute.sc -15
KPX Ograve A -60
KPX Ograve a.sc -50
-KPX Ograve a.pc -50
KPX Ograve a.sc -50
+KPX Ograve a.pc -50
KPX Oacute A -60
KPX Oacute a.sc -50
-KPX Oacute a.pc -50
KPX Oacute a.sc -50
+KPX Oacute a.pc -50
KPX Odieresis A -60
KPX Odieresis V -70
KPX Odieresis W -55
@@ -6713,22 +6960,39 @@ KPX Odieresis Wgrave -55
KPX Odieresis Wacute -55
KPX Odieresis Wdieresis -55
KPX Odieresis amacron.sc -50
+KPX Odieresis amacron.sc -50
KPX Odieresis aogonek.sc -50
+KPX Odieresis aogonek.sc -50
+KPX Odieresis aeacute.sc -40
KPX Odieresis aeacute.sc -40
KPX Odieresis wacute.sc -45
+KPX Odieresis wacute.sc -45
+KPX Odieresis wcircumflex.sc -45
KPX Odieresis wcircumflex.sc -45
KPX Odieresis wdieresis.sc -45
+KPX Odieresis wdieresis.sc -45
+KPX Odieresis wgrave.sc -45
KPX Odieresis wgrave.sc -45
KPX Odieresis ycircumflex.sc -60
+KPX Odieresis ycircumflex.sc -60
+KPX Odieresis a.sc -50
KPX Odieresis a.sc -50
KPX Odieresis v.sc -60
+KPX Odieresis v.sc -60
KPX Odieresis w.sc -45
+KPX Odieresis w.sc -45
+KPX Odieresis x.sc -45
KPX Odieresis x.sc -45
KPX Odieresis y.sc -60
+KPX Odieresis y.sc -60
+KPX Odieresis adieresis.sc -50
KPX Odieresis adieresis.sc -50
KPX Odieresis aring.sc -50
+KPX Odieresis aring.sc -50
+KPX Odieresis ae.sc -40
KPX Odieresis ae.sc -40
KPX Odieresis ydieresis.sc -60
+KPX Odieresis ydieresis.sc -60
KPX Odieresis a.pc -50
KPX Odieresis v.pc -60
KPX Odieresis w.pc -45
@@ -6746,23 +7010,6 @@ KPX Odieresis aeacute.pc -40
KPX Odieresis wgrave.pc -45
KPX Odieresis wacute.pc -45
KPX Odieresis wdieresis.pc -45
-KPX Odieresis a.sc -50
-KPX Odieresis v.sc -60
-KPX Odieresis w.sc -45
-KPX Odieresis x.sc -45
-KPX Odieresis y.sc -60
-KPX Odieresis adieresis.sc -50
-KPX Odieresis aring.sc -50
-KPX Odieresis ae.sc -40
-KPX Odieresis ydieresis.sc -60
-KPX Odieresis amacron.sc -50
-KPX Odieresis aogonek.sc -50
-KPX Odieresis wcircumflex.sc -45
-KPX Odieresis ycircumflex.sc -60
-KPX Odieresis aeacute.sc -40
-KPX Odieresis wgrave.sc -45
-KPX Odieresis wacute.sc -45
-KPX Odieresis wdieresis.sc -45
KPX Oslash A -60
KPX Oslash V -70
KPX Oslash W -55
@@ -6781,22 +7028,39 @@ KPX Oslash Wgrave -55
KPX Oslash Wacute -55
KPX Oslash Wdieresis -55
KPX Oslash amacron.sc -50
+KPX Oslash amacron.sc -50
+KPX Oslash aogonek.sc -50
KPX Oslash aogonek.sc -50
KPX Oslash aeacute.sc -40
+KPX Oslash aeacute.sc -40
KPX Oslash wacute.sc -45
+KPX Oslash wacute.sc -45
+KPX Oslash wcircumflex.sc -45
KPX Oslash wcircumflex.sc -45
KPX Oslash wdieresis.sc -45
+KPX Oslash wdieresis.sc -45
+KPX Oslash wgrave.sc -45
KPX Oslash wgrave.sc -45
KPX Oslash ycircumflex.sc -60
+KPX Oslash ycircumflex.sc -60
+KPX Oslash a.sc -50
KPX Oslash a.sc -50
KPX Oslash v.sc -60
+KPX Oslash v.sc -60
+KPX Oslash w.sc -45
KPX Oslash w.sc -45
KPX Oslash x.sc -45
+KPX Oslash x.sc -45
KPX Oslash y.sc -60
+KPX Oslash y.sc -60
+KPX Oslash adieresis.sc -50
KPX Oslash adieresis.sc -50
KPX Oslash aring.sc -50
+KPX Oslash aring.sc -50
+KPX Oslash ae.sc -40
KPX Oslash ae.sc -40
KPX Oslash ydieresis.sc -60
+KPX Oslash ydieresis.sc -60
KPX Oslash a.pc -50
KPX Oslash v.pc -60
KPX Oslash w.pc -45
@@ -6814,23 +7078,6 @@ KPX Oslash aeacute.pc -40
KPX Oslash wgrave.pc -45
KPX Oslash wacute.pc -45
KPX Oslash wdieresis.pc -45
-KPX Oslash a.sc -50
-KPX Oslash v.sc -60
-KPX Oslash w.sc -45
-KPX Oslash x.sc -45
-KPX Oslash y.sc -60
-KPX Oslash adieresis.sc -50
-KPX Oslash aring.sc -50
-KPX Oslash ae.sc -40
-KPX Oslash ydieresis.sc -60
-KPX Oslash amacron.sc -50
-KPX Oslash aogonek.sc -50
-KPX Oslash wcircumflex.sc -45
-KPX Oslash ycircumflex.sc -60
-KPX Oslash aeacute.sc -40
-KPX Oslash wgrave.sc -45
-KPX Oslash wacute.sc -45
-KPX Oslash wdieresis.sc -45
KPX Ugrave A -65
KPX Ugrave m -35
KPX Ugrave n -30
@@ -6841,16 +7088,28 @@ KPX Ugrave racute -20
KPX Ugrave rcaron -15
KPX Ugrave rdotaccent -15
KPX Ugrave abrevedotbelow.sc -25
+KPX Ugrave abrevedotbelow.sc -25
KPX Ugrave acircumflexdotbelow.sc -25
+KPX Ugrave acircumflexdotbelow.sc -25
+KPX Ugrave ahookabove.sc -25
KPX Ugrave ahookabove.sc -25
KPX Ugrave abreve.sc -25
+KPX Ugrave abreve.sc -25
+KPX Ugrave amacron.sc -25
KPX Ugrave amacron.sc -25
KPX Ugrave a.sc -55
+KPX Ugrave a.sc -55
KPX Ugrave agrave.sc -25
+KPX Ugrave agrave.sc -25
+KPX Ugrave aacute.sc -40
KPX Ugrave aacute.sc -40
KPX Ugrave acircumflex.sc -25
+KPX Ugrave acircumflex.sc -25
+KPX Ugrave atilde.sc -25
KPX Ugrave atilde.sc -25
KPX Ugrave adieresis.sc -25
+KPX Ugrave adieresis.sc -25
+KPX Ugrave aring.sc -25
KPX Ugrave aring.sc -25
KPX Ugrave a.pc -55
KPX Ugrave agrave.pc -25
@@ -6864,18 +7123,6 @@ KPX Ugrave abreve.pc -25
KPX Ugrave ahookabove.pc -25
KPX Ugrave acircumflexdotbelow.pc -25
KPX Ugrave abrevedotbelow.pc -25
-KPX Ugrave a.sc -55
-KPX Ugrave agrave.sc -25
-KPX Ugrave aacute.sc -40
-KPX Ugrave acircumflex.sc -25
-KPX Ugrave atilde.sc -25
-KPX Ugrave adieresis.sc -25
-KPX Ugrave aring.sc -25
-KPX Ugrave amacron.sc -25
-KPX Ugrave abreve.sc -25
-KPX Ugrave ahookabove.sc -25
-KPX Ugrave acircumflexdotbelow.sc -25
-KPX Ugrave abrevedotbelow.sc -25
KPX Uacute A -65
KPX Uacute m -35
KPX Uacute n -30
@@ -6887,17 +7134,29 @@ KPX Uacute racute -20
KPX Uacute rcaron -15
KPX Uacute rdotaccent -15
KPX Uacute abrevedotbelow.sc -25
+KPX Uacute abrevedotbelow.sc -25
+KPX Uacute acircumflexdotbelow.sc -25
KPX Uacute acircumflexdotbelow.sc -25
KPX Uacute ahookabove.sc -25
+KPX Uacute ahookabove.sc -25
+KPX Uacute abreve.sc -25
KPX Uacute abreve.sc -25
KPX Uacute amacron.sc -25
+KPX Uacute amacron.sc -25
+KPX Uacute a.sc -55
KPX Uacute a.sc -55
KPX Uacute agrave.sc -25
+KPX Uacute agrave.sc -25
+KPX Uacute aacute.sc -40
KPX Uacute aacute.sc -40
KPX Uacute acircumflex.sc -25
+KPX Uacute acircumflex.sc -25
KPX Uacute atilde.sc -25
+KPX Uacute atilde.sc -25
+KPX Uacute adieresis.sc -25
KPX Uacute adieresis.sc -25
KPX Uacute aring.sc -25
+KPX Uacute aring.sc -25
KPX Uacute a.pc -55
KPX Uacute agrave.pc -25
KPX Uacute aacute.pc -40
@@ -6910,18 +7169,6 @@ KPX Uacute abreve.pc -25
KPX Uacute ahookabove.pc -25
KPX Uacute acircumflexdotbelow.pc -25
KPX Uacute abrevedotbelow.pc -25
-KPX Uacute a.sc -55
-KPX Uacute agrave.sc -25
-KPX Uacute aacute.sc -40
-KPX Uacute acircumflex.sc -25
-KPX Uacute atilde.sc -25
-KPX Uacute adieresis.sc -25
-KPX Uacute aring.sc -25
-KPX Uacute amacron.sc -25
-KPX Uacute abreve.sc -25
-KPX Uacute ahookabove.sc -25
-KPX Uacute acircumflexdotbelow.sc -25
-KPX Uacute abrevedotbelow.sc -25
KPX Ucircumflex comma -30
KPX Ucircumflex period -35
KPX Ucircumflex A -65
@@ -6944,20 +7191,35 @@ KPX Ucircumflex rcaron -15
KPX Ucircumflex AEacute -60
KPX Ucircumflex rdotaccent -15
KPX Ucircumflex abrevedotbelow.sc -25
+KPX Ucircumflex abrevedotbelow.sc -25
+KPX Ucircumflex acircumflexdotbelow.sc -25
KPX Ucircumflex acircumflexdotbelow.sc -25
KPX Ucircumflex ahookabove.sc -25
+KPX Ucircumflex ahookabove.sc -25
KPX Ucircumflex abreve.sc -25
+KPX Ucircumflex abreve.sc -25
+KPX Ucircumflex amacron.sc -25
KPX Ucircumflex amacron.sc -25
KPX Ucircumflex aogonek.sc -55
+KPX Ucircumflex aogonek.sc -55
+KPX Ucircumflex aeacute.sc -50
KPX Ucircumflex aeacute.sc -50
KPX Ucircumflex a.sc -55
+KPX Ucircumflex a.sc -55
+KPX Ucircumflex agrave.sc -25
KPX Ucircumflex agrave.sc -25
KPX Ucircumflex aacute.sc -40
+KPX Ucircumflex aacute.sc -40
+KPX Ucircumflex acircumflex.sc -25
KPX Ucircumflex acircumflex.sc -25
KPX Ucircumflex atilde.sc -25
+KPX Ucircumflex atilde.sc -25
KPX Ucircumflex adieresis.sc -25
+KPX Ucircumflex adieresis.sc -25
+KPX Ucircumflex aring.sc -25
KPX Ucircumflex aring.sc -25
KPX Ucircumflex ae.sc -50
+KPX Ucircumflex ae.sc -50
KPX Ucircumflex a.pc -55
KPX Ucircumflex agrave.pc -25
KPX Ucircumflex aacute.pc -40
@@ -6973,21 +7235,6 @@ KPX Ucircumflex aeacute.pc -50
KPX Ucircumflex ahookabove.pc -25
KPX Ucircumflex acircumflexdotbelow.pc -25
KPX Ucircumflex abrevedotbelow.pc -25
-KPX Ucircumflex a.sc -55
-KPX Ucircumflex agrave.sc -25
-KPX Ucircumflex aacute.sc -40
-KPX Ucircumflex acircumflex.sc -25
-KPX Ucircumflex atilde.sc -25
-KPX Ucircumflex adieresis.sc -25
-KPX Ucircumflex aring.sc -25
-KPX Ucircumflex ae.sc -50
-KPX Ucircumflex amacron.sc -25
-KPX Ucircumflex abreve.sc -25
-KPX Ucircumflex aogonek.sc -55
-KPX Ucircumflex aeacute.sc -50
-KPX Ucircumflex ahookabove.sc -25
-KPX Ucircumflex acircumflexdotbelow.sc -25
-KPX Ucircumflex abrevedotbelow.sc -25
KPX Udieresis comma -30
KPX Udieresis period -35
KPX Udieresis A -65
@@ -7010,20 +7257,35 @@ KPX Udieresis rcaron -15
KPX Udieresis AEacute -60
KPX Udieresis rdotaccent -15
KPX Udieresis abrevedotbelow.sc -25
+KPX Udieresis abrevedotbelow.sc -25
KPX Udieresis acircumflexdotbelow.sc -25
+KPX Udieresis acircumflexdotbelow.sc -25
+KPX Udieresis ahookabove.sc -25
KPX Udieresis ahookabove.sc -25
KPX Udieresis abreve.sc -25
+KPX Udieresis abreve.sc -25
+KPX Udieresis amacron.sc -25
KPX Udieresis amacron.sc -25
KPX Udieresis aogonek.sc -55
+KPX Udieresis aogonek.sc -55
+KPX Udieresis aeacute.sc -50
KPX Udieresis aeacute.sc -50
KPX Udieresis a.sc -55
+KPX Udieresis a.sc -55
+KPX Udieresis agrave.sc -25
KPX Udieresis agrave.sc -25
KPX Udieresis aacute.sc -40
+KPX Udieresis aacute.sc -40
KPX Udieresis acircumflex.sc -25
+KPX Udieresis acircumflex.sc -25
+KPX Udieresis atilde.sc -25
KPX Udieresis atilde.sc -25
KPX Udieresis adieresis.sc -25
+KPX Udieresis adieresis.sc -25
+KPX Udieresis aring.sc -25
KPX Udieresis aring.sc -25
KPX Udieresis ae.sc -50
+KPX Udieresis ae.sc -50
KPX Udieresis a.pc -55
KPX Udieresis agrave.pc -25
KPX Udieresis aacute.pc -40
@@ -7039,21 +7301,21 @@ KPX Udieresis aeacute.pc -50
KPX Udieresis ahookabove.pc -25
KPX Udieresis acircumflexdotbelow.pc -25
KPX Udieresis abrevedotbelow.pc -25
-KPX Udieresis a.sc -55
-KPX Udieresis agrave.sc -25
-KPX Udieresis aacute.sc -40
-KPX Udieresis acircumflex.sc -25
-KPX Udieresis atilde.sc -25
-KPX Udieresis adieresis.sc -25
-KPX Udieresis aring.sc -25
-KPX Udieresis ae.sc -50
-KPX Udieresis amacron.sc -25
-KPX Udieresis abreve.sc -25
-KPX Udieresis aogonek.sc -55
-KPX Udieresis aeacute.sc -50
-KPX Udieresis ahookabove.sc -25
-KPX Udieresis acircumflexdotbelow.sc -25
-KPX Udieresis abrevedotbelow.sc -25
+KPX Yacute zdotaccent -67
+KPX Yacute zcaron -67
+KPX Yacute zacute -67
+KPX Yacute z -67
+KPX Yacute scircumflex -67
+KPX Yacute scedilla -67
+KPX Yacute scaron -67
+KPX Yacute sacute -67
+KPX Yacute s -67
+KPX Yacute cdotaccent -67
+KPX Yacute ccircumflex -67
+KPX Yacute ccedilla -67
+KPX Yacute ccaron -67
+KPX Yacute cacute -67
+KPX Yacute c -67
KPX Yacute C -70
KPX Yacute T 15
KPX Yacute i -15
@@ -7122,48 +7384,92 @@ KPX Yacute uhornhookabove -40
KPX Yacute uhorntilde -40
KPX Yacute uhorndotbelow -40
KPX Yacute abrevedotbelow.sc -30
+KPX Yacute abrevedotbelow.sc -30
+KPX Yacute acircumflexdotbelow.sc -30
KPX Yacute acircumflexdotbelow.sc -30
KPX Yacute ahookabove.sc -30
+KPX Yacute ahookabove.sc -30
+KPX Yacute gacute.sc -45
KPX Yacute gacute.sc -45
KPX Yacute gcaron.sc -30
+KPX Yacute gcaron.sc -30
+KPX Yacute ocircumflexdotbelow.sc -30
KPX Yacute ocircumflexdotbelow.sc -30
KPX Yacute oe.sc -40
+KPX Yacute oe.sc -40
KPX Yacute ohookabove.sc -30
+KPX Yacute ohookabove.sc -30
+KPX Yacute ohornacute.sc -30
KPX Yacute ohornacute.sc -30
KPX Yacute ohorndotbelow.sc -30
+KPX Yacute ohorndotbelow.sc -30
+KPX Yacute ohorngrave.sc -30
KPX Yacute ohorngrave.sc -30
KPX Yacute ohornhookabove.sc -30
+KPX Yacute ohornhookabove.sc -30
+KPX Yacute ohorntilde.sc -30
KPX Yacute ohorntilde.sc -30
KPX Yacute scaron.sc -20
+KPX Yacute scaron.sc -20
+KPX Yacute abreve.sc -30
KPX Yacute abreve.sc -30
KPX Yacute amacron.sc -30
+KPX Yacute amacron.sc -30
KPX Yacute aeacute.sc -80
+KPX Yacute aeacute.sc -80
+KPX Yacute cacute.sc -45
KPX Yacute cacute.sc -45
KPX Yacute ccaron.sc -30
+KPX Yacute ccaron.sc -30
+KPX Yacute ccircumflex.sc -30
KPX Yacute ccircumflex.sc -30
KPX Yacute cdotaccent.sc -30
+KPX Yacute cdotaccent.sc -30
+KPX Yacute gbreve.sc -30
KPX Yacute gbreve.sc -30
KPX Yacute gcircumflex.sc -30
+KPX Yacute gcircumflex.sc -30
+KPX Yacute gdotaccent.sc -30
KPX Yacute gdotaccent.sc -30
KPX Yacute obreve.sc -30
+KPX Yacute obreve.sc -30
KPX Yacute ohungarumlaut.sc -30
+KPX Yacute ohungarumlaut.sc -30
+KPX Yacute omacron.sc -30
KPX Yacute omacron.sc -30
KPX Yacute sacute.sc -30
+KPX Yacute sacute.sc -30
+KPX Yacute scircumflex.sc -20
KPX Yacute scircumflex.sc -20
KPX Yacute tcaron.sc 5
+KPX Yacute tcaron.sc 5
+KPX Yacute c.sc -60
KPX Yacute c.sc -60
KPX Yacute t.sc 15
+KPX Yacute t.sc 15
+KPX Yacute agrave.sc -30
KPX Yacute agrave.sc -30
KPX Yacute aacute.sc -45
+KPX Yacute aacute.sc -45
KPX Yacute acircumflex.sc -30
+KPX Yacute acircumflex.sc -30
+KPX Yacute atilde.sc -30
KPX Yacute atilde.sc -30
KPX Yacute adieresis.sc -30
+KPX Yacute adieresis.sc -30
+KPX Yacute aring.sc -30
KPX Yacute aring.sc -30
KPX Yacute ae.sc -80
+KPX Yacute ae.sc -80
+KPX Yacute ograve.sc -30
KPX Yacute ograve.sc -30
KPX Yacute oacute.sc -45
+KPX Yacute oacute.sc -45
+KPX Yacute ocircumflex.sc -30
KPX Yacute ocircumflex.sc -30
KPX Yacute otilde.sc -30
+KPX Yacute otilde.sc -30
+KPX Yacute odieresis.sc -30
KPX Yacute odieresis.sc -30
KPX Yacute c.pc -60
KPX Yacute t.pc 15
@@ -7209,50 +7515,6 @@ KPX Yacute ohorngrave.pc -30
KPX Yacute ohornhookabove.pc -30
KPX Yacute ohorntilde.pc -30
KPX Yacute ohorndotbelow.pc -30
-KPX Yacute c.sc -60
-KPX Yacute t.sc 15
-KPX Yacute agrave.sc -30
-KPX Yacute aacute.sc -45
-KPX Yacute acircumflex.sc -30
-KPX Yacute atilde.sc -30
-KPX Yacute adieresis.sc -30
-KPX Yacute aring.sc -30
-KPX Yacute ae.sc -80
-KPX Yacute ograve.sc -30
-KPX Yacute oacute.sc -45
-KPX Yacute ocircumflex.sc -30
-KPX Yacute otilde.sc -30
-KPX Yacute odieresis.sc -30
-KPX Yacute amacron.sc -30
-KPX Yacute abreve.sc -30
-KPX Yacute cacute.sc -45
-KPX Yacute ccircumflex.sc -30
-KPX Yacute cdotaccent.sc -30
-KPX Yacute ccaron.sc -30
-KPX Yacute gcircumflex.sc -30
-KPX Yacute gbreve.sc -30
-KPX Yacute gdotaccent.sc -30
-KPX Yacute omacron.sc -30
-KPX Yacute obreve.sc -30
-KPX Yacute ohungarumlaut.sc -30
-KPX Yacute oe.sc -40
-KPX Yacute sacute.sc -30
-KPX Yacute scircumflex.sc -20
-KPX Yacute scaron.sc -20
-KPX Yacute tcaron.sc 5
-KPX Yacute gcaron.sc -30
-KPX Yacute gacute.sc -45
-KPX Yacute aeacute.sc -80
-KPX Yacute ahookabove.sc -30
-KPX Yacute acircumflexdotbelow.sc -30
-KPX Yacute abrevedotbelow.sc -30
-KPX Yacute ohookabove.sc -30
-KPX Yacute ocircumflexdotbelow.sc -30
-KPX Yacute ohornacute.sc -30
-KPX Yacute ohorngrave.sc -30
-KPX Yacute ohornhookabove.sc -30
-KPX Yacute ohorntilde.sc -30
-KPX Yacute ohorndotbelow.sc -30
KPX agrave y -30
KPX aacute y -30
KPX acircumflex y -30
@@ -7518,45 +7780,85 @@ KPX Amacron quoteright -115
KPX Amacron quotedblright -90
KPX Amacron guilsinglleft -75
KPX Amacron gacute.sc -45
+KPX Amacron gacute.sc -45
+KPX Amacron gcaron.sc -45
KPX Amacron gcaron.sc -45
KPX Amacron oogonek.sc -50
+KPX Amacron oogonek.sc -50
+KPX Amacron cacute.sc -45
KPX Amacron cacute.sc -45
KPX Amacron ccaron.sc -45
+KPX Amacron ccaron.sc -45
+KPX Amacron ccircumflex.sc -45
KPX Amacron ccircumflex.sc -45
KPX Amacron cdotaccent.sc -45
+KPX Amacron cdotaccent.sc -45
+KPX Amacron gbreve.sc -45
KPX Amacron gbreve.sc -45
KPX Amacron gcircumflex.sc -45
+KPX Amacron gcircumflex.sc -45
KPX Amacron gcommaaccent.sc -45
+KPX Amacron gcommaaccent.sc -45
+KPX Amacron gdotaccent.sc -45
KPX Amacron gdotaccent.sc -45
KPX Amacron obreve.sc -50
+KPX Amacron obreve.sc -50
+KPX Amacron ohungarumlaut.sc -50
KPX Amacron ohungarumlaut.sc -50
KPX Amacron omacron.sc -50
+KPX Amacron omacron.sc -50
KPX Amacron tcaron.sc -45
+KPX Amacron tcaron.sc -45
+KPX Amacron ubreve.sc -50
KPX Amacron ubreve.sc -50
KPX Amacron uhungarumlaut.sc -50
+KPX Amacron uhungarumlaut.sc -50
+KPX Amacron umacron.sc -50
KPX Amacron umacron.sc -50
KPX Amacron uogonek.sc -50
+KPX Amacron uogonek.sc -50
KPX Amacron uring.sc -50
+KPX Amacron uring.sc -50
+KPX Amacron wacute.sc -95
KPX Amacron wacute.sc -95
KPX Amacron wcircumflex.sc -95
+KPX Amacron wcircumflex.sc -95
+KPX Amacron wdieresis.sc -95
KPX Amacron wdieresis.sc -95
KPX Amacron wgrave.sc -95
+KPX Amacron wgrave.sc -95
+KPX Amacron ycircumflex.sc -65
KPX Amacron ycircumflex.sc -65
KPX Amacron c.sc -45
+KPX Amacron c.sc -45
+KPX Amacron g.sc -45
KPX Amacron g.sc -45
KPX Amacron o.sc -50
+KPX Amacron o.sc -50
KPX Amacron q.sc -50
+KPX Amacron q.sc -50
+KPX Amacron t.sc -45
KPX Amacron t.sc -45
KPX Amacron u.sc -50
+KPX Amacron u.sc -50
+KPX Amacron v.sc -110
KPX Amacron v.sc -110
KPX Amacron w.sc -95
+KPX Amacron w.sc -95
+KPX Amacron y.sc -65
KPX Amacron y.sc -65
KPX Amacron ccedilla.sc -45
+KPX Amacron ccedilla.sc -45
+KPX Amacron odieresis.sc -50
KPX Amacron odieresis.sc -50
KPX Amacron oslash.sc -50
+KPX Amacron oslash.sc -50
KPX Amacron ucircumflex.sc -50
+KPX Amacron ucircumflex.sc -50
+KPX Amacron udieresis.sc -50
KPX Amacron udieresis.sc -50
KPX Amacron ydieresis.sc -65
+KPX Amacron ydieresis.sc -65
KPX Amacron c.pc -45
KPX Amacron g.pc -45
KPX Amacron o.pc -50
@@ -7598,46 +7900,6 @@ KPX Amacron uni021B.pc -45
KPX Amacron wgrave.pc -95
KPX Amacron wacute.pc -95
KPX Amacron wdieresis.pc -95
-KPX Amacron c.sc -45
-KPX Amacron g.sc -45
-KPX Amacron o.sc -50
-KPX Amacron q.sc -50
-KPX Amacron t.sc -45
-KPX Amacron u.sc -50
-KPX Amacron v.sc -110
-KPX Amacron w.sc -95
-KPX Amacron y.sc -65
-KPX Amacron ccedilla.sc -45
-KPX Amacron odieresis.sc -50
-KPX Amacron oslash.sc -50
-KPX Amacron ucircumflex.sc -50
-KPX Amacron udieresis.sc -50
-KPX Amacron ydieresis.sc -65
-KPX Amacron cacute.sc -45
-KPX Amacron ccircumflex.sc -45
-KPX Amacron cdotaccent.sc -45
-KPX Amacron ccaron.sc -45
-KPX Amacron gcircumflex.sc -45
-KPX Amacron gbreve.sc -45
-KPX Amacron gdotaccent.sc -45
-KPX Amacron gcommaaccent.sc -45
-KPX Amacron omacron.sc -50
-KPX Amacron obreve.sc -50
-KPX Amacron ohungarumlaut.sc -50
-KPX Amacron tcaron.sc -45
-KPX Amacron umacron.sc -50
-KPX Amacron ubreve.sc -50
-KPX Amacron uring.sc -50
-KPX Amacron uhungarumlaut.sc -50
-KPX Amacron uogonek.sc -50
-KPX Amacron wcircumflex.sc -95
-KPX Amacron ycircumflex.sc -65
-KPX Amacron gcaron.sc -45
-KPX Amacron oogonek.sc -50
-KPX Amacron gacute.sc -45
-KPX Amacron wgrave.sc -95
-KPX Amacron wacute.sc -95
-KPX Amacron wdieresis.sc -95
KPX amacron j -25
KPX amacron v -30
KPX amacron w -30
@@ -7746,44 +8008,84 @@ KPX Aogonek quoteright -115
KPX Aogonek quotedblright -90
KPX Aogonek guilsinglleft -75
KPX Aogonek gacute.sc -45
+KPX Aogonek gacute.sc -45
+KPX Aogonek gcaron.sc -45
KPX Aogonek gcaron.sc -45
KPX Aogonek oogonek.sc -50
+KPX Aogonek oogonek.sc -50
+KPX Aogonek cacute.sc -45
KPX Aogonek cacute.sc -45
KPX Aogonek ccaron.sc -45
+KPX Aogonek ccaron.sc -45
+KPX Aogonek ccircumflex.sc -45
KPX Aogonek ccircumflex.sc -45
KPX Aogonek cdotaccent.sc -45
+KPX Aogonek cdotaccent.sc -45
+KPX Aogonek gbreve.sc -45
KPX Aogonek gbreve.sc -45
KPX Aogonek gcircumflex.sc -45
+KPX Aogonek gcircumflex.sc -45
+KPX Aogonek gcommaaccent.sc -45
KPX Aogonek gcommaaccent.sc -45
KPX Aogonek gdotaccent.sc -45
+KPX Aogonek gdotaccent.sc -45
KPX Aogonek obreve.sc -50
+KPX Aogonek obreve.sc -50
+KPX Aogonek ohungarumlaut.sc -50
KPX Aogonek ohungarumlaut.sc -50
KPX Aogonek omacron.sc -50
+KPX Aogonek omacron.sc -50
+KPX Aogonek tcaron.sc -45
KPX Aogonek tcaron.sc -45
KPX Aogonek ubreve.sc -50
+KPX Aogonek ubreve.sc -50
+KPX Aogonek uhungarumlaut.sc -50
KPX Aogonek uhungarumlaut.sc -50
KPX Aogonek umacron.sc -50
+KPX Aogonek umacron.sc -50
+KPX Aogonek uogonek.sc -50
KPX Aogonek uogonek.sc -50
KPX Aogonek uring.sc -50
+KPX Aogonek uring.sc -50
KPX Aogonek wacute.sc -95
+KPX Aogonek wacute.sc -95
+KPX Aogonek wcircumflex.sc -95
KPX Aogonek wcircumflex.sc -95
KPX Aogonek wdieresis.sc -95
+KPX Aogonek wdieresis.sc -95
+KPX Aogonek wgrave.sc -95
KPX Aogonek wgrave.sc -95
KPX Aogonek ycircumflex.sc -65
+KPX Aogonek ycircumflex.sc -65
+KPX Aogonek c.sc -45
KPX Aogonek c.sc -45
KPX Aogonek g.sc -45
+KPX Aogonek g.sc -45
+KPX Aogonek o.sc -50
KPX Aogonek o.sc -50
KPX Aogonek q.sc -50
+KPX Aogonek q.sc -50
KPX Aogonek t.sc -45
+KPX Aogonek t.sc -45
+KPX Aogonek u.sc -50
KPX Aogonek u.sc -50
KPX Aogonek v.sc -110
+KPX Aogonek v.sc -110
+KPX Aogonek w.sc -95
KPX Aogonek w.sc -95
KPX Aogonek y.sc -65
+KPX Aogonek y.sc -65
+KPX Aogonek ccedilla.sc -45
KPX Aogonek ccedilla.sc -45
KPX Aogonek odieresis.sc -50
+KPX Aogonek odieresis.sc -50
+KPX Aogonek oslash.sc -50
KPX Aogonek oslash.sc -50
KPX Aogonek ucircumflex.sc -50
+KPX Aogonek ucircumflex.sc -50
KPX Aogonek udieresis.sc -50
+KPX Aogonek udieresis.sc -50
+KPX Aogonek ydieresis.sc -65
KPX Aogonek ydieresis.sc -65
KPX Aogonek c.pc -45
KPX Aogonek g.pc -45
@@ -7826,46 +8128,6 @@ KPX Aogonek uni021B.pc -45
KPX Aogonek wgrave.pc -95
KPX Aogonek wacute.pc -95
KPX Aogonek wdieresis.pc -95
-KPX Aogonek c.sc -45
-KPX Aogonek g.sc -45
-KPX Aogonek o.sc -50
-KPX Aogonek q.sc -50
-KPX Aogonek t.sc -45
-KPX Aogonek u.sc -50
-KPX Aogonek v.sc -110
-KPX Aogonek w.sc -95
-KPX Aogonek y.sc -65
-KPX Aogonek ccedilla.sc -45
-KPX Aogonek odieresis.sc -50
-KPX Aogonek oslash.sc -50
-KPX Aogonek ucircumflex.sc -50
-KPX Aogonek udieresis.sc -50
-KPX Aogonek ydieresis.sc -65
-KPX Aogonek cacute.sc -45
-KPX Aogonek ccircumflex.sc -45
-KPX Aogonek cdotaccent.sc -45
-KPX Aogonek ccaron.sc -45
-KPX Aogonek gcircumflex.sc -45
-KPX Aogonek gbreve.sc -45
-KPX Aogonek gdotaccent.sc -45
-KPX Aogonek gcommaaccent.sc -45
-KPX Aogonek omacron.sc -50
-KPX Aogonek obreve.sc -50
-KPX Aogonek ohungarumlaut.sc -50
-KPX Aogonek tcaron.sc -45
-KPX Aogonek umacron.sc -50
-KPX Aogonek ubreve.sc -50
-KPX Aogonek uring.sc -50
-KPX Aogonek uhungarumlaut.sc -50
-KPX Aogonek uogonek.sc -50
-KPX Aogonek wcircumflex.sc -95
-KPX Aogonek ycircumflex.sc -65
-KPX Aogonek gcaron.sc -45
-KPX Aogonek oogonek.sc -50
-KPX Aogonek gacute.sc -45
-KPX Aogonek wgrave.sc -95
-KPX Aogonek wacute.sc -95
-KPX Aogonek wdieresis.sc -95
KPX aogonek v -30
KPX aogonek w -30
KPX aogonek wcircumflex -30
@@ -7888,18 +8150,32 @@ KPX Cacute Ohungarumlaut -10
KPX Cacute Oogonek -10
KPX Cacute AEacute -15
KPX Cacute oogonek.sc -10
+KPX Cacute oogonek.sc -10
KPX Cacute amacron.sc -20
+KPX Cacute amacron.sc -20
+KPX Cacute aogonek.sc -20
KPX Cacute aogonek.sc -20
KPX Cacute aeacute.sc -15
+KPX Cacute aeacute.sc -15
KPX Cacute obreve.sc -10
+KPX Cacute obreve.sc -10
+KPX Cacute ohungarumlaut.sc -10
KPX Cacute ohungarumlaut.sc -10
KPX Cacute omacron.sc -10
+KPX Cacute omacron.sc -10
+KPX Cacute a.sc -20
KPX Cacute a.sc -20
KPX Cacute o.sc -10
+KPX Cacute o.sc -10
+KPX Cacute adieresis.sc -20
KPX Cacute adieresis.sc -20
KPX Cacute aring.sc -20
+KPX Cacute aring.sc -20
+KPX Cacute ae.sc -15
KPX Cacute ae.sc -15
KPX Cacute odieresis.sc -10
+KPX Cacute odieresis.sc -10
+KPX Cacute oslash.sc -10
KPX Cacute oslash.sc -10
KPX Cacute a.pc -20
KPX Cacute o.pc -10
@@ -7915,20 +8191,6 @@ KPX Cacute obreve.pc -10
KPX Cacute ohungarumlaut.pc -10
KPX Cacute oogonek.pc -10
KPX Cacute aeacute.pc -15
-KPX Cacute a.sc -20
-KPX Cacute o.sc -10
-KPX Cacute adieresis.sc -20
-KPX Cacute aring.sc -20
-KPX Cacute ae.sc -15
-KPX Cacute odieresis.sc -10
-KPX Cacute oslash.sc -10
-KPX Cacute amacron.sc -20
-KPX Cacute aogonek.sc -20
-KPX Cacute omacron.sc -10
-KPX Cacute obreve.sc -10
-KPX Cacute ohungarumlaut.sc -10
-KPX Cacute oogonek.sc -10
-KPX Cacute aeacute.sc -15
KPX cacute h -15
KPX cacute k -20
KPX cacute hcircumflex -15
@@ -7948,18 +8210,32 @@ KPX Ccircumflex Ohungarumlaut -10
KPX Ccircumflex Oogonek -10
KPX Ccircumflex AEacute -15
KPX Ccircumflex oogonek.sc -10
+KPX Ccircumflex oogonek.sc -10
+KPX Ccircumflex amacron.sc -20
KPX Ccircumflex amacron.sc -20
KPX Ccircumflex aogonek.sc -20
+KPX Ccircumflex aogonek.sc -20
KPX Ccircumflex aeacute.sc -15
+KPX Ccircumflex aeacute.sc -15
+KPX Ccircumflex obreve.sc -10
KPX Ccircumflex obreve.sc -10
KPX Ccircumflex ohungarumlaut.sc -10
+KPX Ccircumflex ohungarumlaut.sc -10
+KPX Ccircumflex omacron.sc -10
KPX Ccircumflex omacron.sc -10
KPX Ccircumflex a.sc -20
+KPX Ccircumflex a.sc -20
+KPX Ccircumflex o.sc -10
KPX Ccircumflex o.sc -10
KPX Ccircumflex adieresis.sc -20
+KPX Ccircumflex adieresis.sc -20
+KPX Ccircumflex aring.sc -20
KPX Ccircumflex aring.sc -20
KPX Ccircumflex ae.sc -15
+KPX Ccircumflex ae.sc -15
KPX Ccircumflex odieresis.sc -10
+KPX Ccircumflex odieresis.sc -10
+KPX Ccircumflex oslash.sc -10
KPX Ccircumflex oslash.sc -10
KPX Ccircumflex a.pc -20
KPX Ccircumflex o.pc -10
@@ -7975,20 +8251,6 @@ KPX Ccircumflex obreve.pc -10
KPX Ccircumflex ohungarumlaut.pc -10
KPX Ccircumflex oogonek.pc -10
KPX Ccircumflex aeacute.pc -15
-KPX Ccircumflex a.sc -20
-KPX Ccircumflex o.sc -10
-KPX Ccircumflex adieresis.sc -20
-KPX Ccircumflex aring.sc -20
-KPX Ccircumflex ae.sc -15
-KPX Ccircumflex odieresis.sc -10
-KPX Ccircumflex oslash.sc -10
-KPX Ccircumflex amacron.sc -20
-KPX Ccircumflex aogonek.sc -20
-KPX Ccircumflex omacron.sc -10
-KPX Ccircumflex obreve.sc -10
-KPX Ccircumflex ohungarumlaut.sc -10
-KPX Ccircumflex oogonek.sc -10
-KPX Ccircumflex aeacute.sc -15
KPX ccircumflex h -15
KPX ccircumflex k -20
KPX ccircumflex hcircumflex -15
@@ -8008,19 +8270,33 @@ KPX Cdotaccent Ohungarumlaut -10
KPX Cdotaccent Oogonek -10
KPX Cdotaccent AEacute -15
KPX Cdotaccent oogonek.sc -10
+KPX Cdotaccent oogonek.sc -10
+KPX Cdotaccent amacron.sc -20
KPX Cdotaccent amacron.sc -20
KPX Cdotaccent aogonek.sc -20
+KPX Cdotaccent aogonek.sc -20
+KPX Cdotaccent aeacute.sc -15
KPX Cdotaccent aeacute.sc -15
KPX Cdotaccent obreve.sc -10
+KPX Cdotaccent obreve.sc -10
+KPX Cdotaccent ohungarumlaut.sc -10
KPX Cdotaccent ohungarumlaut.sc -10
KPX Cdotaccent omacron.sc -10
+KPX Cdotaccent omacron.sc -10
+KPX Cdotaccent a.sc -20
KPX Cdotaccent a.sc -20
KPX Cdotaccent o.sc -10
+KPX Cdotaccent o.sc -10
+KPX Cdotaccent adieresis.sc -20
KPX Cdotaccent adieresis.sc -20
KPX Cdotaccent aring.sc -20
+KPX Cdotaccent aring.sc -20
KPX Cdotaccent ae.sc -15
+KPX Cdotaccent ae.sc -15
+KPX Cdotaccent odieresis.sc -10
KPX Cdotaccent odieresis.sc -10
KPX Cdotaccent oslash.sc -10
+KPX Cdotaccent oslash.sc -10
KPX Cdotaccent a.pc -20
KPX Cdotaccent o.pc -10
KPX Cdotaccent adieresis.pc -20
@@ -8035,20 +8311,6 @@ KPX Cdotaccent obreve.pc -10
KPX Cdotaccent ohungarumlaut.pc -10
KPX Cdotaccent oogonek.pc -10
KPX Cdotaccent aeacute.pc -15
-KPX Cdotaccent a.sc -20
-KPX Cdotaccent o.sc -10
-KPX Cdotaccent adieresis.sc -20
-KPX Cdotaccent aring.sc -20
-KPX Cdotaccent ae.sc -15
-KPX Cdotaccent odieresis.sc -10
-KPX Cdotaccent oslash.sc -10
-KPX Cdotaccent amacron.sc -20
-KPX Cdotaccent aogonek.sc -20
-KPX Cdotaccent omacron.sc -10
-KPX Cdotaccent obreve.sc -10
-KPX Cdotaccent ohungarumlaut.sc -10
-KPX Cdotaccent oogonek.sc -10
-KPX Cdotaccent aeacute.sc -15
KPX cdotaccent h -15
KPX cdotaccent k -20
KPX cdotaccent hcircumflex -15
@@ -8068,18 +8330,32 @@ KPX Ccaron Ohungarumlaut -10
KPX Ccaron Oogonek -10
KPX Ccaron AEacute -15
KPX Ccaron oogonek.sc -10
+KPX Ccaron oogonek.sc -10
KPX Ccaron amacron.sc -20
+KPX Ccaron amacron.sc -20
+KPX Ccaron aogonek.sc -20
KPX Ccaron aogonek.sc -20
KPX Ccaron aeacute.sc -15
+KPX Ccaron aeacute.sc -15
+KPX Ccaron obreve.sc -10
KPX Ccaron obreve.sc -10
KPX Ccaron ohungarumlaut.sc -10
+KPX Ccaron ohungarumlaut.sc -10
+KPX Ccaron omacron.sc -10
KPX Ccaron omacron.sc -10
KPX Ccaron a.sc -20
+KPX Ccaron a.sc -20
+KPX Ccaron o.sc -10
KPX Ccaron o.sc -10
KPX Ccaron adieresis.sc -20
+KPX Ccaron adieresis.sc -20
KPX Ccaron aring.sc -20
+KPX Ccaron aring.sc -20
+KPX Ccaron ae.sc -15
KPX Ccaron ae.sc -15
KPX Ccaron odieresis.sc -10
+KPX Ccaron odieresis.sc -10
+KPX Ccaron oslash.sc -10
KPX Ccaron oslash.sc -10
KPX Ccaron a.pc -20
KPX Ccaron o.pc -10
@@ -8095,20 +8371,6 @@ KPX Ccaron obreve.pc -10
KPX Ccaron ohungarumlaut.pc -10
KPX Ccaron oogonek.pc -10
KPX Ccaron aeacute.pc -15
-KPX Ccaron a.sc -20
-KPX Ccaron o.sc -10
-KPX Ccaron adieresis.sc -20
-KPX Ccaron aring.sc -20
-KPX Ccaron ae.sc -15
-KPX Ccaron odieresis.sc -10
-KPX Ccaron oslash.sc -10
-KPX Ccaron amacron.sc -20
-KPX Ccaron aogonek.sc -20
-KPX Ccaron omacron.sc -10
-KPX Ccaron obreve.sc -10
-KPX Ccaron ohungarumlaut.sc -10
-KPX Ccaron oogonek.sc -10
-KPX Ccaron aeacute.sc -15
KPX ccaron h -15
KPX ccaron k -20
KPX ccaron hcircumflex -15
@@ -8131,24 +8393,42 @@ KPX Dcaron Wgrave -55
KPX Dcaron Wacute -55
KPX Dcaron Wdieresis -55
KPX Dcaron jacute.sc -35
+KPX Dcaron jacute.sc -35
KPX Dcaron Jacute -40
KPX Dcaron amacron.sc -55
+KPX Dcaron amacron.sc -55
KPX Dcaron aogonek.sc -55
+KPX Dcaron aogonek.sc -55
+KPX Dcaron jcircumflex.sc -35
KPX Dcaron jcircumflex.sc -35
KPX Dcaron wacute.sc -45
+KPX Dcaron wacute.sc -45
+KPX Dcaron wcircumflex.sc -45
KPX Dcaron wcircumflex.sc -45
KPX Dcaron wdieresis.sc -45
+KPX Dcaron wdieresis.sc -45
+KPX Dcaron wgrave.sc -45
KPX Dcaron wgrave.sc -45
KPX Dcaron ycircumflex.sc -65
+KPX Dcaron ycircumflex.sc -65
KPX Dcaron a.sc -55
+KPX Dcaron a.sc -55
+KPX Dcaron j.sc -35
KPX Dcaron j.sc -35
KPX Dcaron v.sc -60
+KPX Dcaron v.sc -60
+KPX Dcaron w.sc -45
KPX Dcaron w.sc -45
KPX Dcaron x.sc -55
+KPX Dcaron x.sc -55
+KPX Dcaron y.sc -65
KPX Dcaron y.sc -65
KPX Dcaron adieresis.sc -55
+KPX Dcaron adieresis.sc -55
+KPX Dcaron aring.sc -55
KPX Dcaron aring.sc -55
KPX Dcaron ydieresis.sc -65
+KPX Dcaron ydieresis.sc -65
KPX Dcaron a.pc -55
KPX Dcaron j.pc -35
KPX Dcaron v.pc -60
@@ -8167,24 +8447,6 @@ KPX Dcaron wgrave.pc -45
KPX Dcaron wacute.pc -45
KPX Dcaron wdieresis.pc -45
KPX Dcaron jacute.pc -35
-KPX Dcaron a.sc -55
-KPX Dcaron j.sc -35
-KPX Dcaron v.sc -60
-KPX Dcaron w.sc -45
-KPX Dcaron x.sc -55
-KPX Dcaron y.sc -65
-KPX Dcaron adieresis.sc -55
-KPX Dcaron aring.sc -55
-KPX Dcaron ydieresis.sc -65
-KPX Dcaron amacron.sc -55
-KPX Dcaron aogonek.sc -55
-KPX Dcaron jcircumflex.sc -35
-KPX Dcaron wcircumflex.sc -45
-KPX Dcaron ycircumflex.sc -65
-KPX Dcaron wgrave.sc -45
-KPX Dcaron wacute.sc -45
-KPX Dcaron wdieresis.sc -45
-KPX Dcaron jacute.sc -35
KPX dcaron backslash 40
KPX dcaron b 35
KPX dcaron h 35
@@ -8219,22 +8481,40 @@ KPX Dcroat Abrevehookabove -65
KPX Dcroat Abrevetilde -65
KPX Dcroat Abrevedotbelow -65
KPX Dcroat abreveacute.sc -55
+KPX Dcroat abreveacute.sc -55
KPX Dcroat abrevedotbelow.sc -55
+KPX Dcroat abrevedotbelow.sc -55
+KPX Dcroat abrevegrave.sc -55
KPX Dcroat abrevegrave.sc -55
KPX Dcroat abrevehookabove.sc -55
+KPX Dcroat abrevehookabove.sc -55
+KPX Dcroat abrevetilde.sc -55
KPX Dcroat abrevetilde.sc -55
KPX Dcroat acircumflexacute.sc -55
+KPX Dcroat acircumflexacute.sc -55
+KPX Dcroat acircumflexdotbelow.sc -55
KPX Dcroat acircumflexdotbelow.sc -55
KPX Dcroat acircumflexgrave.sc -55
+KPX Dcroat acircumflexgrave.sc -55
+KPX Dcroat acircumflexhookabove.sc -55
KPX Dcroat acircumflexhookabove.sc -55
KPX Dcroat acircumflextilde.sc -55
+KPX Dcroat acircumflextilde.sc -55
KPX Dcroat adotbelow.sc -55
+KPX Dcroat adotbelow.sc -55
+KPX Dcroat ahookabove.sc -55
KPX Dcroat ahookabove.sc -55
KPX Dcroat abreve.sc -55
+KPX Dcroat abreve.sc -55
+KPX Dcroat a.sc -55
KPX Dcroat a.sc -55
KPX Dcroat agrave.sc -55
+KPX Dcroat agrave.sc -55
+KPX Dcroat aacute.sc -55
KPX Dcroat aacute.sc -55
KPX Dcroat acircumflex.sc -55
+KPX Dcroat acircumflex.sc -55
+KPX Dcroat atilde.sc -55
KPX Dcroat atilde.sc -55
KPX Dcroat a.pc -55
KPX Dcroat agrave.pc -55
@@ -8254,24 +8534,6 @@ KPX Dcroat abrevegrave.pc -55
KPX Dcroat abrevehookabove.pc -55
KPX Dcroat abrevetilde.pc -55
KPX Dcroat abrevedotbelow.pc -55
-KPX Dcroat a.sc -55
-KPX Dcroat agrave.sc -55
-KPX Dcroat aacute.sc -55
-KPX Dcroat acircumflex.sc -55
-KPX Dcroat atilde.sc -55
-KPX Dcroat abreve.sc -55
-KPX Dcroat adotbelow.sc -55
-KPX Dcroat ahookabove.sc -55
-KPX Dcroat acircumflexacute.sc -55
-KPX Dcroat acircumflexgrave.sc -55
-KPX Dcroat acircumflexhookabove.sc -55
-KPX Dcroat acircumflextilde.sc -55
-KPX Dcroat acircumflexdotbelow.sc -55
-KPX Dcroat abreveacute.sc -55
-KPX Dcroat abrevegrave.sc -55
-KPX Dcroat abrevehookabove.sc -55
-KPX Dcroat abrevetilde.sc -55
-KPX Dcroat abrevedotbelow.sc -55
KPX emacron v -25
KPX emacron w -30
KPX emacron x -35
@@ -8344,22 +8606,40 @@ KPX Gcircumflex Wgrave -20
KPX Gcircumflex Wacute -20
KPX Gcircumflex Wdieresis -20
KPX Gcircumflex amacron.sc -20
+KPX Gcircumflex amacron.sc -20
KPX Gcircumflex aogonek.sc -20
+KPX Gcircumflex aogonek.sc -20
+KPX Gcircumflex aeacute.sc -15
KPX Gcircumflex aeacute.sc -15
KPX Gcircumflex tcaron.sc -15
+KPX Gcircumflex tcaron.sc -15
+KPX Gcircumflex wacute.sc -15
KPX Gcircumflex wacute.sc -15
KPX Gcircumflex wcircumflex.sc -15
+KPX Gcircumflex wcircumflex.sc -15
+KPX Gcircumflex wdieresis.sc -15
KPX Gcircumflex wdieresis.sc -15
KPX Gcircumflex wgrave.sc -15
+KPX Gcircumflex wgrave.sc -15
+KPX Gcircumflex ycircumflex.sc -20
KPX Gcircumflex ycircumflex.sc -20
KPX Gcircumflex a.sc -20
+KPX Gcircumflex a.sc -20
KPX Gcircumflex t.sc -15
+KPX Gcircumflex t.sc -15
+KPX Gcircumflex v.sc -20
KPX Gcircumflex v.sc -20
KPX Gcircumflex w.sc -15
+KPX Gcircumflex w.sc -15
+KPX Gcircumflex y.sc -20
KPX Gcircumflex y.sc -20
KPX Gcircumflex adieresis.sc -20
+KPX Gcircumflex adieresis.sc -20
+KPX Gcircumflex aring.sc -20
KPX Gcircumflex aring.sc -20
KPX Gcircumflex ae.sc -15
+KPX Gcircumflex ae.sc -15
+KPX Gcircumflex ydieresis.sc -20
KPX Gcircumflex ydieresis.sc -20
KPX Gcircumflex a.pc -20
KPX Gcircumflex t.pc -15
@@ -8380,24 +8660,6 @@ KPX Gcircumflex uni021B.pc -15
KPX Gcircumflex wgrave.pc -15
KPX Gcircumflex wacute.pc -15
KPX Gcircumflex wdieresis.pc -15
-KPX Gcircumflex a.sc -20
-KPX Gcircumflex t.sc -15
-KPX Gcircumflex v.sc -20
-KPX Gcircumflex w.sc -15
-KPX Gcircumflex y.sc -20
-KPX Gcircumflex adieresis.sc -20
-KPX Gcircumflex aring.sc -20
-KPX Gcircumflex ae.sc -15
-KPX Gcircumflex ydieresis.sc -20
-KPX Gcircumflex amacron.sc -20
-KPX Gcircumflex aogonek.sc -20
-KPX Gcircumflex tcaron.sc -15
-KPX Gcircumflex wcircumflex.sc -15
-KPX Gcircumflex ycircumflex.sc -20
-KPX Gcircumflex aeacute.sc -15
-KPX Gcircumflex wgrave.sc -15
-KPX Gcircumflex wacute.sc -15
-KPX Gcircumflex wdieresis.sc -15
KPX gcircumflex a -20
KPX gcircumflex e -25
KPX gcircumflex r 10
@@ -8437,23 +8699,41 @@ KPX Gbreve Wgrave -20
KPX Gbreve Wacute -20
KPX Gbreve Wdieresis -20
KPX Gbreve amacron.sc -20
+KPX Gbreve amacron.sc -20
+KPX Gbreve aogonek.sc -20
KPX Gbreve aogonek.sc -20
KPX Gbreve aeacute.sc -15
+KPX Gbreve aeacute.sc -15
+KPX Gbreve tcaron.sc -15
KPX Gbreve tcaron.sc -15
KPX Gbreve wacute.sc -15
+KPX Gbreve wacute.sc -15
+KPX Gbreve wcircumflex.sc -15
KPX Gbreve wcircumflex.sc -15
KPX Gbreve wdieresis.sc -15
+KPX Gbreve wdieresis.sc -15
+KPX Gbreve wgrave.sc -15
KPX Gbreve wgrave.sc -15
KPX Gbreve ycircumflex.sc -20
+KPX Gbreve ycircumflex.sc -20
+KPX Gbreve a.sc -20
KPX Gbreve a.sc -20
KPX Gbreve t.sc -15
+KPX Gbreve t.sc -15
KPX Gbreve v.sc -20
+KPX Gbreve v.sc -20
+KPX Gbreve w.sc -15
KPX Gbreve w.sc -15
KPX Gbreve y.sc -20
+KPX Gbreve y.sc -20
+KPX Gbreve adieresis.sc -20
KPX Gbreve adieresis.sc -20
KPX Gbreve aring.sc -20
+KPX Gbreve aring.sc -20
+KPX Gbreve ae.sc -15
KPX Gbreve ae.sc -15
KPX Gbreve ydieresis.sc -20
+KPX Gbreve ydieresis.sc -20
KPX Gbreve a.pc -20
KPX Gbreve t.pc -15
KPX Gbreve v.pc -20
@@ -8473,24 +8753,6 @@ KPX Gbreve uni021B.pc -15
KPX Gbreve wgrave.pc -15
KPX Gbreve wacute.pc -15
KPX Gbreve wdieresis.pc -15
-KPX Gbreve a.sc -20
-KPX Gbreve t.sc -15
-KPX Gbreve v.sc -20
-KPX Gbreve w.sc -15
-KPX Gbreve y.sc -20
-KPX Gbreve adieresis.sc -20
-KPX Gbreve aring.sc -20
-KPX Gbreve ae.sc -15
-KPX Gbreve ydieresis.sc -20
-KPX Gbreve amacron.sc -20
-KPX Gbreve aogonek.sc -20
-KPX Gbreve tcaron.sc -15
-KPX Gbreve wcircumflex.sc -15
-KPX Gbreve ycircumflex.sc -20
-KPX Gbreve aeacute.sc -15
-KPX Gbreve wgrave.sc -15
-KPX Gbreve wacute.sc -15
-KPX Gbreve wdieresis.sc -15
KPX gbreve a -20
KPX gbreve e -25
KPX gbreve r 10
@@ -8530,23 +8792,41 @@ KPX Gdotaccent Wgrave -20
KPX Gdotaccent Wacute -20
KPX Gdotaccent Wdieresis -20
KPX Gdotaccent amacron.sc -20
+KPX Gdotaccent amacron.sc -20
+KPX Gdotaccent aogonek.sc -20
KPX Gdotaccent aogonek.sc -20
KPX Gdotaccent aeacute.sc -15
+KPX Gdotaccent aeacute.sc -15
+KPX Gdotaccent tcaron.sc -15
KPX Gdotaccent tcaron.sc -15
KPX Gdotaccent wacute.sc -15
+KPX Gdotaccent wacute.sc -15
+KPX Gdotaccent wcircumflex.sc -15
KPX Gdotaccent wcircumflex.sc -15
KPX Gdotaccent wdieresis.sc -15
+KPX Gdotaccent wdieresis.sc -15
+KPX Gdotaccent wgrave.sc -15
KPX Gdotaccent wgrave.sc -15
KPX Gdotaccent ycircumflex.sc -20
+KPX Gdotaccent ycircumflex.sc -20
+KPX Gdotaccent a.sc -20
KPX Gdotaccent a.sc -20
KPX Gdotaccent t.sc -15
+KPX Gdotaccent t.sc -15
KPX Gdotaccent v.sc -20
+KPX Gdotaccent v.sc -20
+KPX Gdotaccent w.sc -15
KPX Gdotaccent w.sc -15
KPX Gdotaccent y.sc -20
+KPX Gdotaccent y.sc -20
+KPX Gdotaccent adieresis.sc -20
KPX Gdotaccent adieresis.sc -20
KPX Gdotaccent aring.sc -20
+KPX Gdotaccent aring.sc -20
+KPX Gdotaccent ae.sc -15
KPX Gdotaccent ae.sc -15
KPX Gdotaccent ydieresis.sc -20
+KPX Gdotaccent ydieresis.sc -20
KPX Gdotaccent a.pc -20
KPX Gdotaccent t.pc -15
KPX Gdotaccent v.pc -20
@@ -8566,24 +8846,6 @@ KPX Gdotaccent uni021B.pc -15
KPX Gdotaccent wgrave.pc -15
KPX Gdotaccent wacute.pc -15
KPX Gdotaccent wdieresis.pc -15
-KPX Gdotaccent a.sc -20
-KPX Gdotaccent t.sc -15
-KPX Gdotaccent v.sc -20
-KPX Gdotaccent w.sc -15
-KPX Gdotaccent y.sc -20
-KPX Gdotaccent adieresis.sc -20
-KPX Gdotaccent aring.sc -20
-KPX Gdotaccent ae.sc -15
-KPX Gdotaccent ydieresis.sc -20
-KPX Gdotaccent amacron.sc -20
-KPX Gdotaccent aogonek.sc -20
-KPX Gdotaccent tcaron.sc -15
-KPX Gdotaccent wcircumflex.sc -15
-KPX Gdotaccent ycircumflex.sc -20
-KPX Gdotaccent aeacute.sc -15
-KPX Gdotaccent wgrave.sc -15
-KPX Gdotaccent wacute.sc -15
-KPX Gdotaccent wdieresis.sc -15
KPX gdotaccent a -20
KPX gdotaccent e -25
KPX gdotaccent r 10
@@ -8623,22 +8885,40 @@ KPX Gcommaaccent Wgrave -20
KPX Gcommaaccent Wacute -20
KPX Gcommaaccent Wdieresis -20
KPX Gcommaaccent amacron.sc -20
+KPX Gcommaaccent amacron.sc -20
+KPX Gcommaaccent aogonek.sc -20
KPX Gcommaaccent aogonek.sc -20
KPX Gcommaaccent aeacute.sc -15
+KPX Gcommaaccent aeacute.sc -15
KPX Gcommaaccent tcaron.sc -15
+KPX Gcommaaccent tcaron.sc -15
+KPX Gcommaaccent wacute.sc -15
KPX Gcommaaccent wacute.sc -15
KPX Gcommaaccent wcircumflex.sc -15
+KPX Gcommaaccent wcircumflex.sc -15
+KPX Gcommaaccent wdieresis.sc -15
KPX Gcommaaccent wdieresis.sc -15
KPX Gcommaaccent wgrave.sc -15
+KPX Gcommaaccent wgrave.sc -15
+KPX Gcommaaccent ycircumflex.sc -20
KPX Gcommaaccent ycircumflex.sc -20
KPX Gcommaaccent a.sc -20
+KPX Gcommaaccent a.sc -20
+KPX Gcommaaccent t.sc -15
KPX Gcommaaccent t.sc -15
KPX Gcommaaccent v.sc -20
+KPX Gcommaaccent v.sc -20
KPX Gcommaaccent w.sc -15
+KPX Gcommaaccent w.sc -15
+KPX Gcommaaccent y.sc -20
KPX Gcommaaccent y.sc -20
KPX Gcommaaccent adieresis.sc -20
+KPX Gcommaaccent adieresis.sc -20
+KPX Gcommaaccent aring.sc -20
KPX Gcommaaccent aring.sc -20
KPX Gcommaaccent ae.sc -15
+KPX Gcommaaccent ae.sc -15
+KPX Gcommaaccent ydieresis.sc -20
KPX Gcommaaccent ydieresis.sc -20
KPX Gcommaaccent a.pc -20
KPX Gcommaaccent t.pc -15
@@ -8659,24 +8939,6 @@ KPX Gcommaaccent uni021B.pc -15
KPX Gcommaaccent wgrave.pc -15
KPX Gcommaaccent wacute.pc -15
KPX Gcommaaccent wdieresis.pc -15
-KPX Gcommaaccent a.sc -20
-KPX Gcommaaccent t.sc -15
-KPX Gcommaaccent v.sc -20
-KPX Gcommaaccent w.sc -15
-KPX Gcommaaccent y.sc -20
-KPX Gcommaaccent adieresis.sc -20
-KPX Gcommaaccent aring.sc -20
-KPX Gcommaaccent ae.sc -15
-KPX Gcommaaccent ydieresis.sc -20
-KPX Gcommaaccent amacron.sc -20
-KPX Gcommaaccent aogonek.sc -20
-KPX Gcommaaccent tcaron.sc -15
-KPX Gcommaaccent wcircumflex.sc -15
-KPX Gcommaaccent ycircumflex.sc -20
-KPX Gcommaaccent aeacute.sc -15
-KPX Gcommaaccent wgrave.sc -15
-KPX Gcommaaccent wacute.sc -15
-KPX Gcommaaccent wdieresis.sc -15
KPX gcommaaccent a -20
KPX gcommaaccent e -25
KPX gcommaaccent r 10
@@ -8729,11 +8991,18 @@ KPX Jcircumflex Amacron -55
KPX Jcircumflex Aogonek -55
KPX Jcircumflex AEacute -45
KPX Jcircumflex amacron.sc -45
+KPX Jcircumflex amacron.sc -45
+KPX Jcircumflex aogonek.sc -45
KPX Jcircumflex aogonek.sc -45
KPX Jcircumflex aeacute.sc -40
+KPX Jcircumflex aeacute.sc -40
KPX Jcircumflex a.sc -45
+KPX Jcircumflex a.sc -45
+KPX Jcircumflex adieresis.sc -45
KPX Jcircumflex adieresis.sc -45
KPX Jcircumflex aring.sc -45
+KPX Jcircumflex aring.sc -45
+KPX Jcircumflex ae.sc -40
KPX Jcircumflex ae.sc -40
KPX Jcircumflex a.pc -45
KPX Jcircumflex adieresis.pc -45
@@ -8742,13 +9011,6 @@ KPX Jcircumflex ae.pc -40
KPX Jcircumflex amacron.pc -45
KPX Jcircumflex aogonek.pc -45
KPX Jcircumflex aeacute.pc -40
-KPX Jcircumflex a.sc -45
-KPX Jcircumflex adieresis.sc -45
-KPX Jcircumflex aring.sc -45
-KPX Jcircumflex ae.sc -40
-KPX Jcircumflex amacron.sc -45
-KPX Jcircumflex aogonek.sc -45
-KPX Jcircumflex aeacute.sc -40
KPX Kcommaaccent hyphen -65
KPX Kcommaaccent C -45
KPX Kcommaaccent G -50
@@ -8797,26 +9059,47 @@ KPX Kcommaaccent Oogonek -50
KPX Kcommaaccent oogonek -30
KPX Kcommaaccent Gacute -50
KPX Kcommaaccent gacute.sc -40
+KPX Kcommaaccent gacute.sc -40
+KPX Kcommaaccent gcaron.sc -40
KPX Kcommaaccent gcaron.sc -40
KPX Kcommaaccent oe.sc -40
+KPX Kcommaaccent oe.sc -40
+KPX Kcommaaccent oogonek.sc -40
KPX Kcommaaccent oogonek.sc -40
KPX Kcommaaccent cacute.sc -40
+KPX Kcommaaccent cacute.sc -40
+KPX Kcommaaccent ccaron.sc -40
KPX Kcommaaccent ccaron.sc -40
KPX Kcommaaccent ccircumflex.sc -40
+KPX Kcommaaccent ccircumflex.sc -40
KPX Kcommaaccent cdotaccent.sc -40
+KPX Kcommaaccent cdotaccent.sc -40
+KPX Kcommaaccent gbreve.sc -40
KPX Kcommaaccent gbreve.sc -40
KPX Kcommaaccent gcircumflex.sc -40
+KPX Kcommaaccent gcircumflex.sc -40
+KPX Kcommaaccent gcommaaccent.sc -40
KPX Kcommaaccent gcommaaccent.sc -40
KPX Kcommaaccent gdotaccent.sc -40
+KPX Kcommaaccent gdotaccent.sc -40
+KPX Kcommaaccent obreve.sc -40
KPX Kcommaaccent obreve.sc -40
KPX Kcommaaccent ohungarumlaut.sc -40
+KPX Kcommaaccent ohungarumlaut.sc -40
+KPX Kcommaaccent omacron.sc -40
KPX Kcommaaccent omacron.sc -40
KPX Kcommaaccent c.sc -40
+KPX Kcommaaccent c.sc -40
KPX Kcommaaccent g.sc -40
+KPX Kcommaaccent g.sc -40
+KPX Kcommaaccent o.sc -40
KPX Kcommaaccent o.sc -40
KPX Kcommaaccent ccedilla.sc -40
+KPX Kcommaaccent ccedilla.sc -40
+KPX Kcommaaccent odieresis.sc -40
KPX Kcommaaccent odieresis.sc -40
KPX Kcommaaccent oslash.sc -40
+KPX Kcommaaccent oslash.sc -40
KPX Kcommaaccent c.pc -40
KPX Kcommaaccent g.pc -40
KPX Kcommaaccent o.pc -40
@@ -8838,27 +9121,6 @@ KPX Kcommaaccent oe.pc -40
KPX Kcommaaccent gcaron.pc -40
KPX Kcommaaccent oogonek.pc -40
KPX Kcommaaccent gacute.pc -40
-KPX Kcommaaccent c.sc -40
-KPX Kcommaaccent g.sc -40
-KPX Kcommaaccent o.sc -40
-KPX Kcommaaccent ccedilla.sc -40
-KPX Kcommaaccent odieresis.sc -40
-KPX Kcommaaccent oslash.sc -40
-KPX Kcommaaccent cacute.sc -40
-KPX Kcommaaccent ccircumflex.sc -40
-KPX Kcommaaccent cdotaccent.sc -40
-KPX Kcommaaccent ccaron.sc -40
-KPX Kcommaaccent gcircumflex.sc -40
-KPX Kcommaaccent gbreve.sc -40
-KPX Kcommaaccent gdotaccent.sc -40
-KPX Kcommaaccent gcommaaccent.sc -40
-KPX Kcommaaccent omacron.sc -40
-KPX Kcommaaccent obreve.sc -40
-KPX Kcommaaccent ohungarumlaut.sc -40
-KPX Kcommaaccent oe.sc -40
-KPX Kcommaaccent gcaron.sc -40
-KPX Kcommaaccent oogonek.sc -40
-KPX Kcommaaccent gacute.sc -40
KPX kcommaaccent hyphen -65
KPX kcommaaccent e -20
KPX kcommaaccent g -10
@@ -8916,24 +9178,43 @@ KPX Lacute Wdieresis -90
KPX Lacute quoteright -125
KPX Lacute quotedblright -100
KPX Lacute tcaron.sc -65
+KPX Lacute tcaron.sc -65
KPX Lacute ubreve.sc -20
+KPX Lacute ubreve.sc -20
+KPX Lacute uhungarumlaut.sc -20
KPX Lacute uhungarumlaut.sc -20
KPX Lacute umacron.sc -20
+KPX Lacute umacron.sc -20
+KPX Lacute uogonek.sc -20
KPX Lacute uogonek.sc -20
KPX Lacute uring.sc -20
+KPX Lacute uring.sc -20
+KPX Lacute wacute.sc -75
KPX Lacute wacute.sc -75
KPX Lacute wcircumflex.sc -75
+KPX Lacute wcircumflex.sc -75
+KPX Lacute wdieresis.sc -75
KPX Lacute wdieresis.sc -75
KPX Lacute wgrave.sc -75
+KPX Lacute wgrave.sc -75
KPX Lacute ycircumflex.sc -85
+KPX Lacute ycircumflex.sc -85
+KPX Lacute t.sc -65
KPX Lacute t.sc -65
KPX Lacute u.sc -20
+KPX Lacute u.sc -20
+KPX Lacute v.sc -95
KPX Lacute v.sc -95
KPX Lacute w.sc -75
+KPX Lacute w.sc -75
+KPX Lacute y.sc -85
KPX Lacute y.sc -85
KPX Lacute ucircumflex.sc -20
+KPX Lacute ucircumflex.sc -20
+KPX Lacute udieresis.sc -20
KPX Lacute udieresis.sc -20
KPX Lacute ydieresis.sc -85
+KPX Lacute ydieresis.sc -85
KPX Lacute t.pc -65
KPX Lacute u.pc -20
KPX Lacute v.pc -95
@@ -8954,25 +9235,6 @@ KPX Lacute uni021B.pc -65
KPX Lacute wgrave.pc -75
KPX Lacute wacute.pc -75
KPX Lacute wdieresis.pc -75
-KPX Lacute t.sc -65
-KPX Lacute u.sc -20
-KPX Lacute v.sc -95
-KPX Lacute w.sc -75
-KPX Lacute y.sc -85
-KPX Lacute ucircumflex.sc -20
-KPX Lacute udieresis.sc -20
-KPX Lacute ydieresis.sc -85
-KPX Lacute tcaron.sc -65
-KPX Lacute umacron.sc -20
-KPX Lacute ubreve.sc -20
-KPX Lacute uring.sc -20
-KPX Lacute uhungarumlaut.sc -20
-KPX Lacute uogonek.sc -20
-KPX Lacute wcircumflex.sc -75
-KPX Lacute ycircumflex.sc -85
-KPX Lacute wgrave.sc -75
-KPX Lacute wacute.sc -75
-KPX Lacute wdieresis.sc -75
KPX lacute v -30
KPX lacute y -25
KPX lacute ydieresis -25
@@ -9004,23 +9266,42 @@ KPX Lcommaaccent Wdieresis -90
KPX Lcommaaccent quoteright -125
KPX Lcommaaccent quotedblright -100
KPX Lcommaaccent tcaron.sc -65
+KPX Lcommaaccent tcaron.sc -65
KPX Lcommaaccent ubreve.sc -20
+KPX Lcommaaccent ubreve.sc -20
+KPX Lcommaaccent uhungarumlaut.sc -20
KPX Lcommaaccent uhungarumlaut.sc -20
KPX Lcommaaccent umacron.sc -20
+KPX Lcommaaccent umacron.sc -20
+KPX Lcommaaccent uogonek.sc -20
KPX Lcommaaccent uogonek.sc -20
KPX Lcommaaccent uring.sc -20
+KPX Lcommaaccent uring.sc -20
+KPX Lcommaaccent wacute.sc -75
KPX Lcommaaccent wacute.sc -75
KPX Lcommaaccent wcircumflex.sc -75
+KPX Lcommaaccent wcircumflex.sc -75
KPX Lcommaaccent wdieresis.sc -75
+KPX Lcommaaccent wdieresis.sc -75
+KPX Lcommaaccent wgrave.sc -75
KPX Lcommaaccent wgrave.sc -75
KPX Lcommaaccent ycircumflex.sc -85
+KPX Lcommaaccent ycircumflex.sc -85
+KPX Lcommaaccent t.sc -65
KPX Lcommaaccent t.sc -65
KPX Lcommaaccent u.sc -20
+KPX Lcommaaccent u.sc -20
KPX Lcommaaccent v.sc -95
+KPX Lcommaaccent v.sc -95
+KPX Lcommaaccent w.sc -75
KPX Lcommaaccent w.sc -75
KPX Lcommaaccent y.sc -85
+KPX Lcommaaccent y.sc -85
+KPX Lcommaaccent ucircumflex.sc -20
KPX Lcommaaccent ucircumflex.sc -20
KPX Lcommaaccent udieresis.sc -20
+KPX Lcommaaccent udieresis.sc -20
+KPX Lcommaaccent ydieresis.sc -85
KPX Lcommaaccent ydieresis.sc -85
KPX Lcommaaccent t.pc -65
KPX Lcommaaccent u.pc -20
@@ -9042,25 +9323,6 @@ KPX Lcommaaccent uni021B.pc -65
KPX Lcommaaccent wgrave.pc -75
KPX Lcommaaccent wacute.pc -75
KPX Lcommaaccent wdieresis.pc -75
-KPX Lcommaaccent t.sc -65
-KPX Lcommaaccent u.sc -20
-KPX Lcommaaccent v.sc -95
-KPX Lcommaaccent w.sc -75
-KPX Lcommaaccent y.sc -85
-KPX Lcommaaccent ucircumflex.sc -20
-KPX Lcommaaccent udieresis.sc -20
-KPX Lcommaaccent ydieresis.sc -85
-KPX Lcommaaccent tcaron.sc -65
-KPX Lcommaaccent umacron.sc -20
-KPX Lcommaaccent ubreve.sc -20
-KPX Lcommaaccent uring.sc -20
-KPX Lcommaaccent uhungarumlaut.sc -20
-KPX Lcommaaccent uogonek.sc -20
-KPX Lcommaaccent wcircumflex.sc -75
-KPX Lcommaaccent ycircumflex.sc -85
-KPX Lcommaaccent wgrave.sc -75
-KPX Lcommaaccent wacute.sc -75
-KPX Lcommaaccent wdieresis.sc -75
KPX lcommaaccent v -30
KPX lcommaaccent y -25
KPX lcommaaccent ydieresis -25
@@ -9107,39 +9369,73 @@ KPX Lcaron Ytilde -50
KPX Lcaron quoteright -125
KPX Lcaron quotedblright -100
KPX Lcaron udotbelow.sc -10
+KPX Lcaron udotbelow.sc -10
+KPX Lcaron uhookabove.sc -10
KPX Lcaron uhookabove.sc -10
KPX Lcaron uhornacute.sc -10
+KPX Lcaron uhornacute.sc -10
+KPX Lcaron uhorndotbelow.sc -10
KPX Lcaron uhorndotbelow.sc -10
KPX Lcaron uhorngrave.sc -10
+KPX Lcaron uhorngrave.sc -10
+KPX Lcaron uhornhookabove.sc -10
KPX Lcaron uhornhookabove.sc -10
KPX Lcaron uhorntilde.sc -10
+KPX Lcaron uhorntilde.sc -10
KPX Lcaron ydotbelow.sc -40
+KPX Lcaron ydotbelow.sc -40
+KPX Lcaron yhookabove.sc -40
KPX Lcaron yhookabove.sc -40
KPX Lcaron ytilde.sc -40
+KPX Lcaron ytilde.sc -40
+KPX Lcaron tcaron.sc -30
KPX Lcaron tcaron.sc -30
KPX Lcaron ubreve.sc -10
+KPX Lcaron ubreve.sc -10
+KPX Lcaron uhungarumlaut.sc -10
KPX Lcaron uhungarumlaut.sc -10
KPX Lcaron umacron.sc -10
+KPX Lcaron umacron.sc -10
+KPX Lcaron uogonek.sc -10
KPX Lcaron uogonek.sc -10
KPX Lcaron uring.sc -10
+KPX Lcaron uring.sc -10
KPX Lcaron utilde.sc -10
+KPX Lcaron utilde.sc -10
+KPX Lcaron wacute.sc -40
KPX Lcaron wacute.sc -40
KPX Lcaron wcircumflex.sc -40
+KPX Lcaron wcircumflex.sc -40
+KPX Lcaron wdieresis.sc -40
KPX Lcaron wdieresis.sc -40
KPX Lcaron wgrave.sc -40
+KPX Lcaron wgrave.sc -40
+KPX Lcaron ycircumflex.sc -40
KPX Lcaron ycircumflex.sc -40
KPX Lcaron ygrave.sc -40
+KPX Lcaron ygrave.sc -40
+KPX Lcaron t.sc -30
KPX Lcaron t.sc -30
KPX Lcaron u.sc -10
+KPX Lcaron u.sc -10
KPX Lcaron v.sc -50
+KPX Lcaron v.sc -50
+KPX Lcaron w.sc -40
KPX Lcaron w.sc -40
KPX Lcaron y.sc -40
+KPX Lcaron y.sc -40
+KPX Lcaron ugrave.sc -10
KPX Lcaron ugrave.sc -10
KPX Lcaron uacute.sc -10
+KPX Lcaron uacute.sc -10
+KPX Lcaron ucircumflex.sc -10
KPX Lcaron ucircumflex.sc -10
KPX Lcaron udieresis.sc -10
+KPX Lcaron udieresis.sc -10
+KPX Lcaron yacute.sc -40
KPX Lcaron yacute.sc -40
KPX Lcaron ydieresis.sc -40
+KPX Lcaron ydieresis.sc -40
KPX Lcaron t.pc -30
KPX Lcaron u.pc -10
KPX Lcaron v.pc -50
@@ -9175,40 +9471,6 @@ KPX Lcaron ygrave.pc -40
KPX Lcaron ydotbelow.pc -40
KPX Lcaron yhookabove.pc -40
KPX Lcaron ytilde.pc -40
-KPX Lcaron t.sc -30
-KPX Lcaron u.sc -10
-KPX Lcaron v.sc -50
-KPX Lcaron w.sc -40
-KPX Lcaron y.sc -40
-KPX Lcaron ugrave.sc -10
-KPX Lcaron uacute.sc -10
-KPX Lcaron ucircumflex.sc -10
-KPX Lcaron udieresis.sc -10
-KPX Lcaron yacute.sc -40
-KPX Lcaron ydieresis.sc -40
-KPX Lcaron tcaron.sc -30
-KPX Lcaron utilde.sc -10
-KPX Lcaron umacron.sc -10
-KPX Lcaron ubreve.sc -10
-KPX Lcaron uring.sc -10
-KPX Lcaron uhungarumlaut.sc -10
-KPX Lcaron uogonek.sc -10
-KPX Lcaron wcircumflex.sc -40
-KPX Lcaron ycircumflex.sc -40
-KPX Lcaron wgrave.sc -40
-KPX Lcaron wacute.sc -40
-KPX Lcaron wdieresis.sc -40
-KPX Lcaron udotbelow.sc -10
-KPX Lcaron uhookabove.sc -10
-KPX Lcaron uhornacute.sc -10
-KPX Lcaron uhorngrave.sc -10
-KPX Lcaron uhornhookabove.sc -10
-KPX Lcaron uhorntilde.sc -10
-KPX Lcaron uhorndotbelow.sc -10
-KPX Lcaron ygrave.sc -40
-KPX Lcaron ydotbelow.sc -40
-KPX Lcaron yhookabove.sc -40
-KPX Lcaron ytilde.sc -40
KPX lcaron backslash 40
KPX lcaron b 35
KPX lcaron h 35
@@ -9270,24 +9532,43 @@ KPX Lslash Ytilde -80
KPX Lslash quoteright -125
KPX Lslash quotedblright -100
KPX Lslash tcaron.sc -65
+KPX Lslash tcaron.sc -65
+KPX Lslash ubreve.sc -20
KPX Lslash ubreve.sc -20
KPX Lslash uhungarumlaut.sc -20
+KPX Lslash uhungarumlaut.sc -20
KPX Lslash umacron.sc -20
+KPX Lslash umacron.sc -20
+KPX Lslash uogonek.sc -20
KPX Lslash uogonek.sc -20
KPX Lslash uring.sc -20
+KPX Lslash uring.sc -20
+KPX Lslash wacute.sc -75
KPX Lslash wacute.sc -75
KPX Lslash wcircumflex.sc -75
+KPX Lslash wcircumflex.sc -75
+KPX Lslash wdieresis.sc -75
KPX Lslash wdieresis.sc -75
KPX Lslash wgrave.sc -75
+KPX Lslash wgrave.sc -75
+KPX Lslash ycircumflex.sc -85
KPX Lslash ycircumflex.sc -85
KPX Lslash t.sc -65
+KPX Lslash t.sc -65
KPX Lslash u.sc -20
+KPX Lslash u.sc -20
+KPX Lslash v.sc -95
KPX Lslash v.sc -95
KPX Lslash w.sc -75
+KPX Lslash w.sc -75
+KPX Lslash y.sc -85
KPX Lslash y.sc -85
KPX Lslash ucircumflex.sc -20
+KPX Lslash ucircumflex.sc -20
+KPX Lslash udieresis.sc -20
KPX Lslash udieresis.sc -20
KPX Lslash ydieresis.sc -85
+KPX Lslash ydieresis.sc -85
KPX Lslash t.pc -65
KPX Lslash u.pc -20
KPX Lslash v.pc -95
@@ -9308,25 +9589,6 @@ KPX Lslash uni021B.pc -65
KPX Lslash wgrave.pc -75
KPX Lslash wacute.pc -75
KPX Lslash wdieresis.pc -75
-KPX Lslash t.sc -65
-KPX Lslash u.sc -20
-KPX Lslash v.sc -95
-KPX Lslash w.sc -75
-KPX Lslash y.sc -85
-KPX Lslash ucircumflex.sc -20
-KPX Lslash udieresis.sc -20
-KPX Lslash ydieresis.sc -85
-KPX Lslash tcaron.sc -65
-KPX Lslash umacron.sc -20
-KPX Lslash ubreve.sc -20
-KPX Lslash uring.sc -20
-KPX Lslash uhungarumlaut.sc -20
-KPX Lslash uogonek.sc -20
-KPX Lslash wcircumflex.sc -75
-KPX Lslash ycircumflex.sc -85
-KPX Lslash wgrave.sc -75
-KPX Lslash wacute.sc -75
-KPX Lslash wdieresis.sc -75
KPX lslash v -30
KPX lslash y -25
KPX lslash ydieresis -25
@@ -9390,32 +9652,59 @@ KPX Nacute Gacute -20
KPX Nacute AEacute -20
KPX Nacute aeacute -25
KPX Nacute gacute.sc -15
+KPX Nacute gacute.sc -15
KPX Nacute gcaron.sc -15
+KPX Nacute gcaron.sc -15
+KPX Nacute oogonek.sc -15
KPX Nacute oogonek.sc -15
KPX Nacute amacron.sc -25
+KPX Nacute amacron.sc -25
+KPX Nacute aogonek.sc -25
KPX Nacute aogonek.sc -25
KPX Nacute aeacute.sc -15
+KPX Nacute aeacute.sc -15
+KPX Nacute cacute.sc -15
KPX Nacute cacute.sc -15
KPX Nacute ccaron.sc -15
+KPX Nacute ccaron.sc -15
+KPX Nacute ccircumflex.sc -15
KPX Nacute ccircumflex.sc -15
KPX Nacute cdotaccent.sc -15
+KPX Nacute cdotaccent.sc -15
KPX Nacute gbreve.sc -15
+KPX Nacute gbreve.sc -15
+KPX Nacute gcircumflex.sc -15
KPX Nacute gcircumflex.sc -15
KPX Nacute gcommaaccent.sc -15
+KPX Nacute gcommaaccent.sc -15
+KPX Nacute gdotaccent.sc -15
KPX Nacute gdotaccent.sc -15
KPX Nacute obreve.sc -15
+KPX Nacute obreve.sc -15
KPX Nacute ohungarumlaut.sc -15
+KPX Nacute ohungarumlaut.sc -15
+KPX Nacute omacron.sc -15
KPX Nacute omacron.sc -15
KPX Nacute a.sc -25
+KPX Nacute a.sc -25
+KPX Nacute c.sc -15
KPX Nacute c.sc -15
KPX Nacute g.sc -15
+KPX Nacute g.sc -15
KPX Nacute o.sc -15
+KPX Nacute o.sc -15
+KPX Nacute adieresis.sc -25
KPX Nacute adieresis.sc -25
KPX Nacute aring.sc -25
+KPX Nacute aring.sc -25
+KPX Nacute ae.sc -15
KPX Nacute ae.sc -15
KPX Nacute ccedilla.sc -15
+KPX Nacute ccedilla.sc -15
+KPX Nacute odieresis.sc -15
KPX Nacute odieresis.sc -15
KPX Nacute oslash.sc -15
+KPX Nacute oslash.sc -15
KPX Nacute a.pc -25
KPX Nacute c.pc -15
KPX Nacute g.pc -15
@@ -9443,33 +9732,6 @@ KPX Nacute gcaron.pc -15
KPX Nacute oogonek.pc -15
KPX Nacute gacute.pc -15
KPX Nacute aeacute.pc -15
-KPX Nacute a.sc -25
-KPX Nacute c.sc -15
-KPX Nacute g.sc -15
-KPX Nacute o.sc -15
-KPX Nacute adieresis.sc -25
-KPX Nacute aring.sc -25
-KPX Nacute ae.sc -15
-KPX Nacute ccedilla.sc -15
-KPX Nacute odieresis.sc -15
-KPX Nacute oslash.sc -15
-KPX Nacute amacron.sc -25
-KPX Nacute aogonek.sc -25
-KPX Nacute cacute.sc -15
-KPX Nacute ccircumflex.sc -15
-KPX Nacute cdotaccent.sc -15
-KPX Nacute ccaron.sc -15
-KPX Nacute gcircumflex.sc -15
-KPX Nacute gbreve.sc -15
-KPX Nacute gdotaccent.sc -15
-KPX Nacute gcommaaccent.sc -15
-KPX Nacute omacron.sc -15
-KPX Nacute obreve.sc -15
-KPX Nacute ohungarumlaut.sc -15
-KPX Nacute gcaron.sc -15
-KPX Nacute oogonek.sc -15
-KPX Nacute gacute.sc -15
-KPX Nacute aeacute.sc -15
KPX nacute T -55
KPX nacute p -15
KPX nacute v -30
@@ -9543,32 +9805,59 @@ KPX Ncommaaccent Gacute -20
KPX Ncommaaccent AEacute -20
KPX Ncommaaccent aeacute -25
KPX Ncommaaccent gacute.sc -15
+KPX Ncommaaccent gacute.sc -15
+KPX Ncommaaccent gcaron.sc -15
KPX Ncommaaccent gcaron.sc -15
KPX Ncommaaccent oogonek.sc -15
+KPX Ncommaaccent oogonek.sc -15
+KPX Ncommaaccent amacron.sc -25
KPX Ncommaaccent amacron.sc -25
KPX Ncommaaccent aogonek.sc -25
+KPX Ncommaaccent aogonek.sc -25
+KPX Ncommaaccent aeacute.sc -15
KPX Ncommaaccent aeacute.sc -15
KPX Ncommaaccent cacute.sc -15
+KPX Ncommaaccent cacute.sc -15
+KPX Ncommaaccent ccaron.sc -15
KPX Ncommaaccent ccaron.sc -15
KPX Ncommaaccent ccircumflex.sc -15
+KPX Ncommaaccent ccircumflex.sc -15
+KPX Ncommaaccent cdotaccent.sc -15
KPX Ncommaaccent cdotaccent.sc -15
KPX Ncommaaccent gbreve.sc -15
+KPX Ncommaaccent gbreve.sc -15
KPX Ncommaaccent gcircumflex.sc -15
+KPX Ncommaaccent gcircumflex.sc -15
+KPX Ncommaaccent gcommaaccent.sc -15
KPX Ncommaaccent gcommaaccent.sc -15
KPX Ncommaaccent gdotaccent.sc -15
+KPX Ncommaaccent gdotaccent.sc -15
+KPX Ncommaaccent obreve.sc -15
KPX Ncommaaccent obreve.sc -15
KPX Ncommaaccent ohungarumlaut.sc -15
+KPX Ncommaaccent ohungarumlaut.sc -15
+KPX Ncommaaccent omacron.sc -15
KPX Ncommaaccent omacron.sc -15
KPX Ncommaaccent a.sc -25
+KPX Ncommaaccent a.sc -25
+KPX Ncommaaccent c.sc -15
KPX Ncommaaccent c.sc -15
KPX Ncommaaccent g.sc -15
+KPX Ncommaaccent g.sc -15
KPX Ncommaaccent o.sc -15
+KPX Ncommaaccent o.sc -15
+KPX Ncommaaccent adieresis.sc -25
KPX Ncommaaccent adieresis.sc -25
KPX Ncommaaccent aring.sc -25
+KPX Ncommaaccent aring.sc -25
+KPX Ncommaaccent ae.sc -15
KPX Ncommaaccent ae.sc -15
KPX Ncommaaccent ccedilla.sc -15
+KPX Ncommaaccent ccedilla.sc -15
+KPX Ncommaaccent odieresis.sc -15
KPX Ncommaaccent odieresis.sc -15
KPX Ncommaaccent oslash.sc -15
+KPX Ncommaaccent oslash.sc -15
KPX Ncommaaccent a.pc -25
KPX Ncommaaccent c.pc -15
KPX Ncommaaccent g.pc -15
@@ -9596,33 +9885,6 @@ KPX Ncommaaccent gcaron.pc -15
KPX Ncommaaccent oogonek.pc -15
KPX Ncommaaccent gacute.pc -15
KPX Ncommaaccent aeacute.pc -15
-KPX Ncommaaccent a.sc -25
-KPX Ncommaaccent c.sc -15
-KPX Ncommaaccent g.sc -15
-KPX Ncommaaccent o.sc -15
-KPX Ncommaaccent adieresis.sc -25
-KPX Ncommaaccent aring.sc -25
-KPX Ncommaaccent ae.sc -15
-KPX Ncommaaccent ccedilla.sc -15
-KPX Ncommaaccent odieresis.sc -15
-KPX Ncommaaccent oslash.sc -15
-KPX Ncommaaccent amacron.sc -25
-KPX Ncommaaccent aogonek.sc -25
-KPX Ncommaaccent cacute.sc -15
-KPX Ncommaaccent ccircumflex.sc -15
-KPX Ncommaaccent cdotaccent.sc -15
-KPX Ncommaaccent ccaron.sc -15
-KPX Ncommaaccent gcircumflex.sc -15
-KPX Ncommaaccent gbreve.sc -15
-KPX Ncommaaccent gdotaccent.sc -15
-KPX Ncommaaccent gcommaaccent.sc -15
-KPX Ncommaaccent omacron.sc -15
-KPX Ncommaaccent obreve.sc -15
-KPX Ncommaaccent ohungarumlaut.sc -15
-KPX Ncommaaccent gcaron.sc -15
-KPX Ncommaaccent oogonek.sc -15
-KPX Ncommaaccent gacute.sc -15
-KPX Ncommaaccent aeacute.sc -15
KPX ncommaaccent T -55
KPX ncommaaccent p -15
KPX ncommaaccent v -30
@@ -9696,32 +9958,59 @@ KPX Ncaron Gacute -20
KPX Ncaron AEacute -20
KPX Ncaron aeacute -25
KPX Ncaron gacute.sc -15
+KPX Ncaron gacute.sc -15
+KPX Ncaron gcaron.sc -15
KPX Ncaron gcaron.sc -15
KPX Ncaron oogonek.sc -15
+KPX Ncaron oogonek.sc -15
+KPX Ncaron amacron.sc -25
KPX Ncaron amacron.sc -25
KPX Ncaron aogonek.sc -25
+KPX Ncaron aogonek.sc -25
+KPX Ncaron aeacute.sc -15
KPX Ncaron aeacute.sc -15
KPX Ncaron cacute.sc -15
+KPX Ncaron cacute.sc -15
+KPX Ncaron ccaron.sc -15
KPX Ncaron ccaron.sc -15
KPX Ncaron ccircumflex.sc -15
+KPX Ncaron ccircumflex.sc -15
+KPX Ncaron cdotaccent.sc -15
KPX Ncaron cdotaccent.sc -15
KPX Ncaron gbreve.sc -15
+KPX Ncaron gbreve.sc -15
KPX Ncaron gcircumflex.sc -15
+KPX Ncaron gcircumflex.sc -15
+KPX Ncaron gcommaaccent.sc -15
KPX Ncaron gcommaaccent.sc -15
KPX Ncaron gdotaccent.sc -15
+KPX Ncaron gdotaccent.sc -15
+KPX Ncaron obreve.sc -15
KPX Ncaron obreve.sc -15
KPX Ncaron ohungarumlaut.sc -15
+KPX Ncaron ohungarumlaut.sc -15
+KPX Ncaron omacron.sc -15
KPX Ncaron omacron.sc -15
KPX Ncaron a.sc -25
+KPX Ncaron a.sc -25
+KPX Ncaron c.sc -15
KPX Ncaron c.sc -15
KPX Ncaron g.sc -15
+KPX Ncaron g.sc -15
KPX Ncaron o.sc -15
+KPX Ncaron o.sc -15
+KPX Ncaron adieresis.sc -25
KPX Ncaron adieresis.sc -25
KPX Ncaron aring.sc -25
+KPX Ncaron aring.sc -25
+KPX Ncaron ae.sc -15
KPX Ncaron ae.sc -15
KPX Ncaron ccedilla.sc -15
+KPX Ncaron ccedilla.sc -15
+KPX Ncaron odieresis.sc -15
KPX Ncaron odieresis.sc -15
KPX Ncaron oslash.sc -15
+KPX Ncaron oslash.sc -15
KPX Ncaron a.pc -25
KPX Ncaron c.pc -15
KPX Ncaron g.pc -15
@@ -9749,33 +10038,6 @@ KPX Ncaron gcaron.pc -15
KPX Ncaron oogonek.pc -15
KPX Ncaron gacute.pc -15
KPX Ncaron aeacute.pc -15
-KPX Ncaron a.sc -25
-KPX Ncaron c.sc -15
-KPX Ncaron g.sc -15
-KPX Ncaron o.sc -15
-KPX Ncaron adieresis.sc -25
-KPX Ncaron aring.sc -25
-KPX Ncaron ae.sc -15
-KPX Ncaron ccedilla.sc -15
-KPX Ncaron odieresis.sc -15
-KPX Ncaron oslash.sc -15
-KPX Ncaron amacron.sc -25
-KPX Ncaron aogonek.sc -25
-KPX Ncaron cacute.sc -15
-KPX Ncaron ccircumflex.sc -15
-KPX Ncaron cdotaccent.sc -15
-KPX Ncaron ccaron.sc -15
-KPX Ncaron gcircumflex.sc -15
-KPX Ncaron gbreve.sc -15
-KPX Ncaron gdotaccent.sc -15
-KPX Ncaron gcommaaccent.sc -15
-KPX Ncaron omacron.sc -15
-KPX Ncaron obreve.sc -15
-KPX Ncaron ohungarumlaut.sc -15
-KPX Ncaron gcaron.sc -15
-KPX Ncaron oogonek.sc -15
-KPX Ncaron gacute.sc -15
-KPX Ncaron aeacute.sc -15
KPX ncaron T -55
KPX ncaron p -15
KPX ncaron v -30
@@ -9808,22 +10070,39 @@ KPX Omacron Wgrave -55
KPX Omacron Wacute -55
KPX Omacron Wdieresis -55
KPX Omacron amacron.sc -50
+KPX Omacron amacron.sc -50
+KPX Omacron aogonek.sc -50
KPX Omacron aogonek.sc -50
KPX Omacron aeacute.sc -40
+KPX Omacron aeacute.sc -40
KPX Omacron wacute.sc -45
+KPX Omacron wacute.sc -45
+KPX Omacron wcircumflex.sc -45
KPX Omacron wcircumflex.sc -45
KPX Omacron wdieresis.sc -45
+KPX Omacron wdieresis.sc -45
+KPX Omacron wgrave.sc -45
KPX Omacron wgrave.sc -45
KPX Omacron ycircumflex.sc -60
+KPX Omacron ycircumflex.sc -60
+KPX Omacron a.sc -50
KPX Omacron a.sc -50
KPX Omacron v.sc -60
+KPX Omacron v.sc -60
+KPX Omacron w.sc -45
KPX Omacron w.sc -45
KPX Omacron x.sc -45
+KPX Omacron x.sc -45
KPX Omacron y.sc -60
+KPX Omacron y.sc -60
+KPX Omacron adieresis.sc -50
KPX Omacron adieresis.sc -50
KPX Omacron aring.sc -50
+KPX Omacron aring.sc -50
+KPX Omacron ae.sc -40
KPX Omacron ae.sc -40
KPX Omacron ydieresis.sc -60
+KPX Omacron ydieresis.sc -60
KPX Omacron a.pc -50
KPX Omacron v.pc -60
KPX Omacron w.pc -45
@@ -9841,23 +10120,6 @@ KPX Omacron aeacute.pc -40
KPX Omacron wgrave.pc -45
KPX Omacron wacute.pc -45
KPX Omacron wdieresis.pc -45
-KPX Omacron a.sc -50
-KPX Omacron v.sc -60
-KPX Omacron w.sc -45
-KPX Omacron x.sc -45
-KPX Omacron y.sc -60
-KPX Omacron adieresis.sc -50
-KPX Omacron aring.sc -50
-KPX Omacron ae.sc -40
-KPX Omacron ydieresis.sc -60
-KPX Omacron amacron.sc -50
-KPX Omacron aogonek.sc -50
-KPX Omacron wcircumflex.sc -45
-KPX Omacron ycircumflex.sc -60
-KPX Omacron aeacute.sc -40
-KPX Omacron wgrave.sc -45
-KPX Omacron wacute.sc -45
-KPX Omacron wdieresis.sc -45
KPX omacron T -90
KPX omacron v -35
KPX omacron w -35
@@ -9890,22 +10152,39 @@ KPX Obreve Wgrave -55
KPX Obreve Wacute -55
KPX Obreve Wdieresis -55
KPX Obreve amacron.sc -50
+KPX Obreve amacron.sc -50
+KPX Obreve aogonek.sc -50
KPX Obreve aogonek.sc -50
KPX Obreve aeacute.sc -40
+KPX Obreve aeacute.sc -40
+KPX Obreve wacute.sc -45
KPX Obreve wacute.sc -45
KPX Obreve wcircumflex.sc -45
+KPX Obreve wcircumflex.sc -45
KPX Obreve wdieresis.sc -45
+KPX Obreve wdieresis.sc -45
+KPX Obreve wgrave.sc -45
KPX Obreve wgrave.sc -45
KPX Obreve ycircumflex.sc -60
+KPX Obreve ycircumflex.sc -60
+KPX Obreve a.sc -50
KPX Obreve a.sc -50
KPX Obreve v.sc -60
+KPX Obreve v.sc -60
+KPX Obreve w.sc -45
KPX Obreve w.sc -45
KPX Obreve x.sc -45
+KPX Obreve x.sc -45
+KPX Obreve y.sc -60
KPX Obreve y.sc -60
KPX Obreve adieresis.sc -50
+KPX Obreve adieresis.sc -50
KPX Obreve aring.sc -50
+KPX Obreve aring.sc -50
+KPX Obreve ae.sc -40
KPX Obreve ae.sc -40
KPX Obreve ydieresis.sc -60
+KPX Obreve ydieresis.sc -60
KPX Obreve a.pc -50
KPX Obreve v.pc -60
KPX Obreve w.pc -45
@@ -9923,23 +10202,6 @@ KPX Obreve aeacute.pc -40
KPX Obreve wgrave.pc -45
KPX Obreve wacute.pc -45
KPX Obreve wdieresis.pc -45
-KPX Obreve a.sc -50
-KPX Obreve v.sc -60
-KPX Obreve w.sc -45
-KPX Obreve x.sc -45
-KPX Obreve y.sc -60
-KPX Obreve adieresis.sc -50
-KPX Obreve aring.sc -50
-KPX Obreve ae.sc -40
-KPX Obreve ydieresis.sc -60
-KPX Obreve amacron.sc -50
-KPX Obreve aogonek.sc -50
-KPX Obreve wcircumflex.sc -45
-KPX Obreve ycircumflex.sc -60
-KPX Obreve aeacute.sc -40
-KPX Obreve wgrave.sc -45
-KPX Obreve wacute.sc -45
-KPX Obreve wdieresis.sc -45
KPX obreve T -90
KPX obreve v -35
KPX obreve w -35
@@ -9972,22 +10234,39 @@ KPX Ohungarumlaut Wgrave -55
KPX Ohungarumlaut Wacute -55
KPX Ohungarumlaut Wdieresis -55
KPX Ohungarumlaut amacron.sc -50
+KPX Ohungarumlaut amacron.sc -50
+KPX Ohungarumlaut aogonek.sc -50
KPX Ohungarumlaut aogonek.sc -50
KPX Ohungarumlaut aeacute.sc -40
+KPX Ohungarumlaut aeacute.sc -40
KPX Ohungarumlaut wacute.sc -45
+KPX Ohungarumlaut wacute.sc -45
+KPX Ohungarumlaut wcircumflex.sc -45
KPX Ohungarumlaut wcircumflex.sc -45
KPX Ohungarumlaut wdieresis.sc -45
+KPX Ohungarumlaut wdieresis.sc -45
+KPX Ohungarumlaut wgrave.sc -45
KPX Ohungarumlaut wgrave.sc -45
KPX Ohungarumlaut ycircumflex.sc -60
+KPX Ohungarumlaut ycircumflex.sc -60
KPX Ohungarumlaut a.sc -50
+KPX Ohungarumlaut a.sc -50
+KPX Ohungarumlaut v.sc -60
KPX Ohungarumlaut v.sc -60
KPX Ohungarumlaut w.sc -45
+KPX Ohungarumlaut w.sc -45
+KPX Ohungarumlaut x.sc -45
KPX Ohungarumlaut x.sc -45
KPX Ohungarumlaut y.sc -60
+KPX Ohungarumlaut y.sc -60
+KPX Ohungarumlaut adieresis.sc -50
KPX Ohungarumlaut adieresis.sc -50
KPX Ohungarumlaut aring.sc -50
+KPX Ohungarumlaut aring.sc -50
+KPX Ohungarumlaut ae.sc -40
KPX Ohungarumlaut ae.sc -40
KPX Ohungarumlaut ydieresis.sc -60
+KPX Ohungarumlaut ydieresis.sc -60
KPX Ohungarumlaut a.pc -50
KPX Ohungarumlaut v.pc -60
KPX Ohungarumlaut w.pc -45
@@ -10005,23 +10284,6 @@ KPX Ohungarumlaut aeacute.pc -40
KPX Ohungarumlaut wgrave.pc -45
KPX Ohungarumlaut wacute.pc -45
KPX Ohungarumlaut wdieresis.pc -45
-KPX Ohungarumlaut a.sc -50
-KPX Ohungarumlaut v.sc -60
-KPX Ohungarumlaut w.sc -45
-KPX Ohungarumlaut x.sc -45
-KPX Ohungarumlaut y.sc -60
-KPX Ohungarumlaut adieresis.sc -50
-KPX Ohungarumlaut aring.sc -50
-KPX Ohungarumlaut ae.sc -40
-KPX Ohungarumlaut ydieresis.sc -60
-KPX Ohungarumlaut amacron.sc -50
-KPX Ohungarumlaut aogonek.sc -50
-KPX Ohungarumlaut wcircumflex.sc -45
-KPX Ohungarumlaut ycircumflex.sc -60
-KPX Ohungarumlaut aeacute.sc -40
-KPX Ohungarumlaut wgrave.sc -45
-KPX Ohungarumlaut wacute.sc -45
-KPX Ohungarumlaut wdieresis.sc -45
KPX ohungarumlaut T -90
KPX ohungarumlaut v -35
KPX ohungarumlaut w -35
@@ -10105,45 +10367,85 @@ KPX Racute Wgrave -70
KPX Racute Wacute -70
KPX Racute Wdieresis -70
KPX Racute gacute.sc -40
+KPX Racute gacute.sc -40
KPX Racute gcaron.sc -40
+KPX Racute gcaron.sc -40
+KPX Racute oe.sc -35
KPX Racute oe.sc -35
KPX Racute oogonek.sc -40
+KPX Racute oogonek.sc -40
+KPX Racute cacute.sc -35
KPX Racute cacute.sc -35
KPX Racute ccaron.sc -35
+KPX Racute ccaron.sc -35
+KPX Racute ccircumflex.sc -35
KPX Racute ccircumflex.sc -35
KPX Racute cdotaccent.sc -35
+KPX Racute cdotaccent.sc -35
+KPX Racute gbreve.sc -40
KPX Racute gbreve.sc -40
KPX Racute gcircumflex.sc -40
+KPX Racute gcircumflex.sc -40
KPX Racute gcommaaccent.sc -40
+KPX Racute gcommaaccent.sc -40
+KPX Racute gdotaccent.sc -40
KPX Racute gdotaccent.sc -40
KPX Racute obreve.sc -40
+KPX Racute obreve.sc -40
+KPX Racute ohungarumlaut.sc -40
KPX Racute ohungarumlaut.sc -40
KPX Racute omacron.sc -40
+KPX Racute omacron.sc -40
+KPX Racute tcaron.sc -30
KPX Racute tcaron.sc -30
KPX Racute ubreve.sc -45
+KPX Racute ubreve.sc -45
+KPX Racute uhungarumlaut.sc -45
KPX Racute uhungarumlaut.sc -45
KPX Racute umacron.sc -45
+KPX Racute umacron.sc -45
KPX Racute uogonek.sc -45
+KPX Racute uogonek.sc -45
+KPX Racute uring.sc -45
KPX Racute uring.sc -45
KPX Racute wacute.sc -60
+KPX Racute wacute.sc -60
+KPX Racute wcircumflex.sc -60
KPX Racute wcircumflex.sc -60
KPX Racute wdieresis.sc -60
+KPX Racute wdieresis.sc -60
+KPX Racute wgrave.sc -60
KPX Racute wgrave.sc -60
KPX Racute ycircumflex.sc -65
+KPX Racute ycircumflex.sc -65
+KPX Racute c.sc -35
KPX Racute c.sc -35
KPX Racute g.sc -40
+KPX Racute g.sc -40
KPX Racute o.sc -40
+KPX Racute o.sc -40
+KPX Racute t.sc -30
KPX Racute t.sc -30
KPX Racute u.sc -45
+KPX Racute u.sc -45
+KPX Racute v.sc -65
KPX Racute v.sc -65
KPX Racute w.sc -60
+KPX Racute w.sc -60
+KPX Racute y.sc -65
KPX Racute y.sc -65
KPX Racute ccedilla.sc -35
+KPX Racute ccedilla.sc -35
+KPX Racute odieresis.sc -40
KPX Racute odieresis.sc -40
KPX Racute oslash.sc -40
+KPX Racute oslash.sc -40
KPX Racute ucircumflex.sc -45
+KPX Racute ucircumflex.sc -45
+KPX Racute udieresis.sc -45
KPX Racute udieresis.sc -45
KPX Racute ydieresis.sc -65
+KPX Racute ydieresis.sc -65
KPX Racute c.pc -35
KPX Racute g.pc -40
KPX Racute o.pc -40
@@ -10185,46 +10487,6 @@ KPX Racute uni021B.pc -30
KPX Racute wgrave.pc -60
KPX Racute wacute.pc -60
KPX Racute wdieresis.pc -60
-KPX Racute c.sc -35
-KPX Racute g.sc -40
-KPX Racute o.sc -40
-KPX Racute t.sc -30
-KPX Racute u.sc -45
-KPX Racute v.sc -65
-KPX Racute w.sc -60
-KPX Racute y.sc -65
-KPX Racute ccedilla.sc -35
-KPX Racute odieresis.sc -40
-KPX Racute oslash.sc -40
-KPX Racute ucircumflex.sc -45
-KPX Racute udieresis.sc -45
-KPX Racute ydieresis.sc -65
-KPX Racute cacute.sc -35
-KPX Racute ccircumflex.sc -35
-KPX Racute cdotaccent.sc -35
-KPX Racute ccaron.sc -35
-KPX Racute gcircumflex.sc -40
-KPX Racute gbreve.sc -40
-KPX Racute gdotaccent.sc -40
-KPX Racute gcommaaccent.sc -40
-KPX Racute omacron.sc -40
-KPX Racute obreve.sc -40
-KPX Racute ohungarumlaut.sc -40
-KPX Racute oe.sc -35
-KPX Racute tcaron.sc -30
-KPX Racute umacron.sc -45
-KPX Racute ubreve.sc -45
-KPX Racute uring.sc -45
-KPX Racute uhungarumlaut.sc -45
-KPX Racute uogonek.sc -45
-KPX Racute wcircumflex.sc -60
-KPX Racute ycircumflex.sc -65
-KPX Racute gcaron.sc -40
-KPX Racute oogonek.sc -40
-KPX Racute gacute.sc -40
-KPX Racute wgrave.sc -60
-KPX Racute wacute.sc -60
-KPX Racute wdieresis.sc -60
KPX racute comma -40
KPX racute hyphen -45
KPX racute period -50
@@ -10353,44 +10615,84 @@ KPX Rcommaaccent Wgrave -70
KPX Rcommaaccent Wacute -70
KPX Rcommaaccent Wdieresis -70
KPX Rcommaaccent gacute.sc -40
+KPX Rcommaaccent gacute.sc -40
+KPX Rcommaaccent gcaron.sc -40
KPX Rcommaaccent gcaron.sc -40
KPX Rcommaaccent oe.sc -35
+KPX Rcommaaccent oe.sc -35
KPX Rcommaaccent oogonek.sc -40
+KPX Rcommaaccent oogonek.sc -40
+KPX Rcommaaccent cacute.sc -35
KPX Rcommaaccent cacute.sc -35
KPX Rcommaaccent ccaron.sc -35
+KPX Rcommaaccent ccaron.sc -35
+KPX Rcommaaccent ccircumflex.sc -35
KPX Rcommaaccent ccircumflex.sc -35
KPX Rcommaaccent cdotaccent.sc -35
+KPX Rcommaaccent cdotaccent.sc -35
+KPX Rcommaaccent gbreve.sc -40
KPX Rcommaaccent gbreve.sc -40
KPX Rcommaaccent gcircumflex.sc -40
+KPX Rcommaaccent gcircumflex.sc -40
+KPX Rcommaaccent gcommaaccent.sc -40
KPX Rcommaaccent gcommaaccent.sc -40
KPX Rcommaaccent gdotaccent.sc -40
+KPX Rcommaaccent gdotaccent.sc -40
KPX Rcommaaccent obreve.sc -40
+KPX Rcommaaccent obreve.sc -40
+KPX Rcommaaccent ohungarumlaut.sc -40
KPX Rcommaaccent ohungarumlaut.sc -40
KPX Rcommaaccent omacron.sc -40
+KPX Rcommaaccent omacron.sc -40
+KPX Rcommaaccent tcaron.sc -30
KPX Rcommaaccent tcaron.sc -30
KPX Rcommaaccent ubreve.sc -45
+KPX Rcommaaccent ubreve.sc -45
+KPX Rcommaaccent uhungarumlaut.sc -45
KPX Rcommaaccent uhungarumlaut.sc -45
KPX Rcommaaccent umacron.sc -45
+KPX Rcommaaccent umacron.sc -45
+KPX Rcommaaccent uogonek.sc -45
KPX Rcommaaccent uogonek.sc -45
KPX Rcommaaccent uring.sc -45
+KPX Rcommaaccent uring.sc -45
KPX Rcommaaccent wacute.sc -60
+KPX Rcommaaccent wacute.sc -60
+KPX Rcommaaccent wcircumflex.sc -60
KPX Rcommaaccent wcircumflex.sc -60
KPX Rcommaaccent wdieresis.sc -60
+KPX Rcommaaccent wdieresis.sc -60
+KPX Rcommaaccent wgrave.sc -60
KPX Rcommaaccent wgrave.sc -60
KPX Rcommaaccent ycircumflex.sc -65
+KPX Rcommaaccent ycircumflex.sc -65
+KPX Rcommaaccent c.sc -35
KPX Rcommaaccent c.sc -35
KPX Rcommaaccent g.sc -40
+KPX Rcommaaccent g.sc -40
+KPX Rcommaaccent o.sc -40
KPX Rcommaaccent o.sc -40
KPX Rcommaaccent t.sc -30
+KPX Rcommaaccent t.sc -30
KPX Rcommaaccent u.sc -45
+KPX Rcommaaccent u.sc -45
+KPX Rcommaaccent v.sc -65
KPX Rcommaaccent v.sc -65
KPX Rcommaaccent w.sc -60
+KPX Rcommaaccent w.sc -60
+KPX Rcommaaccent y.sc -65
KPX Rcommaaccent y.sc -65
KPX Rcommaaccent ccedilla.sc -35
+KPX Rcommaaccent ccedilla.sc -35
+KPX Rcommaaccent odieresis.sc -40
KPX Rcommaaccent odieresis.sc -40
KPX Rcommaaccent oslash.sc -40
+KPX Rcommaaccent oslash.sc -40
+KPX Rcommaaccent ucircumflex.sc -45
KPX Rcommaaccent ucircumflex.sc -45
KPX Rcommaaccent udieresis.sc -45
+KPX Rcommaaccent udieresis.sc -45
+KPX Rcommaaccent ydieresis.sc -65
KPX Rcommaaccent ydieresis.sc -65
KPX Rcommaaccent c.pc -35
KPX Rcommaaccent g.pc -40
@@ -10433,46 +10735,6 @@ KPX Rcommaaccent uni021B.pc -30
KPX Rcommaaccent wgrave.pc -60
KPX Rcommaaccent wacute.pc -60
KPX Rcommaaccent wdieresis.pc -60
-KPX Rcommaaccent c.sc -35
-KPX Rcommaaccent g.sc -40
-KPX Rcommaaccent o.sc -40
-KPX Rcommaaccent t.sc -30
-KPX Rcommaaccent u.sc -45
-KPX Rcommaaccent v.sc -65
-KPX Rcommaaccent w.sc -60
-KPX Rcommaaccent y.sc -65
-KPX Rcommaaccent ccedilla.sc -35
-KPX Rcommaaccent odieresis.sc -40
-KPX Rcommaaccent oslash.sc -40
-KPX Rcommaaccent ucircumflex.sc -45
-KPX Rcommaaccent udieresis.sc -45
-KPX Rcommaaccent ydieresis.sc -65
-KPX Rcommaaccent cacute.sc -35
-KPX Rcommaaccent ccircumflex.sc -35
-KPX Rcommaaccent cdotaccent.sc -35
-KPX Rcommaaccent ccaron.sc -35
-KPX Rcommaaccent gcircumflex.sc -40
-KPX Rcommaaccent gbreve.sc -40
-KPX Rcommaaccent gdotaccent.sc -40
-KPX Rcommaaccent gcommaaccent.sc -40
-KPX Rcommaaccent omacron.sc -40
-KPX Rcommaaccent obreve.sc -40
-KPX Rcommaaccent ohungarumlaut.sc -40
-KPX Rcommaaccent oe.sc -35
-KPX Rcommaaccent tcaron.sc -30
-KPX Rcommaaccent umacron.sc -45
-KPX Rcommaaccent ubreve.sc -45
-KPX Rcommaaccent uring.sc -45
-KPX Rcommaaccent uhungarumlaut.sc -45
-KPX Rcommaaccent uogonek.sc -45
-KPX Rcommaaccent wcircumflex.sc -60
-KPX Rcommaaccent ycircumflex.sc -65
-KPX Rcommaaccent gcaron.sc -40
-KPX Rcommaaccent oogonek.sc -40
-KPX Rcommaaccent gacute.sc -40
-KPX Rcommaaccent wgrave.sc -60
-KPX Rcommaaccent wacute.sc -60
-KPX Rcommaaccent wdieresis.sc -60
KPX rcommaaccent comma -40
KPX rcommaaccent hyphen -45
KPX rcommaaccent period -50
@@ -10601,44 +10863,84 @@ KPX Rcaron Wgrave -70
KPX Rcaron Wacute -70
KPX Rcaron Wdieresis -70
KPX Rcaron gacute.sc -40
+KPX Rcaron gacute.sc -40
KPX Rcaron gcaron.sc -40
+KPX Rcaron gcaron.sc -40
+KPX Rcaron oe.sc -35
KPX Rcaron oe.sc -35
KPX Rcaron oogonek.sc -40
+KPX Rcaron oogonek.sc -40
KPX Rcaron cacute.sc -35
+KPX Rcaron cacute.sc -35
+KPX Rcaron ccaron.sc -35
KPX Rcaron ccaron.sc -35
KPX Rcaron ccircumflex.sc -35
+KPX Rcaron ccircumflex.sc -35
+KPX Rcaron cdotaccent.sc -35
KPX Rcaron cdotaccent.sc -35
KPX Rcaron gbreve.sc -40
+KPX Rcaron gbreve.sc -40
+KPX Rcaron gcircumflex.sc -40
KPX Rcaron gcircumflex.sc -40
KPX Rcaron gcommaaccent.sc -40
+KPX Rcaron gcommaaccent.sc -40
+KPX Rcaron gdotaccent.sc -40
KPX Rcaron gdotaccent.sc -40
KPX Rcaron obreve.sc -40
+KPX Rcaron obreve.sc -40
KPX Rcaron ohungarumlaut.sc -40
+KPX Rcaron ohungarumlaut.sc -40
+KPX Rcaron omacron.sc -40
KPX Rcaron omacron.sc -40
KPX Rcaron tcaron.sc -30
+KPX Rcaron tcaron.sc -30
+KPX Rcaron ubreve.sc -45
KPX Rcaron ubreve.sc -45
KPX Rcaron uhungarumlaut.sc -45
+KPX Rcaron uhungarumlaut.sc -45
+KPX Rcaron umacron.sc -45
KPX Rcaron umacron.sc -45
KPX Rcaron uogonek.sc -45
+KPX Rcaron uogonek.sc -45
+KPX Rcaron uring.sc -45
KPX Rcaron uring.sc -45
KPX Rcaron wacute.sc -60
+KPX Rcaron wacute.sc -60
KPX Rcaron wcircumflex.sc -60
+KPX Rcaron wcircumflex.sc -60
+KPX Rcaron wdieresis.sc -60
KPX Rcaron wdieresis.sc -60
KPX Rcaron wgrave.sc -60
+KPX Rcaron wgrave.sc -60
+KPX Rcaron ycircumflex.sc -65
KPX Rcaron ycircumflex.sc -65
KPX Rcaron c.sc -35
+KPX Rcaron c.sc -35
KPX Rcaron g.sc -40
+KPX Rcaron g.sc -40
+KPX Rcaron o.sc -40
KPX Rcaron o.sc -40
KPX Rcaron t.sc -30
+KPX Rcaron t.sc -30
+KPX Rcaron u.sc -45
KPX Rcaron u.sc -45
KPX Rcaron v.sc -65
+KPX Rcaron v.sc -65
KPX Rcaron w.sc -60
+KPX Rcaron w.sc -60
+KPX Rcaron y.sc -65
KPX Rcaron y.sc -65
KPX Rcaron ccedilla.sc -35
+KPX Rcaron ccedilla.sc -35
+KPX Rcaron odieresis.sc -40
KPX Rcaron odieresis.sc -40
KPX Rcaron oslash.sc -40
+KPX Rcaron oslash.sc -40
+KPX Rcaron ucircumflex.sc -45
KPX Rcaron ucircumflex.sc -45
KPX Rcaron udieresis.sc -45
+KPX Rcaron udieresis.sc -45
+KPX Rcaron ydieresis.sc -65
KPX Rcaron ydieresis.sc -65
KPX Rcaron c.pc -35
KPX Rcaron g.pc -40
@@ -10681,46 +10983,6 @@ KPX Rcaron uni021B.pc -30
KPX Rcaron wgrave.pc -60
KPX Rcaron wacute.pc -60
KPX Rcaron wdieresis.pc -60
-KPX Rcaron c.sc -35
-KPX Rcaron g.sc -40
-KPX Rcaron o.sc -40
-KPX Rcaron t.sc -30
-KPX Rcaron u.sc -45
-KPX Rcaron v.sc -65
-KPX Rcaron w.sc -60
-KPX Rcaron y.sc -65
-KPX Rcaron ccedilla.sc -35
-KPX Rcaron odieresis.sc -40
-KPX Rcaron oslash.sc -40
-KPX Rcaron ucircumflex.sc -45
-KPX Rcaron udieresis.sc -45
-KPX Rcaron ydieresis.sc -65
-KPX Rcaron cacute.sc -35
-KPX Rcaron ccircumflex.sc -35
-KPX Rcaron cdotaccent.sc -35
-KPX Rcaron ccaron.sc -35
-KPX Rcaron gcircumflex.sc -40
-KPX Rcaron gbreve.sc -40
-KPX Rcaron gdotaccent.sc -40
-KPX Rcaron gcommaaccent.sc -40
-KPX Rcaron omacron.sc -40
-KPX Rcaron obreve.sc -40
-KPX Rcaron ohungarumlaut.sc -40
-KPX Rcaron oe.sc -35
-KPX Rcaron tcaron.sc -30
-KPX Rcaron umacron.sc -45
-KPX Rcaron ubreve.sc -45
-KPX Rcaron uring.sc -45
-KPX Rcaron uhungarumlaut.sc -45
-KPX Rcaron uogonek.sc -45
-KPX Rcaron wcircumflex.sc -60
-KPX Rcaron ycircumflex.sc -65
-KPX Rcaron gcaron.sc -40
-KPX Rcaron oogonek.sc -40
-KPX Rcaron gacute.sc -40
-KPX Rcaron wgrave.sc -60
-KPX Rcaron wacute.sc -60
-KPX Rcaron wdieresis.sc -60
KPX rcaron comma -40
KPX rcaron hyphen -45
KPX rcaron period -50
@@ -10803,23 +11065,41 @@ KPX Sacute Wgrave -20
KPX Sacute Wacute -20
KPX Sacute Wdieresis -20
KPX Sacute amacron.sc -30
+KPX Sacute amacron.sc -30
KPX Sacute aogonek.sc -30
+KPX Sacute aogonek.sc -30
+KPX Sacute aeacute.sc -25
KPX Sacute aeacute.sc -25
KPX Sacute tcaron.sc -15
+KPX Sacute tcaron.sc -15
+KPX Sacute wacute.sc -15
KPX Sacute wacute.sc -15
KPX Sacute wcircumflex.sc -15
+KPX Sacute wcircumflex.sc -15
KPX Sacute wdieresis.sc -15
+KPX Sacute wdieresis.sc -15
+KPX Sacute wgrave.sc -15
KPX Sacute wgrave.sc -15
KPX Sacute ycircumflex.sc -25
+KPX Sacute ycircumflex.sc -25
+KPX Sacute a.sc -30
KPX Sacute a.sc -30
KPX Sacute t.sc -15
+KPX Sacute t.sc -15
+KPX Sacute v.sc -20
KPX Sacute v.sc -20
KPX Sacute w.sc -15
+KPX Sacute w.sc -15
+KPX Sacute y.sc -25
KPX Sacute y.sc -25
KPX Sacute adieresis.sc -30
+KPX Sacute adieresis.sc -30
KPX Sacute aring.sc -30
+KPX Sacute aring.sc -30
+KPX Sacute ae.sc -25
KPX Sacute ae.sc -25
KPX Sacute ydieresis.sc -25
+KPX Sacute ydieresis.sc -25
KPX Sacute a.pc -30
KPX Sacute t.pc -15
KPX Sacute v.pc -20
@@ -10839,24 +11119,6 @@ KPX Sacute uni021B.pc -15
KPX Sacute wgrave.pc -15
KPX Sacute wacute.pc -15
KPX Sacute wdieresis.pc -15
-KPX Sacute a.sc -30
-KPX Sacute t.sc -15
-KPX Sacute v.sc -20
-KPX Sacute w.sc -15
-KPX Sacute y.sc -25
-KPX Sacute adieresis.sc -30
-KPX Sacute aring.sc -30
-KPX Sacute ae.sc -25
-KPX Sacute ydieresis.sc -25
-KPX Sacute amacron.sc -30
-KPX Sacute aogonek.sc -30
-KPX Sacute tcaron.sc -15
-KPX Sacute wcircumflex.sc -15
-KPX Sacute ycircumflex.sc -25
-KPX Sacute aeacute.sc -25
-KPX Sacute wgrave.sc -15
-KPX Sacute wacute.sc -15
-KPX Sacute wdieresis.sc -15
KPX sacute t -15
KPX sacute tcaron -15
KPX sacute uni021B -15
@@ -10884,23 +11146,41 @@ KPX Scircumflex Wgrave -20
KPX Scircumflex Wacute -20
KPX Scircumflex Wdieresis -20
KPX Scircumflex amacron.sc -30
+KPX Scircumflex amacron.sc -30
KPX Scircumflex aogonek.sc -30
+KPX Scircumflex aogonek.sc -30
+KPX Scircumflex aeacute.sc -25
KPX Scircumflex aeacute.sc -25
KPX Scircumflex tcaron.sc -15
+KPX Scircumflex tcaron.sc -15
+KPX Scircumflex wacute.sc -15
KPX Scircumflex wacute.sc -15
KPX Scircumflex wcircumflex.sc -15
+KPX Scircumflex wcircumflex.sc -15
KPX Scircumflex wdieresis.sc -15
+KPX Scircumflex wdieresis.sc -15
+KPX Scircumflex wgrave.sc -15
KPX Scircumflex wgrave.sc -15
KPX Scircumflex ycircumflex.sc -25
+KPX Scircumflex ycircumflex.sc -25
+KPX Scircumflex a.sc -30
KPX Scircumflex a.sc -30
KPX Scircumflex t.sc -15
+KPX Scircumflex t.sc -15
+KPX Scircumflex v.sc -20
KPX Scircumflex v.sc -20
KPX Scircumflex w.sc -15
+KPX Scircumflex w.sc -15
+KPX Scircumflex y.sc -25
KPX Scircumflex y.sc -25
KPX Scircumflex adieresis.sc -30
+KPX Scircumflex adieresis.sc -30
KPX Scircumflex aring.sc -30
+KPX Scircumflex aring.sc -30
+KPX Scircumflex ae.sc -25
KPX Scircumflex ae.sc -25
KPX Scircumflex ydieresis.sc -25
+KPX Scircumflex ydieresis.sc -25
KPX Scircumflex a.pc -30
KPX Scircumflex t.pc -15
KPX Scircumflex v.pc -20
@@ -10920,24 +11200,6 @@ KPX Scircumflex uni021B.pc -15
KPX Scircumflex wgrave.pc -15
KPX Scircumflex wacute.pc -15
KPX Scircumflex wdieresis.pc -15
-KPX Scircumflex a.sc -30
-KPX Scircumflex t.sc -15
-KPX Scircumflex v.sc -20
-KPX Scircumflex w.sc -15
-KPX Scircumflex y.sc -25
-KPX Scircumflex adieresis.sc -30
-KPX Scircumflex aring.sc -30
-KPX Scircumflex ae.sc -25
-KPX Scircumflex ydieresis.sc -25
-KPX Scircumflex amacron.sc -30
-KPX Scircumflex aogonek.sc -30
-KPX Scircumflex tcaron.sc -15
-KPX Scircumflex wcircumflex.sc -15
-KPX Scircumflex ycircumflex.sc -25
-KPX Scircumflex aeacute.sc -25
-KPX Scircumflex wgrave.sc -15
-KPX Scircumflex wacute.sc -15
-KPX Scircumflex wdieresis.sc -15
KPX scircumflex t -15
KPX scircumflex tcaron -15
KPX scircumflex uni021B -15
@@ -10965,23 +11227,41 @@ KPX Scedilla Wgrave -20
KPX Scedilla Wacute -20
KPX Scedilla Wdieresis -20
KPX Scedilla amacron.sc -30
+KPX Scedilla amacron.sc -30
KPX Scedilla aogonek.sc -30
+KPX Scedilla aogonek.sc -30
+KPX Scedilla aeacute.sc -25
KPX Scedilla aeacute.sc -25
KPX Scedilla tcaron.sc -15
+KPX Scedilla tcaron.sc -15
+KPX Scedilla wacute.sc -15
KPX Scedilla wacute.sc -15
KPX Scedilla wcircumflex.sc -15
+KPX Scedilla wcircumflex.sc -15
KPX Scedilla wdieresis.sc -15
+KPX Scedilla wdieresis.sc -15
+KPX Scedilla wgrave.sc -15
KPX Scedilla wgrave.sc -15
KPX Scedilla ycircumflex.sc -25
+KPX Scedilla ycircumflex.sc -25
+KPX Scedilla a.sc -30
KPX Scedilla a.sc -30
KPX Scedilla t.sc -15
+KPX Scedilla t.sc -15
+KPX Scedilla v.sc -20
KPX Scedilla v.sc -20
KPX Scedilla w.sc -15
+KPX Scedilla w.sc -15
+KPX Scedilla y.sc -25
KPX Scedilla y.sc -25
KPX Scedilla adieresis.sc -30
+KPX Scedilla adieresis.sc -30
KPX Scedilla aring.sc -30
+KPX Scedilla aring.sc -30
+KPX Scedilla ae.sc -25
KPX Scedilla ae.sc -25
KPX Scedilla ydieresis.sc -25
+KPX Scedilla ydieresis.sc -25
KPX Scedilla a.pc -30
KPX Scedilla t.pc -15
KPX Scedilla v.pc -20
@@ -11001,24 +11281,6 @@ KPX Scedilla uni021B.pc -15
KPX Scedilla wgrave.pc -15
KPX Scedilla wacute.pc -15
KPX Scedilla wdieresis.pc -15
-KPX Scedilla a.sc -30
-KPX Scedilla t.sc -15
-KPX Scedilla v.sc -20
-KPX Scedilla w.sc -15
-KPX Scedilla y.sc -25
-KPX Scedilla adieresis.sc -30
-KPX Scedilla aring.sc -30
-KPX Scedilla ae.sc -25
-KPX Scedilla ydieresis.sc -25
-KPX Scedilla amacron.sc -30
-KPX Scedilla aogonek.sc -30
-KPX Scedilla tcaron.sc -15
-KPX Scedilla wcircumflex.sc -15
-KPX Scedilla ycircumflex.sc -25
-KPX Scedilla aeacute.sc -25
-KPX Scedilla wgrave.sc -15
-KPX Scedilla wacute.sc -15
-KPX Scedilla wdieresis.sc -15
KPX scedilla t -15
KPX scedilla tcaron -15
KPX scedilla uni021B -15
@@ -11046,22 +11308,40 @@ KPX Scaron Wgrave -20
KPX Scaron Wacute -20
KPX Scaron Wdieresis -20
KPX Scaron amacron.sc -30
+KPX Scaron amacron.sc -30
+KPX Scaron aogonek.sc -30
KPX Scaron aogonek.sc -30
KPX Scaron aeacute.sc -25
+KPX Scaron aeacute.sc -25
+KPX Scaron tcaron.sc -15
KPX Scaron tcaron.sc -15
KPX Scaron wacute.sc -15
+KPX Scaron wacute.sc -15
+KPX Scaron wcircumflex.sc -15
KPX Scaron wcircumflex.sc -15
KPX Scaron wdieresis.sc -15
+KPX Scaron wdieresis.sc -15
KPX Scaron wgrave.sc -15
+KPX Scaron wgrave.sc -15
+KPX Scaron ycircumflex.sc -25
KPX Scaron ycircumflex.sc -25
KPX Scaron a.sc -30
+KPX Scaron a.sc -30
+KPX Scaron t.sc -15
KPX Scaron t.sc -15
KPX Scaron v.sc -20
+KPX Scaron v.sc -20
+KPX Scaron w.sc -15
KPX Scaron w.sc -15
KPX Scaron y.sc -25
+KPX Scaron y.sc -25
+KPX Scaron adieresis.sc -30
KPX Scaron adieresis.sc -30
KPX Scaron aring.sc -30
+KPX Scaron aring.sc -30
KPX Scaron ae.sc -25
+KPX Scaron ae.sc -25
+KPX Scaron ydieresis.sc -25
KPX Scaron ydieresis.sc -25
KPX Scaron a.pc -30
KPX Scaron t.pc -15
@@ -11082,24 +11362,6 @@ KPX Scaron uni021B.pc -15
KPX Scaron wgrave.pc -15
KPX Scaron wacute.pc -15
KPX Scaron wdieresis.pc -15
-KPX Scaron a.sc -30
-KPX Scaron t.sc -15
-KPX Scaron v.sc -20
-KPX Scaron w.sc -15
-KPX Scaron y.sc -25
-KPX Scaron adieresis.sc -30
-KPX Scaron aring.sc -30
-KPX Scaron ae.sc -25
-KPX Scaron ydieresis.sc -25
-KPX Scaron amacron.sc -30
-KPX Scaron aogonek.sc -30
-KPX Scaron tcaron.sc -15
-KPX Scaron wcircumflex.sc -15
-KPX Scaron ycircumflex.sc -25
-KPX Scaron aeacute.sc -25
-KPX Scaron wgrave.sc -15
-KPX Scaron wacute.sc -15
-KPX Scaron wdieresis.sc -15
KPX scaron t -15
KPX scaron tcaron -15
KPX scaron uni021B -15
@@ -11244,39 +11506,71 @@ KPX Tcaron yhookabove -50
KPX Tcaron ytilde -50
KPX Tcaron guilsinglleft -125
KPX Tcaron abrevedotbelow.sc -25
+KPX Tcaron abrevedotbelow.sc -25
+KPX Tcaron acircumflexdotbelow.sc -25
KPX Tcaron acircumflexdotbelow.sc -25
KPX Tcaron ahookabove.sc -25
+KPX Tcaron ahookabove.sc -25
+KPX Tcaron jacute.sc -15
KPX Tcaron jacute.sc -15
KPX Tcaron oe.sc -40
+KPX Tcaron oe.sc -40
+KPX Tcaron yhookabove.sc 5
KPX Tcaron yhookabove.sc 5
KPX Tcaron ytilde.sc 5
+KPX Tcaron ytilde.sc 5
KPX Tcaron Jacute -20
KPX Tcaron jacute -20
KPX Tcaron abreve.sc -25
+KPX Tcaron abreve.sc -25
+KPX Tcaron amacron.sc -25
KPX Tcaron amacron.sc -25
KPX Tcaron aogonek.sc -45
+KPX Tcaron aogonek.sc -45
+KPX Tcaron aeacute.sc -80
KPX Tcaron aeacute.sc -80
KPX Tcaron jcircumflex.sc -10
+KPX Tcaron jcircumflex.sc -10
+KPX Tcaron wacute.sc 15
KPX Tcaron wacute.sc 15
KPX Tcaron wcircumflex.sc 10
+KPX Tcaron wcircumflex.sc 10
+KPX Tcaron wdieresis.sc 10
KPX Tcaron wdieresis.sc 10
KPX Tcaron wgrave.sc 10
+KPX Tcaron wgrave.sc 10
KPX Tcaron ycircumflex.sc 5
+KPX Tcaron ycircumflex.sc 5
+KPX Tcaron ygrave.sc 5
KPX Tcaron ygrave.sc 5
KPX Tcaron a.sc -45
+KPX Tcaron a.sc -45
+KPX Tcaron j.sc -15
KPX Tcaron j.sc -15
KPX Tcaron v.sc 15
+KPX Tcaron v.sc 15
+KPX Tcaron w.sc 15
KPX Tcaron w.sc 15
KPX Tcaron y.sc 10
+KPX Tcaron y.sc 10
+KPX Tcaron agrave.sc -25
KPX Tcaron agrave.sc -25
KPX Tcaron aacute.sc -35
+KPX Tcaron aacute.sc -35
KPX Tcaron acircumflex.sc -25
+KPX Tcaron acircumflex.sc -25
+KPX Tcaron atilde.sc -25
KPX Tcaron atilde.sc -25
KPX Tcaron adieresis.sc -25
+KPX Tcaron adieresis.sc -25
+KPX Tcaron aring.sc -25
KPX Tcaron aring.sc -25
KPX Tcaron ae.sc -80
+KPX Tcaron ae.sc -80
+KPX Tcaron yacute.sc 5
KPX Tcaron yacute.sc 5
KPX Tcaron ydieresis.sc 5
+KPX Tcaron ydieresis.sc 5
KPX Tcaron a.pc -45
KPX Tcaron j.pc -15
KPX Tcaron v.pc 15
@@ -11309,38 +11603,6 @@ KPX Tcaron ygrave.pc 5
KPX Tcaron yhookabove.pc 5
KPX Tcaron ytilde.pc 5
KPX Tcaron jacute.pc -15
-KPX Tcaron a.sc -45
-KPX Tcaron j.sc -15
-KPX Tcaron v.sc 15
-KPX Tcaron w.sc 15
-KPX Tcaron y.sc 10
-KPX Tcaron agrave.sc -25
-KPX Tcaron aacute.sc -35
-KPX Tcaron acircumflex.sc -25
-KPX Tcaron atilde.sc -25
-KPX Tcaron adieresis.sc -25
-KPX Tcaron aring.sc -25
-KPX Tcaron ae.sc -80
-KPX Tcaron yacute.sc 5
-KPX Tcaron ydieresis.sc 5
-KPX Tcaron amacron.sc -25
-KPX Tcaron abreve.sc -25
-KPX Tcaron aogonek.sc -45
-KPX Tcaron jcircumflex.sc -10
-KPX Tcaron oe.sc -40
-KPX Tcaron wcircumflex.sc 10
-KPX Tcaron ycircumflex.sc 5
-KPX Tcaron aeacute.sc -80
-KPX Tcaron wgrave.sc 10
-KPX Tcaron wacute.sc 15
-KPX Tcaron wdieresis.sc 10
-KPX Tcaron ahookabove.sc -25
-KPX Tcaron acircumflexdotbelow.sc -25
-KPX Tcaron abrevedotbelow.sc -25
-KPX Tcaron ygrave.sc 5
-KPX Tcaron yhookabove.sc 5
-KPX Tcaron ytilde.sc 5
-KPX Tcaron jacute.sc -15
KPX tcaron backslash 35
KPX tcaron b 30
KPX tcaron h 30
@@ -11366,16 +11628,28 @@ KPX Utilde racute -20
KPX Utilde rcaron -15
KPX Utilde rdotaccent -15
KPX Utilde abrevedotbelow.sc -25
+KPX Utilde abrevedotbelow.sc -25
KPX Utilde acircumflexdotbelow.sc -25
+KPX Utilde acircumflexdotbelow.sc -25
+KPX Utilde ahookabove.sc -25
KPX Utilde ahookabove.sc -25
KPX Utilde abreve.sc -25
+KPX Utilde abreve.sc -25
+KPX Utilde amacron.sc -25
KPX Utilde amacron.sc -25
KPX Utilde a.sc -55
+KPX Utilde a.sc -55
KPX Utilde agrave.sc -25
+KPX Utilde agrave.sc -25
+KPX Utilde aacute.sc -40
KPX Utilde aacute.sc -40
KPX Utilde acircumflex.sc -25
+KPX Utilde acircumflex.sc -25
+KPX Utilde atilde.sc -25
KPX Utilde atilde.sc -25
KPX Utilde adieresis.sc -25
+KPX Utilde adieresis.sc -25
+KPX Utilde aring.sc -25
KPX Utilde aring.sc -25
KPX Utilde a.pc -55
KPX Utilde agrave.pc -25
@@ -11389,18 +11663,6 @@ KPX Utilde abreve.pc -25
KPX Utilde ahookabove.pc -25
KPX Utilde acircumflexdotbelow.pc -25
KPX Utilde abrevedotbelow.pc -25
-KPX Utilde a.sc -55
-KPX Utilde agrave.sc -25
-KPX Utilde aacute.sc -40
-KPX Utilde acircumflex.sc -25
-KPX Utilde atilde.sc -25
-KPX Utilde adieresis.sc -25
-KPX Utilde aring.sc -25
-KPX Utilde amacron.sc -25
-KPX Utilde abreve.sc -25
-KPX Utilde ahookabove.sc -25
-KPX Utilde acircumflexdotbelow.sc -25
-KPX Utilde abrevedotbelow.sc -25
KPX Umacron comma -30
KPX Umacron period -35
KPX Umacron A -65
@@ -11423,20 +11685,35 @@ KPX Umacron rcaron -15
KPX Umacron AEacute -60
KPX Umacron rdotaccent -15
KPX Umacron abrevedotbelow.sc -25
+KPX Umacron abrevedotbelow.sc -25
+KPX Umacron acircumflexdotbelow.sc -25
KPX Umacron acircumflexdotbelow.sc -25
KPX Umacron ahookabove.sc -25
+KPX Umacron ahookabove.sc -25
+KPX Umacron abreve.sc -25
KPX Umacron abreve.sc -25
KPX Umacron amacron.sc -25
+KPX Umacron amacron.sc -25
KPX Umacron aogonek.sc -55
+KPX Umacron aogonek.sc -55
+KPX Umacron aeacute.sc -50
KPX Umacron aeacute.sc -50
KPX Umacron a.sc -55
+KPX Umacron a.sc -55
+KPX Umacron agrave.sc -25
KPX Umacron agrave.sc -25
KPX Umacron aacute.sc -40
+KPX Umacron aacute.sc -40
KPX Umacron acircumflex.sc -25
+KPX Umacron acircumflex.sc -25
+KPX Umacron atilde.sc -25
KPX Umacron atilde.sc -25
KPX Umacron adieresis.sc -25
+KPX Umacron adieresis.sc -25
+KPX Umacron aring.sc -25
KPX Umacron aring.sc -25
KPX Umacron ae.sc -50
+KPX Umacron ae.sc -50
KPX Umacron a.pc -55
KPX Umacron agrave.pc -25
KPX Umacron aacute.pc -40
@@ -11452,21 +11729,6 @@ KPX Umacron aeacute.pc -50
KPX Umacron ahookabove.pc -25
KPX Umacron acircumflexdotbelow.pc -25
KPX Umacron abrevedotbelow.pc -25
-KPX Umacron a.sc -55
-KPX Umacron agrave.sc -25
-KPX Umacron aacute.sc -40
-KPX Umacron acircumflex.sc -25
-KPX Umacron atilde.sc -25
-KPX Umacron adieresis.sc -25
-KPX Umacron aring.sc -25
-KPX Umacron ae.sc -50
-KPX Umacron amacron.sc -25
-KPX Umacron abreve.sc -25
-KPX Umacron aogonek.sc -55
-KPX Umacron aeacute.sc -50
-KPX Umacron ahookabove.sc -25
-KPX Umacron acircumflexdotbelow.sc -25
-KPX Umacron abrevedotbelow.sc -25
KPX umacron quoteright -35
KPX Ubreve comma -30
KPX Ubreve period -35
@@ -11490,19 +11752,34 @@ KPX Ubreve rcaron -15
KPX Ubreve AEacute -60
KPX Ubreve rdotaccent -15
KPX Ubreve abrevedotbelow.sc -25
+KPX Ubreve abrevedotbelow.sc -25
+KPX Ubreve acircumflexdotbelow.sc -25
KPX Ubreve acircumflexdotbelow.sc -25
KPX Ubreve ahookabove.sc -25
+KPX Ubreve ahookabove.sc -25
+KPX Ubreve abreve.sc -25
KPX Ubreve abreve.sc -25
KPX Ubreve amacron.sc -25
+KPX Ubreve amacron.sc -25
+KPX Ubreve aogonek.sc -55
KPX Ubreve aogonek.sc -55
KPX Ubreve aeacute.sc -50
+KPX Ubreve aeacute.sc -50
KPX Ubreve a.sc -55
+KPX Ubreve a.sc -55
+KPX Ubreve agrave.sc -25
KPX Ubreve agrave.sc -25
KPX Ubreve aacute.sc -40
+KPX Ubreve aacute.sc -40
+KPX Ubreve acircumflex.sc -25
KPX Ubreve acircumflex.sc -25
KPX Ubreve atilde.sc -25
+KPX Ubreve atilde.sc -25
+KPX Ubreve adieresis.sc -25
KPX Ubreve adieresis.sc -25
KPX Ubreve aring.sc -25
+KPX Ubreve aring.sc -25
+KPX Ubreve ae.sc -50
KPX Ubreve ae.sc -50
KPX Ubreve a.pc -55
KPX Ubreve agrave.pc -25
@@ -11519,21 +11796,6 @@ KPX Ubreve aeacute.pc -50
KPX Ubreve ahookabove.pc -25
KPX Ubreve acircumflexdotbelow.pc -25
KPX Ubreve abrevedotbelow.pc -25
-KPX Ubreve a.sc -55
-KPX Ubreve agrave.sc -25
-KPX Ubreve aacute.sc -40
-KPX Ubreve acircumflex.sc -25
-KPX Ubreve atilde.sc -25
-KPX Ubreve adieresis.sc -25
-KPX Ubreve aring.sc -25
-KPX Ubreve ae.sc -50
-KPX Ubreve amacron.sc -25
-KPX Ubreve abreve.sc -25
-KPX Ubreve aogonek.sc -55
-KPX Ubreve aeacute.sc -50
-KPX Ubreve ahookabove.sc -25
-KPX Ubreve acircumflexdotbelow.sc -25
-KPX Ubreve abrevedotbelow.sc -25
KPX ubreve quoteright -35
KPX Uring comma -30
KPX Uring period -35
@@ -11557,19 +11819,34 @@ KPX Uring rcaron -15
KPX Uring AEacute -60
KPX Uring rdotaccent -15
KPX Uring abrevedotbelow.sc -25
+KPX Uring abrevedotbelow.sc -25
KPX Uring acircumflexdotbelow.sc -25
+KPX Uring acircumflexdotbelow.sc -25
+KPX Uring ahookabove.sc -25
KPX Uring ahookabove.sc -25
KPX Uring abreve.sc -25
+KPX Uring abreve.sc -25
KPX Uring amacron.sc -25
+KPX Uring amacron.sc -25
+KPX Uring aogonek.sc -55
KPX Uring aogonek.sc -55
KPX Uring aeacute.sc -50
+KPX Uring aeacute.sc -50
+KPX Uring a.sc -55
KPX Uring a.sc -55
KPX Uring agrave.sc -25
+KPX Uring agrave.sc -25
+KPX Uring aacute.sc -40
KPX Uring aacute.sc -40
KPX Uring acircumflex.sc -25
+KPX Uring acircumflex.sc -25
+KPX Uring atilde.sc -25
KPX Uring atilde.sc -25
KPX Uring adieresis.sc -25
+KPX Uring adieresis.sc -25
KPX Uring aring.sc -25
+KPX Uring aring.sc -25
+KPX Uring ae.sc -50
KPX Uring ae.sc -50
KPX Uring a.pc -55
KPX Uring agrave.pc -25
@@ -11586,21 +11863,6 @@ KPX Uring aeacute.pc -50
KPX Uring ahookabove.pc -25
KPX Uring acircumflexdotbelow.pc -25
KPX Uring abrevedotbelow.pc -25
-KPX Uring a.sc -55
-KPX Uring agrave.sc -25
-KPX Uring aacute.sc -40
-KPX Uring acircumflex.sc -25
-KPX Uring atilde.sc -25
-KPX Uring adieresis.sc -25
-KPX Uring aring.sc -25
-KPX Uring ae.sc -50
-KPX Uring amacron.sc -25
-KPX Uring abreve.sc -25
-KPX Uring aogonek.sc -55
-KPX Uring aeacute.sc -50
-KPX Uring ahookabove.sc -25
-KPX Uring acircumflexdotbelow.sc -25
-KPX Uring abrevedotbelow.sc -25
KPX uring quoteright -35
KPX Uhungarumlaut comma -30
KPX Uhungarumlaut period -35
@@ -11624,19 +11886,34 @@ KPX Uhungarumlaut rcaron -15
KPX Uhungarumlaut AEacute -60
KPX Uhungarumlaut rdotaccent -15
KPX Uhungarumlaut abrevedotbelow.sc -25
+KPX Uhungarumlaut abrevedotbelow.sc -25
+KPX Uhungarumlaut acircumflexdotbelow.sc -25
KPX Uhungarumlaut acircumflexdotbelow.sc -25
KPX Uhungarumlaut ahookabove.sc -25
+KPX Uhungarumlaut ahookabove.sc -25
+KPX Uhungarumlaut abreve.sc -25
KPX Uhungarumlaut abreve.sc -25
KPX Uhungarumlaut amacron.sc -25
+KPX Uhungarumlaut amacron.sc -25
+KPX Uhungarumlaut aogonek.sc -55
KPX Uhungarumlaut aogonek.sc -55
KPX Uhungarumlaut aeacute.sc -50
+KPX Uhungarumlaut aeacute.sc -50
+KPX Uhungarumlaut a.sc -55
KPX Uhungarumlaut a.sc -55
KPX Uhungarumlaut agrave.sc -25
+KPX Uhungarumlaut agrave.sc -25
+KPX Uhungarumlaut aacute.sc -40
KPX Uhungarumlaut aacute.sc -40
KPX Uhungarumlaut acircumflex.sc -25
+KPX Uhungarumlaut acircumflex.sc -25
KPX Uhungarumlaut atilde.sc -25
+KPX Uhungarumlaut atilde.sc -25
+KPX Uhungarumlaut adieresis.sc -25
KPX Uhungarumlaut adieresis.sc -25
KPX Uhungarumlaut aring.sc -25
+KPX Uhungarumlaut aring.sc -25
+KPX Uhungarumlaut ae.sc -50
KPX Uhungarumlaut ae.sc -50
KPX Uhungarumlaut a.pc -55
KPX Uhungarumlaut agrave.pc -25
@@ -11653,21 +11930,6 @@ KPX Uhungarumlaut aeacute.pc -50
KPX Uhungarumlaut ahookabove.pc -25
KPX Uhungarumlaut acircumflexdotbelow.pc -25
KPX Uhungarumlaut abrevedotbelow.pc -25
-KPX Uhungarumlaut a.sc -55
-KPX Uhungarumlaut agrave.sc -25
-KPX Uhungarumlaut aacute.sc -40
-KPX Uhungarumlaut acircumflex.sc -25
-KPX Uhungarumlaut atilde.sc -25
-KPX Uhungarumlaut adieresis.sc -25
-KPX Uhungarumlaut aring.sc -25
-KPX Uhungarumlaut ae.sc -50
-KPX Uhungarumlaut amacron.sc -25
-KPX Uhungarumlaut abreve.sc -25
-KPX Uhungarumlaut aogonek.sc -55
-KPX Uhungarumlaut aeacute.sc -50
-KPX Uhungarumlaut ahookabove.sc -25
-KPX Uhungarumlaut acircumflexdotbelow.sc -25
-KPX Uhungarumlaut abrevedotbelow.sc -25
KPX uhungarumlaut quoteright -35
KPX Uogonek comma -30
KPX Uogonek period -35
@@ -11691,20 +11953,35 @@ KPX Uogonek rcaron -15
KPX Uogonek AEacute -60
KPX Uogonek rdotaccent -15
KPX Uogonek abrevedotbelow.sc -25
+KPX Uogonek abrevedotbelow.sc -25
KPX Uogonek acircumflexdotbelow.sc -25
+KPX Uogonek acircumflexdotbelow.sc -25
+KPX Uogonek ahookabove.sc -25
KPX Uogonek ahookabove.sc -25
KPX Uogonek abreve.sc -25
+KPX Uogonek abreve.sc -25
+KPX Uogonek amacron.sc -25
KPX Uogonek amacron.sc -25
KPX Uogonek aogonek.sc -55
+KPX Uogonek aogonek.sc -55
+KPX Uogonek aeacute.sc -50
KPX Uogonek aeacute.sc -50
KPX Uogonek a.sc -55
+KPX Uogonek a.sc -55
KPX Uogonek agrave.sc -25
+KPX Uogonek agrave.sc -25
+KPX Uogonek aacute.sc -40
KPX Uogonek aacute.sc -40
KPX Uogonek acircumflex.sc -25
+KPX Uogonek acircumflex.sc -25
+KPX Uogonek atilde.sc -25
KPX Uogonek atilde.sc -25
KPX Uogonek adieresis.sc -25
+KPX Uogonek adieresis.sc -25
+KPX Uogonek aring.sc -25
KPX Uogonek aring.sc -25
KPX Uogonek ae.sc -50
+KPX Uogonek ae.sc -50
KPX Uogonek a.pc -55
KPX Uogonek agrave.pc -25
KPX Uogonek aacute.pc -40
@@ -11720,21 +11997,6 @@ KPX Uogonek aeacute.pc -50
KPX Uogonek ahookabove.pc -25
KPX Uogonek acircumflexdotbelow.pc -25
KPX Uogonek abrevedotbelow.pc -25
-KPX Uogonek a.sc -55
-KPX Uogonek agrave.sc -25
-KPX Uogonek aacute.sc -40
-KPX Uogonek acircumflex.sc -25
-KPX Uogonek atilde.sc -25
-KPX Uogonek adieresis.sc -25
-KPX Uogonek aring.sc -25
-KPX Uogonek ae.sc -50
-KPX Uogonek amacron.sc -25
-KPX Uogonek abreve.sc -25
-KPX Uogonek aogonek.sc -55
-KPX Uogonek aeacute.sc -50
-KPX Uogonek ahookabove.sc -25
-KPX Uogonek acircumflexdotbelow.sc -25
-KPX Uogonek abrevedotbelow.sc -25
KPX uogonek quoteright -35
KPX Wcircumflex comma -90
KPX Wcircumflex hyphen -55
@@ -11867,59 +12129,113 @@ KPX Wcircumflex yhookabove -25
KPX Wcircumflex ytilde -25
KPX Wcircumflex guilsinglleft -105
KPX Wcircumflex abrevedotbelow.sc -50
+KPX Wcircumflex abrevedotbelow.sc -50
KPX Wcircumflex acircumflexdotbelow.sc -50
+KPX Wcircumflex acircumflexdotbelow.sc -50
+KPX Wcircumflex ahookabove.sc -50
KPX Wcircumflex ahookabove.sc -50
KPX Wcircumflex gacute.sc -35
+KPX Wcircumflex gacute.sc -35
+KPX Wcircumflex gcaron.sc -25
KPX Wcircumflex gcaron.sc -25
KPX Wcircumflex ocircumflexdotbelow.sc -25
+KPX Wcircumflex ocircumflexdotbelow.sc -25
KPX Wcircumflex oe.sc -40
+KPX Wcircumflex oe.sc -40
+KPX Wcircumflex ohookabove.sc -25
KPX Wcircumflex ohookabove.sc -25
KPX Wcircumflex ohornacute.sc -25
+KPX Wcircumflex ohornacute.sc -25
+KPX Wcircumflex ohorndotbelow.sc -25
KPX Wcircumflex ohorndotbelow.sc -25
KPX Wcircumflex ohorngrave.sc -25
+KPX Wcircumflex ohorngrave.sc -25
+KPX Wcircumflex ohornhookabove.sc -25
KPX Wcircumflex ohornhookabove.sc -25
KPX Wcircumflex ohorntilde.sc -25
+KPX Wcircumflex ohorntilde.sc -25
+KPX Wcircumflex oogonek.sc -45
KPX Wcircumflex oogonek.sc -45
KPX Wcircumflex scaron.sc -15
+KPX Wcircumflex scaron.sc -15
KPX Wcircumflex abreve.sc -50
+KPX Wcircumflex abreve.sc -50
+KPX Wcircumflex amacron.sc -50
KPX Wcircumflex amacron.sc -50
KPX Wcircumflex aogonek.sc -95
+KPX Wcircumflex aogonek.sc -95
+KPX Wcircumflex aeacute.sc -80
KPX Wcircumflex aeacute.sc -80
KPX Wcircumflex cacute.sc -35
+KPX Wcircumflex cacute.sc -35
+KPX Wcircumflex ccaron.sc -25
KPX Wcircumflex ccaron.sc -25
KPX Wcircumflex ccircumflex.sc -25
+KPX Wcircumflex ccircumflex.sc -25
+KPX Wcircumflex cdotaccent.sc -25
KPX Wcircumflex cdotaccent.sc -25
KPX Wcircumflex gbreve.sc -25
+KPX Wcircumflex gbreve.sc -25
KPX Wcircumflex gcircumflex.sc -25
+KPX Wcircumflex gcircumflex.sc -25
+KPX Wcircumflex gcommaaccent.sc -45
KPX Wcircumflex gcommaaccent.sc -45
KPX Wcircumflex gdotaccent.sc -25
+KPX Wcircumflex gdotaccent.sc -25
+KPX Wcircumflex obreve.sc -25
KPX Wcircumflex obreve.sc -25
KPX Wcircumflex ohungarumlaut.sc -25
+KPX Wcircumflex ohungarumlaut.sc -25
+KPX Wcircumflex omacron.sc -25
KPX Wcircumflex omacron.sc -25
KPX Wcircumflex sacute.sc -25
+KPX Wcircumflex sacute.sc -25
+KPX Wcircumflex scedilla.sc -35
KPX Wcircumflex scedilla.sc -35
KPX Wcircumflex scircumflex.sc -15
+KPX Wcircumflex scircumflex.sc -15
KPX Wcircumflex tcaron.sc 5
+KPX Wcircumflex tcaron.sc 5
+KPX Wcircumflex a.sc -95
KPX Wcircumflex a.sc -95
KPX Wcircumflex c.sc -45
+KPX Wcircumflex c.sc -45
+KPX Wcircumflex g.sc -45
KPX Wcircumflex g.sc -45
KPX Wcircumflex o.sc -45
+KPX Wcircumflex o.sc -45
+KPX Wcircumflex s.sc -35
KPX Wcircumflex s.sc -35
KPX Wcircumflex t.sc 15
+KPX Wcircumflex t.sc 15
+KPX Wcircumflex agrave.sc -50
KPX Wcircumflex agrave.sc -50
KPX Wcircumflex aacute.sc -70
+KPX Wcircumflex aacute.sc -70
KPX Wcircumflex acircumflex.sc -50
+KPX Wcircumflex acircumflex.sc -50
+KPX Wcircumflex atilde.sc -50
KPX Wcircumflex atilde.sc -50
KPX Wcircumflex adieresis.sc -50
+KPX Wcircumflex adieresis.sc -50
+KPX Wcircumflex aring.sc -50
KPX Wcircumflex aring.sc -50
KPX Wcircumflex ae.sc -80
+KPX Wcircumflex ae.sc -80
+KPX Wcircumflex ccedilla.sc -45
KPX Wcircumflex ccedilla.sc -45
KPX Wcircumflex ograve.sc -25
+KPX Wcircumflex ograve.sc -25
+KPX Wcircumflex oacute.sc -35
KPX Wcircumflex oacute.sc -35
KPX Wcircumflex ocircumflex.sc -25
+KPX Wcircumflex ocircumflex.sc -25
KPX Wcircumflex otilde.sc -25
+KPX Wcircumflex otilde.sc -25
+KPX Wcircumflex odieresis.sc -25
KPX Wcircumflex odieresis.sc -25
KPX Wcircumflex oslash.sc -45
+KPX Wcircumflex oslash.sc -45
KPX Wcircumflex a.pc -95
KPX Wcircumflex c.pc -45
KPX Wcircumflex g.pc -45
@@ -11976,60 +12292,6 @@ KPX Wcircumflex ohorngrave.pc -25
KPX Wcircumflex ohornhookabove.pc -25
KPX Wcircumflex ohorntilde.pc -25
KPX Wcircumflex ohorndotbelow.pc -25
-KPX Wcircumflex a.sc -95
-KPX Wcircumflex c.sc -45
-KPX Wcircumflex g.sc -45
-KPX Wcircumflex o.sc -45
-KPX Wcircumflex s.sc -35
-KPX Wcircumflex t.sc 15
-KPX Wcircumflex agrave.sc -50
-KPX Wcircumflex aacute.sc -70
-KPX Wcircumflex acircumflex.sc -50
-KPX Wcircumflex atilde.sc -50
-KPX Wcircumflex adieresis.sc -50
-KPX Wcircumflex aring.sc -50
-KPX Wcircumflex ae.sc -80
-KPX Wcircumflex ccedilla.sc -45
-KPX Wcircumflex ograve.sc -25
-KPX Wcircumflex oacute.sc -35
-KPX Wcircumflex ocircumflex.sc -25
-KPX Wcircumflex otilde.sc -25
-KPX Wcircumflex odieresis.sc -25
-KPX Wcircumflex oslash.sc -45
-KPX Wcircumflex amacron.sc -50
-KPX Wcircumflex abreve.sc -50
-KPX Wcircumflex aogonek.sc -95
-KPX Wcircumflex cacute.sc -35
-KPX Wcircumflex ccircumflex.sc -25
-KPX Wcircumflex cdotaccent.sc -25
-KPX Wcircumflex ccaron.sc -25
-KPX Wcircumflex gcircumflex.sc -25
-KPX Wcircumflex gbreve.sc -25
-KPX Wcircumflex gdotaccent.sc -25
-KPX Wcircumflex gcommaaccent.sc -45
-KPX Wcircumflex omacron.sc -25
-KPX Wcircumflex obreve.sc -25
-KPX Wcircumflex ohungarumlaut.sc -25
-KPX Wcircumflex oe.sc -40
-KPX Wcircumflex sacute.sc -25
-KPX Wcircumflex scircumflex.sc -15
-KPX Wcircumflex scedilla.sc -35
-KPX Wcircumflex scaron.sc -15
-KPX Wcircumflex tcaron.sc 5
-KPX Wcircumflex gcaron.sc -25
-KPX Wcircumflex oogonek.sc -45
-KPX Wcircumflex gacute.sc -35
-KPX Wcircumflex aeacute.sc -80
-KPX Wcircumflex ahookabove.sc -50
-KPX Wcircumflex acircumflexdotbelow.sc -50
-KPX Wcircumflex abrevedotbelow.sc -50
-KPX Wcircumflex ohookabove.sc -25
-KPX Wcircumflex ocircumflexdotbelow.sc -25
-KPX Wcircumflex ohornacute.sc -25
-KPX Wcircumflex ohorngrave.sc -25
-KPX Wcircumflex ohornhookabove.sc -25
-KPX Wcircumflex ohorntilde.sc -25
-KPX Wcircumflex ohorndotbelow.sc -25
KPX wcircumflex comma -65
KPX wcircumflex hyphen -25
KPX wcircumflex period -70
@@ -12081,6 +12343,21 @@ KPX wcircumflex oogonek -35
KPX wcircumflex gacute -45
KPX wcircumflex aeacute -25
KPX wcircumflex uni0219 -25
+KPX Ycircumflex zdotaccent -67
+KPX Ycircumflex zcaron -67
+KPX Ycircumflex zacute -67
+KPX Ycircumflex z -67
+KPX Ycircumflex scircumflex -67
+KPX Ycircumflex scedilla -67
+KPX Ycircumflex scaron -67
+KPX Ycircumflex sacute -67
+KPX Ycircumflex s -67
+KPX Ycircumflex cdotaccent -67
+KPX Ycircumflex ccircumflex -67
+KPX Ycircumflex ccedilla -67
+KPX Ycircumflex ccaron -67
+KPX Ycircumflex cacute -67
+KPX Ycircumflex c -67
KPX Ycircumflex comma -95
KPX Ycircumflex hyphen -100
KPX Ycircumflex period -105
@@ -12204,61 +12481,117 @@ KPX Ycircumflex uhorntilde -40
KPX Ycircumflex uhorndotbelow -40
KPX Ycircumflex guilsinglleft -145
KPX Ycircumflex abrevedotbelow.sc -30
+KPX Ycircumflex abrevedotbelow.sc -30
KPX Ycircumflex acircumflexdotbelow.sc -30
+KPX Ycircumflex acircumflexdotbelow.sc -30
+KPX Ycircumflex ahookabove.sc -30
KPX Ycircumflex ahookabove.sc -30
KPX Ycircumflex gacute.sc -45
+KPX Ycircumflex gacute.sc -45
+KPX Ycircumflex gcaron.sc -30
KPX Ycircumflex gcaron.sc -30
KPX Ycircumflex jacute.sc -25
+KPX Ycircumflex jacute.sc -25
KPX Ycircumflex ocircumflexdotbelow.sc -30
+KPX Ycircumflex ocircumflexdotbelow.sc -30
+KPX Ycircumflex oe.sc -40
KPX Ycircumflex oe.sc -40
KPX Ycircumflex ohookabove.sc -30
+KPX Ycircumflex ohookabove.sc -30
+KPX Ycircumflex ohornacute.sc -30
KPX Ycircumflex ohornacute.sc -30
KPX Ycircumflex ohorndotbelow.sc -30
+KPX Ycircumflex ohorndotbelow.sc -30
+KPX Ycircumflex ohorngrave.sc -30
KPX Ycircumflex ohorngrave.sc -30
KPX Ycircumflex ohornhookabove.sc -30
+KPX Ycircumflex ohornhookabove.sc -30
+KPX Ycircumflex ohorntilde.sc -30
KPX Ycircumflex ohorntilde.sc -30
KPX Ycircumflex oogonek.sc -60
+KPX Ycircumflex oogonek.sc -60
+KPX Ycircumflex scaron.sc -20
KPX Ycircumflex scaron.sc -20
KPX Ycircumflex Jacute -30
KPX Ycircumflex abreve.sc -30
+KPX Ycircumflex abreve.sc -30
KPX Ycircumflex amacron.sc -30
+KPX Ycircumflex amacron.sc -30
+KPX Ycircumflex aogonek.sc -65
KPX Ycircumflex aogonek.sc -65
KPX Ycircumflex aeacute.sc -80
+KPX Ycircumflex aeacute.sc -80
+KPX Ycircumflex cacute.sc -45
KPX Ycircumflex cacute.sc -45
KPX Ycircumflex ccaron.sc -30
+KPX Ycircumflex ccaron.sc -30
+KPX Ycircumflex ccircumflex.sc -30
KPX Ycircumflex ccircumflex.sc -30
KPX Ycircumflex cdotaccent.sc -30
+KPX Ycircumflex cdotaccent.sc -30
KPX Ycircumflex gbreve.sc -30
+KPX Ycircumflex gbreve.sc -30
+KPX Ycircumflex gcircumflex.sc -30
KPX Ycircumflex gcircumflex.sc -30
KPX Ycircumflex gcommaaccent.sc -60
+KPX Ycircumflex gcommaaccent.sc -60
+KPX Ycircumflex gdotaccent.sc -30
KPX Ycircumflex gdotaccent.sc -30
KPX Ycircumflex obreve.sc -30
+KPX Ycircumflex obreve.sc -30
+KPX Ycircumflex ohungarumlaut.sc -30
KPX Ycircumflex ohungarumlaut.sc -30
KPX Ycircumflex omacron.sc -30
+KPX Ycircumflex omacron.sc -30
+KPX Ycircumflex sacute.sc -30
KPX Ycircumflex sacute.sc -30
KPX Ycircumflex scedilla.sc -40
+KPX Ycircumflex scedilla.sc -40
KPX Ycircumflex scircumflex.sc -20
+KPX Ycircumflex scircumflex.sc -20
+KPX Ycircumflex tcaron.sc 5
KPX Ycircumflex tcaron.sc 5
KPX Ycircumflex a.sc -65
+KPX Ycircumflex a.sc -65
+KPX Ycircumflex c.sc -60
KPX Ycircumflex c.sc -60
KPX Ycircumflex g.sc -60
+KPX Ycircumflex g.sc -60
KPX Ycircumflex j.sc -25
+KPX Ycircumflex j.sc -25
+KPX Ycircumflex o.sc -60
KPX Ycircumflex o.sc -60
KPX Ycircumflex s.sc -40
+KPX Ycircumflex s.sc -40
+KPX Ycircumflex t.sc 15
KPX Ycircumflex t.sc 15
KPX Ycircumflex agrave.sc -30
+KPX Ycircumflex agrave.sc -30
KPX Ycircumflex aacute.sc -45
+KPX Ycircumflex aacute.sc -45
+KPX Ycircumflex acircumflex.sc -30
KPX Ycircumflex acircumflex.sc -30
KPX Ycircumflex atilde.sc -30
+KPX Ycircumflex atilde.sc -30
+KPX Ycircumflex adieresis.sc -30
KPX Ycircumflex adieresis.sc -30
KPX Ycircumflex aring.sc -30
+KPX Ycircumflex aring.sc -30
+KPX Ycircumflex ae.sc -80
KPX Ycircumflex ae.sc -80
KPX Ycircumflex ccedilla.sc -60
+KPX Ycircumflex ccedilla.sc -60
+KPX Ycircumflex ograve.sc -30
KPX Ycircumflex ograve.sc -30
KPX Ycircumflex oacute.sc -45
+KPX Ycircumflex oacute.sc -45
KPX Ycircumflex ocircumflex.sc -30
+KPX Ycircumflex ocircumflex.sc -30
+KPX Ycircumflex otilde.sc -30
KPX Ycircumflex otilde.sc -30
KPX Ycircumflex odieresis.sc -30
+KPX Ycircumflex odieresis.sc -30
+KPX Ycircumflex oslash.sc -60
KPX Ycircumflex oslash.sc -60
KPX Ycircumflex a.pc -65
KPX Ycircumflex c.pc -60
@@ -12318,62 +12651,6 @@ KPX Ycircumflex ohornhookabove.pc -30
KPX Ycircumflex ohorntilde.pc -30
KPX Ycircumflex ohorndotbelow.pc -30
KPX Ycircumflex jacute.pc -25
-KPX Ycircumflex a.sc -65
-KPX Ycircumflex c.sc -60
-KPX Ycircumflex g.sc -60
-KPX Ycircumflex j.sc -25
-KPX Ycircumflex o.sc -60
-KPX Ycircumflex s.sc -40
-KPX Ycircumflex t.sc 15
-KPX Ycircumflex agrave.sc -30
-KPX Ycircumflex aacute.sc -45
-KPX Ycircumflex acircumflex.sc -30
-KPX Ycircumflex atilde.sc -30
-KPX Ycircumflex adieresis.sc -30
-KPX Ycircumflex aring.sc -30
-KPX Ycircumflex ae.sc -80
-KPX Ycircumflex ccedilla.sc -60
-KPX Ycircumflex ograve.sc -30
-KPX Ycircumflex oacute.sc -45
-KPX Ycircumflex ocircumflex.sc -30
-KPX Ycircumflex otilde.sc -30
-KPX Ycircumflex odieresis.sc -30
-KPX Ycircumflex oslash.sc -60
-KPX Ycircumflex amacron.sc -30
-KPX Ycircumflex abreve.sc -30
-KPX Ycircumflex aogonek.sc -65
-KPX Ycircumflex cacute.sc -45
-KPX Ycircumflex ccircumflex.sc -30
-KPX Ycircumflex cdotaccent.sc -30
-KPX Ycircumflex ccaron.sc -30
-KPX Ycircumflex gcircumflex.sc -30
-KPX Ycircumflex gbreve.sc -30
-KPX Ycircumflex gdotaccent.sc -30
-KPX Ycircumflex gcommaaccent.sc -60
-KPX Ycircumflex omacron.sc -30
-KPX Ycircumflex obreve.sc -30
-KPX Ycircumflex ohungarumlaut.sc -30
-KPX Ycircumflex oe.sc -40
-KPX Ycircumflex sacute.sc -30
-KPX Ycircumflex scircumflex.sc -20
-KPX Ycircumflex scedilla.sc -40
-KPX Ycircumflex scaron.sc -20
-KPX Ycircumflex tcaron.sc 5
-KPX Ycircumflex gcaron.sc -30
-KPX Ycircumflex oogonek.sc -60
-KPX Ycircumflex gacute.sc -45
-KPX Ycircumflex aeacute.sc -80
-KPX Ycircumflex ahookabove.sc -30
-KPX Ycircumflex acircumflexdotbelow.sc -30
-KPX Ycircumflex abrevedotbelow.sc -30
-KPX Ycircumflex ohookabove.sc -30
-KPX Ycircumflex ocircumflexdotbelow.sc -30
-KPX Ycircumflex ohornacute.sc -30
-KPX Ycircumflex ohorngrave.sc -30
-KPX Ycircumflex ohornhookabove.sc -30
-KPX Ycircumflex ohorntilde.sc -30
-KPX Ycircumflex ohorndotbelow.sc -30
-KPX Ycircumflex jacute.sc -25
KPX ycircumflex comma -65
KPX ycircumflex hyphen -25
KPX ycircumflex period -75
@@ -12425,6 +12702,21 @@ KPX ycircumflex oogonek -40
KPX ycircumflex gacute -50
KPX ycircumflex aeacute -25
KPX ycircumflex uni0219 -25
+KPX Ydieresis zdotaccent -67
+KPX Ydieresis zcaron -67
+KPX Ydieresis zacute -67
+KPX Ydieresis z -67
+KPX Ydieresis scircumflex -67
+KPX Ydieresis scedilla -67
+KPX Ydieresis scaron -67
+KPX Ydieresis sacute -67
+KPX Ydieresis s -67
+KPX Ydieresis cdotaccent -67
+KPX Ydieresis ccircumflex -67
+KPX Ydieresis ccedilla -67
+KPX Ydieresis ccaron -67
+KPX Ydieresis cacute -67
+KPX Ydieresis c -67
KPX Ydieresis comma -95
KPX Ydieresis hyphen -100
KPX Ydieresis period -105
@@ -12548,62 +12840,118 @@ KPX Ydieresis uhorntilde -40
KPX Ydieresis uhorndotbelow -40
KPX Ydieresis guilsinglleft -145
KPX Ydieresis abrevedotbelow.sc -30
+KPX Ydieresis abrevedotbelow.sc -30
KPX Ydieresis acircumflexdotbelow.sc -30
+KPX Ydieresis acircumflexdotbelow.sc -30
+KPX Ydieresis ahookabove.sc -30
KPX Ydieresis ahookabove.sc -30
KPX Ydieresis gacute.sc -45
+KPX Ydieresis gacute.sc -45
KPX Ydieresis gcaron.sc -30
+KPX Ydieresis gcaron.sc -30
+KPX Ydieresis jacute.sc -25
KPX Ydieresis jacute.sc -25
KPX Ydieresis ocircumflexdotbelow.sc -30
+KPX Ydieresis ocircumflexdotbelow.sc -30
+KPX Ydieresis oe.sc -40
KPX Ydieresis oe.sc -40
KPX Ydieresis ohookabove.sc -30
+KPX Ydieresis ohookabove.sc -30
+KPX Ydieresis ohornacute.sc -30
KPX Ydieresis ohornacute.sc -30
KPX Ydieresis ohorndotbelow.sc -30
+KPX Ydieresis ohorndotbelow.sc -30
+KPX Ydieresis ohorngrave.sc -30
KPX Ydieresis ohorngrave.sc -30
KPX Ydieresis ohornhookabove.sc -30
+KPX Ydieresis ohornhookabove.sc -30
KPX Ydieresis ohorntilde.sc -30
+KPX Ydieresis ohorntilde.sc -30
+KPX Ydieresis oogonek.sc -60
KPX Ydieresis oogonek.sc -60
KPX Ydieresis scaron.sc -20
+KPX Ydieresis scaron.sc -20
KPX Ydieresis Jacute -30
KPX Ydieresis abreve.sc -30
+KPX Ydieresis abreve.sc -30
KPX Ydieresis amacron.sc -30
+KPX Ydieresis amacron.sc -30
+KPX Ydieresis aogonek.sc -65
KPX Ydieresis aogonek.sc -65
KPX Ydieresis aeacute.sc -80
+KPX Ydieresis aeacute.sc -80
+KPX Ydieresis cacute.sc -45
KPX Ydieresis cacute.sc -45
KPX Ydieresis ccaron.sc -30
+KPX Ydieresis ccaron.sc -30
KPX Ydieresis ccircumflex.sc -30
+KPX Ydieresis ccircumflex.sc -30
+KPX Ydieresis cdotaccent.sc -30
KPX Ydieresis cdotaccent.sc -30
KPX Ydieresis gbreve.sc -30
+KPX Ydieresis gbreve.sc -30
+KPX Ydieresis gcircumflex.sc -30
KPX Ydieresis gcircumflex.sc -30
KPX Ydieresis gcommaaccent.sc -60
+KPX Ydieresis gcommaaccent.sc -60
+KPX Ydieresis gdotaccent.sc -30
KPX Ydieresis gdotaccent.sc -30
KPX Ydieresis obreve.sc -30
+KPX Ydieresis obreve.sc -30
+KPX Ydieresis ohungarumlaut.sc -30
KPX Ydieresis ohungarumlaut.sc -30
KPX Ydieresis omacron.sc -30
+KPX Ydieresis omacron.sc -30
KPX Ydieresis sacute.sc -30
+KPX Ydieresis sacute.sc -30
+KPX Ydieresis scedilla.sc -40
KPX Ydieresis scedilla.sc -40
KPX Ydieresis scircumflex.sc -20
+KPX Ydieresis scircumflex.sc -20
+KPX Ydieresis tcaron.sc 5
KPX Ydieresis tcaron.sc 5
KPX Ydieresis a.sc -65
+KPX Ydieresis a.sc -65
+KPX Ydieresis c.sc -60
KPX Ydieresis c.sc -60
KPX Ydieresis g.sc -60
+KPX Ydieresis g.sc -60
+KPX Ydieresis j.sc -25
KPX Ydieresis j.sc -25
KPX Ydieresis o.sc -60
+KPX Ydieresis o.sc -60
KPX Ydieresis s.sc -40
+KPX Ydieresis s.sc -40
+KPX Ydieresis t.sc 15
KPX Ydieresis t.sc 15
KPX Ydieresis agrave.sc -30
+KPX Ydieresis agrave.sc -30
+KPX Ydieresis aacute.sc -45
KPX Ydieresis aacute.sc -45
KPX Ydieresis acircumflex.sc -30
+KPX Ydieresis acircumflex.sc -30
+KPX Ydieresis atilde.sc -30
KPX Ydieresis atilde.sc -30
KPX Ydieresis adieresis.sc -30
+KPX Ydieresis adieresis.sc -30
+KPX Ydieresis aring.sc -30
KPX Ydieresis aring.sc -30
KPX Ydieresis ae.sc -80
+KPX Ydieresis ae.sc -80
KPX Ydieresis ccedilla.sc -60
+KPX Ydieresis ccedilla.sc -60
+KPX Ydieresis ograve.sc -30
KPX Ydieresis ograve.sc -30
KPX Ydieresis oacute.sc -45
+KPX Ydieresis oacute.sc -45
+KPX Ydieresis ocircumflex.sc -30
KPX Ydieresis ocircumflex.sc -30
KPX Ydieresis otilde.sc -30
+KPX Ydieresis otilde.sc -30
+KPX Ydieresis odieresis.sc -30
KPX Ydieresis odieresis.sc -30
KPX Ydieresis oslash.sc -60
+KPX Ydieresis oslash.sc -60
KPX Ydieresis a.pc -65
KPX Ydieresis c.pc -60
KPX Ydieresis g.pc -60
@@ -12662,62 +13010,6 @@ KPX Ydieresis ohornhookabove.pc -30
KPX Ydieresis ohorntilde.pc -30
KPX Ydieresis ohorndotbelow.pc -30
KPX Ydieresis jacute.pc -25
-KPX Ydieresis a.sc -65
-KPX Ydieresis c.sc -60
-KPX Ydieresis g.sc -60
-KPX Ydieresis j.sc -25
-KPX Ydieresis o.sc -60
-KPX Ydieresis s.sc -40
-KPX Ydieresis t.sc 15
-KPX Ydieresis agrave.sc -30
-KPX Ydieresis aacute.sc -45
-KPX Ydieresis acircumflex.sc -30
-KPX Ydieresis atilde.sc -30
-KPX Ydieresis adieresis.sc -30
-KPX Ydieresis aring.sc -30
-KPX Ydieresis ae.sc -80
-KPX Ydieresis ccedilla.sc -60
-KPX Ydieresis ograve.sc -30
-KPX Ydieresis oacute.sc -45
-KPX Ydieresis ocircumflex.sc -30
-KPX Ydieresis otilde.sc -30
-KPX Ydieresis odieresis.sc -30
-KPX Ydieresis oslash.sc -60
-KPX Ydieresis amacron.sc -30
-KPX Ydieresis abreve.sc -30
-KPX Ydieresis aogonek.sc -65
-KPX Ydieresis cacute.sc -45
-KPX Ydieresis ccircumflex.sc -30
-KPX Ydieresis cdotaccent.sc -30
-KPX Ydieresis ccaron.sc -30
-KPX Ydieresis gcircumflex.sc -30
-KPX Ydieresis gbreve.sc -30
-KPX Ydieresis gdotaccent.sc -30
-KPX Ydieresis gcommaaccent.sc -60
-KPX Ydieresis omacron.sc -30
-KPX Ydieresis obreve.sc -30
-KPX Ydieresis ohungarumlaut.sc -30
-KPX Ydieresis oe.sc -40
-KPX Ydieresis sacute.sc -30
-KPX Ydieresis scircumflex.sc -20
-KPX Ydieresis scedilla.sc -40
-KPX Ydieresis scaron.sc -20
-KPX Ydieresis tcaron.sc 5
-KPX Ydieresis gcaron.sc -30
-KPX Ydieresis oogonek.sc -60
-KPX Ydieresis gacute.sc -45
-KPX Ydieresis aeacute.sc -80
-KPX Ydieresis ahookabove.sc -30
-KPX Ydieresis acircumflexdotbelow.sc -30
-KPX Ydieresis abrevedotbelow.sc -30
-KPX Ydieresis ohookabove.sc -30
-KPX Ydieresis ocircumflexdotbelow.sc -30
-KPX Ydieresis ohornacute.sc -30
-KPX Ydieresis ohorngrave.sc -30
-KPX Ydieresis ohornhookabove.sc -30
-KPX Ydieresis ohorntilde.sc -30
-KPX Ydieresis ohorndotbelow.sc -30
-KPX Ydieresis jacute.sc -25
KPX Zacute v -50
KPX Zacute y -50
KPX Zacute ydieresis -50
@@ -12750,22 +13042,40 @@ KPX Gcaron Wgrave -20
KPX Gcaron Wacute -20
KPX Gcaron Wdieresis -20
KPX Gcaron amacron.sc -20
+KPX Gcaron amacron.sc -20
KPX Gcaron aogonek.sc -20
+KPX Gcaron aogonek.sc -20
+KPX Gcaron aeacute.sc -15
KPX Gcaron aeacute.sc -15
KPX Gcaron tcaron.sc -15
+KPX Gcaron tcaron.sc -15
+KPX Gcaron wacute.sc -15
KPX Gcaron wacute.sc -15
KPX Gcaron wcircumflex.sc -15
+KPX Gcaron wcircumflex.sc -15
+KPX Gcaron wdieresis.sc -15
KPX Gcaron wdieresis.sc -15
KPX Gcaron wgrave.sc -15
+KPX Gcaron wgrave.sc -15
+KPX Gcaron ycircumflex.sc -20
KPX Gcaron ycircumflex.sc -20
KPX Gcaron a.sc -20
+KPX Gcaron a.sc -20
KPX Gcaron t.sc -15
+KPX Gcaron t.sc -15
+KPX Gcaron v.sc -20
KPX Gcaron v.sc -20
KPX Gcaron w.sc -15
+KPX Gcaron w.sc -15
+KPX Gcaron y.sc -20
KPX Gcaron y.sc -20
KPX Gcaron adieresis.sc -20
+KPX Gcaron adieresis.sc -20
+KPX Gcaron aring.sc -20
KPX Gcaron aring.sc -20
KPX Gcaron ae.sc -15
+KPX Gcaron ae.sc -15
+KPX Gcaron ydieresis.sc -20
KPX Gcaron ydieresis.sc -20
KPX Gcaron a.pc -20
KPX Gcaron t.pc -15
@@ -12786,24 +13096,6 @@ KPX Gcaron uni021B.pc -15
KPX Gcaron wgrave.pc -15
KPX Gcaron wacute.pc -15
KPX Gcaron wdieresis.pc -15
-KPX Gcaron a.sc -20
-KPX Gcaron t.sc -15
-KPX Gcaron v.sc -20
-KPX Gcaron w.sc -15
-KPX Gcaron y.sc -20
-KPX Gcaron adieresis.sc -20
-KPX Gcaron aring.sc -20
-KPX Gcaron ae.sc -15
-KPX Gcaron ydieresis.sc -20
-KPX Gcaron amacron.sc -20
-KPX Gcaron aogonek.sc -20
-KPX Gcaron tcaron.sc -15
-KPX Gcaron wcircumflex.sc -15
-KPX Gcaron ycircumflex.sc -20
-KPX Gcaron aeacute.sc -15
-KPX Gcaron wgrave.sc -15
-KPX Gcaron wacute.sc -15
-KPX Gcaron wdieresis.sc -15
KPX gcaron a -20
KPX gcaron e -25
KPX gcaron r 10
@@ -12841,22 +13133,39 @@ KPX Oogonek Wgrave -55
KPX Oogonek Wacute -55
KPX Oogonek Wdieresis -55
KPX Oogonek amacron.sc -50
+KPX Oogonek amacron.sc -50
KPX Oogonek aogonek.sc -50
+KPX Oogonek aogonek.sc -50
+KPX Oogonek aeacute.sc -40
KPX Oogonek aeacute.sc -40
KPX Oogonek wacute.sc -45
+KPX Oogonek wacute.sc -45
+KPX Oogonek wcircumflex.sc -45
KPX Oogonek wcircumflex.sc -45
KPX Oogonek wdieresis.sc -45
+KPX Oogonek wdieresis.sc -45
+KPX Oogonek wgrave.sc -45
KPX Oogonek wgrave.sc -45
KPX Oogonek ycircumflex.sc -60
+KPX Oogonek ycircumflex.sc -60
+KPX Oogonek a.sc -50
KPX Oogonek a.sc -50
KPX Oogonek v.sc -60
+KPX Oogonek v.sc -60
KPX Oogonek w.sc -45
+KPX Oogonek w.sc -45
+KPX Oogonek x.sc -45
KPX Oogonek x.sc -45
KPX Oogonek y.sc -60
+KPX Oogonek y.sc -60
+KPX Oogonek adieresis.sc -50
KPX Oogonek adieresis.sc -50
KPX Oogonek aring.sc -50
+KPX Oogonek aring.sc -50
+KPX Oogonek ae.sc -40
KPX Oogonek ae.sc -40
KPX Oogonek ydieresis.sc -60
+KPX Oogonek ydieresis.sc -60
KPX Oogonek a.pc -50
KPX Oogonek v.pc -60
KPX Oogonek w.pc -45
@@ -12874,23 +13183,6 @@ KPX Oogonek aeacute.pc -40
KPX Oogonek wgrave.pc -45
KPX Oogonek wacute.pc -45
KPX Oogonek wdieresis.pc -45
-KPX Oogonek a.sc -50
-KPX Oogonek v.sc -60
-KPX Oogonek w.sc -45
-KPX Oogonek x.sc -45
-KPX Oogonek y.sc -60
-KPX Oogonek adieresis.sc -50
-KPX Oogonek aring.sc -50
-KPX Oogonek ae.sc -40
-KPX Oogonek ydieresis.sc -60
-KPX Oogonek amacron.sc -50
-KPX Oogonek aogonek.sc -50
-KPX Oogonek wcircumflex.sc -45
-KPX Oogonek ycircumflex.sc -60
-KPX Oogonek aeacute.sc -40
-KPX Oogonek wgrave.sc -45
-KPX Oogonek wacute.sc -45
-KPX Oogonek wdieresis.sc -45
KPX oogonek T -90
KPX oogonek v -35
KPX oogonek w -35
@@ -12922,22 +13214,40 @@ KPX Gacute Wgrave -20
KPX Gacute Wacute -20
KPX Gacute Wdieresis -20
KPX Gacute amacron.sc -20
+KPX Gacute amacron.sc -20
+KPX Gacute aogonek.sc -20
KPX Gacute aogonek.sc -20
KPX Gacute aeacute.sc -15
+KPX Gacute aeacute.sc -15
KPX Gacute tcaron.sc -15
+KPX Gacute tcaron.sc -15
+KPX Gacute wacute.sc -15
KPX Gacute wacute.sc -15
KPX Gacute wcircumflex.sc -15
+KPX Gacute wcircumflex.sc -15
+KPX Gacute wdieresis.sc -15
KPX Gacute wdieresis.sc -15
KPX Gacute wgrave.sc -15
+KPX Gacute wgrave.sc -15
+KPX Gacute ycircumflex.sc -20
KPX Gacute ycircumflex.sc -20
KPX Gacute a.sc -20
+KPX Gacute a.sc -20
+KPX Gacute t.sc -15
KPX Gacute t.sc -15
KPX Gacute v.sc -20
+KPX Gacute v.sc -20
KPX Gacute w.sc -15
+KPX Gacute w.sc -15
+KPX Gacute y.sc -20
KPX Gacute y.sc -20
KPX Gacute adieresis.sc -20
+KPX Gacute adieresis.sc -20
+KPX Gacute aring.sc -20
KPX Gacute aring.sc -20
KPX Gacute ae.sc -15
+KPX Gacute ae.sc -15
+KPX Gacute ydieresis.sc -20
KPX Gacute ydieresis.sc -20
KPX Gacute a.pc -20
KPX Gacute t.pc -15
@@ -12958,24 +13268,6 @@ KPX Gacute uni021B.pc -15
KPX Gacute wgrave.pc -15
KPX Gacute wacute.pc -15
KPX Gacute wdieresis.pc -15
-KPX Gacute a.sc -20
-KPX Gacute t.sc -15
-KPX Gacute v.sc -20
-KPX Gacute w.sc -15
-KPX Gacute y.sc -20
-KPX Gacute adieresis.sc -20
-KPX Gacute aring.sc -20
-KPX Gacute ae.sc -15
-KPX Gacute ydieresis.sc -20
-KPX Gacute amacron.sc -20
-KPX Gacute aogonek.sc -20
-KPX Gacute tcaron.sc -15
-KPX Gacute wcircumflex.sc -15
-KPX Gacute ycircumflex.sc -20
-KPX Gacute aeacute.sc -15
-KPX Gacute wgrave.sc -15
-KPX Gacute wacute.sc -15
-KPX Gacute wdieresis.sc -15
KPX gacute a -20
KPX gacute e -25
KPX gacute r 10
@@ -13027,23 +13319,41 @@ KPX uni0218 Wgrave -20
KPX uni0218 Wacute -20
KPX uni0218 Wdieresis -20
KPX uni0218 amacron.sc -30
+KPX uni0218 amacron.sc -30
KPX uni0218 aogonek.sc -30
+KPX uni0218 aogonek.sc -30
+KPX uni0218 aeacute.sc -25
KPX uni0218 aeacute.sc -25
KPX uni0218 tcaron.sc -15
+KPX uni0218 tcaron.sc -15
KPX uni0218 wacute.sc -15
+KPX uni0218 wacute.sc -15
+KPX uni0218 wcircumflex.sc -15
KPX uni0218 wcircumflex.sc -15
KPX uni0218 wdieresis.sc -15
+KPX uni0218 wdieresis.sc -15
+KPX uni0218 wgrave.sc -15
KPX uni0218 wgrave.sc -15
KPX uni0218 ycircumflex.sc -25
+KPX uni0218 ycircumflex.sc -25
+KPX uni0218 a.sc -30
KPX uni0218 a.sc -30
KPX uni0218 t.sc -15
+KPX uni0218 t.sc -15
+KPX uni0218 v.sc -20
KPX uni0218 v.sc -20
KPX uni0218 w.sc -15
+KPX uni0218 w.sc -15
KPX uni0218 y.sc -25
+KPX uni0218 y.sc -25
+KPX uni0218 adieresis.sc -30
KPX uni0218 adieresis.sc -30
KPX uni0218 aring.sc -30
+KPX uni0218 aring.sc -30
+KPX uni0218 ae.sc -25
KPX uni0218 ae.sc -25
KPX uni0218 ydieresis.sc -25
+KPX uni0218 ydieresis.sc -25
KPX uni0218 a.pc -30
KPX uni0218 t.pc -15
KPX uni0218 v.pc -20
@@ -13063,24 +13373,6 @@ KPX uni0218 uni021B.pc -15
KPX uni0218 wgrave.pc -15
KPX uni0218 wacute.pc -15
KPX uni0218 wdieresis.pc -15
-KPX uni0218 a.sc -30
-KPX uni0218 t.sc -15
-KPX uni0218 v.sc -20
-KPX uni0218 w.sc -15
-KPX uni0218 y.sc -25
-KPX uni0218 adieresis.sc -30
-KPX uni0218 aring.sc -30
-KPX uni0218 ae.sc -25
-KPX uni0218 ydieresis.sc -25
-KPX uni0218 amacron.sc -30
-KPX uni0218 aogonek.sc -30
-KPX uni0218 tcaron.sc -15
-KPX uni0218 wcircumflex.sc -15
-KPX uni0218 ycircumflex.sc -25
-KPX uni0218 aeacute.sc -25
-KPX uni0218 wgrave.sc -15
-KPX uni0218 wacute.sc -15
-KPX uni0218 wdieresis.sc -15
KPX uni0219 t -15
KPX uni0219 tcaron -15
KPX uni0219 uni021B -15
@@ -13225,38 +13517,70 @@ KPX uni021A yhookabove -50
KPX uni021A ytilde -50
KPX uni021A guilsinglleft -125
KPX uni021A abrevedotbelow.sc -25
+KPX uni021A abrevedotbelow.sc -25
KPX uni021A acircumflexdotbelow.sc -25
+KPX uni021A acircumflexdotbelow.sc -25
+KPX uni021A ahookabove.sc -25
KPX uni021A ahookabove.sc -25
KPX uni021A jacute.sc -15
+KPX uni021A jacute.sc -15
KPX uni021A oe.sc -40
+KPX uni021A oe.sc -40
+KPX uni021A yhookabove.sc 5
KPX uni021A yhookabove.sc 5
KPX uni021A ytilde.sc 5
+KPX uni021A ytilde.sc 5
KPX uni021A Jacute -20
KPX uni021A jacute -20
KPX uni021A abreve.sc -25
+KPX uni021A abreve.sc -25
KPX uni021A amacron.sc -25
+KPX uni021A amacron.sc -25
+KPX uni021A aogonek.sc -45
KPX uni021A aogonek.sc -45
KPX uni021A aeacute.sc -80
+KPX uni021A aeacute.sc -80
+KPX uni021A jcircumflex.sc -10
KPX uni021A jcircumflex.sc -10
KPX uni021A wacute.sc 15
+KPX uni021A wacute.sc 15
KPX uni021A wcircumflex.sc 10
+KPX uni021A wcircumflex.sc 10
+KPX uni021A wdieresis.sc 10
KPX uni021A wdieresis.sc 10
KPX uni021A wgrave.sc 10
+KPX uni021A wgrave.sc 10
+KPX uni021A ycircumflex.sc 5
KPX uni021A ycircumflex.sc 5
KPX uni021A ygrave.sc 5
+KPX uni021A ygrave.sc 5
+KPX uni021A a.sc -45
KPX uni021A a.sc -45
KPX uni021A j.sc -15
+KPX uni021A j.sc -15
+KPX uni021A v.sc 15
KPX uni021A v.sc 15
KPX uni021A w.sc 15
+KPX uni021A w.sc 15
KPX uni021A y.sc 10
+KPX uni021A y.sc 10
+KPX uni021A agrave.sc -25
KPX uni021A agrave.sc -25
KPX uni021A aacute.sc -35
+KPX uni021A aacute.sc -35
+KPX uni021A acircumflex.sc -25
KPX uni021A acircumflex.sc -25
KPX uni021A atilde.sc -25
+KPX uni021A atilde.sc -25
+KPX uni021A adieresis.sc -25
KPX uni021A adieresis.sc -25
KPX uni021A aring.sc -25
+KPX uni021A aring.sc -25
+KPX uni021A ae.sc -80
KPX uni021A ae.sc -80
KPX uni021A yacute.sc 5
+KPX uni021A yacute.sc 5
+KPX uni021A ydieresis.sc 5
KPX uni021A ydieresis.sc 5
KPX uni021A a.pc -45
KPX uni021A j.pc -15
@@ -13290,47 +13614,15 @@ KPX uni021A ygrave.pc 5
KPX uni021A yhookabove.pc 5
KPX uni021A ytilde.pc 5
KPX uni021A jacute.pc -15
-KPX uni021A a.sc -45
-KPX uni021A j.sc -15
-KPX uni021A v.sc 15
-KPX uni021A w.sc 15
-KPX uni021A y.sc 10
-KPX uni021A agrave.sc -25
-KPX uni021A aacute.sc -35
-KPX uni021A acircumflex.sc -25
-KPX uni021A atilde.sc -25
-KPX uni021A adieresis.sc -25
-KPX uni021A aring.sc -25
-KPX uni021A ae.sc -80
-KPX uni021A yacute.sc 5
-KPX uni021A ydieresis.sc 5
-KPX uni021A amacron.sc -25
-KPX uni021A abreve.sc -25
-KPX uni021A aogonek.sc -45
-KPX uni021A jcircumflex.sc -10
-KPX uni021A oe.sc -40
-KPX uni021A wcircumflex.sc 10
-KPX uni021A ycircumflex.sc 5
-KPX uni021A aeacute.sc -80
-KPX uni021A wgrave.sc 10
-KPX uni021A wacute.sc 15
-KPX uni021A wdieresis.sc 10
-KPX uni021A ahookabove.sc -25
-KPX uni021A acircumflexdotbelow.sc -25
-KPX uni021A abrevedotbelow.sc -25
-KPX uni021A ygrave.sc 5
-KPX uni021A yhookabove.sc 5
-KPX uni021A ytilde.sc 5
-KPX uni021A jacute.sc -15
KPX uni021B quoteright -30
KPX ringhalfright A -85
KPX ringhalfright a.sc -95
-KPX ringhalfright a.pc -95
KPX ringhalfright a.sc -95
+KPX ringhalfright a.pc -95
KPX ringhalfleft A -85
KPX ringhalfleft a.sc -95
-KPX ringhalfleft a.pc -95
KPX ringhalfleft a.sc -95
+KPX ringhalfleft a.pc -95
KPX Rdotaccent hyphen -50
KPX Rdotaccent C -40
KPX Rdotaccent G -45
@@ -13400,44 +13692,84 @@ KPX Rdotaccent Wgrave -70
KPX Rdotaccent Wacute -70
KPX Rdotaccent Wdieresis -70
KPX Rdotaccent gacute.sc -40
+KPX Rdotaccent gacute.sc -40
+KPX Rdotaccent gcaron.sc -40
KPX Rdotaccent gcaron.sc -40
KPX Rdotaccent oe.sc -35
+KPX Rdotaccent oe.sc -35
+KPX Rdotaccent oogonek.sc -40
KPX Rdotaccent oogonek.sc -40
KPX Rdotaccent cacute.sc -35
+KPX Rdotaccent cacute.sc -35
+KPX Rdotaccent ccaron.sc -35
KPX Rdotaccent ccaron.sc -35
KPX Rdotaccent ccircumflex.sc -35
+KPX Rdotaccent ccircumflex.sc -35
+KPX Rdotaccent cdotaccent.sc -35
KPX Rdotaccent cdotaccent.sc -35
KPX Rdotaccent gbreve.sc -40
+KPX Rdotaccent gbreve.sc -40
KPX Rdotaccent gcircumflex.sc -40
+KPX Rdotaccent gcircumflex.sc -40
+KPX Rdotaccent gcommaaccent.sc -40
KPX Rdotaccent gcommaaccent.sc -40
KPX Rdotaccent gdotaccent.sc -40
+KPX Rdotaccent gdotaccent.sc -40
+KPX Rdotaccent obreve.sc -40
KPX Rdotaccent obreve.sc -40
KPX Rdotaccent ohungarumlaut.sc -40
+KPX Rdotaccent ohungarumlaut.sc -40
+KPX Rdotaccent omacron.sc -40
KPX Rdotaccent omacron.sc -40
KPX Rdotaccent tcaron.sc -30
+KPX Rdotaccent tcaron.sc -30
+KPX Rdotaccent ubreve.sc -45
KPX Rdotaccent ubreve.sc -45
KPX Rdotaccent uhungarumlaut.sc -45
+KPX Rdotaccent uhungarumlaut.sc -45
KPX Rdotaccent umacron.sc -45
+KPX Rdotaccent umacron.sc -45
+KPX Rdotaccent uogonek.sc -45
KPX Rdotaccent uogonek.sc -45
KPX Rdotaccent uring.sc -45
+KPX Rdotaccent uring.sc -45
+KPX Rdotaccent wacute.sc -60
KPX Rdotaccent wacute.sc -60
KPX Rdotaccent wcircumflex.sc -60
+KPX Rdotaccent wcircumflex.sc -60
+KPX Rdotaccent wdieresis.sc -60
KPX Rdotaccent wdieresis.sc -60
KPX Rdotaccent wgrave.sc -60
+KPX Rdotaccent wgrave.sc -60
+KPX Rdotaccent ycircumflex.sc -65
KPX Rdotaccent ycircumflex.sc -65
KPX Rdotaccent c.sc -35
+KPX Rdotaccent c.sc -35
KPX Rdotaccent g.sc -40
+KPX Rdotaccent g.sc -40
+KPX Rdotaccent o.sc -40
KPX Rdotaccent o.sc -40
KPX Rdotaccent t.sc -30
+KPX Rdotaccent t.sc -30
+KPX Rdotaccent u.sc -45
KPX Rdotaccent u.sc -45
KPX Rdotaccent v.sc -65
+KPX Rdotaccent v.sc -65
+KPX Rdotaccent w.sc -60
KPX Rdotaccent w.sc -60
KPX Rdotaccent y.sc -65
+KPX Rdotaccent y.sc -65
+KPX Rdotaccent ccedilla.sc -35
KPX Rdotaccent ccedilla.sc -35
KPX Rdotaccent odieresis.sc -40
+KPX Rdotaccent odieresis.sc -40
KPX Rdotaccent oslash.sc -40
+KPX Rdotaccent oslash.sc -40
+KPX Rdotaccent ucircumflex.sc -45
KPX Rdotaccent ucircumflex.sc -45
KPX Rdotaccent udieresis.sc -45
+KPX Rdotaccent udieresis.sc -45
+KPX Rdotaccent ydieresis.sc -65
KPX Rdotaccent ydieresis.sc -65
KPX Rdotaccent c.pc -35
KPX Rdotaccent g.pc -40
@@ -13480,46 +13812,6 @@ KPX Rdotaccent uni021B.pc -30
KPX Rdotaccent wgrave.pc -60
KPX Rdotaccent wacute.pc -60
KPX Rdotaccent wdieresis.pc -60
-KPX Rdotaccent c.sc -35
-KPX Rdotaccent g.sc -40
-KPX Rdotaccent o.sc -40
-KPX Rdotaccent t.sc -30
-KPX Rdotaccent u.sc -45
-KPX Rdotaccent v.sc -65
-KPX Rdotaccent w.sc -60
-KPX Rdotaccent y.sc -65
-KPX Rdotaccent ccedilla.sc -35
-KPX Rdotaccent odieresis.sc -40
-KPX Rdotaccent oslash.sc -40
-KPX Rdotaccent ucircumflex.sc -45
-KPX Rdotaccent udieresis.sc -45
-KPX Rdotaccent ydieresis.sc -65
-KPX Rdotaccent cacute.sc -35
-KPX Rdotaccent ccircumflex.sc -35
-KPX Rdotaccent cdotaccent.sc -35
-KPX Rdotaccent ccaron.sc -35
-KPX Rdotaccent gcircumflex.sc -40
-KPX Rdotaccent gbreve.sc -40
-KPX Rdotaccent gdotaccent.sc -40
-KPX Rdotaccent gcommaaccent.sc -40
-KPX Rdotaccent omacron.sc -40
-KPX Rdotaccent obreve.sc -40
-KPX Rdotaccent ohungarumlaut.sc -40
-KPX Rdotaccent oe.sc -35
-KPX Rdotaccent tcaron.sc -30
-KPX Rdotaccent umacron.sc -45
-KPX Rdotaccent ubreve.sc -45
-KPX Rdotaccent uring.sc -45
-KPX Rdotaccent uhungarumlaut.sc -45
-KPX Rdotaccent uogonek.sc -45
-KPX Rdotaccent wcircumflex.sc -60
-KPX Rdotaccent ycircumflex.sc -65
-KPX Rdotaccent gcaron.sc -40
-KPX Rdotaccent oogonek.sc -40
-KPX Rdotaccent gacute.sc -40
-KPX Rdotaccent wgrave.sc -60
-KPX Rdotaccent wacute.sc -60
-KPX Rdotaccent wdieresis.sc -60
KPX rdotaccent comma -40
KPX rdotaccent hyphen -45
KPX rdotaccent period -50
@@ -13579,6 +13871,21 @@ KPX rdotaccent wacute 20
KPX rdotaccent wdieresis 20
KPX rdotaccent quoteright -20
KPX rdotaccent jacute 15
+KPX Wgrave zdotaccent -53
+KPX Wgrave zcaron -53
+KPX Wgrave zacute -53
+KPX Wgrave z -53
+KPX Wgrave scircumflex -60
+KPX Wgrave scedilla -60
+KPX Wgrave scaron -60
+KPX Wgrave sacute -60
+KPX Wgrave s -60
+KPX Wgrave cdotaccent -53
+KPX Wgrave ccircumflex -53
+KPX Wgrave ccedilla -53
+KPX Wgrave ccaron -53
+KPX Wgrave cacute -53
+KPX Wgrave c -53
KPX Wgrave comma -90
KPX Wgrave hyphen -55
KPX Wgrave period -95
@@ -13710,59 +14017,113 @@ KPX Wgrave yhookabove -25
KPX Wgrave ytilde -25
KPX Wgrave guilsinglleft -105
KPX Wgrave abrevedotbelow.sc -50
+KPX Wgrave abrevedotbelow.sc -50
+KPX Wgrave acircumflexdotbelow.sc -50
KPX Wgrave acircumflexdotbelow.sc -50
KPX Wgrave ahookabove.sc -50
+KPX Wgrave ahookabove.sc -50
+KPX Wgrave gacute.sc -35
KPX Wgrave gacute.sc -35
KPX Wgrave gcaron.sc -25
+KPX Wgrave gcaron.sc -25
+KPX Wgrave ocircumflexdotbelow.sc -25
KPX Wgrave ocircumflexdotbelow.sc -25
KPX Wgrave oe.sc -40
+KPX Wgrave oe.sc -40
+KPX Wgrave ohookabove.sc -25
KPX Wgrave ohookabove.sc -25
KPX Wgrave ohornacute.sc -25
+KPX Wgrave ohornacute.sc -25
+KPX Wgrave ohorndotbelow.sc -25
KPX Wgrave ohorndotbelow.sc -25
KPX Wgrave ohorngrave.sc -25
+KPX Wgrave ohorngrave.sc -25
KPX Wgrave ohornhookabove.sc -25
+KPX Wgrave ohornhookabove.sc -25
+KPX Wgrave ohorntilde.sc -25
KPX Wgrave ohorntilde.sc -25
KPX Wgrave oogonek.sc -45
+KPX Wgrave oogonek.sc -45
+KPX Wgrave scaron.sc -15
KPX Wgrave scaron.sc -15
KPX Wgrave abreve.sc -50
+KPX Wgrave abreve.sc -50
+KPX Wgrave amacron.sc -50
KPX Wgrave amacron.sc -50
KPX Wgrave aogonek.sc -95
+KPX Wgrave aogonek.sc -95
+KPX Wgrave aeacute.sc -80
KPX Wgrave aeacute.sc -80
KPX Wgrave cacute.sc -35
+KPX Wgrave cacute.sc -35
KPX Wgrave ccaron.sc -25
+KPX Wgrave ccaron.sc -25
+KPX Wgrave ccircumflex.sc -25
KPX Wgrave ccircumflex.sc -25
KPX Wgrave cdotaccent.sc -25
+KPX Wgrave cdotaccent.sc -25
+KPX Wgrave gbreve.sc -25
KPX Wgrave gbreve.sc -25
KPX Wgrave gcircumflex.sc -25
+KPX Wgrave gcircumflex.sc -25
+KPX Wgrave gcommaaccent.sc -45
KPX Wgrave gcommaaccent.sc -45
KPX Wgrave gdotaccent.sc -25
+KPX Wgrave gdotaccent.sc -25
+KPX Wgrave obreve.sc -25
KPX Wgrave obreve.sc -25
KPX Wgrave ohungarumlaut.sc -25
+KPX Wgrave ohungarumlaut.sc -25
KPX Wgrave omacron.sc -25
+KPX Wgrave omacron.sc -25
+KPX Wgrave sacute.sc -25
KPX Wgrave sacute.sc -25
KPX Wgrave scedilla.sc -35
+KPX Wgrave scedilla.sc -35
+KPX Wgrave scircumflex.sc -15
KPX Wgrave scircumflex.sc -15
KPX Wgrave tcaron.sc 5
+KPX Wgrave tcaron.sc 5
+KPX Wgrave a.sc -95
KPX Wgrave a.sc -95
KPX Wgrave c.sc -45
+KPX Wgrave c.sc -45
+KPX Wgrave g.sc -45
KPX Wgrave g.sc -45
KPX Wgrave o.sc -45
+KPX Wgrave o.sc -45
KPX Wgrave s.sc -35
+KPX Wgrave s.sc -35
+KPX Wgrave t.sc 15
KPX Wgrave t.sc 15
KPX Wgrave agrave.sc -50
+KPX Wgrave agrave.sc -50
+KPX Wgrave aacute.sc -70
KPX Wgrave aacute.sc -70
KPX Wgrave acircumflex.sc -50
+KPX Wgrave acircumflex.sc -50
+KPX Wgrave atilde.sc -50
KPX Wgrave atilde.sc -50
KPX Wgrave adieresis.sc -50
+KPX Wgrave adieresis.sc -50
+KPX Wgrave aring.sc -50
KPX Wgrave aring.sc -50
KPX Wgrave ae.sc -80
+KPX Wgrave ae.sc -80
KPX Wgrave ccedilla.sc -45
+KPX Wgrave ccedilla.sc -45
+KPX Wgrave ograve.sc -25
KPX Wgrave ograve.sc -25
KPX Wgrave oacute.sc -35
+KPX Wgrave oacute.sc -35
+KPX Wgrave ocircumflex.sc -25
KPX Wgrave ocircumflex.sc -25
KPX Wgrave otilde.sc -25
+KPX Wgrave otilde.sc -25
+KPX Wgrave odieresis.sc -25
KPX Wgrave odieresis.sc -25
KPX Wgrave oslash.sc -45
+KPX Wgrave oslash.sc -45
KPX Wgrave a.pc -95
KPX Wgrave c.pc -45
KPX Wgrave g.pc -45
@@ -13819,60 +14180,6 @@ KPX Wgrave ohorngrave.pc -25
KPX Wgrave ohornhookabove.pc -25
KPX Wgrave ohorntilde.pc -25
KPX Wgrave ohorndotbelow.pc -25
-KPX Wgrave a.sc -95
-KPX Wgrave c.sc -45
-KPX Wgrave g.sc -45
-KPX Wgrave o.sc -45
-KPX Wgrave s.sc -35
-KPX Wgrave t.sc 15
-KPX Wgrave agrave.sc -50
-KPX Wgrave aacute.sc -70
-KPX Wgrave acircumflex.sc -50
-KPX Wgrave atilde.sc -50
-KPX Wgrave adieresis.sc -50
-KPX Wgrave aring.sc -50
-KPX Wgrave ae.sc -80
-KPX Wgrave ccedilla.sc -45
-KPX Wgrave ograve.sc -25
-KPX Wgrave oacute.sc -35
-KPX Wgrave ocircumflex.sc -25
-KPX Wgrave otilde.sc -25
-KPX Wgrave odieresis.sc -25
-KPX Wgrave oslash.sc -45
-KPX Wgrave amacron.sc -50
-KPX Wgrave abreve.sc -50
-KPX Wgrave aogonek.sc -95
-KPX Wgrave cacute.sc -35
-KPX Wgrave ccircumflex.sc -25
-KPX Wgrave cdotaccent.sc -25
-KPX Wgrave ccaron.sc -25
-KPX Wgrave gcircumflex.sc -25
-KPX Wgrave gbreve.sc -25
-KPX Wgrave gdotaccent.sc -25
-KPX Wgrave gcommaaccent.sc -45
-KPX Wgrave omacron.sc -25
-KPX Wgrave obreve.sc -25
-KPX Wgrave ohungarumlaut.sc -25
-KPX Wgrave oe.sc -40
-KPX Wgrave sacute.sc -25
-KPX Wgrave scircumflex.sc -15
-KPX Wgrave scedilla.sc -35
-KPX Wgrave scaron.sc -15
-KPX Wgrave tcaron.sc 5
-KPX Wgrave gcaron.sc -25
-KPX Wgrave oogonek.sc -45
-KPX Wgrave gacute.sc -35
-KPX Wgrave aeacute.sc -80
-KPX Wgrave ahookabove.sc -50
-KPX Wgrave acircumflexdotbelow.sc -50
-KPX Wgrave abrevedotbelow.sc -50
-KPX Wgrave ohookabove.sc -25
-KPX Wgrave ocircumflexdotbelow.sc -25
-KPX Wgrave ohornacute.sc -25
-KPX Wgrave ohorngrave.sc -25
-KPX Wgrave ohornhookabove.sc -25
-KPX Wgrave ohorntilde.sc -25
-KPX Wgrave ohorndotbelow.sc -25
KPX wgrave comma -65
KPX wgrave hyphen -25
KPX wgrave period -70
@@ -13924,6 +14231,21 @@ KPX wgrave oogonek -35
KPX wgrave gacute -45
KPX wgrave aeacute -25
KPX wgrave uni0219 -25
+KPX Wacute zdotaccent -53
+KPX Wacute zcaron -53
+KPX Wacute zacute -53
+KPX Wacute z -53
+KPX Wacute scircumflex -60
+KPX Wacute scedilla -60
+KPX Wacute scaron -60
+KPX Wacute sacute -60
+KPX Wacute s -60
+KPX Wacute cdotaccent -53
+KPX Wacute ccircumflex -53
+KPX Wacute ccedilla -53
+KPX Wacute ccaron -53
+KPX Wacute cacute -53
+KPX Wacute c -53
KPX Wacute comma -90
KPX Wacute hyphen -55
KPX Wacute period -95
@@ -14055,58 +14377,112 @@ KPX Wacute yhookabove -25
KPX Wacute ytilde -25
KPX Wacute guilsinglleft -105
KPX Wacute abrevedotbelow.sc -50
+KPX Wacute abrevedotbelow.sc -50
+KPX Wacute acircumflexdotbelow.sc -50
KPX Wacute acircumflexdotbelow.sc -50
KPX Wacute ahookabove.sc -50
+KPX Wacute ahookabove.sc -50
KPX Wacute gacute.sc -35
+KPX Wacute gacute.sc -35
+KPX Wacute gcaron.sc -25
KPX Wacute gcaron.sc -25
KPX Wacute ocircumflexdotbelow.sc -25
+KPX Wacute ocircumflexdotbelow.sc -25
+KPX Wacute oe.sc -40
KPX Wacute oe.sc -40
KPX Wacute ohookabove.sc -25
+KPX Wacute ohookabove.sc -25
+KPX Wacute ohornacute.sc -25
KPX Wacute ohornacute.sc -25
KPX Wacute ohorndotbelow.sc -25
+KPX Wacute ohorndotbelow.sc -25
+KPX Wacute ohorngrave.sc -25
KPX Wacute ohorngrave.sc -25
KPX Wacute ohornhookabove.sc -25
+KPX Wacute ohornhookabove.sc -25
KPX Wacute ohorntilde.sc -25
+KPX Wacute ohorntilde.sc -25
+KPX Wacute oogonek.sc -45
KPX Wacute oogonek.sc -45
KPX Wacute scaron.sc -15
+KPX Wacute scaron.sc -15
+KPX Wacute abreve.sc -50
KPX Wacute abreve.sc -50
KPX Wacute amacron.sc -50
+KPX Wacute amacron.sc -50
+KPX Wacute aogonek.sc -95
KPX Wacute aogonek.sc -95
KPX Wacute aeacute.sc -80
+KPX Wacute aeacute.sc -80
+KPX Wacute cacute.sc -35
KPX Wacute cacute.sc -35
KPX Wacute ccaron.sc -25
+KPX Wacute ccaron.sc -25
KPX Wacute ccircumflex.sc -25
+KPX Wacute ccircumflex.sc -25
+KPX Wacute cdotaccent.sc -25
KPX Wacute cdotaccent.sc -25
KPX Wacute gbreve.sc -25
+KPX Wacute gbreve.sc -25
+KPX Wacute gcircumflex.sc -25
KPX Wacute gcircumflex.sc -25
KPX Wacute gcommaaccent.sc -45
+KPX Wacute gcommaaccent.sc -45
+KPX Wacute gdotaccent.sc -25
KPX Wacute gdotaccent.sc -25
KPX Wacute obreve.sc -25
+KPX Wacute obreve.sc -25
+KPX Wacute ohungarumlaut.sc -25
KPX Wacute ohungarumlaut.sc -25
KPX Wacute omacron.sc -25
+KPX Wacute omacron.sc -25
KPX Wacute sacute.sc -25
+KPX Wacute sacute.sc -25
+KPX Wacute scedilla.sc -35
KPX Wacute scedilla.sc -35
KPX Wacute scircumflex.sc -15
+KPX Wacute scircumflex.sc -15
+KPX Wacute tcaron.sc 5
KPX Wacute tcaron.sc 5
KPX Wacute a.sc -95
+KPX Wacute a.sc -95
+KPX Wacute c.sc -45
KPX Wacute c.sc -45
KPX Wacute g.sc -45
+KPX Wacute g.sc -45
+KPX Wacute o.sc -45
KPX Wacute o.sc -45
KPX Wacute s.sc -35
+KPX Wacute s.sc -35
KPX Wacute t.sc 15
+KPX Wacute t.sc 15
+KPX Wacute agrave.sc -50
KPX Wacute agrave.sc -50
KPX Wacute aacute.sc -70
+KPX Wacute aacute.sc -70
+KPX Wacute acircumflex.sc -50
KPX Wacute acircumflex.sc -50
KPX Wacute atilde.sc -50
+KPX Wacute atilde.sc -50
+KPX Wacute adieresis.sc -50
KPX Wacute adieresis.sc -50
KPX Wacute aring.sc -50
+KPX Wacute aring.sc -50
+KPX Wacute ae.sc -80
KPX Wacute ae.sc -80
KPX Wacute ccedilla.sc -45
+KPX Wacute ccedilla.sc -45
KPX Wacute ograve.sc -25
+KPX Wacute ograve.sc -25
+KPX Wacute oacute.sc -35
KPX Wacute oacute.sc -35
KPX Wacute ocircumflex.sc -25
+KPX Wacute ocircumflex.sc -25
+KPX Wacute otilde.sc -25
KPX Wacute otilde.sc -25
KPX Wacute odieresis.sc -25
+KPX Wacute odieresis.sc -25
+KPX Wacute oslash.sc -45
KPX Wacute oslash.sc -45
KPX Wacute a.pc -95
KPX Wacute c.pc -45
@@ -14164,60 +14540,6 @@ KPX Wacute ohorngrave.pc -25
KPX Wacute ohornhookabove.pc -25
KPX Wacute ohorntilde.pc -25
KPX Wacute ohorndotbelow.pc -25
-KPX Wacute a.sc -95
-KPX Wacute c.sc -45
-KPX Wacute g.sc -45
-KPX Wacute o.sc -45
-KPX Wacute s.sc -35
-KPX Wacute t.sc 15
-KPX Wacute agrave.sc -50
-KPX Wacute aacute.sc -70
-KPX Wacute acircumflex.sc -50
-KPX Wacute atilde.sc -50
-KPX Wacute adieresis.sc -50
-KPX Wacute aring.sc -50
-KPX Wacute ae.sc -80
-KPX Wacute ccedilla.sc -45
-KPX Wacute ograve.sc -25
-KPX Wacute oacute.sc -35
-KPX Wacute ocircumflex.sc -25
-KPX Wacute otilde.sc -25
-KPX Wacute odieresis.sc -25
-KPX Wacute oslash.sc -45
-KPX Wacute amacron.sc -50
-KPX Wacute abreve.sc -50
-KPX Wacute aogonek.sc -95
-KPX Wacute cacute.sc -35
-KPX Wacute ccircumflex.sc -25
-KPX Wacute cdotaccent.sc -25
-KPX Wacute ccaron.sc -25
-KPX Wacute gcircumflex.sc -25
-KPX Wacute gbreve.sc -25
-KPX Wacute gdotaccent.sc -25
-KPX Wacute gcommaaccent.sc -45
-KPX Wacute omacron.sc -25
-KPX Wacute obreve.sc -25
-KPX Wacute ohungarumlaut.sc -25
-KPX Wacute oe.sc -40
-KPX Wacute sacute.sc -25
-KPX Wacute scircumflex.sc -15
-KPX Wacute scedilla.sc -35
-KPX Wacute scaron.sc -15
-KPX Wacute tcaron.sc 5
-KPX Wacute gcaron.sc -25
-KPX Wacute oogonek.sc -45
-KPX Wacute gacute.sc -35
-KPX Wacute aeacute.sc -80
-KPX Wacute ahookabove.sc -50
-KPX Wacute acircumflexdotbelow.sc -50
-KPX Wacute abrevedotbelow.sc -50
-KPX Wacute ohookabove.sc -25
-KPX Wacute ocircumflexdotbelow.sc -25
-KPX Wacute ohornacute.sc -25
-KPX Wacute ohorngrave.sc -25
-KPX Wacute ohornhookabove.sc -25
-KPX Wacute ohorntilde.sc -25
-KPX Wacute ohorndotbelow.sc -25
KPX wacute comma -65
KPX wacute hyphen -25
KPX wacute period -70
@@ -14269,6 +14591,21 @@ KPX wacute oogonek -35
KPX wacute gacute -45
KPX wacute aeacute -25
KPX wacute uni0219 -25
+KPX Wdieresis zdotaccent -53
+KPX Wdieresis zcaron -53
+KPX Wdieresis zacute -53
+KPX Wdieresis z -53
+KPX Wdieresis scircumflex -60
+KPX Wdieresis scedilla -60
+KPX Wdieresis scaron -60
+KPX Wdieresis sacute -60
+KPX Wdieresis s -60
+KPX Wdieresis cdotaccent -53
+KPX Wdieresis ccircumflex -53
+KPX Wdieresis ccedilla -53
+KPX Wdieresis ccaron -53
+KPX Wdieresis cacute -53
+KPX Wdieresis c -53
KPX Wdieresis comma -90
KPX Wdieresis hyphen -55
KPX Wdieresis period -95
@@ -14400,59 +14737,113 @@ KPX Wdieresis yhookabove -25
KPX Wdieresis ytilde -25
KPX Wdieresis guilsinglleft -105
KPX Wdieresis abrevedotbelow.sc -50
+KPX Wdieresis abrevedotbelow.sc -50
+KPX Wdieresis acircumflexdotbelow.sc -50
KPX Wdieresis acircumflexdotbelow.sc -50
KPX Wdieresis ahookabove.sc -50
+KPX Wdieresis ahookabove.sc -50
KPX Wdieresis gacute.sc -35
+KPX Wdieresis gacute.sc -35
+KPX Wdieresis gcaron.sc -25
KPX Wdieresis gcaron.sc -25
KPX Wdieresis ocircumflexdotbelow.sc -25
+KPX Wdieresis ocircumflexdotbelow.sc -25
+KPX Wdieresis oe.sc -40
KPX Wdieresis oe.sc -40
KPX Wdieresis ohookabove.sc -25
+KPX Wdieresis ohookabove.sc -25
+KPX Wdieresis ohornacute.sc -25
KPX Wdieresis ohornacute.sc -25
KPX Wdieresis ohorndotbelow.sc -25
+KPX Wdieresis ohorndotbelow.sc -25
+KPX Wdieresis ohorngrave.sc -25
KPX Wdieresis ohorngrave.sc -25
KPX Wdieresis ohornhookabove.sc -25
+KPX Wdieresis ohornhookabove.sc -25
KPX Wdieresis ohorntilde.sc -25
+KPX Wdieresis ohorntilde.sc -25
+KPX Wdieresis oogonek.sc -45
KPX Wdieresis oogonek.sc -45
KPX Wdieresis scaron.sc -15
+KPX Wdieresis scaron.sc -15
+KPX Wdieresis abreve.sc -50
KPX Wdieresis abreve.sc -50
KPX Wdieresis amacron.sc -50
+KPX Wdieresis amacron.sc -50
+KPX Wdieresis aogonek.sc -95
KPX Wdieresis aogonek.sc -95
KPX Wdieresis aeacute.sc -80
+KPX Wdieresis aeacute.sc -80
+KPX Wdieresis cacute.sc -35
KPX Wdieresis cacute.sc -35
KPX Wdieresis ccaron.sc -25
+KPX Wdieresis ccaron.sc -25
KPX Wdieresis ccircumflex.sc -25
+KPX Wdieresis ccircumflex.sc -25
+KPX Wdieresis cdotaccent.sc -25
KPX Wdieresis cdotaccent.sc -25
KPX Wdieresis gbreve.sc -25
+KPX Wdieresis gbreve.sc -25
+KPX Wdieresis gcircumflex.sc -25
KPX Wdieresis gcircumflex.sc -25
KPX Wdieresis gcommaaccent.sc -45
+KPX Wdieresis gcommaaccent.sc -45
+KPX Wdieresis gdotaccent.sc -25
KPX Wdieresis gdotaccent.sc -25
KPX Wdieresis obreve.sc -25
+KPX Wdieresis obreve.sc -25
+KPX Wdieresis ohungarumlaut.sc -25
KPX Wdieresis ohungarumlaut.sc -25
KPX Wdieresis omacron.sc -25
+KPX Wdieresis omacron.sc -25
KPX Wdieresis sacute.sc -25
+KPX Wdieresis sacute.sc -25
+KPX Wdieresis scedilla.sc -35
KPX Wdieresis scedilla.sc -35
KPX Wdieresis scircumflex.sc -15
+KPX Wdieresis scircumflex.sc -15
+KPX Wdieresis tcaron.sc 5
KPX Wdieresis tcaron.sc 5
KPX Wdieresis a.sc -95
+KPX Wdieresis a.sc -95
KPX Wdieresis c.sc -45
+KPX Wdieresis c.sc -45
+KPX Wdieresis g.sc -45
KPX Wdieresis g.sc -45
KPX Wdieresis o.sc -45
+KPX Wdieresis o.sc -45
+KPX Wdieresis s.sc -35
KPX Wdieresis s.sc -35
KPX Wdieresis t.sc 15
+KPX Wdieresis t.sc 15
KPX Wdieresis agrave.sc -50
+KPX Wdieresis agrave.sc -50
+KPX Wdieresis aacute.sc -70
KPX Wdieresis aacute.sc -70
KPX Wdieresis acircumflex.sc -50
+KPX Wdieresis acircumflex.sc -50
+KPX Wdieresis atilde.sc -50
KPX Wdieresis atilde.sc -50
KPX Wdieresis adieresis.sc -50
+KPX Wdieresis adieresis.sc -50
+KPX Wdieresis aring.sc -50
KPX Wdieresis aring.sc -50
KPX Wdieresis ae.sc -80
+KPX Wdieresis ae.sc -80
+KPX Wdieresis ccedilla.sc -45
KPX Wdieresis ccedilla.sc -45
KPX Wdieresis ograve.sc -25
+KPX Wdieresis ograve.sc -25
KPX Wdieresis oacute.sc -35
+KPX Wdieresis oacute.sc -35
+KPX Wdieresis ocircumflex.sc -25
KPX Wdieresis ocircumflex.sc -25
KPX Wdieresis otilde.sc -25
+KPX Wdieresis otilde.sc -25
+KPX Wdieresis odieresis.sc -25
KPX Wdieresis odieresis.sc -25
KPX Wdieresis oslash.sc -45
+KPX Wdieresis oslash.sc -45
KPX Wdieresis a.pc -95
KPX Wdieresis c.pc -45
KPX Wdieresis g.pc -45
@@ -14509,60 +14900,6 @@ KPX Wdieresis ohorngrave.pc -25
KPX Wdieresis ohornhookabove.pc -25
KPX Wdieresis ohorntilde.pc -25
KPX Wdieresis ohorndotbelow.pc -25
-KPX Wdieresis a.sc -95
-KPX Wdieresis c.sc -45
-KPX Wdieresis g.sc -45
-KPX Wdieresis o.sc -45
-KPX Wdieresis s.sc -35
-KPX Wdieresis t.sc 15
-KPX Wdieresis agrave.sc -50
-KPX Wdieresis aacute.sc -70
-KPX Wdieresis acircumflex.sc -50
-KPX Wdieresis atilde.sc -50
-KPX Wdieresis adieresis.sc -50
-KPX Wdieresis aring.sc -50
-KPX Wdieresis ae.sc -80
-KPX Wdieresis ccedilla.sc -45
-KPX Wdieresis ograve.sc -25
-KPX Wdieresis oacute.sc -35
-KPX Wdieresis ocircumflex.sc -25
-KPX Wdieresis otilde.sc -25
-KPX Wdieresis odieresis.sc -25
-KPX Wdieresis oslash.sc -45
-KPX Wdieresis amacron.sc -50
-KPX Wdieresis abreve.sc -50
-KPX Wdieresis aogonek.sc -95
-KPX Wdieresis cacute.sc -35
-KPX Wdieresis ccircumflex.sc -25
-KPX Wdieresis cdotaccent.sc -25
-KPX Wdieresis ccaron.sc -25
-KPX Wdieresis gcircumflex.sc -25
-KPX Wdieresis gbreve.sc -25
-KPX Wdieresis gdotaccent.sc -25
-KPX Wdieresis gcommaaccent.sc -45
-KPX Wdieresis omacron.sc -25
-KPX Wdieresis obreve.sc -25
-KPX Wdieresis ohungarumlaut.sc -25
-KPX Wdieresis oe.sc -40
-KPX Wdieresis sacute.sc -25
-KPX Wdieresis scircumflex.sc -15
-KPX Wdieresis scedilla.sc -35
-KPX Wdieresis scaron.sc -15
-KPX Wdieresis tcaron.sc 5
-KPX Wdieresis gcaron.sc -25
-KPX Wdieresis oogonek.sc -45
-KPX Wdieresis gacute.sc -35
-KPX Wdieresis aeacute.sc -80
-KPX Wdieresis ahookabove.sc -50
-KPX Wdieresis acircumflexdotbelow.sc -50
-KPX Wdieresis abrevedotbelow.sc -50
-KPX Wdieresis ohookabove.sc -25
-KPX Wdieresis ocircumflexdotbelow.sc -25
-KPX Wdieresis ohornacute.sc -25
-KPX Wdieresis ohorngrave.sc -25
-KPX Wdieresis ohornhookabove.sc -25
-KPX Wdieresis ohorntilde.sc -25
-KPX Wdieresis ohorndotbelow.sc -25
KPX wdieresis comma -65
KPX wdieresis hyphen -25
KPX wdieresis period -70
@@ -14625,20 +14962,20 @@ KPX Adotbelow t -20
KPX Adotbelow u -30
KPX Adotbelow y -85
KPX Adotbelow c.sc -45
+KPX Adotbelow c.sc -45
KPX Adotbelow o.sc -50
+KPX Adotbelow o.sc -50
+KPX Adotbelow t.sc -45
KPX Adotbelow t.sc -45
KPX Adotbelow u.sc -50
+KPX Adotbelow u.sc -50
+KPX Adotbelow y.sc -65
KPX Adotbelow y.sc -65
KPX Adotbelow c.pc -45
KPX Adotbelow o.pc -50
KPX Adotbelow t.pc -45
KPX Adotbelow u.pc -50
KPX Adotbelow y.pc -65
-KPX Adotbelow c.sc -45
-KPX Adotbelow o.sc -50
-KPX Adotbelow t.sc -45
-KPX Adotbelow u.sc -50
-KPX Adotbelow y.sc -65
KPX adotbelow y -30
KPX Ahookabove O -60
KPX Ahookabove U -60
@@ -14647,14 +14984,14 @@ KPX Ahookabove o -40
KPX Ahookabove u -30
KPX Ahookabove y -85
KPX Ahookabove o.sc -50
+KPX Ahookabove o.sc -50
+KPX Ahookabove u.sc -50
KPX Ahookabove u.sc -50
KPX Ahookabove y.sc -65
+KPX Ahookabove y.sc -65
KPX Ahookabove o.pc -50
KPX Ahookabove u.pc -50
KPX Ahookabove y.pc -65
-KPX Ahookabove o.sc -50
-KPX Ahookabove u.sc -50
-KPX Ahookabove y.sc -65
KPX ahookabove y -30
KPX Acircumflexacute C -55
KPX Acircumflexacute T -55
@@ -14665,50 +15002,50 @@ KPX Acircumflexacute t -20
KPX Acircumflexacute u -30
KPX Acircumflexacute y -85
KPX Acircumflexacute c.sc -45
+KPX Acircumflexacute c.sc -45
KPX Acircumflexacute t.sc -45
+KPX Acircumflexacute t.sc -45
+KPX Acircumflexacute u.sc -50
KPX Acircumflexacute u.sc -50
KPX Acircumflexacute y.sc -65
+KPX Acircumflexacute y.sc -65
KPX Acircumflexacute c.pc -45
KPX Acircumflexacute t.pc -45
KPX Acircumflexacute u.pc -50
KPX Acircumflexacute y.pc -65
-KPX Acircumflexacute c.sc -45
-KPX Acircumflexacute t.sc -45
-KPX Acircumflexacute u.sc -50
-KPX Acircumflexacute y.sc -65
KPX acircumflexacute y -30
KPX Acircumflexgrave U -60
KPX Acircumflexgrave Y -80
KPX Acircumflexgrave u -30
KPX Acircumflexgrave y -85
KPX Acircumflexgrave u.sc -50
+KPX Acircumflexgrave u.sc -50
+KPX Acircumflexgrave y.sc -65
KPX Acircumflexgrave y.sc -65
KPX Acircumflexgrave u.pc -50
KPX Acircumflexgrave y.pc -65
-KPX Acircumflexgrave u.sc -50
-KPX Acircumflexgrave y.sc -65
KPX acircumflexgrave y -30
KPX Acircumflexhookabove U -60
KPX Acircumflexhookabove Y -80
KPX Acircumflexhookabove u -30
KPX Acircumflexhookabove y -85
KPX Acircumflexhookabove u.sc -50
+KPX Acircumflexhookabove u.sc -50
+KPX Acircumflexhookabove y.sc -65
KPX Acircumflexhookabove y.sc -65
KPX Acircumflexhookabove u.pc -50
KPX Acircumflexhookabove y.pc -65
-KPX Acircumflexhookabove u.sc -50
-KPX Acircumflexhookabove y.sc -65
KPX acircumflexhookabove y -30
KPX Acircumflextilde U -60
KPX Acircumflextilde Y -80
KPX Acircumflextilde u -30
KPX Acircumflextilde y -85
KPX Acircumflextilde u.sc -50
+KPX Acircumflextilde u.sc -50
+KPX Acircumflextilde y.sc -65
KPX Acircumflextilde y.sc -65
KPX Acircumflextilde u.pc -50
KPX Acircumflextilde y.pc -65
-KPX Acircumflextilde u.sc -50
-KPX Acircumflextilde y.sc -65
KPX acircumflextilde y -30
KPX Acircumflexdotbelow C -55
KPX Acircumflexdotbelow T -55
@@ -14719,48 +15056,48 @@ KPX Acircumflexdotbelow t -20
KPX Acircumflexdotbelow u -30
KPX Acircumflexdotbelow y -85
KPX Acircumflexdotbelow c.sc -45
+KPX Acircumflexdotbelow c.sc -45
KPX Acircumflexdotbelow t.sc -45
+KPX Acircumflexdotbelow t.sc -45
+KPX Acircumflexdotbelow u.sc -50
KPX Acircumflexdotbelow u.sc -50
KPX Acircumflexdotbelow y.sc -65
+KPX Acircumflexdotbelow y.sc -65
KPX Acircumflexdotbelow c.pc -45
KPX Acircumflexdotbelow t.pc -45
KPX Acircumflexdotbelow u.pc -50
KPX Acircumflexdotbelow y.pc -65
-KPX Acircumflexdotbelow c.sc -45
-KPX Acircumflexdotbelow t.sc -45
-KPX Acircumflexdotbelow u.sc -50
-KPX Acircumflexdotbelow y.sc -65
KPX acircumflexdotbelow y -30
KPX Abreveacute C -55
KPX Abreveacute T -55
KPX Abreveacute c -30
KPX Abreveacute t -20
KPX Abreveacute c.sc -45
+KPX Abreveacute c.sc -45
+KPX Abreveacute t.sc -45
KPX Abreveacute t.sc -45
KPX Abreveacute c.pc -45
KPX Abreveacute t.pc -45
-KPX Abreveacute c.sc -45
-KPX Abreveacute t.sc -45
KPX Abrevedotbelow C -55
KPX Abrevedotbelow T -55
KPX Abrevedotbelow c -30
KPX Abrevedotbelow t -20
KPX Abrevedotbelow c.sc -45
+KPX Abrevedotbelow c.sc -45
+KPX Abrevedotbelow t.sc -45
KPX Abrevedotbelow t.sc -45
KPX Abrevedotbelow c.pc -45
KPX Abrevedotbelow t.pc -45
-KPX Abrevedotbelow c.sc -45
-KPX Abrevedotbelow t.sc -45
KPX idotbelow T -30
KPX Odotbelow A -60
KPX Odotbelow a.sc -50
-KPX Odotbelow a.pc -50
KPX Odotbelow a.sc -50
+KPX Odotbelow a.pc -50
KPX odotbelow T -90
KPX Ohookabove A -60
KPX Ohookabove a.sc -50
-KPX Ohookabove a.pc -50
KPX Ohookabove a.sc -50
+KPX Ohookabove a.pc -50
KPX ocircumflexacute T -90
KPX ocircumflexdotbelow T -90
KPX ohornacute T -90
@@ -14776,16 +15113,28 @@ KPX Udotbelow racute -20
KPX Udotbelow rcaron -15
KPX Udotbelow rdotaccent -15
KPX Udotbelow abrevedotbelow.sc -25
+KPX Udotbelow abrevedotbelow.sc -25
+KPX Udotbelow acircumflexdotbelow.sc -25
KPX Udotbelow acircumflexdotbelow.sc -25
KPX Udotbelow ahookabove.sc -25
+KPX Udotbelow ahookabove.sc -25
+KPX Udotbelow abreve.sc -25
KPX Udotbelow abreve.sc -25
KPX Udotbelow amacron.sc -25
+KPX Udotbelow amacron.sc -25
+KPX Udotbelow a.sc -55
KPX Udotbelow a.sc -55
KPX Udotbelow agrave.sc -25
+KPX Udotbelow agrave.sc -25
+KPX Udotbelow aacute.sc -40
KPX Udotbelow aacute.sc -40
KPX Udotbelow acircumflex.sc -25
+KPX Udotbelow acircumflex.sc -25
+KPX Udotbelow atilde.sc -25
KPX Udotbelow atilde.sc -25
KPX Udotbelow adieresis.sc -25
+KPX Udotbelow adieresis.sc -25
+KPX Udotbelow aring.sc -25
KPX Udotbelow aring.sc -25
KPX Udotbelow a.pc -55
KPX Udotbelow agrave.pc -25
@@ -14799,18 +15148,6 @@ KPX Udotbelow abreve.pc -25
KPX Udotbelow ahookabove.pc -25
KPX Udotbelow acircumflexdotbelow.pc -25
KPX Udotbelow abrevedotbelow.pc -25
-KPX Udotbelow a.sc -55
-KPX Udotbelow agrave.sc -25
-KPX Udotbelow aacute.sc -40
-KPX Udotbelow acircumflex.sc -25
-KPX Udotbelow atilde.sc -25
-KPX Udotbelow adieresis.sc -25
-KPX Udotbelow aring.sc -25
-KPX Udotbelow amacron.sc -25
-KPX Udotbelow abreve.sc -25
-KPX Udotbelow ahookabove.sc -25
-KPX Udotbelow acircumflexdotbelow.sc -25
-KPX Udotbelow abrevedotbelow.sc -25
KPX Uhookabove A -65
KPX Uhookabove m -35
KPX Uhookabove n -30
@@ -14821,16 +15158,28 @@ KPX Uhookabove racute -20
KPX Uhookabove rcaron -15
KPX Uhookabove rdotaccent -15
KPX Uhookabove abrevedotbelow.sc -25
+KPX Uhookabove abrevedotbelow.sc -25
KPX Uhookabove acircumflexdotbelow.sc -25
+KPX Uhookabove acircumflexdotbelow.sc -25
+KPX Uhookabove ahookabove.sc -25
KPX Uhookabove ahookabove.sc -25
KPX Uhookabove abreve.sc -25
+KPX Uhookabove abreve.sc -25
+KPX Uhookabove amacron.sc -25
KPX Uhookabove amacron.sc -25
KPX Uhookabove a.sc -55
+KPX Uhookabove a.sc -55
KPX Uhookabove agrave.sc -25
+KPX Uhookabove agrave.sc -25
+KPX Uhookabove aacute.sc -40
KPX Uhookabove aacute.sc -40
KPX Uhookabove acircumflex.sc -25
+KPX Uhookabove acircumflex.sc -25
+KPX Uhookabove atilde.sc -25
KPX Uhookabove atilde.sc -25
KPX Uhookabove adieresis.sc -25
+KPX Uhookabove adieresis.sc -25
+KPX Uhookabove aring.sc -25
KPX Uhookabove aring.sc -25
KPX Uhookabove a.pc -55
KPX Uhookabove agrave.pc -25
@@ -14844,18 +15193,6 @@ KPX Uhookabove abreve.pc -25
KPX Uhookabove ahookabove.pc -25
KPX Uhookabove acircumflexdotbelow.pc -25
KPX Uhookabove abrevedotbelow.pc -25
-KPX Uhookabove a.sc -55
-KPX Uhookabove agrave.sc -25
-KPX Uhookabove aacute.sc -40
-KPX Uhookabove acircumflex.sc -25
-KPX Uhookabove atilde.sc -25
-KPX Uhookabove adieresis.sc -25
-KPX Uhookabove aring.sc -25
-KPX Uhookabove amacron.sc -25
-KPX Uhookabove abreve.sc -25
-KPX Uhookabove ahookabove.sc -25
-KPX Uhookabove acircumflexdotbelow.sc -25
-KPX Uhookabove abrevedotbelow.sc -25
KPX Uhornacute A -65
KPX Uhornacute n -30
KPX Uhornacute ntilde -15
@@ -14865,17 +15202,29 @@ KPX Uhornacute racute -20
KPX Uhornacute rcaron -15
KPX Uhornacute rdotaccent -15
KPX Uhornacute abrevedotbelow.sc -25
+KPX Uhornacute abrevedotbelow.sc -25
+KPX Uhornacute acircumflexdotbelow.sc -25
KPX Uhornacute acircumflexdotbelow.sc -25
KPX Uhornacute ahookabove.sc -25
+KPX Uhornacute ahookabove.sc -25
+KPX Uhornacute abreve.sc -25
KPX Uhornacute abreve.sc -25
KPX Uhornacute amacron.sc -25
+KPX Uhornacute amacron.sc -25
+KPX Uhornacute a.sc -55
KPX Uhornacute a.sc -55
KPX Uhornacute agrave.sc -25
+KPX Uhornacute agrave.sc -25
+KPX Uhornacute aacute.sc -40
KPX Uhornacute aacute.sc -40
KPX Uhornacute acircumflex.sc -25
+KPX Uhornacute acircumflex.sc -25
KPX Uhornacute atilde.sc -25
+KPX Uhornacute atilde.sc -25
+KPX Uhornacute adieresis.sc -25
KPX Uhornacute adieresis.sc -25
KPX Uhornacute aring.sc -25
+KPX Uhornacute aring.sc -25
KPX Uhornacute a.pc -55
KPX Uhornacute agrave.pc -25
KPX Uhornacute aacute.pc -40
@@ -14888,18 +15237,6 @@ KPX Uhornacute abreve.pc -25
KPX Uhornacute ahookabove.pc -25
KPX Uhornacute acircumflexdotbelow.pc -25
KPX Uhornacute abrevedotbelow.pc -25
-KPX Uhornacute a.sc -55
-KPX Uhornacute agrave.sc -25
-KPX Uhornacute aacute.sc -40
-KPX Uhornacute acircumflex.sc -25
-KPX Uhornacute atilde.sc -25
-KPX Uhornacute adieresis.sc -25
-KPX Uhornacute aring.sc -25
-KPX Uhornacute amacron.sc -25
-KPX Uhornacute abreve.sc -25
-KPX Uhornacute ahookabove.sc -25
-KPX Uhornacute acircumflexdotbelow.sc -25
-KPX Uhornacute abrevedotbelow.sc -25
KPX Uhorngrave A -65
KPX Uhorngrave m -35
KPX Uhorngrave n -30
@@ -14910,17 +15247,29 @@ KPX Uhorngrave racute -20
KPX Uhorngrave rcaron -15
KPX Uhorngrave rdotaccent -15
KPX Uhorngrave abrevedotbelow.sc -25
+KPX Uhorngrave abrevedotbelow.sc -25
+KPX Uhorngrave acircumflexdotbelow.sc -25
KPX Uhorngrave acircumflexdotbelow.sc -25
KPX Uhorngrave ahookabove.sc -25
+KPX Uhorngrave ahookabove.sc -25
KPX Uhorngrave abreve.sc -25
+KPX Uhorngrave abreve.sc -25
+KPX Uhorngrave amacron.sc -25
KPX Uhorngrave amacron.sc -25
KPX Uhorngrave a.sc -55
+KPX Uhorngrave a.sc -55
+KPX Uhorngrave agrave.sc -25
KPX Uhorngrave agrave.sc -25
KPX Uhorngrave aacute.sc -40
+KPX Uhorngrave aacute.sc -40
+KPX Uhorngrave acircumflex.sc -25
KPX Uhorngrave acircumflex.sc -25
KPX Uhorngrave atilde.sc -25
+KPX Uhorngrave atilde.sc -25
+KPX Uhorngrave adieresis.sc -25
KPX Uhorngrave adieresis.sc -25
KPX Uhorngrave aring.sc -25
+KPX Uhorngrave aring.sc -25
KPX Uhorngrave a.pc -55
KPX Uhorngrave agrave.pc -25
KPX Uhorngrave aacute.pc -40
@@ -14933,18 +15282,6 @@ KPX Uhorngrave abreve.pc -25
KPX Uhorngrave ahookabove.pc -25
KPX Uhorngrave acircumflexdotbelow.pc -25
KPX Uhorngrave abrevedotbelow.pc -25
-KPX Uhorngrave a.sc -55
-KPX Uhorngrave agrave.sc -25
-KPX Uhorngrave aacute.sc -40
-KPX Uhorngrave acircumflex.sc -25
-KPX Uhorngrave atilde.sc -25
-KPX Uhorngrave adieresis.sc -25
-KPX Uhorngrave aring.sc -25
-KPX Uhorngrave amacron.sc -25
-KPX Uhorngrave abreve.sc -25
-KPX Uhorngrave ahookabove.sc -25
-KPX Uhorngrave acircumflexdotbelow.sc -25
-KPX Uhorngrave abrevedotbelow.sc -25
KPX Uhornhookabove A -65
KPX Uhornhookabove n -30
KPX Uhornhookabove ntilde -15
@@ -14954,17 +15291,29 @@ KPX Uhornhookabove racute -20
KPX Uhornhookabove rcaron -15
KPX Uhornhookabove rdotaccent -15
KPX Uhornhookabove abrevedotbelow.sc -25
+KPX Uhornhookabove abrevedotbelow.sc -25
+KPX Uhornhookabove acircumflexdotbelow.sc -25
KPX Uhornhookabove acircumflexdotbelow.sc -25
KPX Uhornhookabove ahookabove.sc -25
+KPX Uhornhookabove ahookabove.sc -25
+KPX Uhornhookabove abreve.sc -25
KPX Uhornhookabove abreve.sc -25
KPX Uhornhookabove amacron.sc -25
+KPX Uhornhookabove amacron.sc -25
+KPX Uhornhookabove a.sc -55
KPX Uhornhookabove a.sc -55
KPX Uhornhookabove agrave.sc -25
+KPX Uhornhookabove agrave.sc -25
KPX Uhornhookabove aacute.sc -40
+KPX Uhornhookabove aacute.sc -40
+KPX Uhornhookabove acircumflex.sc -25
KPX Uhornhookabove acircumflex.sc -25
KPX Uhornhookabove atilde.sc -25
+KPX Uhornhookabove atilde.sc -25
+KPX Uhornhookabove adieresis.sc -25
KPX Uhornhookabove adieresis.sc -25
KPX Uhornhookabove aring.sc -25
+KPX Uhornhookabove aring.sc -25
KPX Uhornhookabove a.pc -55
KPX Uhornhookabove agrave.pc -25
KPX Uhornhookabove aacute.pc -40
@@ -14977,18 +15326,6 @@ KPX Uhornhookabove abreve.pc -25
KPX Uhornhookabove ahookabove.pc -25
KPX Uhornhookabove acircumflexdotbelow.pc -25
KPX Uhornhookabove abrevedotbelow.pc -25
-KPX Uhornhookabove a.sc -55
-KPX Uhornhookabove agrave.sc -25
-KPX Uhornhookabove aacute.sc -40
-KPX Uhornhookabove acircumflex.sc -25
-KPX Uhornhookabove atilde.sc -25
-KPX Uhornhookabove adieresis.sc -25
-KPX Uhornhookabove aring.sc -25
-KPX Uhornhookabove amacron.sc -25
-KPX Uhornhookabove abreve.sc -25
-KPX Uhornhookabove ahookabove.sc -25
-KPX Uhornhookabove acircumflexdotbelow.sc -25
-KPX Uhornhookabove abrevedotbelow.sc -25
KPX Uhorntilde A -65
KPX Uhorntilde n -30
KPX Uhorntilde ntilde -15
@@ -14998,16 +15335,28 @@ KPX Uhorntilde racute -20
KPX Uhorntilde rcaron -15
KPX Uhorntilde rdotaccent -15
KPX Uhorntilde abrevedotbelow.sc -25
+KPX Uhorntilde abrevedotbelow.sc -25
KPX Uhorntilde acircumflexdotbelow.sc -25
+KPX Uhorntilde acircumflexdotbelow.sc -25
+KPX Uhorntilde ahookabove.sc -25
KPX Uhorntilde ahookabove.sc -25
KPX Uhorntilde abreve.sc -25
+KPX Uhorntilde abreve.sc -25
+KPX Uhorntilde amacron.sc -25
KPX Uhorntilde amacron.sc -25
KPX Uhorntilde a.sc -55
+KPX Uhorntilde a.sc -55
+KPX Uhorntilde agrave.sc -25
KPX Uhorntilde agrave.sc -25
KPX Uhorntilde aacute.sc -40
+KPX Uhorntilde aacute.sc -40
+KPX Uhorntilde acircumflex.sc -25
KPX Uhorntilde acircumflex.sc -25
KPX Uhorntilde atilde.sc -25
+KPX Uhorntilde atilde.sc -25
KPX Uhorntilde adieresis.sc -25
+KPX Uhorntilde adieresis.sc -25
+KPX Uhorntilde aring.sc -25
KPX Uhorntilde aring.sc -25
KPX Uhorntilde a.pc -55
KPX Uhorntilde agrave.pc -25
@@ -15021,18 +15370,6 @@ KPX Uhorntilde abreve.pc -25
KPX Uhorntilde ahookabove.pc -25
KPX Uhorntilde acircumflexdotbelow.pc -25
KPX Uhorntilde abrevedotbelow.pc -25
-KPX Uhorntilde a.sc -55
-KPX Uhorntilde agrave.sc -25
-KPX Uhorntilde aacute.sc -40
-KPX Uhorntilde acircumflex.sc -25
-KPX Uhorntilde atilde.sc -25
-KPX Uhorntilde adieresis.sc -25
-KPX Uhorntilde aring.sc -25
-KPX Uhorntilde amacron.sc -25
-KPX Uhorntilde abreve.sc -25
-KPX Uhorntilde ahookabove.sc -25
-KPX Uhorntilde acircumflexdotbelow.sc -25
-KPX Uhorntilde abrevedotbelow.sc -25
KPX Uhorndotbelow A -65
KPX Uhorndotbelow n -30
KPX Uhorndotbelow ntilde -15
@@ -15042,16 +15379,28 @@ KPX Uhorndotbelow racute -20
KPX Uhorndotbelow rcaron -15
KPX Uhorndotbelow rdotaccent -15
KPX Uhorndotbelow abrevedotbelow.sc -25
+KPX Uhorndotbelow abrevedotbelow.sc -25
KPX Uhorndotbelow acircumflexdotbelow.sc -25
+KPX Uhorndotbelow acircumflexdotbelow.sc -25
+KPX Uhorndotbelow ahookabove.sc -25
KPX Uhorndotbelow ahookabove.sc -25
KPX Uhorndotbelow abreve.sc -25
+KPX Uhorndotbelow abreve.sc -25
KPX Uhorndotbelow amacron.sc -25
+KPX Uhorndotbelow amacron.sc -25
+KPX Uhorndotbelow a.sc -55
KPX Uhorndotbelow a.sc -55
KPX Uhorndotbelow agrave.sc -25
+KPX Uhorndotbelow agrave.sc -25
+KPX Uhorndotbelow aacute.sc -40
KPX Uhorndotbelow aacute.sc -40
KPX Uhorndotbelow acircumflex.sc -25
+KPX Uhorndotbelow acircumflex.sc -25
+KPX Uhorndotbelow atilde.sc -25
KPX Uhorndotbelow atilde.sc -25
KPX Uhorndotbelow adieresis.sc -25
+KPX Uhorndotbelow adieresis.sc -25
+KPX Uhorndotbelow aring.sc -25
KPX Uhorndotbelow aring.sc -25
KPX Uhorndotbelow a.pc -55
KPX Uhorndotbelow agrave.pc -25
@@ -15065,18 +15414,21 @@ KPX Uhorndotbelow abreve.pc -25
KPX Uhorndotbelow ahookabove.pc -25
KPX Uhorndotbelow acircumflexdotbelow.pc -25
KPX Uhorndotbelow abrevedotbelow.pc -25
-KPX Uhorndotbelow a.sc -55
-KPX Uhorndotbelow agrave.sc -25
-KPX Uhorndotbelow aacute.sc -40
-KPX Uhorndotbelow acircumflex.sc -25
-KPX Uhorndotbelow atilde.sc -25
-KPX Uhorndotbelow adieresis.sc -25
-KPX Uhorndotbelow aring.sc -25
-KPX Uhorndotbelow amacron.sc -25
-KPX Uhorndotbelow abreve.sc -25
-KPX Uhorndotbelow ahookabove.sc -25
-KPX Uhorndotbelow acircumflexdotbelow.sc -25
-KPX Uhorndotbelow abrevedotbelow.sc -25
+KPX Ygrave zdotaccent -67
+KPX Ygrave zcaron -67
+KPX Ygrave zacute -67
+KPX Ygrave z -67
+KPX Ygrave scircumflex -67
+KPX Ygrave scedilla -67
+KPX Ygrave scaron -67
+KPX Ygrave sacute -67
+KPX Ygrave s -67
+KPX Ygrave cdotaccent -67
+KPX Ygrave ccircumflex -67
+KPX Ygrave ccedilla -67
+KPX Ygrave ccaron -67
+KPX Ygrave cacute -67
+KPX Ygrave c -67
KPX Ygrave i -15
KPX Ygrave AE -115
KPX Ygrave agrave -50
@@ -15143,47 +15495,89 @@ KPX Ygrave uhornhookabove -40
KPX Ygrave uhorntilde -40
KPX Ygrave uhorndotbelow -40
KPX Ygrave abrevedotbelow.sc -30
+KPX Ygrave abrevedotbelow.sc -30
KPX Ygrave acircumflexdotbelow.sc -30
+KPX Ygrave acircumflexdotbelow.sc -30
+KPX Ygrave ahookabove.sc -30
KPX Ygrave ahookabove.sc -30
KPX Ygrave gacute.sc -45
+KPX Ygrave gacute.sc -45
+KPX Ygrave gcaron.sc -30
KPX Ygrave gcaron.sc -30
KPX Ygrave ocircumflexdotbelow.sc -30
+KPX Ygrave ocircumflexdotbelow.sc -30
+KPX Ygrave oe.sc -40
KPX Ygrave oe.sc -40
KPX Ygrave ohookabove.sc -30
+KPX Ygrave ohookabove.sc -30
KPX Ygrave ohornacute.sc -30
+KPX Ygrave ohornacute.sc -30
+KPX Ygrave ohorndotbelow.sc -30
KPX Ygrave ohorndotbelow.sc -30
KPX Ygrave ohorngrave.sc -30
+KPX Ygrave ohorngrave.sc -30
+KPX Ygrave ohornhookabove.sc -30
KPX Ygrave ohornhookabove.sc -30
KPX Ygrave ohorntilde.sc -30
+KPX Ygrave ohorntilde.sc -30
+KPX Ygrave scaron.sc -20
KPX Ygrave scaron.sc -20
KPX Ygrave abreve.sc -30
+KPX Ygrave abreve.sc -30
+KPX Ygrave amacron.sc -30
KPX Ygrave amacron.sc -30
KPX Ygrave aeacute.sc -80
+KPX Ygrave aeacute.sc -80
KPX Ygrave cacute.sc -45
+KPX Ygrave cacute.sc -45
+KPX Ygrave ccaron.sc -30
KPX Ygrave ccaron.sc -30
KPX Ygrave ccircumflex.sc -30
+KPX Ygrave ccircumflex.sc -30
+KPX Ygrave cdotaccent.sc -30
KPX Ygrave cdotaccent.sc -30
KPX Ygrave gbreve.sc -30
+KPX Ygrave gbreve.sc -30
+KPX Ygrave gcircumflex.sc -30
KPX Ygrave gcircumflex.sc -30
KPX Ygrave gdotaccent.sc -30
+KPX Ygrave gdotaccent.sc -30
+KPX Ygrave obreve.sc -30
KPX Ygrave obreve.sc -30
KPX Ygrave ohungarumlaut.sc -30
+KPX Ygrave ohungarumlaut.sc -30
KPX Ygrave omacron.sc -30
+KPX Ygrave omacron.sc -30
+KPX Ygrave sacute.sc -30
KPX Ygrave sacute.sc -30
KPX Ygrave scircumflex.sc -20
+KPX Ygrave scircumflex.sc -20
+KPX Ygrave tcaron.sc 5
KPX Ygrave tcaron.sc 5
KPX Ygrave agrave.sc -30
+KPX Ygrave agrave.sc -30
+KPX Ygrave aacute.sc -45
KPX Ygrave aacute.sc -45
KPX Ygrave acircumflex.sc -30
+KPX Ygrave acircumflex.sc -30
+KPX Ygrave atilde.sc -30
KPX Ygrave atilde.sc -30
KPX Ygrave adieresis.sc -30
+KPX Ygrave adieresis.sc -30
KPX Ygrave aring.sc -30
+KPX Ygrave aring.sc -30
+KPX Ygrave ae.sc -80
KPX Ygrave ae.sc -80
KPX Ygrave ograve.sc -30
+KPX Ygrave ograve.sc -30
+KPX Ygrave oacute.sc -45
KPX Ygrave oacute.sc -45
KPX Ygrave ocircumflex.sc -30
+KPX Ygrave ocircumflex.sc -30
+KPX Ygrave otilde.sc -30
KPX Ygrave otilde.sc -30
KPX Ygrave odieresis.sc -30
+KPX Ygrave odieresis.sc -30
KPX Ygrave agrave.pc -30
KPX Ygrave aacute.pc -45
KPX Ygrave acircumflex.pc -30
@@ -15226,51 +15620,24 @@ KPX Ygrave ohorngrave.pc -30
KPX Ygrave ohornhookabove.pc -30
KPX Ygrave ohorntilde.pc -30
KPX Ygrave ohorndotbelow.pc -30
-KPX Ygrave agrave.sc -30
-KPX Ygrave aacute.sc -45
-KPX Ygrave acircumflex.sc -30
-KPX Ygrave atilde.sc -30
-KPX Ygrave adieresis.sc -30
-KPX Ygrave aring.sc -30
-KPX Ygrave ae.sc -80
-KPX Ygrave ograve.sc -30
-KPX Ygrave oacute.sc -45
-KPX Ygrave ocircumflex.sc -30
-KPX Ygrave otilde.sc -30
-KPX Ygrave odieresis.sc -30
-KPX Ygrave amacron.sc -30
-KPX Ygrave abreve.sc -30
-KPX Ygrave cacute.sc -45
-KPX Ygrave ccircumflex.sc -30
-KPX Ygrave cdotaccent.sc -30
-KPX Ygrave ccaron.sc -30
-KPX Ygrave gcircumflex.sc -30
-KPX Ygrave gbreve.sc -30
-KPX Ygrave gdotaccent.sc -30
-KPX Ygrave omacron.sc -30
-KPX Ygrave obreve.sc -30
-KPX Ygrave ohungarumlaut.sc -30
-KPX Ygrave oe.sc -40
-KPX Ygrave sacute.sc -30
-KPX Ygrave scircumflex.sc -20
-KPX Ygrave scaron.sc -20
-KPX Ygrave tcaron.sc 5
-KPX Ygrave gcaron.sc -30
-KPX Ygrave gacute.sc -45
-KPX Ygrave aeacute.sc -80
-KPX Ygrave ahookabove.sc -30
-KPX Ygrave acircumflexdotbelow.sc -30
-KPX Ygrave abrevedotbelow.sc -30
-KPX Ygrave ohookabove.sc -30
-KPX Ygrave ocircumflexdotbelow.sc -30
-KPX Ygrave ohornacute.sc -30
-KPX Ygrave ohorngrave.sc -30
-KPX Ygrave ohornhookabove.sc -30
-KPX Ygrave ohorntilde.sc -30
-KPX Ygrave ohorndotbelow.sc -30
KPX ygrave ae -25
KPX ygrave oe -35
KPX ygrave aeacute -25
+KPX Ydotbelow zdotaccent -67
+KPX Ydotbelow zcaron -67
+KPX Ydotbelow zacute -67
+KPX Ydotbelow z -67
+KPX Ydotbelow scircumflex -67
+KPX Ydotbelow scedilla -67
+KPX Ydotbelow scaron -67
+KPX Ydotbelow sacute -67
+KPX Ydotbelow s -67
+KPX Ydotbelow cdotaccent -67
+KPX Ydotbelow ccircumflex -67
+KPX Ydotbelow ccedilla -67
+KPX Ydotbelow ccaron -67
+KPX Ydotbelow cacute -67
+KPX Ydotbelow c -67
KPX Ydotbelow C -70
KPX Ydotbelow T 15
KPX Ydotbelow i -15
@@ -15340,49 +15707,93 @@ KPX Ydotbelow uhornhookabove -40
KPX Ydotbelow uhorntilde -40
KPX Ydotbelow uhorndotbelow -40
KPX Ydotbelow abrevedotbelow.sc -30
+KPX Ydotbelow abrevedotbelow.sc -30
+KPX Ydotbelow acircumflexdotbelow.sc -30
KPX Ydotbelow acircumflexdotbelow.sc -30
KPX Ydotbelow ahookabove.sc -30
+KPX Ydotbelow ahookabove.sc -30
+KPX Ydotbelow gacute.sc -45
KPX Ydotbelow gacute.sc -45
KPX Ydotbelow gcaron.sc -30
+KPX Ydotbelow gcaron.sc -30
KPX Ydotbelow ocircumflexdotbelow.sc -30
+KPX Ydotbelow ocircumflexdotbelow.sc -30
+KPX Ydotbelow oe.sc -40
KPX Ydotbelow oe.sc -40
KPX Ydotbelow ohookabove.sc -30
+KPX Ydotbelow ohookabove.sc -30
+KPX Ydotbelow ohornacute.sc -30
KPX Ydotbelow ohornacute.sc -30
KPX Ydotbelow ohorndotbelow.sc -30
+KPX Ydotbelow ohorndotbelow.sc -30
+KPX Ydotbelow ohorngrave.sc -30
KPX Ydotbelow ohorngrave.sc -30
KPX Ydotbelow ohornhookabove.sc -30
+KPX Ydotbelow ohornhookabove.sc -30
+KPX Ydotbelow ohorntilde.sc -30
KPX Ydotbelow ohorntilde.sc -30
KPX Ydotbelow scaron.sc -20
+KPX Ydotbelow scaron.sc -20
KPX Ydotbelow abreve.sc -30
+KPX Ydotbelow abreve.sc -30
+KPX Ydotbelow amacron.sc -30
KPX Ydotbelow amacron.sc -30
KPX Ydotbelow aeacute.sc -80
+KPX Ydotbelow aeacute.sc -80
+KPX Ydotbelow cacute.sc -45
KPX Ydotbelow cacute.sc -45
KPX Ydotbelow ccaron.sc -30
+KPX Ydotbelow ccaron.sc -30
+KPX Ydotbelow ccircumflex.sc -30
KPX Ydotbelow ccircumflex.sc -30
KPX Ydotbelow cdotaccent.sc -30
+KPX Ydotbelow cdotaccent.sc -30
+KPX Ydotbelow gbreve.sc -30
KPX Ydotbelow gbreve.sc -30
KPX Ydotbelow gcircumflex.sc -30
+KPX Ydotbelow gcircumflex.sc -30
KPX Ydotbelow gdotaccent.sc -30
+KPX Ydotbelow gdotaccent.sc -30
+KPX Ydotbelow obreve.sc -30
KPX Ydotbelow obreve.sc -30
KPX Ydotbelow ohungarumlaut.sc -30
+KPX Ydotbelow ohungarumlaut.sc -30
+KPX Ydotbelow omacron.sc -30
KPX Ydotbelow omacron.sc -30
KPX Ydotbelow sacute.sc -30
+KPX Ydotbelow sacute.sc -30
+KPX Ydotbelow scircumflex.sc -20
KPX Ydotbelow scircumflex.sc -20
KPX Ydotbelow tcaron.sc 5
+KPX Ydotbelow tcaron.sc 5
+KPX Ydotbelow c.sc -60
KPX Ydotbelow c.sc -60
KPX Ydotbelow t.sc 15
+KPX Ydotbelow t.sc 15
KPX Ydotbelow agrave.sc -30
+KPX Ydotbelow agrave.sc -30
+KPX Ydotbelow aacute.sc -45
KPX Ydotbelow aacute.sc -45
KPX Ydotbelow acircumflex.sc -30
+KPX Ydotbelow acircumflex.sc -30
+KPX Ydotbelow atilde.sc -30
KPX Ydotbelow atilde.sc -30
KPX Ydotbelow adieresis.sc -30
+KPX Ydotbelow adieresis.sc -30
+KPX Ydotbelow aring.sc -30
KPX Ydotbelow aring.sc -30
KPX Ydotbelow ae.sc -80
+KPX Ydotbelow ae.sc -80
+KPX Ydotbelow ograve.sc -30
KPX Ydotbelow ograve.sc -30
KPX Ydotbelow oacute.sc -45
+KPX Ydotbelow oacute.sc -45
KPX Ydotbelow ocircumflex.sc -30
+KPX Ydotbelow ocircumflex.sc -30
+KPX Ydotbelow otilde.sc -30
KPX Ydotbelow otilde.sc -30
KPX Ydotbelow odieresis.sc -30
+KPX Ydotbelow odieresis.sc -30
KPX Ydotbelow c.pc -60
KPX Ydotbelow t.pc 15
KPX Ydotbelow agrave.pc -30
@@ -15427,54 +15838,25 @@ KPX Ydotbelow ohorngrave.pc -30
KPX Ydotbelow ohornhookabove.pc -30
KPX Ydotbelow ohorntilde.pc -30
KPX Ydotbelow ohorndotbelow.pc -30
-KPX Ydotbelow c.sc -60
-KPX Ydotbelow t.sc 15
-KPX Ydotbelow agrave.sc -30
-KPX Ydotbelow aacute.sc -45
-KPX Ydotbelow acircumflex.sc -30
-KPX Ydotbelow atilde.sc -30
-KPX Ydotbelow adieresis.sc -30
-KPX Ydotbelow aring.sc -30
-KPX Ydotbelow ae.sc -80
-KPX Ydotbelow ograve.sc -30
-KPX Ydotbelow oacute.sc -45
-KPX Ydotbelow ocircumflex.sc -30
-KPX Ydotbelow otilde.sc -30
-KPX Ydotbelow odieresis.sc -30
-KPX Ydotbelow amacron.sc -30
-KPX Ydotbelow abreve.sc -30
-KPX Ydotbelow cacute.sc -45
-KPX Ydotbelow ccircumflex.sc -30
-KPX Ydotbelow cdotaccent.sc -30
-KPX Ydotbelow ccaron.sc -30
-KPX Ydotbelow gcircumflex.sc -30
-KPX Ydotbelow gbreve.sc -30
-KPX Ydotbelow gdotaccent.sc -30
-KPX Ydotbelow omacron.sc -30
-KPX Ydotbelow obreve.sc -30
-KPX Ydotbelow ohungarumlaut.sc -30
-KPX Ydotbelow oe.sc -40
-KPX Ydotbelow sacute.sc -30
-KPX Ydotbelow scircumflex.sc -20
-KPX Ydotbelow scaron.sc -20
-KPX Ydotbelow tcaron.sc 5
-KPX Ydotbelow gcaron.sc -30
-KPX Ydotbelow gacute.sc -45
-KPX Ydotbelow aeacute.sc -80
-KPX Ydotbelow ahookabove.sc -30
-KPX Ydotbelow acircumflexdotbelow.sc -30
-KPX Ydotbelow abrevedotbelow.sc -30
-KPX Ydotbelow ohookabove.sc -30
-KPX Ydotbelow ocircumflexdotbelow.sc -30
-KPX Ydotbelow ohornacute.sc -30
-KPX Ydotbelow ohorngrave.sc -30
-KPX Ydotbelow ohornhookabove.sc -30
-KPX Ydotbelow ohorntilde.sc -30
-KPX Ydotbelow ohorndotbelow.sc -30
KPX ydotbelow c -35
KPX ydotbelow ae -25
KPX ydotbelow oe -35
KPX ydotbelow aeacute -25
+KPX Yhookabove zdotaccent -67
+KPX Yhookabove zcaron -67
+KPX Yhookabove zacute -67
+KPX Yhookabove z -67
+KPX Yhookabove scircumflex -67
+KPX Yhookabove scedilla -67
+KPX Yhookabove scaron -67
+KPX Yhookabove sacute -67
+KPX Yhookabove s -67
+KPX Yhookabove cdotaccent -67
+KPX Yhookabove ccircumflex -67
+KPX Yhookabove ccedilla -67
+KPX Yhookabove ccaron -67
+KPX Yhookabove cacute -67
+KPX Yhookabove c -67
KPX Yhookabove i -15
KPX Yhookabove u -80
KPX Yhookabove AE -115
@@ -15542,46 +15924,88 @@ KPX Yhookabove uhornhookabove -40
KPX Yhookabove uhorntilde -40
KPX Yhookabove uhorndotbelow -40
KPX Yhookabove abrevedotbelow.sc -30
+KPX Yhookabove abrevedotbelow.sc -30
KPX Yhookabove acircumflexdotbelow.sc -30
+KPX Yhookabove acircumflexdotbelow.sc -30
+KPX Yhookabove ahookabove.sc -30
KPX Yhookabove ahookabove.sc -30
KPX Yhookabove gacute.sc -45
+KPX Yhookabove gacute.sc -45
+KPX Yhookabove gcaron.sc -30
KPX Yhookabove gcaron.sc -30
KPX Yhookabove ocircumflexdotbelow.sc -30
+KPX Yhookabove ocircumflexdotbelow.sc -30
+KPX Yhookabove oe.sc -40
KPX Yhookabove oe.sc -40
KPX Yhookabove ohookabove.sc -30
+KPX Yhookabove ohookabove.sc -30
KPX Yhookabove ohornacute.sc -30
+KPX Yhookabove ohornacute.sc -30
+KPX Yhookabove ohorndotbelow.sc -30
KPX Yhookabove ohorndotbelow.sc -30
KPX Yhookabove ohorngrave.sc -30
+KPX Yhookabove ohorngrave.sc -30
+KPX Yhookabove ohornhookabove.sc -30
KPX Yhookabove ohornhookabove.sc -30
KPX Yhookabove ohorntilde.sc -30
+KPX Yhookabove ohorntilde.sc -30
+KPX Yhookabove scaron.sc -20
KPX Yhookabove scaron.sc -20
KPX Yhookabove abreve.sc -30
+KPX Yhookabove abreve.sc -30
+KPX Yhookabove amacron.sc -30
KPX Yhookabove amacron.sc -30
KPX Yhookabove aeacute.sc -80
+KPX Yhookabove aeacute.sc -80
KPX Yhookabove cacute.sc -45
+KPX Yhookabove cacute.sc -45
+KPX Yhookabove ccaron.sc -30
KPX Yhookabove ccaron.sc -30
KPX Yhookabove ccircumflex.sc -30
+KPX Yhookabove ccircumflex.sc -30
+KPX Yhookabove cdotaccent.sc -30
KPX Yhookabove cdotaccent.sc -30
KPX Yhookabove gbreve.sc -30
+KPX Yhookabove gbreve.sc -30
+KPX Yhookabove gcircumflex.sc -30
KPX Yhookabove gcircumflex.sc -30
KPX Yhookabove gdotaccent.sc -30
+KPX Yhookabove gdotaccent.sc -30
+KPX Yhookabove obreve.sc -30
KPX Yhookabove obreve.sc -30
KPX Yhookabove ohungarumlaut.sc -30
+KPX Yhookabove ohungarumlaut.sc -30
KPX Yhookabove omacron.sc -30
+KPX Yhookabove omacron.sc -30
+KPX Yhookabove sacute.sc -30
KPX Yhookabove sacute.sc -30
KPX Yhookabove scircumflex.sc -20
+KPX Yhookabove scircumflex.sc -20
+KPX Yhookabove tcaron.sc 5
KPX Yhookabove tcaron.sc 5
KPX Yhookabove agrave.sc -30
+KPX Yhookabove agrave.sc -30
+KPX Yhookabove aacute.sc -45
KPX Yhookabove aacute.sc -45
KPX Yhookabove acircumflex.sc -30
+KPX Yhookabove acircumflex.sc -30
+KPX Yhookabove atilde.sc -30
KPX Yhookabove atilde.sc -30
KPX Yhookabove adieresis.sc -30
+KPX Yhookabove adieresis.sc -30
KPX Yhookabove aring.sc -30
+KPX Yhookabove aring.sc -30
+KPX Yhookabove ae.sc -80
KPX Yhookabove ae.sc -80
KPX Yhookabove ograve.sc -30
+KPX Yhookabove ograve.sc -30
+KPX Yhookabove oacute.sc -45
KPX Yhookabove oacute.sc -45
KPX Yhookabove ocircumflex.sc -30
+KPX Yhookabove ocircumflex.sc -30
KPX Yhookabove otilde.sc -30
+KPX Yhookabove otilde.sc -30
+KPX Yhookabove odieresis.sc -30
KPX Yhookabove odieresis.sc -30
KPX Yhookabove agrave.pc -30
KPX Yhookabove aacute.pc -45
@@ -15625,51 +16049,24 @@ KPX Yhookabove ohorngrave.pc -30
KPX Yhookabove ohornhookabove.pc -30
KPX Yhookabove ohorntilde.pc -30
KPX Yhookabove ohorndotbelow.pc -30
-KPX Yhookabove agrave.sc -30
-KPX Yhookabove aacute.sc -45
-KPX Yhookabove acircumflex.sc -30
-KPX Yhookabove atilde.sc -30
-KPX Yhookabove adieresis.sc -30
-KPX Yhookabove aring.sc -30
-KPX Yhookabove ae.sc -80
-KPX Yhookabove ograve.sc -30
-KPX Yhookabove oacute.sc -45
-KPX Yhookabove ocircumflex.sc -30
-KPX Yhookabove otilde.sc -30
-KPX Yhookabove odieresis.sc -30
-KPX Yhookabove amacron.sc -30
-KPX Yhookabove abreve.sc -30
-KPX Yhookabove cacute.sc -45
-KPX Yhookabove ccircumflex.sc -30
-KPX Yhookabove cdotaccent.sc -30
-KPX Yhookabove ccaron.sc -30
-KPX Yhookabove gcircumflex.sc -30
-KPX Yhookabove gbreve.sc -30
-KPX Yhookabove gdotaccent.sc -30
-KPX Yhookabove omacron.sc -30
-KPX Yhookabove obreve.sc -30
-KPX Yhookabove ohungarumlaut.sc -30
-KPX Yhookabove oe.sc -40
-KPX Yhookabove sacute.sc -30
-KPX Yhookabove scircumflex.sc -20
-KPX Yhookabove scaron.sc -20
-KPX Yhookabove tcaron.sc 5
-KPX Yhookabove gcaron.sc -30
-KPX Yhookabove gacute.sc -45
-KPX Yhookabove aeacute.sc -80
-KPX Yhookabove ahookabove.sc -30
-KPX Yhookabove acircumflexdotbelow.sc -30
-KPX Yhookabove abrevedotbelow.sc -30
-KPX Yhookabove ohookabove.sc -30
-KPX Yhookabove ocircumflexdotbelow.sc -30
-KPX Yhookabove ohornacute.sc -30
-KPX Yhookabove ohorngrave.sc -30
-KPX Yhookabove ohornhookabove.sc -30
-KPX Yhookabove ohorntilde.sc -30
-KPX Yhookabove ohorndotbelow.sc -30
KPX yhookabove ae -25
KPX yhookabove oe -35
KPX yhookabove aeacute -25
+KPX Ytilde zdotaccent -67
+KPX Ytilde zcaron -67
+KPX Ytilde zacute -67
+KPX Ytilde z -67
+KPX Ytilde scircumflex -67
+KPX Ytilde scedilla -67
+KPX Ytilde scaron -67
+KPX Ytilde sacute -67
+KPX Ytilde s -67
+KPX Ytilde cdotaccent -67
+KPX Ytilde ccircumflex -67
+KPX Ytilde ccedilla -67
+KPX Ytilde ccaron -67
+KPX Ytilde cacute -67
+KPX Ytilde c -67
KPX Ytilde i -15
KPX Ytilde AE -115
KPX Ytilde agrave -50
@@ -15736,46 +16133,88 @@ KPX Ytilde uhornhookabove -40
KPX Ytilde uhorntilde -40
KPX Ytilde uhorndotbelow -40
KPX Ytilde abrevedotbelow.sc -30
+KPX Ytilde abrevedotbelow.sc -30
KPX Ytilde acircumflexdotbelow.sc -30
+KPX Ytilde acircumflexdotbelow.sc -30
+KPX Ytilde ahookabove.sc -30
KPX Ytilde ahookabove.sc -30
KPX Ytilde gacute.sc -45
+KPX Ytilde gacute.sc -45
+KPX Ytilde gcaron.sc -30
KPX Ytilde gcaron.sc -30
KPX Ytilde ocircumflexdotbelow.sc -30
+KPX Ytilde ocircumflexdotbelow.sc -30
KPX Ytilde oe.sc -40
+KPX Ytilde oe.sc -40
+KPX Ytilde ohookabove.sc -30
KPX Ytilde ohookabove.sc -30
KPX Ytilde ohornacute.sc -30
+KPX Ytilde ohornacute.sc -30
+KPX Ytilde ohorndotbelow.sc -30
KPX Ytilde ohorndotbelow.sc -30
KPX Ytilde ohorngrave.sc -30
+KPX Ytilde ohorngrave.sc -30
+KPX Ytilde ohornhookabove.sc -30
KPX Ytilde ohornhookabove.sc -30
KPX Ytilde ohorntilde.sc -30
+KPX Ytilde ohorntilde.sc -30
+KPX Ytilde scaron.sc -20
KPX Ytilde scaron.sc -20
KPX Ytilde abreve.sc -30
+KPX Ytilde abreve.sc -30
KPX Ytilde amacron.sc -30
+KPX Ytilde amacron.sc -30
+KPX Ytilde aeacute.sc -80
KPX Ytilde aeacute.sc -80
KPX Ytilde cacute.sc -45
+KPX Ytilde cacute.sc -45
+KPX Ytilde ccaron.sc -30
KPX Ytilde ccaron.sc -30
KPX Ytilde ccircumflex.sc -30
+KPX Ytilde ccircumflex.sc -30
+KPX Ytilde cdotaccent.sc -30
KPX Ytilde cdotaccent.sc -30
KPX Ytilde gbreve.sc -30
+KPX Ytilde gbreve.sc -30
+KPX Ytilde gcircumflex.sc -30
KPX Ytilde gcircumflex.sc -30
KPX Ytilde gdotaccent.sc -30
+KPX Ytilde gdotaccent.sc -30
KPX Ytilde obreve.sc -30
+KPX Ytilde obreve.sc -30
+KPX Ytilde ohungarumlaut.sc -30
KPX Ytilde ohungarumlaut.sc -30
KPX Ytilde omacron.sc -30
+KPX Ytilde omacron.sc -30
+KPX Ytilde sacute.sc -30
KPX Ytilde sacute.sc -30
KPX Ytilde scircumflex.sc -20
+KPX Ytilde scircumflex.sc -20
KPX Ytilde tcaron.sc 5
+KPX Ytilde tcaron.sc 5
+KPX Ytilde agrave.sc -30
KPX Ytilde agrave.sc -30
KPX Ytilde aacute.sc -45
+KPX Ytilde aacute.sc -45
+KPX Ytilde acircumflex.sc -30
KPX Ytilde acircumflex.sc -30
KPX Ytilde atilde.sc -30
+KPX Ytilde atilde.sc -30
KPX Ytilde adieresis.sc -30
+KPX Ytilde adieresis.sc -30
+KPX Ytilde aring.sc -30
KPX Ytilde aring.sc -30
KPX Ytilde ae.sc -80
+KPX Ytilde ae.sc -80
+KPX Ytilde ograve.sc -30
KPX Ytilde ograve.sc -30
KPX Ytilde oacute.sc -45
+KPX Ytilde oacute.sc -45
+KPX Ytilde ocircumflex.sc -30
KPX Ytilde ocircumflex.sc -30
KPX Ytilde otilde.sc -30
+KPX Ytilde otilde.sc -30
+KPX Ytilde odieresis.sc -30
KPX Ytilde odieresis.sc -30
KPX Ytilde agrave.pc -30
KPX Ytilde aacute.pc -45
@@ -15819,48 +16258,6 @@ KPX Ytilde ohorngrave.pc -30
KPX Ytilde ohornhookabove.pc -30
KPX Ytilde ohorntilde.pc -30
KPX Ytilde ohorndotbelow.pc -30
-KPX Ytilde agrave.sc -30
-KPX Ytilde aacute.sc -45
-KPX Ytilde acircumflex.sc -30
-KPX Ytilde atilde.sc -30
-KPX Ytilde adieresis.sc -30
-KPX Ytilde aring.sc -30
-KPX Ytilde ae.sc -80
-KPX Ytilde ograve.sc -30
-KPX Ytilde oacute.sc -45
-KPX Ytilde ocircumflex.sc -30
-KPX Ytilde otilde.sc -30
-KPX Ytilde odieresis.sc -30
-KPX Ytilde amacron.sc -30
-KPX Ytilde abreve.sc -30
-KPX Ytilde cacute.sc -45
-KPX Ytilde ccircumflex.sc -30
-KPX Ytilde cdotaccent.sc -30
-KPX Ytilde ccaron.sc -30
-KPX Ytilde gcircumflex.sc -30
-KPX Ytilde gbreve.sc -30
-KPX Ytilde gdotaccent.sc -30
-KPX Ytilde omacron.sc -30
-KPX Ytilde obreve.sc -30
-KPX Ytilde ohungarumlaut.sc -30
-KPX Ytilde oe.sc -40
-KPX Ytilde sacute.sc -30
-KPX Ytilde scircumflex.sc -20
-KPX Ytilde scaron.sc -20
-KPX Ytilde tcaron.sc 5
-KPX Ytilde gcaron.sc -30
-KPX Ytilde gacute.sc -45
-KPX Ytilde aeacute.sc -80
-KPX Ytilde ahookabove.sc -30
-KPX Ytilde acircumflexdotbelow.sc -30
-KPX Ytilde abrevedotbelow.sc -30
-KPX Ytilde ohookabove.sc -30
-KPX Ytilde ocircumflexdotbelow.sc -30
-KPX Ytilde ohornacute.sc -30
-KPX Ytilde ohorngrave.sc -30
-KPX Ytilde ohornhookabove.sc -30
-KPX Ytilde ohorntilde.sc -30
-KPX Ytilde ohorndotbelow.sc -30
KPX ytilde ae -25
KPX ytilde oe -35
KPX ytilde aeacute -25
@@ -15881,21 +16278,37 @@ KPX quoteleft Wgrave -15
KPX quoteleft Wacute -15
KPX quoteleft Wdieresis -15
KPX quoteleft amacron.sc -110
+KPX quoteleft amacron.sc -110
KPX quoteleft aogonek.sc -110
+KPX quoteleft aogonek.sc -110
+KPX quoteleft aeacute.sc -115
KPX quoteleft aeacute.sc -115
KPX quoteleft wacute.sc -15
+KPX quoteleft wacute.sc -15
KPX quoteleft wcircumflex.sc -15
+KPX quoteleft wcircumflex.sc -15
+KPX quoteleft wdieresis.sc -15
KPX quoteleft wdieresis.sc -15
KPX quoteleft wgrave.sc -15
+KPX quoteleft wgrave.sc -15
+KPX quoteleft ycircumflex.sc -25
KPX quoteleft ycircumflex.sc -25
KPX quoteleft a.sc -110
+KPX quoteleft a.sc -110
+KPX quoteleft v.sc -25
KPX quoteleft v.sc -25
KPX quoteleft w.sc -15
+KPX quoteleft w.sc -15
+KPX quoteleft y.sc -25
KPX quoteleft y.sc -25
KPX quoteleft adieresis.sc -110
+KPX quoteleft adieresis.sc -110
KPX quoteleft aring.sc -110
+KPX quoteleft aring.sc -110
+KPX quoteleft ae.sc -115
KPX quoteleft ae.sc -115
KPX quoteleft ydieresis.sc -25
+KPX quoteleft ydieresis.sc -25
KPX quoteleft a.pc -110
KPX quoteleft v.pc -25
KPX quoteleft w.pc -15
@@ -15912,22 +16325,6 @@ KPX quoteleft aeacute.pc -115
KPX quoteleft wgrave.pc -15
KPX quoteleft wacute.pc -15
KPX quoteleft wdieresis.pc -15
-KPX quoteleft a.sc -110
-KPX quoteleft v.sc -25
-KPX quoteleft w.sc -15
-KPX quoteleft y.sc -25
-KPX quoteleft adieresis.sc -110
-KPX quoteleft aring.sc -110
-KPX quoteleft ae.sc -115
-KPX quoteleft ydieresis.sc -25
-KPX quoteleft amacron.sc -110
-KPX quoteleft aogonek.sc -110
-KPX quoteleft wcircumflex.sc -15
-KPX quoteleft ycircumflex.sc -25
-KPX quoteleft aeacute.sc -115
-KPX quoteleft wgrave.sc -15
-KPX quoteleft wacute.sc -15
-KPX quoteleft wdieresis.sc -15
KPX quoteright comma -70
KPX quoteright period -80
KPX quoteright A -130
@@ -15970,11 +16367,18 @@ KPX quoteright wgrave -45
KPX quoteright wacute -45
KPX quoteright wdieresis -45
KPX quoteright amacron.sc -130
+KPX quoteright amacron.sc -130
KPX quoteright aogonek.sc -130
+KPX quoteright aogonek.sc -130
+KPX quoteright aeacute.sc -135
KPX quoteright aeacute.sc -135
KPX quoteright a.sc -130
+KPX quoteright a.sc -130
+KPX quoteright adieresis.sc -130
KPX quoteright adieresis.sc -130
KPX quoteright aring.sc -130
+KPX quoteright aring.sc -130
+KPX quoteright ae.sc -135
KPX quoteright ae.sc -135
KPX quoteright a.pc -130
KPX quoteright adieresis.pc -130
@@ -15983,13 +16387,6 @@ KPX quoteright ae.pc -135
KPX quoteright amacron.pc -130
KPX quoteright aogonek.pc -130
KPX quoteright aeacute.pc -135
-KPX quoteright a.sc -130
-KPX quoteright adieresis.sc -130
-KPX quoteright aring.sc -130
-KPX quoteright ae.sc -135
-KPX quoteright amacron.sc -130
-KPX quoteright aogonek.sc -130
-KPX quoteright aeacute.sc -135
KPX quotedblleft A -85
KPX quotedblleft T 15
KPX quotedblleft Adieresis -85
@@ -16001,13 +16398,22 @@ KPX quotedblleft Tcaron 15
KPX quotedblleft AEacute -90
KPX quotedblleft uni021A 15
KPX quotedblleft amacron.sc -85
+KPX quotedblleft amacron.sc -85
+KPX quotedblleft aogonek.sc -85
KPX quotedblleft aogonek.sc -85
KPX quotedblleft aeacute.sc -90
+KPX quotedblleft aeacute.sc -90
KPX quotedblleft tcaron.sc 15
+KPX quotedblleft tcaron.sc 15
+KPX quotedblleft a.sc -85
KPX quotedblleft a.sc -85
KPX quotedblleft t.sc 15
+KPX quotedblleft t.sc 15
+KPX quotedblleft adieresis.sc -85
KPX quotedblleft adieresis.sc -85
KPX quotedblleft aring.sc -85
+KPX quotedblleft aring.sc -85
+KPX quotedblleft ae.sc -90
KPX quotedblleft ae.sc -90
KPX quotedblleft a.pc -85
KPX quotedblleft t.pc 15
@@ -16019,15 +16425,6 @@ KPX quotedblleft aogonek.pc -85
KPX quotedblleft tcaron.pc 15
KPX quotedblleft aeacute.pc -90
KPX quotedblleft uni021B.pc 15
-KPX quotedblleft a.sc -85
-KPX quotedblleft t.sc 15
-KPX quotedblleft adieresis.sc -85
-KPX quotedblleft aring.sc -85
-KPX quotedblleft ae.sc -90
-KPX quotedblleft amacron.sc -85
-KPX quotedblleft aogonek.sc -85
-KPX quotedblleft tcaron.sc 15
-KPX quotedblleft aeacute.sc -90
KPX quotedblright A -95
KPX quotedblright T 10
KPX quotedblright Adieresis -95
@@ -16039,13 +16436,22 @@ KPX quotedblright Tcaron 10
KPX quotedblright AEacute -100
KPX quotedblright uni021A 10
KPX quotedblright amacron.sc -95
+KPX quotedblright amacron.sc -95
+KPX quotedblright aogonek.sc -95
KPX quotedblright aogonek.sc -95
KPX quotedblright aeacute.sc -100
+KPX quotedblright aeacute.sc -100
KPX quotedblright tcaron.sc 10
+KPX quotedblright tcaron.sc 10
+KPX quotedblright a.sc -95
KPX quotedblright a.sc -95
KPX quotedblright t.sc 10
+KPX quotedblright t.sc 10
+KPX quotedblright adieresis.sc -95
KPX quotedblright adieresis.sc -95
KPX quotedblright aring.sc -95
+KPX quotedblright aring.sc -95
+KPX quotedblright ae.sc -100
KPX quotedblright ae.sc -100
KPX quotedblright a.pc -95
KPX quotedblright t.pc 10
@@ -16057,15 +16463,6 @@ KPX quotedblright aogonek.pc -95
KPX quotedblright tcaron.pc 10
KPX quotedblright aeacute.pc -100
KPX quotedblright uni021B.pc 10
-KPX quotedblright a.sc -95
-KPX quotedblright t.sc 10
-KPX quotedblright adieresis.sc -95
-KPX quotedblright aring.sc -95
-KPX quotedblright ae.sc -100
-KPX quotedblright amacron.sc -95
-KPX quotedblright aogonek.sc -95
-KPX quotedblright tcaron.sc 10
-KPX quotedblright aeacute.sc -100
KPX quotedblbase A 10
KPX quotedblbase T -60
KPX quotedblbase V -105
@@ -16089,23 +16486,41 @@ KPX quotedblbase Wacute -75
KPX quotedblbase Wdieresis -75
KPX quotedblbase jacute 50
KPX quotedblbase amacron.sc 10
+KPX quotedblbase amacron.sc 10
+KPX quotedblbase aogonek.sc 10
KPX quotedblbase aogonek.sc 10
KPX quotedblbase aeacute.sc 20
+KPX quotedblbase aeacute.sc 20
KPX quotedblbase tcaron.sc -60
+KPX quotedblbase tcaron.sc -60
+KPX quotedblbase wacute.sc -75
KPX quotedblbase wacute.sc -75
KPX quotedblbase wcircumflex.sc -75
+KPX quotedblbase wcircumflex.sc -75
+KPX quotedblbase wdieresis.sc -75
KPX quotedblbase wdieresis.sc -75
KPX quotedblbase wgrave.sc -75
+KPX quotedblbase wgrave.sc -75
KPX quotedblbase ycircumflex.sc -85
+KPX quotedblbase ycircumflex.sc -85
+KPX quotedblbase a.sc 10
KPX quotedblbase a.sc 10
KPX quotedblbase t.sc -60
+KPX quotedblbase t.sc -60
+KPX quotedblbase v.sc -105
KPX quotedblbase v.sc -105
KPX quotedblbase w.sc -75
+KPX quotedblbase w.sc -75
KPX quotedblbase y.sc -85
+KPX quotedblbase y.sc -85
+KPX quotedblbase adieresis.sc 10
KPX quotedblbase adieresis.sc 10
KPX quotedblbase aring.sc 10
+KPX quotedblbase aring.sc 10
+KPX quotedblbase ae.sc 20
KPX quotedblbase ae.sc 20
KPX quotedblbase ydieresis.sc -85
+KPX quotedblbase ydieresis.sc -85
KPX quotedblbase a.pc 10
KPX quotedblbase t.pc -60
KPX quotedblbase v.pc -105
@@ -16125,24 +16540,6 @@ KPX quotedblbase uni021B.pc -60
KPX quotedblbase wgrave.pc -75
KPX quotedblbase wacute.pc -75
KPX quotedblbase wdieresis.pc -75
-KPX quotedblbase a.sc 10
-KPX quotedblbase t.sc -60
-KPX quotedblbase v.sc -105
-KPX quotedblbase w.sc -75
-KPX quotedblbase y.sc -85
-KPX quotedblbase adieresis.sc 10
-KPX quotedblbase aring.sc 10
-KPX quotedblbase ae.sc 20
-KPX quotedblbase ydieresis.sc -85
-KPX quotedblbase amacron.sc 10
-KPX quotedblbase aogonek.sc 10
-KPX quotedblbase tcaron.sc -60
-KPX quotedblbase wcircumflex.sc -75
-KPX quotedblbase ycircumflex.sc -85
-KPX quotedblbase aeacute.sc 20
-KPX quotedblbase wgrave.sc -75
-KPX quotedblbase wacute.sc -75
-KPX quotedblbase wdieresis.sc -75
KPX guilsinglright A -70
KPX guilsinglright T -125
KPX guilsinglright V -130
@@ -16162,443 +16559,420 @@ KPX guilsinglright uni021A -125
KPX guilsinglright Wgrave -105
KPX guilsinglright Wacute -105
KPX guilsinglright Wdieresis -105
-KPX zero.superior fraction -13
-KPX zero.superior fraction.alt 60
-KPX four.superior fraction -22
-KPX four.superior fraction.alt 70
-KPX five.superior fraction -21
-KPX five.superior fraction.alt 50
-KPX six.superior fraction.alt 70
-KPX seven.superior fraction -112
-KPX seven.superior fraction.alt -25
-KPX eight.superior fraction -18
-KPX eight.superior fraction.alt 70
-KPX nine.superior fraction -49
-KPX nine.superior fraction.alt 40
-KPX fraction.alt zero.inferior 70
-KPX fraction.alt one.inferior 55
-KPX fraction.alt two.inferior 80
-KPX fraction.alt three.inferior 65
-KPX fraction.alt four.inferior 7
-KPX fraction.alt five.inferior 25
-KPX fraction.alt six.inferior 35
-KPX fraction.alt seven.inferior 85
-KPX fraction.alt eight.inferior 60
-KPX fraction.alt nine.inferior 65
-KPX fraction.alt zero.dnom -9
-KPX fraction.alt one.dnom -61
-KPX fraction.alt two.dnom -13
-KPX fraction.alt three.dnom -37
-KPX fraction.alt four.dnom -79
-KPX fraction.alt five.dnom -61
+KPX fraction.alt zero.dnom -16
+KPX fraction.alt one.dnom 6
+KPX fraction.alt two.dnom 14
+KPX fraction.alt three.dnom -4
+KPX fraction.alt four.dnom -66
+KPX fraction.alt five.dnom -28
KPX fraction.alt six.dnom -47
-KPX fraction.alt seven.dnom -34
-KPX fraction.alt eight.dnom -27
-KPX fraction.alt nine.dnom -21
+KPX fraction.alt seven.dnom 6
+KPX fraction.alt eight.dnom 6
+KPX fraction.alt nine.dnom 5
KPX abreveacute.sc c.sc -35
-KPX abreveacute.sc t.sc -35
KPX abreveacute.sc c.sc -35
KPX abreveacute.sc t.sc -35
+KPX abreveacute.sc t.sc -35
KPX abrevedotbelow.sc c.sc -35
-KPX abrevedotbelow.sc t.sc -35
KPX abrevedotbelow.sc c.sc -35
KPX abrevedotbelow.sc t.sc -35
+KPX abrevedotbelow.sc t.sc -35
KPX acircumflexacute.sc c.sc -35
-KPX acircumflexacute.sc t.sc -35
-KPX acircumflexacute.sc u.sc -40
-KPX acircumflexacute.sc y.sc -55
KPX acircumflexacute.sc c.sc -35
KPX acircumflexacute.sc t.sc -35
+KPX acircumflexacute.sc t.sc -35
KPX acircumflexacute.sc u.sc -40
+KPX acircumflexacute.sc u.sc -40
+KPX acircumflexacute.sc y.sc -55
KPX acircumflexacute.sc y.sc -55
KPX acircumflexdotbelow.sc c.sc -35
-KPX acircumflexdotbelow.sc t.sc -35
-KPX acircumflexdotbelow.sc u.sc -40
-KPX acircumflexdotbelow.sc y.sc -55
KPX acircumflexdotbelow.sc c.sc -35
KPX acircumflexdotbelow.sc t.sc -35
+KPX acircumflexdotbelow.sc t.sc -35
+KPX acircumflexdotbelow.sc u.sc -40
KPX acircumflexdotbelow.sc u.sc -40
KPX acircumflexdotbelow.sc y.sc -55
+KPX acircumflexdotbelow.sc y.sc -55
KPX acircumflexgrave.sc u.sc -40
-KPX acircumflexgrave.sc y.sc -55
KPX acircumflexgrave.sc u.sc -40
KPX acircumflexgrave.sc y.sc -55
+KPX acircumflexgrave.sc y.sc -55
KPX acircumflexhookabove.sc u.sc -40
-KPX acircumflexhookabove.sc y.sc -55
KPX acircumflexhookabove.sc u.sc -40
KPX acircumflexhookabove.sc y.sc -55
+KPX acircumflexhookabove.sc y.sc -55
KPX acircumflextilde.sc u.sc -40
-KPX acircumflextilde.sc y.sc -55
KPX acircumflextilde.sc u.sc -40
KPX acircumflextilde.sc y.sc -55
+KPX acircumflextilde.sc y.sc -55
KPX adotbelow.sc c.sc -35
-KPX adotbelow.sc o.sc -40
-KPX adotbelow.sc t.sc -35
-KPX adotbelow.sc u.sc -40
-KPX adotbelow.sc y.sc -55
KPX adotbelow.sc c.sc -35
KPX adotbelow.sc o.sc -40
+KPX adotbelow.sc o.sc -40
+KPX adotbelow.sc t.sc -35
KPX adotbelow.sc t.sc -35
KPX adotbelow.sc u.sc -40
+KPX adotbelow.sc u.sc -40
+KPX adotbelow.sc y.sc -55
KPX adotbelow.sc y.sc -55
KPX ahookabove.sc o.sc -40
-KPX ahookabove.sc u.sc -40
-KPX ahookabove.sc y.sc -55
KPX ahookabove.sc o.sc -40
KPX ahookabove.sc u.sc -40
+KPX ahookabove.sc u.sc -40
KPX ahookabove.sc y.sc -55
+KPX ahookabove.sc y.sc -55
+KPX dcroat.sc abreveacute.sc -45
KPX dcroat.sc abreveacute.sc -45
KPX dcroat.sc abrevedotbelow.sc -45
+KPX dcroat.sc abrevedotbelow.sc -45
+KPX dcroat.sc abrevegrave.sc -45
KPX dcroat.sc abrevegrave.sc -45
KPX dcroat.sc abrevehookabove.sc -45
+KPX dcroat.sc abrevehookabove.sc -45
+KPX dcroat.sc abrevetilde.sc -45
KPX dcroat.sc abrevetilde.sc -45
KPX dcroat.sc acircumflexacute.sc -45
+KPX dcroat.sc acircumflexacute.sc -45
KPX dcroat.sc acircumflexdotbelow.sc -45
+KPX dcroat.sc acircumflexdotbelow.sc -45
+KPX dcroat.sc acircumflexgrave.sc -45
KPX dcroat.sc acircumflexgrave.sc -45
KPX dcroat.sc acircumflexhookabove.sc -45
+KPX dcroat.sc acircumflexhookabove.sc -45
+KPX dcroat.sc acircumflextilde.sc -45
KPX dcroat.sc acircumflextilde.sc -45
KPX dcroat.sc adotbelow.sc -45
+KPX dcroat.sc adotbelow.sc -45
KPX dcroat.sc ahookabove.sc -45
+KPX dcroat.sc ahookabove.sc -45
+KPX dcroat.sc abreve.sc -45
KPX dcroat.sc abreve.sc -45
KPX dcroat.sc a.sc -45
-KPX dcroat.sc agrave.sc -45
-KPX dcroat.sc aacute.sc -45
-KPX dcroat.sc acircumflex.sc -45
-KPX dcroat.sc atilde.sc -45
KPX dcroat.sc a.sc -45
KPX dcroat.sc agrave.sc -45
+KPX dcroat.sc agrave.sc -45
KPX dcroat.sc aacute.sc -45
+KPX dcroat.sc aacute.sc -45
+KPX dcroat.sc acircumflex.sc -45
KPX dcroat.sc acircumflex.sc -45
KPX dcroat.sc atilde.sc -45
-KPX dcroat.sc abreve.sc -45
-KPX dcroat.sc adotbelow.sc -45
-KPX dcroat.sc ahookabove.sc -45
-KPX dcroat.sc acircumflexacute.sc -45
-KPX dcroat.sc acircumflexgrave.sc -45
-KPX dcroat.sc acircumflexhookabove.sc -45
-KPX dcroat.sc acircumflextilde.sc -45
-KPX dcroat.sc acircumflexdotbelow.sc -45
-KPX dcroat.sc abreveacute.sc -45
-KPX dcroat.sc abrevegrave.sc -45
-KPX dcroat.sc abrevehookabove.sc -45
-KPX dcroat.sc abrevetilde.sc -45
-KPX dcroat.sc abrevedotbelow.sc -45
+KPX dcroat.sc atilde.sc -45
KPX gacute.sc amacron.sc -15
+KPX gacute.sc amacron.sc -15
+KPX gacute.sc aogonek.sc -15
KPX gacute.sc aogonek.sc -15
KPX gacute.sc aeacute.sc -15
+KPX gacute.sc aeacute.sc -15
+KPX gacute.sc tcaron.sc -15
KPX gacute.sc tcaron.sc -15
KPX gacute.sc wacute.sc -15
+KPX gacute.sc wacute.sc -15
+KPX gacute.sc wcircumflex.sc -15
KPX gacute.sc wcircumflex.sc -15
KPX gacute.sc wdieresis.sc -15
+KPX gacute.sc wdieresis.sc -15
+KPX gacute.sc wgrave.sc -15
KPX gacute.sc wgrave.sc -15
KPX gacute.sc ycircumflex.sc -15
+KPX gacute.sc ycircumflex.sc -15
KPX gacute.sc a.sc -15
-KPX gacute.sc t.sc -15
-KPX gacute.sc v.sc -15
-KPX gacute.sc w.sc -15
-KPX gacute.sc y.sc -15
-KPX gacute.sc adieresis.sc -15
-KPX gacute.sc aring.sc -15
-KPX gacute.sc ae.sc -15
-KPX gacute.sc ydieresis.sc -15
KPX gacute.sc a.sc -15
KPX gacute.sc t.sc -15
+KPX gacute.sc t.sc -15
KPX gacute.sc v.sc -15
+KPX gacute.sc v.sc -15
+KPX gacute.sc w.sc -15
KPX gacute.sc w.sc -15
KPX gacute.sc y.sc -15
+KPX gacute.sc y.sc -15
+KPX gacute.sc adieresis.sc -15
KPX gacute.sc adieresis.sc -15
KPX gacute.sc aring.sc -15
+KPX gacute.sc aring.sc -15
+KPX gacute.sc ae.sc -15
KPX gacute.sc ae.sc -15
KPX gacute.sc ydieresis.sc -15
-KPX gacute.sc amacron.sc -15
-KPX gacute.sc aogonek.sc -15
-KPX gacute.sc tcaron.sc -15
-KPX gacute.sc wcircumflex.sc -15
-KPX gacute.sc ycircumflex.sc -15
-KPX gacute.sc aeacute.sc -15
-KPX gacute.sc wgrave.sc -15
-KPX gacute.sc wacute.sc -15
-KPX gacute.sc wdieresis.sc -15
+KPX gacute.sc ydieresis.sc -15
+KPX gcaron.sc amacron.sc -15
KPX gcaron.sc amacron.sc -15
KPX gcaron.sc aogonek.sc -15
+KPX gcaron.sc aogonek.sc -15
KPX gcaron.sc aeacute.sc -15
+KPX gcaron.sc aeacute.sc -15
+KPX gcaron.sc tcaron.sc -15
KPX gcaron.sc tcaron.sc -15
KPX gcaron.sc wacute.sc -15
+KPX gcaron.sc wacute.sc -15
+KPX gcaron.sc wcircumflex.sc -15
KPX gcaron.sc wcircumflex.sc -15
KPX gcaron.sc wdieresis.sc -15
+KPX gcaron.sc wdieresis.sc -15
+KPX gcaron.sc wgrave.sc -15
KPX gcaron.sc wgrave.sc -15
KPX gcaron.sc ycircumflex.sc -15
+KPX gcaron.sc ycircumflex.sc -15
KPX gcaron.sc a.sc -15
-KPX gcaron.sc t.sc -15
-KPX gcaron.sc v.sc -15
-KPX gcaron.sc w.sc -15
-KPX gcaron.sc y.sc -15
-KPX gcaron.sc adieresis.sc -15
-KPX gcaron.sc aring.sc -15
-KPX gcaron.sc ae.sc -15
-KPX gcaron.sc ydieresis.sc -15
KPX gcaron.sc a.sc -15
KPX gcaron.sc t.sc -15
+KPX gcaron.sc t.sc -15
KPX gcaron.sc v.sc -15
+KPX gcaron.sc v.sc -15
+KPX gcaron.sc w.sc -15
KPX gcaron.sc w.sc -15
KPX gcaron.sc y.sc -15
+KPX gcaron.sc y.sc -15
KPX gcaron.sc adieresis.sc -15
+KPX gcaron.sc adieresis.sc -15
+KPX gcaron.sc aring.sc -15
KPX gcaron.sc aring.sc -15
KPX gcaron.sc ae.sc -15
+KPX gcaron.sc ae.sc -15
+KPX gcaron.sc ydieresis.sc -15
KPX gcaron.sc ydieresis.sc -15
-KPX gcaron.sc amacron.sc -15
-KPX gcaron.sc aogonek.sc -15
-KPX gcaron.sc tcaron.sc -15
-KPX gcaron.sc wcircumflex.sc -15
-KPX gcaron.sc ycircumflex.sc -15
-KPX gcaron.sc aeacute.sc -15
-KPX gcaron.sc wgrave.sc -15
-KPX gcaron.sc wacute.sc -15
-KPX gcaron.sc wdieresis.sc -15
KPX jacute.sc amacron.sc -35
+KPX jacute.sc amacron.sc -35
+KPX jacute.sc aogonek.sc -35
KPX jacute.sc aogonek.sc -35
KPX jacute.sc aeacute.sc -30
+KPX jacute.sc aeacute.sc -30
KPX jacute.sc a.sc -35
-KPX jacute.sc adieresis.sc -35
-KPX jacute.sc aring.sc -35
-KPX jacute.sc ae.sc -30
KPX jacute.sc a.sc -35
KPX jacute.sc adieresis.sc -35
+KPX jacute.sc adieresis.sc -35
+KPX jacute.sc aring.sc -35
KPX jacute.sc aring.sc -35
KPX jacute.sc ae.sc -30
-KPX jacute.sc amacron.sc -35
-KPX jacute.sc aogonek.sc -35
-KPX jacute.sc aeacute.sc -30
+KPX jacute.sc ae.sc -30
+KPX lslash.sc hyphen 25
KPX lslash.sc hyphen 25
KPX lslash.sc quoteright -125
+KPX lslash.sc quoteright -125
KPX lslash.sc quotedblright -100
+KPX lslash.sc quotedblright -100
+KPX lslash.sc udotbelow.sc -15
KPX lslash.sc udotbelow.sc -15
KPX lslash.sc uhookabove.sc -15
+KPX lslash.sc uhookabove.sc -15
+KPX lslash.sc uhornacute.sc -15
KPX lslash.sc uhornacute.sc -15
KPX lslash.sc uhorndotbelow.sc -15
+KPX lslash.sc uhorndotbelow.sc -15
+KPX lslash.sc uhorngrave.sc -15
KPX lslash.sc uhorngrave.sc -15
KPX lslash.sc uhornhookabove.sc -15
+KPX lslash.sc uhornhookabove.sc -15
+KPX lslash.sc uhorntilde.sc -15
KPX lslash.sc uhorntilde.sc -15
KPX lslash.sc ydotbelow.sc -55
+KPX lslash.sc ydotbelow.sc -55
KPX lslash.sc yhookabove.sc -55
+KPX lslash.sc yhookabove.sc -55
+KPX lslash.sc ytilde.sc -55
KPX lslash.sc ytilde.sc -55
KPX lslash.sc tcaron.sc -40
+KPX lslash.sc tcaron.sc -40
+KPX lslash.sc ubreve.sc -15
KPX lslash.sc ubreve.sc -15
KPX lslash.sc uhungarumlaut.sc -15
+KPX lslash.sc uhungarumlaut.sc -15
+KPX lslash.sc umacron.sc -15
KPX lslash.sc umacron.sc -15
KPX lslash.sc uogonek.sc -15
+KPX lslash.sc uogonek.sc -15
+KPX lslash.sc uring.sc -15
KPX lslash.sc uring.sc -15
KPX lslash.sc utilde.sc -15
+KPX lslash.sc utilde.sc -15
KPX lslash.sc wacute.sc -50
+KPX lslash.sc wacute.sc -50
+KPX lslash.sc wcircumflex.sc -50
KPX lslash.sc wcircumflex.sc -50
KPX lslash.sc wdieresis.sc -50
+KPX lslash.sc wdieresis.sc -50
+KPX lslash.sc wgrave.sc -50
KPX lslash.sc wgrave.sc -50
KPX lslash.sc ycircumflex.sc -55
+KPX lslash.sc ycircumflex.sc -55
+KPX lslash.sc ygrave.sc -55
KPX lslash.sc ygrave.sc -55
KPX lslash.sc t.sc -40
-KPX lslash.sc u.sc -15
-KPX lslash.sc v.sc -60
-KPX lslash.sc w.sc -50
-KPX lslash.sc y.sc -55
-KPX lslash.sc ugrave.sc -15
-KPX lslash.sc uacute.sc -15
-KPX lslash.sc ucircumflex.sc -15
-KPX lslash.sc udieresis.sc -15
-KPX lslash.sc yacute.sc -55
-KPX lslash.sc ydieresis.sc -55
-KPX lslash.sc hyphen 25
-KPX lslash.sc quoteright -125
-KPX lslash.sc quotedblright -100
KPX lslash.sc t.sc -40
KPX lslash.sc u.sc -15
+KPX lslash.sc u.sc -15
KPX lslash.sc v.sc -60
+KPX lslash.sc v.sc -60
+KPX lslash.sc w.sc -50
KPX lslash.sc w.sc -50
KPX lslash.sc y.sc -55
+KPX lslash.sc y.sc -55
+KPX lslash.sc ugrave.sc -15
KPX lslash.sc ugrave.sc -15
KPX lslash.sc uacute.sc -15
+KPX lslash.sc uacute.sc -15
+KPX lslash.sc ucircumflex.sc -15
KPX lslash.sc ucircumflex.sc -15
KPX lslash.sc udieresis.sc -15
+KPX lslash.sc udieresis.sc -15
+KPX lslash.sc yacute.sc -55
KPX lslash.sc yacute.sc -55
KPX lslash.sc ydieresis.sc -55
-KPX lslash.sc tcaron.sc -40
-KPX lslash.sc utilde.sc -15
-KPX lslash.sc umacron.sc -15
-KPX lslash.sc ubreve.sc -15
-KPX lslash.sc uring.sc -15
-KPX lslash.sc uhungarumlaut.sc -15
-KPX lslash.sc uogonek.sc -15
-KPX lslash.sc wcircumflex.sc -50
-KPX lslash.sc ycircumflex.sc -55
-KPX lslash.sc wgrave.sc -50
-KPX lslash.sc wacute.sc -50
-KPX lslash.sc wdieresis.sc -50
-KPX lslash.sc udotbelow.sc -15
-KPX lslash.sc uhookabove.sc -15
-KPX lslash.sc uhornacute.sc -15
-KPX lslash.sc uhorngrave.sc -15
-KPX lslash.sc uhornhookabove.sc -15
-KPX lslash.sc uhorntilde.sc -15
-KPX lslash.sc uhorndotbelow.sc -15
-KPX lslash.sc ygrave.sc -55
-KPX lslash.sc ydotbelow.sc -55
-KPX lslash.sc yhookabove.sc -55
-KPX lslash.sc ytilde.sc -55
+KPX lslash.sc ydieresis.sc -55
KPX odotbelow.sc a.sc -40
KPX odotbelow.sc a.sc -40
KPX ohookabove.sc a.sc -40
KPX ohookabove.sc a.sc -40
KPX oogonek.sc amacron.sc -40
+KPX oogonek.sc amacron.sc -40
+KPX oogonek.sc aogonek.sc -40
KPX oogonek.sc aogonek.sc -40
KPX oogonek.sc aeacute.sc -35
+KPX oogonek.sc aeacute.sc -35
+KPX oogonek.sc wacute.sc -35
KPX oogonek.sc wacute.sc -35
KPX oogonek.sc wcircumflex.sc -35
+KPX oogonek.sc wcircumflex.sc -35
+KPX oogonek.sc wdieresis.sc -35
KPX oogonek.sc wdieresis.sc -35
KPX oogonek.sc wgrave.sc -35
+KPX oogonek.sc wgrave.sc -35
+KPX oogonek.sc ycircumflex.sc -45
KPX oogonek.sc ycircumflex.sc -45
KPX oogonek.sc a.sc -40
-KPX oogonek.sc v.sc -45
-KPX oogonek.sc w.sc -35
-KPX oogonek.sc x.sc -35
-KPX oogonek.sc y.sc -45
-KPX oogonek.sc adieresis.sc -40
-KPX oogonek.sc aring.sc -40
-KPX oogonek.sc ae.sc -35
-KPX oogonek.sc ydieresis.sc -45
KPX oogonek.sc a.sc -40
KPX oogonek.sc v.sc -45
+KPX oogonek.sc v.sc -45
KPX oogonek.sc w.sc -35
+KPX oogonek.sc w.sc -35
+KPX oogonek.sc x.sc -35
KPX oogonek.sc x.sc -35
KPX oogonek.sc y.sc -45
+KPX oogonek.sc y.sc -45
KPX oogonek.sc adieresis.sc -40
+KPX oogonek.sc adieresis.sc -40
+KPX oogonek.sc aring.sc -40
KPX oogonek.sc aring.sc -40
KPX oogonek.sc ae.sc -35
+KPX oogonek.sc ae.sc -35
KPX oogonek.sc ydieresis.sc -45
-KPX oogonek.sc amacron.sc -40
-KPX oogonek.sc aogonek.sc -40
-KPX oogonek.sc wcircumflex.sc -35
-KPX oogonek.sc ycircumflex.sc -45
-KPX oogonek.sc aeacute.sc -35
-KPX oogonek.sc wgrave.sc -35
-KPX oogonek.sc wacute.sc -35
-KPX oogonek.sc wdieresis.sc -35
+KPX oogonek.sc ydieresis.sc -45
+KPX rdotaccent.sc hyphen -50
KPX rdotaccent.sc hyphen -50
KPX rdotaccent.sc gacute.sc -30
+KPX rdotaccent.sc gacute.sc -30
+KPX rdotaccent.sc gcaron.sc -30
KPX rdotaccent.sc gcaron.sc -30
KPX rdotaccent.sc oe.sc -25
+KPX rdotaccent.sc oe.sc -25
+KPX rdotaccent.sc oogonek.sc -30
KPX rdotaccent.sc oogonek.sc -30
KPX rdotaccent.sc cacute.sc -25
+KPX rdotaccent.sc cacute.sc -25
KPX rdotaccent.sc ccaron.sc -25
+KPX rdotaccent.sc ccaron.sc -25
+KPX rdotaccent.sc ccircumflex.sc -25
KPX rdotaccent.sc ccircumflex.sc -25
KPX rdotaccent.sc cdotaccent.sc -25
+KPX rdotaccent.sc cdotaccent.sc -25
+KPX rdotaccent.sc gbreve.sc -30
KPX rdotaccent.sc gbreve.sc -30
KPX rdotaccent.sc gcircumflex.sc -30
+KPX rdotaccent.sc gcircumflex.sc -30
KPX rdotaccent.sc gcommaaccent.sc -30
+KPX rdotaccent.sc gcommaaccent.sc -30
+KPX rdotaccent.sc gdotaccent.sc -30
KPX rdotaccent.sc gdotaccent.sc -30
KPX rdotaccent.sc obreve.sc -30
+KPX rdotaccent.sc obreve.sc -30
+KPX rdotaccent.sc ohungarumlaut.sc -30
KPX rdotaccent.sc ohungarumlaut.sc -30
KPX rdotaccent.sc omacron.sc -30
+KPX rdotaccent.sc omacron.sc -30
KPX rdotaccent.sc tcaron.sc -25
+KPX rdotaccent.sc tcaron.sc -25
+KPX rdotaccent.sc ubreve.sc -35
KPX rdotaccent.sc ubreve.sc -35
KPX rdotaccent.sc uhungarumlaut.sc -35
+KPX rdotaccent.sc uhungarumlaut.sc -35
+KPX rdotaccent.sc umacron.sc -35
KPX rdotaccent.sc umacron.sc -35
KPX rdotaccent.sc uogonek.sc -35
+KPX rdotaccent.sc uogonek.sc -35
+KPX rdotaccent.sc uring.sc -35
KPX rdotaccent.sc uring.sc -35
KPX rdotaccent.sc wacute.sc -45
+KPX rdotaccent.sc wacute.sc -45
+KPX rdotaccent.sc wcircumflex.sc -45
KPX rdotaccent.sc wcircumflex.sc -45
KPX rdotaccent.sc wdieresis.sc -45
+KPX rdotaccent.sc wdieresis.sc -45
KPX rdotaccent.sc wgrave.sc -45
+KPX rdotaccent.sc wgrave.sc -45
+KPX rdotaccent.sc ycircumflex.sc -50
KPX rdotaccent.sc ycircumflex.sc -50
KPX rdotaccent.sc c.sc -25
-KPX rdotaccent.sc g.sc -30
-KPX rdotaccent.sc o.sc -30
-KPX rdotaccent.sc t.sc -25
-KPX rdotaccent.sc u.sc -35
-KPX rdotaccent.sc v.sc -50
-KPX rdotaccent.sc w.sc -45
-KPX rdotaccent.sc y.sc -50
-KPX rdotaccent.sc ccedilla.sc -25
-KPX rdotaccent.sc odieresis.sc -30
-KPX rdotaccent.sc oslash.sc -30
-KPX rdotaccent.sc ucircumflex.sc -35
-KPX rdotaccent.sc udieresis.sc -35
-KPX rdotaccent.sc ydieresis.sc -50
-KPX rdotaccent.sc hyphen -50
KPX rdotaccent.sc c.sc -25
KPX rdotaccent.sc g.sc -30
+KPX rdotaccent.sc g.sc -30
+KPX rdotaccent.sc o.sc -30
KPX rdotaccent.sc o.sc -30
KPX rdotaccent.sc t.sc -25
+KPX rdotaccent.sc t.sc -25
+KPX rdotaccent.sc u.sc -35
KPX rdotaccent.sc u.sc -35
KPX rdotaccent.sc v.sc -50
+KPX rdotaccent.sc v.sc -50
+KPX rdotaccent.sc w.sc -45
KPX rdotaccent.sc w.sc -45
KPX rdotaccent.sc y.sc -50
+KPX rdotaccent.sc y.sc -50
+KPX rdotaccent.sc ccedilla.sc -25
KPX rdotaccent.sc ccedilla.sc -25
KPX rdotaccent.sc odieresis.sc -30
+KPX rdotaccent.sc odieresis.sc -30
+KPX rdotaccent.sc oslash.sc -30
KPX rdotaccent.sc oslash.sc -30
KPX rdotaccent.sc ucircumflex.sc -35
+KPX rdotaccent.sc ucircumflex.sc -35
+KPX rdotaccent.sc udieresis.sc -35
KPX rdotaccent.sc udieresis.sc -35
KPX rdotaccent.sc ydieresis.sc -50
-KPX rdotaccent.sc cacute.sc -25
-KPX rdotaccent.sc ccircumflex.sc -25
-KPX rdotaccent.sc cdotaccent.sc -25
-KPX rdotaccent.sc ccaron.sc -25
-KPX rdotaccent.sc gcircumflex.sc -30
-KPX rdotaccent.sc gbreve.sc -30
-KPX rdotaccent.sc gdotaccent.sc -30
-KPX rdotaccent.sc gcommaaccent.sc -30
-KPX rdotaccent.sc omacron.sc -30
-KPX rdotaccent.sc obreve.sc -30
-KPX rdotaccent.sc ohungarumlaut.sc -30
-KPX rdotaccent.sc oe.sc -25
-KPX rdotaccent.sc tcaron.sc -25
-KPX rdotaccent.sc umacron.sc -35
-KPX rdotaccent.sc ubreve.sc -35
-KPX rdotaccent.sc uring.sc -35
-KPX rdotaccent.sc uhungarumlaut.sc -35
-KPX rdotaccent.sc uogonek.sc -35
-KPX rdotaccent.sc wcircumflex.sc -45
-KPX rdotaccent.sc ycircumflex.sc -50
-KPX rdotaccent.sc gcaron.sc -30
-KPX rdotaccent.sc oogonek.sc -30
-KPX rdotaccent.sc gacute.sc -30
-KPX rdotaccent.sc wgrave.sc -45
-KPX rdotaccent.sc wacute.sc -45
-KPX rdotaccent.sc wdieresis.sc -45
+KPX rdotaccent.sc ydieresis.sc -50
+KPX scaron.sc amacron.sc -25
KPX scaron.sc amacron.sc -25
KPX scaron.sc aogonek.sc -25
+KPX scaron.sc aogonek.sc -25
+KPX scaron.sc aeacute.sc -20
KPX scaron.sc aeacute.sc -20
KPX scaron.sc tcaron.sc -15
+KPX scaron.sc tcaron.sc -15
+KPX scaron.sc wacute.sc -15
KPX scaron.sc wacute.sc -15
KPX scaron.sc wcircumflex.sc -15
+KPX scaron.sc wcircumflex.sc -15
+KPX scaron.sc wdieresis.sc -15
KPX scaron.sc wdieresis.sc -15
KPX scaron.sc wgrave.sc -15
+KPX scaron.sc wgrave.sc -15
+KPX scaron.sc ycircumflex.sc -20
KPX scaron.sc ycircumflex.sc -20
KPX scaron.sc a.sc -25
-KPX scaron.sc t.sc -15
-KPX scaron.sc v.sc -15
-KPX scaron.sc w.sc -15
-KPX scaron.sc y.sc -20
-KPX scaron.sc adieresis.sc -25
-KPX scaron.sc aring.sc -25
-KPX scaron.sc ae.sc -20
-KPX scaron.sc ydieresis.sc -20
KPX scaron.sc a.sc -25
KPX scaron.sc t.sc -15
+KPX scaron.sc t.sc -15
+KPX scaron.sc v.sc -15
KPX scaron.sc v.sc -15
KPX scaron.sc w.sc -15
+KPX scaron.sc w.sc -15
+KPX scaron.sc y.sc -20
KPX scaron.sc y.sc -20
KPX scaron.sc adieresis.sc -25
+KPX scaron.sc adieresis.sc -25
+KPX scaron.sc aring.sc -25
KPX scaron.sc aring.sc -25
KPX scaron.sc ae.sc -20
+KPX scaron.sc ae.sc -20
+KPX scaron.sc ydieresis.sc -20
KPX scaron.sc ydieresis.sc -20
-KPX scaron.sc amacron.sc -25
-KPX scaron.sc aogonek.sc -25
-KPX scaron.sc tcaron.sc -15
-KPX scaron.sc wcircumflex.sc -15
-KPX scaron.sc ycircumflex.sc -20
-KPX scaron.sc aeacute.sc -20
-KPX scaron.sc wgrave.sc -15
-KPX scaron.sc wacute.sc -15
-KPX scaron.sc wdieresis.sc -15
KPX udotbelow.sc a.sc -45
KPX udotbelow.sc a.sc -45
KPX uhookabove.sc a.sc -45
@@ -16614,9 +16988,9 @@ KPX uhornhookabove.sc a.sc -45
KPX uhorntilde.sc a.sc -45
KPX uhorntilde.sc a.sc -45
KPX ydotbelow.sc c.sc -45
-KPX ydotbelow.sc t.sc 10
KPX ydotbelow.sc c.sc -45
KPX ydotbelow.sc t.sc 10
+KPX ydotbelow.sc t.sc 10
KPX hyphen.prop two.prop -10
KPX hyphen.prop seven.prop -30
KPX hyphen.prop one.prop -20
@@ -16628,11 +17002,18 @@ KPX Jacute Amacron -55
KPX Jacute Aogonek -55
KPX Jacute AEacute -45
KPX Jacute amacron.sc -45
+KPX Jacute amacron.sc -45
KPX Jacute aogonek.sc -45
+KPX Jacute aogonek.sc -45
+KPX Jacute aeacute.sc -40
KPX Jacute aeacute.sc -40
KPX Jacute a.sc -45
+KPX Jacute a.sc -45
+KPX Jacute adieresis.sc -45
KPX Jacute adieresis.sc -45
KPX Jacute aring.sc -45
+KPX Jacute aring.sc -45
+KPX Jacute ae.sc -40
KPX Jacute ae.sc -40
KPX Jacute a.pc -45
KPX Jacute adieresis.pc -45
@@ -16641,3824 +17022,3817 @@ KPX Jacute ae.pc -40
KPX Jacute amacron.pc -45
KPX Jacute aogonek.pc -45
KPX Jacute aeacute.pc -40
-KPX Jacute a.sc -45
-KPX Jacute adieresis.sc -45
-KPX Jacute aring.sc -45
-KPX Jacute ae.sc -40
-KPX Jacute amacron.sc -45
-KPX Jacute aogonek.sc -45
-KPX Jacute aeacute.sc -40
KPX seven.prop hyphen.prop -20
KPX seven.prop four.prop -20
KPX seven.prop six.prop -10
KPX amacron.sc hyphen -25
+KPX amacron.sc hyphen -25
+KPX amacron.sc quoteright -115
KPX amacron.sc quoteright -115
KPX amacron.sc quotedblright -90
+KPX amacron.sc quotedblright -90
KPX amacron.sc gacute.sc -35
+KPX amacron.sc gacute.sc -35
+KPX amacron.sc gcaron.sc -35
KPX amacron.sc gcaron.sc -35
KPX amacron.sc oogonek.sc -40
+KPX amacron.sc oogonek.sc -40
+KPX amacron.sc cacute.sc -35
KPX amacron.sc cacute.sc -35
KPX amacron.sc ccaron.sc -35
+KPX amacron.sc ccaron.sc -35
+KPX amacron.sc ccircumflex.sc -35
KPX amacron.sc ccircumflex.sc -35
KPX amacron.sc cdotaccent.sc -35
+KPX amacron.sc cdotaccent.sc -35
+KPX amacron.sc gbreve.sc -35
KPX amacron.sc gbreve.sc -35
KPX amacron.sc gcircumflex.sc -35
+KPX amacron.sc gcircumflex.sc -35
KPX amacron.sc gcommaaccent.sc -35
+KPX amacron.sc gcommaaccent.sc -35
+KPX amacron.sc gdotaccent.sc -35
KPX amacron.sc gdotaccent.sc -35
KPX amacron.sc obreve.sc -40
+KPX amacron.sc obreve.sc -40
+KPX amacron.sc ohungarumlaut.sc -40
KPX amacron.sc ohungarumlaut.sc -40
KPX amacron.sc omacron.sc -40
+KPX amacron.sc omacron.sc -40
+KPX amacron.sc tcaron.sc -35
KPX amacron.sc tcaron.sc -35
KPX amacron.sc ubreve.sc -40
+KPX amacron.sc ubreve.sc -40
+KPX amacron.sc uhungarumlaut.sc -40
KPX amacron.sc uhungarumlaut.sc -40
KPX amacron.sc umacron.sc -40
+KPX amacron.sc umacron.sc -40
KPX amacron.sc uogonek.sc -40
+KPX amacron.sc uogonek.sc -40
+KPX amacron.sc uring.sc -40
KPX amacron.sc uring.sc -40
KPX amacron.sc wacute.sc -75
+KPX amacron.sc wacute.sc -75
+KPX amacron.sc wcircumflex.sc -75
KPX amacron.sc wcircumflex.sc -75
KPX amacron.sc wdieresis.sc -75
+KPX amacron.sc wdieresis.sc -75
KPX amacron.sc wgrave.sc -75
+KPX amacron.sc wgrave.sc -75
+KPX amacron.sc ycircumflex.sc -55
KPX amacron.sc ycircumflex.sc -55
KPX amacron.sc c.sc -35
-KPX amacron.sc g.sc -35
-KPX amacron.sc o.sc -40
-KPX amacron.sc q.sc -40
-KPX amacron.sc t.sc -35
-KPX amacron.sc u.sc -40
-KPX amacron.sc v.sc -85
-KPX amacron.sc w.sc -75
-KPX amacron.sc y.sc -55
-KPX amacron.sc ccedilla.sc -35
-KPX amacron.sc odieresis.sc -40
-KPX amacron.sc oslash.sc -40
-KPX amacron.sc ucircumflex.sc -40
-KPX amacron.sc udieresis.sc -40
-KPX amacron.sc ydieresis.sc -55
-KPX amacron.sc hyphen -25
-KPX amacron.sc quoteright -115
-KPX amacron.sc quotedblright -90
KPX amacron.sc c.sc -35
KPX amacron.sc g.sc -35
+KPX amacron.sc g.sc -35
KPX amacron.sc o.sc -40
+KPX amacron.sc o.sc -40
+KPX amacron.sc q.sc -40
KPX amacron.sc q.sc -40
KPX amacron.sc t.sc -35
+KPX amacron.sc t.sc -35
KPX amacron.sc u.sc -40
+KPX amacron.sc u.sc -40
+KPX amacron.sc v.sc -85
KPX amacron.sc v.sc -85
KPX amacron.sc w.sc -75
+KPX amacron.sc w.sc -75
+KPX amacron.sc y.sc -55
KPX amacron.sc y.sc -55
KPX amacron.sc ccedilla.sc -35
+KPX amacron.sc ccedilla.sc -35
+KPX amacron.sc odieresis.sc -40
KPX amacron.sc odieresis.sc -40
KPX amacron.sc oslash.sc -40
+KPX amacron.sc oslash.sc -40
+KPX amacron.sc ucircumflex.sc -40
KPX amacron.sc ucircumflex.sc -40
KPX amacron.sc udieresis.sc -40
+KPX amacron.sc udieresis.sc -40
KPX amacron.sc ydieresis.sc -55
-KPX amacron.sc cacute.sc -35
-KPX amacron.sc ccircumflex.sc -35
-KPX amacron.sc cdotaccent.sc -35
-KPX amacron.sc ccaron.sc -35
-KPX amacron.sc gcircumflex.sc -35
-KPX amacron.sc gbreve.sc -35
-KPX amacron.sc gdotaccent.sc -35
-KPX amacron.sc gcommaaccent.sc -35
-KPX amacron.sc omacron.sc -40
-KPX amacron.sc obreve.sc -40
-KPX amacron.sc ohungarumlaut.sc -40
-KPX amacron.sc tcaron.sc -35
-KPX amacron.sc umacron.sc -40
-KPX amacron.sc ubreve.sc -40
-KPX amacron.sc uring.sc -40
-KPX amacron.sc uhungarumlaut.sc -40
-KPX amacron.sc uogonek.sc -40
-KPX amacron.sc wcircumflex.sc -75
-KPX amacron.sc ycircumflex.sc -55
-KPX amacron.sc gcaron.sc -35
-KPX amacron.sc oogonek.sc -40
-KPX amacron.sc gacute.sc -35
-KPX amacron.sc wgrave.sc -75
-KPX amacron.sc wacute.sc -75
-KPX amacron.sc wdieresis.sc -75
+KPX amacron.sc ydieresis.sc -55
+KPX aogonek.sc hyphen -25
KPX aogonek.sc hyphen -25
KPX aogonek.sc quoteright -115
+KPX aogonek.sc quoteright -115
+KPX aogonek.sc quotedblright -90
KPX aogonek.sc quotedblright -90
KPX aogonek.sc gacute.sc -35
+KPX aogonek.sc gacute.sc -35
+KPX aogonek.sc gcaron.sc -35
KPX aogonek.sc gcaron.sc -35
KPX aogonek.sc oogonek.sc -40
+KPX aogonek.sc oogonek.sc -40
+KPX aogonek.sc cacute.sc -35
KPX aogonek.sc cacute.sc -35
KPX aogonek.sc ccaron.sc -35
+KPX aogonek.sc ccaron.sc -35
+KPX aogonek.sc ccircumflex.sc -35
KPX aogonek.sc ccircumflex.sc -35
KPX aogonek.sc cdotaccent.sc -35
+KPX aogonek.sc cdotaccent.sc -35
KPX aogonek.sc gbreve.sc -35
+KPX aogonek.sc gbreve.sc -35
+KPX aogonek.sc gcircumflex.sc -35
KPX aogonek.sc gcircumflex.sc -35
KPX aogonek.sc gcommaaccent.sc -35
+KPX aogonek.sc gcommaaccent.sc -35
+KPX aogonek.sc gdotaccent.sc -35
KPX aogonek.sc gdotaccent.sc -35
KPX aogonek.sc obreve.sc -40
+KPX aogonek.sc obreve.sc -40
+KPX aogonek.sc ohungarumlaut.sc -40
KPX aogonek.sc ohungarumlaut.sc -40
KPX aogonek.sc omacron.sc -40
+KPX aogonek.sc omacron.sc -40
+KPX aogonek.sc tcaron.sc -35
KPX aogonek.sc tcaron.sc -35
KPX aogonek.sc ubreve.sc -40
+KPX aogonek.sc ubreve.sc -40
KPX aogonek.sc uhungarumlaut.sc -40
+KPX aogonek.sc uhungarumlaut.sc -40
+KPX aogonek.sc umacron.sc -40
KPX aogonek.sc umacron.sc -40
KPX aogonek.sc uogonek.sc -40
+KPX aogonek.sc uogonek.sc -40
+KPX aogonek.sc uring.sc -40
KPX aogonek.sc uring.sc -40
KPX aogonek.sc wacute.sc -75
+KPX aogonek.sc wacute.sc -75
+KPX aogonek.sc wcircumflex.sc -75
KPX aogonek.sc wcircumflex.sc -75
KPX aogonek.sc wdieresis.sc -75
+KPX aogonek.sc wdieresis.sc -75
+KPX aogonek.sc wgrave.sc -75
KPX aogonek.sc wgrave.sc -75
KPX aogonek.sc ycircumflex.sc -55
+KPX aogonek.sc ycircumflex.sc -55
KPX aogonek.sc c.sc -35
-KPX aogonek.sc g.sc -35
-KPX aogonek.sc o.sc -40
-KPX aogonek.sc q.sc -40
-KPX aogonek.sc t.sc -35
-KPX aogonek.sc u.sc -40
-KPX aogonek.sc v.sc -85
-KPX aogonek.sc w.sc -75
-KPX aogonek.sc y.sc -55
-KPX aogonek.sc ccedilla.sc -35
-KPX aogonek.sc odieresis.sc -40
-KPX aogonek.sc oslash.sc -40
-KPX aogonek.sc ucircumflex.sc -40
-KPX aogonek.sc udieresis.sc -40
-KPX aogonek.sc ydieresis.sc -55
-KPX aogonek.sc hyphen -25
-KPX aogonek.sc quoteright -115
-KPX aogonek.sc quotedblright -90
KPX aogonek.sc c.sc -35
KPX aogonek.sc g.sc -35
+KPX aogonek.sc g.sc -35
KPX aogonek.sc o.sc -40
+KPX aogonek.sc o.sc -40
+KPX aogonek.sc q.sc -40
KPX aogonek.sc q.sc -40
KPX aogonek.sc t.sc -35
+KPX aogonek.sc t.sc -35
+KPX aogonek.sc u.sc -40
KPX aogonek.sc u.sc -40
KPX aogonek.sc v.sc -85
+KPX aogonek.sc v.sc -85
+KPX aogonek.sc w.sc -75
KPX aogonek.sc w.sc -75
KPX aogonek.sc y.sc -55
+KPX aogonek.sc y.sc -55
+KPX aogonek.sc ccedilla.sc -35
KPX aogonek.sc ccedilla.sc -35
KPX aogonek.sc odieresis.sc -40
+KPX aogonek.sc odieresis.sc -40
KPX aogonek.sc oslash.sc -40
+KPX aogonek.sc oslash.sc -40
+KPX aogonek.sc ucircumflex.sc -40
KPX aogonek.sc ucircumflex.sc -40
KPX aogonek.sc udieresis.sc -40
+KPX aogonek.sc udieresis.sc -40
+KPX aogonek.sc ydieresis.sc -55
KPX aogonek.sc ydieresis.sc -55
-KPX aogonek.sc cacute.sc -35
-KPX aogonek.sc ccircumflex.sc -35
-KPX aogonek.sc cdotaccent.sc -35
-KPX aogonek.sc ccaron.sc -35
-KPX aogonek.sc gcircumflex.sc -35
-KPX aogonek.sc gbreve.sc -35
-KPX aogonek.sc gdotaccent.sc -35
-KPX aogonek.sc gcommaaccent.sc -35
-KPX aogonek.sc omacron.sc -40
-KPX aogonek.sc obreve.sc -40
-KPX aogonek.sc ohungarumlaut.sc -40
-KPX aogonek.sc tcaron.sc -35
-KPX aogonek.sc umacron.sc -40
-KPX aogonek.sc ubreve.sc -40
-KPX aogonek.sc uring.sc -40
-KPX aogonek.sc uhungarumlaut.sc -40
-KPX aogonek.sc uogonek.sc -40
-KPX aogonek.sc wcircumflex.sc -75
-KPX aogonek.sc ycircumflex.sc -55
-KPX aogonek.sc gcaron.sc -35
-KPX aogonek.sc oogonek.sc -40
-KPX aogonek.sc gacute.sc -35
-KPX aogonek.sc wgrave.sc -75
-KPX aogonek.sc wacute.sc -75
-KPX aogonek.sc wdieresis.sc -75
KPX cacute.sc oogonek.sc -5
+KPX cacute.sc oogonek.sc -5
+KPX cacute.sc amacron.sc -15
KPX cacute.sc amacron.sc -15
KPX cacute.sc aogonek.sc -15
+KPX cacute.sc aogonek.sc -15
KPX cacute.sc aeacute.sc -10
+KPX cacute.sc aeacute.sc -10
+KPX cacute.sc obreve.sc -5
KPX cacute.sc obreve.sc -5
KPX cacute.sc ohungarumlaut.sc -5
+KPX cacute.sc ohungarumlaut.sc -5
+KPX cacute.sc omacron.sc -5
KPX cacute.sc omacron.sc -5
KPX cacute.sc a.sc -15
-KPX cacute.sc o.sc -5
-KPX cacute.sc adieresis.sc -15
-KPX cacute.sc aring.sc -15
-KPX cacute.sc ae.sc -10
-KPX cacute.sc odieresis.sc -5
-KPX cacute.sc oslash.sc -5
KPX cacute.sc a.sc -15
KPX cacute.sc o.sc -5
+KPX cacute.sc o.sc -5
KPX cacute.sc adieresis.sc -15
+KPX cacute.sc adieresis.sc -15
+KPX cacute.sc aring.sc -15
KPX cacute.sc aring.sc -15
KPX cacute.sc ae.sc -10
+KPX cacute.sc ae.sc -10
+KPX cacute.sc odieresis.sc -5
KPX cacute.sc odieresis.sc -5
KPX cacute.sc oslash.sc -5
-KPX cacute.sc amacron.sc -15
-KPX cacute.sc aogonek.sc -15
-KPX cacute.sc omacron.sc -5
-KPX cacute.sc obreve.sc -5
-KPX cacute.sc ohungarumlaut.sc -5
-KPX cacute.sc oogonek.sc -5
-KPX cacute.sc aeacute.sc -10
+KPX cacute.sc oslash.sc -5
KPX ccaron.sc oogonek.sc -5
+KPX ccaron.sc oogonek.sc -5
+KPX ccaron.sc amacron.sc -15
KPX ccaron.sc amacron.sc -15
KPX ccaron.sc aogonek.sc -15
+KPX ccaron.sc aogonek.sc -15
+KPX ccaron.sc aeacute.sc -10
KPX ccaron.sc aeacute.sc -10
KPX ccaron.sc obreve.sc -5
+KPX ccaron.sc obreve.sc -5
+KPX ccaron.sc ohungarumlaut.sc -5
KPX ccaron.sc ohungarumlaut.sc -5
KPX ccaron.sc omacron.sc -5
+KPX ccaron.sc omacron.sc -5
KPX ccaron.sc a.sc -15
-KPX ccaron.sc o.sc -5
-KPX ccaron.sc adieresis.sc -15
-KPX ccaron.sc aring.sc -15
-KPX ccaron.sc ae.sc -10
-KPX ccaron.sc odieresis.sc -5
-KPX ccaron.sc oslash.sc -5
KPX ccaron.sc a.sc -15
KPX ccaron.sc o.sc -5
+KPX ccaron.sc o.sc -5
+KPX ccaron.sc adieresis.sc -15
KPX ccaron.sc adieresis.sc -15
KPX ccaron.sc aring.sc -15
+KPX ccaron.sc aring.sc -15
+KPX ccaron.sc ae.sc -10
KPX ccaron.sc ae.sc -10
KPX ccaron.sc odieresis.sc -5
+KPX ccaron.sc odieresis.sc -5
KPX ccaron.sc oslash.sc -5
-KPX ccaron.sc amacron.sc -15
-KPX ccaron.sc aogonek.sc -15
-KPX ccaron.sc omacron.sc -5
-KPX ccaron.sc obreve.sc -5
-KPX ccaron.sc ohungarumlaut.sc -5
-KPX ccaron.sc oogonek.sc -5
-KPX ccaron.sc aeacute.sc -10
+KPX ccaron.sc oslash.sc -5
+KPX ccircumflex.sc oogonek.sc -5
KPX ccircumflex.sc oogonek.sc -5
KPX ccircumflex.sc amacron.sc -15
+KPX ccircumflex.sc amacron.sc -15
+KPX ccircumflex.sc aogonek.sc -15
KPX ccircumflex.sc aogonek.sc -15
KPX ccircumflex.sc aeacute.sc -10
+KPX ccircumflex.sc aeacute.sc -10
+KPX ccircumflex.sc obreve.sc -5
KPX ccircumflex.sc obreve.sc -5
KPX ccircumflex.sc ohungarumlaut.sc -5
+KPX ccircumflex.sc ohungarumlaut.sc -5
+KPX ccircumflex.sc omacron.sc -5
KPX ccircumflex.sc omacron.sc -5
KPX ccircumflex.sc a.sc -15
-KPX ccircumflex.sc o.sc -5
-KPX ccircumflex.sc adieresis.sc -15
-KPX ccircumflex.sc aring.sc -15
-KPX ccircumflex.sc ae.sc -10
-KPX ccircumflex.sc odieresis.sc -5
-KPX ccircumflex.sc oslash.sc -5
KPX ccircumflex.sc a.sc -15
KPX ccircumflex.sc o.sc -5
+KPX ccircumflex.sc o.sc -5
KPX ccircumflex.sc adieresis.sc -15
+KPX ccircumflex.sc adieresis.sc -15
+KPX ccircumflex.sc aring.sc -15
KPX ccircumflex.sc aring.sc -15
KPX ccircumflex.sc ae.sc -10
+KPX ccircumflex.sc ae.sc -10
+KPX ccircumflex.sc odieresis.sc -5
KPX ccircumflex.sc odieresis.sc -5
KPX ccircumflex.sc oslash.sc -5
-KPX ccircumflex.sc amacron.sc -15
-KPX ccircumflex.sc aogonek.sc -15
-KPX ccircumflex.sc omacron.sc -5
-KPX ccircumflex.sc obreve.sc -5
-KPX ccircumflex.sc ohungarumlaut.sc -5
-KPX ccircumflex.sc oogonek.sc -5
-KPX ccircumflex.sc aeacute.sc -10
+KPX ccircumflex.sc oslash.sc -5
KPX cdotaccent.sc oogonek.sc -5
+KPX cdotaccent.sc oogonek.sc -5
+KPX cdotaccent.sc amacron.sc -15
KPX cdotaccent.sc amacron.sc -15
KPX cdotaccent.sc aogonek.sc -15
+KPX cdotaccent.sc aogonek.sc -15
KPX cdotaccent.sc aeacute.sc -10
+KPX cdotaccent.sc aeacute.sc -10
+KPX cdotaccent.sc obreve.sc -5
KPX cdotaccent.sc obreve.sc -5
KPX cdotaccent.sc ohungarumlaut.sc -5
+KPX cdotaccent.sc ohungarumlaut.sc -5
+KPX cdotaccent.sc omacron.sc -5
KPX cdotaccent.sc omacron.sc -5
KPX cdotaccent.sc a.sc -15
-KPX cdotaccent.sc o.sc -5
-KPX cdotaccent.sc adieresis.sc -15
-KPX cdotaccent.sc aring.sc -15
-KPX cdotaccent.sc ae.sc -10
-KPX cdotaccent.sc odieresis.sc -5
-KPX cdotaccent.sc oslash.sc -5
KPX cdotaccent.sc a.sc -15
KPX cdotaccent.sc o.sc -5
+KPX cdotaccent.sc o.sc -5
KPX cdotaccent.sc adieresis.sc -15
+KPX cdotaccent.sc adieresis.sc -15
+KPX cdotaccent.sc aring.sc -15
KPX cdotaccent.sc aring.sc -15
KPX cdotaccent.sc ae.sc -10
+KPX cdotaccent.sc ae.sc -10
+KPX cdotaccent.sc odieresis.sc -5
KPX cdotaccent.sc odieresis.sc -5
KPX cdotaccent.sc oslash.sc -5
-KPX cdotaccent.sc amacron.sc -15
-KPX cdotaccent.sc aogonek.sc -15
-KPX cdotaccent.sc omacron.sc -5
-KPX cdotaccent.sc obreve.sc -5
-KPX cdotaccent.sc ohungarumlaut.sc -5
-KPX cdotaccent.sc oogonek.sc -5
-KPX cdotaccent.sc aeacute.sc -10
+KPX cdotaccent.sc oslash.sc -5
+KPX dcaron.sc jacute.sc -25
KPX dcaron.sc jacute.sc -25
KPX dcaron.sc amacron.sc -45
+KPX dcaron.sc amacron.sc -45
+KPX dcaron.sc aogonek.sc -45
KPX dcaron.sc aogonek.sc -45
KPX dcaron.sc jcircumflex.sc -25
+KPX dcaron.sc jcircumflex.sc -25
KPX dcaron.sc wacute.sc -35
+KPX dcaron.sc wacute.sc -35
+KPX dcaron.sc wcircumflex.sc -35
KPX dcaron.sc wcircumflex.sc -35
KPX dcaron.sc wdieresis.sc -35
+KPX dcaron.sc wdieresis.sc -35
+KPX dcaron.sc wgrave.sc -35
KPX dcaron.sc wgrave.sc -35
KPX dcaron.sc ycircumflex.sc -50
+KPX dcaron.sc ycircumflex.sc -50
KPX dcaron.sc a.sc -45
-KPX dcaron.sc j.sc -25
-KPX dcaron.sc v.sc -45
-KPX dcaron.sc w.sc -35
-KPX dcaron.sc x.sc -45
-KPX dcaron.sc y.sc -50
-KPX dcaron.sc adieresis.sc -45
-KPX dcaron.sc aring.sc -45
-KPX dcaron.sc ydieresis.sc -50
KPX dcaron.sc a.sc -45
KPX dcaron.sc j.sc -25
+KPX dcaron.sc j.sc -25
+KPX dcaron.sc v.sc -45
KPX dcaron.sc v.sc -45
KPX dcaron.sc w.sc -35
+KPX dcaron.sc w.sc -35
+KPX dcaron.sc x.sc -45
KPX dcaron.sc x.sc -45
KPX dcaron.sc y.sc -50
+KPX dcaron.sc y.sc -50
KPX dcaron.sc adieresis.sc -45
+KPX dcaron.sc adieresis.sc -45
+KPX dcaron.sc aring.sc -45
KPX dcaron.sc aring.sc -45
KPX dcaron.sc ydieresis.sc -50
-KPX dcaron.sc amacron.sc -45
-KPX dcaron.sc aogonek.sc -45
-KPX dcaron.sc jcircumflex.sc -25
-KPX dcaron.sc wcircumflex.sc -35
-KPX dcaron.sc ycircumflex.sc -50
-KPX dcaron.sc wgrave.sc -35
-KPX dcaron.sc wacute.sc -35
-KPX dcaron.sc wdieresis.sc -35
-KPX dcaron.sc jacute.sc -25
+KPX dcaron.sc ydieresis.sc -50
+KPX gbreve.sc amacron.sc -15
KPX gbreve.sc amacron.sc -15
KPX gbreve.sc aogonek.sc -15
+KPX gbreve.sc aogonek.sc -15
+KPX gbreve.sc aeacute.sc -15
KPX gbreve.sc aeacute.sc -15
KPX gbreve.sc tcaron.sc -15
+KPX gbreve.sc tcaron.sc -15
+KPX gbreve.sc wacute.sc -15
KPX gbreve.sc wacute.sc -15
KPX gbreve.sc wcircumflex.sc -15
+KPX gbreve.sc wcircumflex.sc -15
KPX gbreve.sc wdieresis.sc -15
+KPX gbreve.sc wdieresis.sc -15
+KPX gbreve.sc wgrave.sc -15
KPX gbreve.sc wgrave.sc -15
KPX gbreve.sc ycircumflex.sc -15
+KPX gbreve.sc ycircumflex.sc -15
KPX gbreve.sc a.sc -15
-KPX gbreve.sc t.sc -15
-KPX gbreve.sc v.sc -15
-KPX gbreve.sc w.sc -15
-KPX gbreve.sc y.sc -15
-KPX gbreve.sc adieresis.sc -15
-KPX gbreve.sc aring.sc -15
-KPX gbreve.sc ae.sc -15
-KPX gbreve.sc ydieresis.sc -15
KPX gbreve.sc a.sc -15
KPX gbreve.sc t.sc -15
+KPX gbreve.sc t.sc -15
KPX gbreve.sc v.sc -15
+KPX gbreve.sc v.sc -15
+KPX gbreve.sc w.sc -15
KPX gbreve.sc w.sc -15
KPX gbreve.sc y.sc -15
+KPX gbreve.sc y.sc -15
+KPX gbreve.sc adieresis.sc -15
KPX gbreve.sc adieresis.sc -15
KPX gbreve.sc aring.sc -15
+KPX gbreve.sc aring.sc -15
+KPX gbreve.sc ae.sc -15
KPX gbreve.sc ae.sc -15
KPX gbreve.sc ydieresis.sc -15
-KPX gbreve.sc amacron.sc -15
-KPX gbreve.sc aogonek.sc -15
-KPX gbreve.sc tcaron.sc -15
-KPX gbreve.sc wcircumflex.sc -15
-KPX gbreve.sc ycircumflex.sc -15
-KPX gbreve.sc aeacute.sc -15
-KPX gbreve.sc wgrave.sc -15
-KPX gbreve.sc wacute.sc -15
-KPX gbreve.sc wdieresis.sc -15
+KPX gbreve.sc ydieresis.sc -15
KPX gcircumflex.sc amacron.sc -15
+KPX gcircumflex.sc amacron.sc -15
+KPX gcircumflex.sc aogonek.sc -15
KPX gcircumflex.sc aogonek.sc -15
KPX gcircumflex.sc aeacute.sc -15
+KPX gcircumflex.sc aeacute.sc -15
+KPX gcircumflex.sc tcaron.sc -15
KPX gcircumflex.sc tcaron.sc -15
KPX gcircumflex.sc wacute.sc -15
+KPX gcircumflex.sc wacute.sc -15
+KPX gcircumflex.sc wcircumflex.sc -15
KPX gcircumflex.sc wcircumflex.sc -15
KPX gcircumflex.sc wdieresis.sc -15
+KPX gcircumflex.sc wdieresis.sc -15
+KPX gcircumflex.sc wgrave.sc -15
KPX gcircumflex.sc wgrave.sc -15
KPX gcircumflex.sc ycircumflex.sc -15
+KPX gcircumflex.sc ycircumflex.sc -15
KPX gcircumflex.sc a.sc -15
-KPX gcircumflex.sc t.sc -15
-KPX gcircumflex.sc v.sc -15
-KPX gcircumflex.sc w.sc -15
-KPX gcircumflex.sc y.sc -15
-KPX gcircumflex.sc adieresis.sc -15
-KPX gcircumflex.sc aring.sc -15
-KPX gcircumflex.sc ae.sc -15
-KPX gcircumflex.sc ydieresis.sc -15
KPX gcircumflex.sc a.sc -15
KPX gcircumflex.sc t.sc -15
+KPX gcircumflex.sc t.sc -15
KPX gcircumflex.sc v.sc -15
+KPX gcircumflex.sc v.sc -15
+KPX gcircumflex.sc w.sc -15
KPX gcircumflex.sc w.sc -15
KPX gcircumflex.sc y.sc -15
+KPX gcircumflex.sc y.sc -15
+KPX gcircumflex.sc adieresis.sc -15
KPX gcircumflex.sc adieresis.sc -15
KPX gcircumflex.sc aring.sc -15
+KPX gcircumflex.sc aring.sc -15
+KPX gcircumflex.sc ae.sc -15
KPX gcircumflex.sc ae.sc -15
KPX gcircumflex.sc ydieresis.sc -15
-KPX gcircumflex.sc amacron.sc -15
-KPX gcircumflex.sc aogonek.sc -15
-KPX gcircumflex.sc tcaron.sc -15
-KPX gcircumflex.sc wcircumflex.sc -15
-KPX gcircumflex.sc ycircumflex.sc -15
-KPX gcircumflex.sc aeacute.sc -15
-KPX gcircumflex.sc wgrave.sc -15
-KPX gcircumflex.sc wacute.sc -15
-KPX gcircumflex.sc wdieresis.sc -15
+KPX gcircumflex.sc ydieresis.sc -15
+KPX gcommaaccent.sc amacron.sc -15
KPX gcommaaccent.sc amacron.sc -15
KPX gcommaaccent.sc aogonek.sc -15
+KPX gcommaaccent.sc aogonek.sc -15
KPX gcommaaccent.sc aeacute.sc -15
+KPX gcommaaccent.sc aeacute.sc -15
+KPX gcommaaccent.sc tcaron.sc -15
KPX gcommaaccent.sc tcaron.sc -15
KPX gcommaaccent.sc wacute.sc -15
+KPX gcommaaccent.sc wacute.sc -15
+KPX gcommaaccent.sc wcircumflex.sc -15
KPX gcommaaccent.sc wcircumflex.sc -15
KPX gcommaaccent.sc wdieresis.sc -15
+KPX gcommaaccent.sc wdieresis.sc -15
+KPX gcommaaccent.sc wgrave.sc -15
KPX gcommaaccent.sc wgrave.sc -15
KPX gcommaaccent.sc ycircumflex.sc -15
+KPX gcommaaccent.sc ycircumflex.sc -15
KPX gcommaaccent.sc a.sc -15
-KPX gcommaaccent.sc t.sc -15
-KPX gcommaaccent.sc v.sc -15
-KPX gcommaaccent.sc w.sc -15
-KPX gcommaaccent.sc y.sc -15
-KPX gcommaaccent.sc adieresis.sc -15
-KPX gcommaaccent.sc aring.sc -15
-KPX gcommaaccent.sc ae.sc -15
-KPX gcommaaccent.sc ydieresis.sc -15
KPX gcommaaccent.sc a.sc -15
KPX gcommaaccent.sc t.sc -15
+KPX gcommaaccent.sc t.sc -15
+KPX gcommaaccent.sc v.sc -15
KPX gcommaaccent.sc v.sc -15
KPX gcommaaccent.sc w.sc -15
+KPX gcommaaccent.sc w.sc -15
KPX gcommaaccent.sc y.sc -15
+KPX gcommaaccent.sc y.sc -15
+KPX gcommaaccent.sc adieresis.sc -15
KPX gcommaaccent.sc adieresis.sc -15
KPX gcommaaccent.sc aring.sc -15
+KPX gcommaaccent.sc aring.sc -15
+KPX gcommaaccent.sc ae.sc -15
KPX gcommaaccent.sc ae.sc -15
KPX gcommaaccent.sc ydieresis.sc -15
-KPX gcommaaccent.sc amacron.sc -15
-KPX gcommaaccent.sc aogonek.sc -15
-KPX gcommaaccent.sc tcaron.sc -15
-KPX gcommaaccent.sc wcircumflex.sc -15
-KPX gcommaaccent.sc ycircumflex.sc -15
-KPX gcommaaccent.sc aeacute.sc -15
-KPX gcommaaccent.sc wgrave.sc -15
-KPX gcommaaccent.sc wacute.sc -15
-KPX gcommaaccent.sc wdieresis.sc -15
+KPX gcommaaccent.sc ydieresis.sc -15
+KPX gdotaccent.sc amacron.sc -15
KPX gdotaccent.sc amacron.sc -15
KPX gdotaccent.sc aogonek.sc -15
+KPX gdotaccent.sc aogonek.sc -15
+KPX gdotaccent.sc aeacute.sc -15
KPX gdotaccent.sc aeacute.sc -15
KPX gdotaccent.sc tcaron.sc -15
+KPX gdotaccent.sc tcaron.sc -15
KPX gdotaccent.sc wacute.sc -15
+KPX gdotaccent.sc wacute.sc -15
+KPX gdotaccent.sc wcircumflex.sc -15
KPX gdotaccent.sc wcircumflex.sc -15
KPX gdotaccent.sc wdieresis.sc -15
+KPX gdotaccent.sc wdieresis.sc -15
+KPX gdotaccent.sc wgrave.sc -15
KPX gdotaccent.sc wgrave.sc -15
KPX gdotaccent.sc ycircumflex.sc -15
+KPX gdotaccent.sc ycircumflex.sc -15
KPX gdotaccent.sc a.sc -15
-KPX gdotaccent.sc t.sc -15
-KPX gdotaccent.sc v.sc -15
-KPX gdotaccent.sc w.sc -15
-KPX gdotaccent.sc y.sc -15
-KPX gdotaccent.sc adieresis.sc -15
-KPX gdotaccent.sc aring.sc -15
-KPX gdotaccent.sc ae.sc -15
-KPX gdotaccent.sc ydieresis.sc -15
KPX gdotaccent.sc a.sc -15
KPX gdotaccent.sc t.sc -15
+KPX gdotaccent.sc t.sc -15
+KPX gdotaccent.sc v.sc -15
KPX gdotaccent.sc v.sc -15
KPX gdotaccent.sc w.sc -15
+KPX gdotaccent.sc w.sc -15
+KPX gdotaccent.sc y.sc -15
KPX gdotaccent.sc y.sc -15
KPX gdotaccent.sc adieresis.sc -15
+KPX gdotaccent.sc adieresis.sc -15
KPX gdotaccent.sc aring.sc -15
+KPX gdotaccent.sc aring.sc -15
+KPX gdotaccent.sc ae.sc -15
KPX gdotaccent.sc ae.sc -15
KPX gdotaccent.sc ydieresis.sc -15
-KPX gdotaccent.sc amacron.sc -15
-KPX gdotaccent.sc aogonek.sc -15
-KPX gdotaccent.sc tcaron.sc -15
-KPX gdotaccent.sc wcircumflex.sc -15
-KPX gdotaccent.sc ycircumflex.sc -15
-KPX gdotaccent.sc aeacute.sc -15
-KPX gdotaccent.sc wgrave.sc -15
-KPX gdotaccent.sc wacute.sc -15
-KPX gdotaccent.sc wdieresis.sc -15
+KPX gdotaccent.sc ydieresis.sc -15
+KPX jcircumflex.sc amacron.sc -35
KPX jcircumflex.sc amacron.sc -35
KPX jcircumflex.sc aogonek.sc -35
+KPX jcircumflex.sc aogonek.sc -35
+KPX jcircumflex.sc aeacute.sc -30
KPX jcircumflex.sc aeacute.sc -30
KPX jcircumflex.sc a.sc -35
-KPX jcircumflex.sc adieresis.sc -35
-KPX jcircumflex.sc aring.sc -35
-KPX jcircumflex.sc ae.sc -30
KPX jcircumflex.sc a.sc -35
KPX jcircumflex.sc adieresis.sc -35
+KPX jcircumflex.sc adieresis.sc -35
+KPX jcircumflex.sc aring.sc -35
KPX jcircumflex.sc aring.sc -35
KPX jcircumflex.sc ae.sc -30
-KPX jcircumflex.sc amacron.sc -35
-KPX jcircumflex.sc aogonek.sc -35
-KPX jcircumflex.sc aeacute.sc -30
+KPX jcircumflex.sc ae.sc -30
KPX kcommaaccent.sc hyphen -65
+KPX kcommaaccent.sc hyphen -65
+KPX kcommaaccent.sc gacute.sc -35
KPX kcommaaccent.sc gacute.sc -35
KPX kcommaaccent.sc gcaron.sc -35
+KPX kcommaaccent.sc gcaron.sc -35
KPX kcommaaccent.sc oe.sc -30
+KPX kcommaaccent.sc oe.sc -30
+KPX kcommaaccent.sc oogonek.sc -35
KPX kcommaaccent.sc oogonek.sc -35
KPX kcommaaccent.sc cacute.sc -30
+KPX kcommaaccent.sc cacute.sc -30
+KPX kcommaaccent.sc ccaron.sc -30
KPX kcommaaccent.sc ccaron.sc -30
KPX kcommaaccent.sc ccircumflex.sc -30
+KPX kcommaaccent.sc ccircumflex.sc -30
KPX kcommaaccent.sc cdotaccent.sc -30
+KPX kcommaaccent.sc cdotaccent.sc -30
+KPX kcommaaccent.sc gbreve.sc -35
KPX kcommaaccent.sc gbreve.sc -35
KPX kcommaaccent.sc gcircumflex.sc -35
+KPX kcommaaccent.sc gcircumflex.sc -35
+KPX kcommaaccent.sc gcommaaccent.sc -35
KPX kcommaaccent.sc gcommaaccent.sc -35
KPX kcommaaccent.sc gdotaccent.sc -35
+KPX kcommaaccent.sc gdotaccent.sc -35
KPX kcommaaccent.sc obreve.sc -35
+KPX kcommaaccent.sc obreve.sc -35
+KPX kcommaaccent.sc ohungarumlaut.sc -35
KPX kcommaaccent.sc ohungarumlaut.sc -35
KPX kcommaaccent.sc omacron.sc -35
+KPX kcommaaccent.sc omacron.sc -35
KPX kcommaaccent.sc c.sc -30
-KPX kcommaaccent.sc g.sc -35
-KPX kcommaaccent.sc o.sc -35
-KPX kcommaaccent.sc ccedilla.sc -30
-KPX kcommaaccent.sc odieresis.sc -35
-KPX kcommaaccent.sc oslash.sc -35
-KPX kcommaaccent.sc hyphen -65
KPX kcommaaccent.sc c.sc -30
KPX kcommaaccent.sc g.sc -35
+KPX kcommaaccent.sc g.sc -35
+KPX kcommaaccent.sc o.sc -35
KPX kcommaaccent.sc o.sc -35
KPX kcommaaccent.sc ccedilla.sc -30
+KPX kcommaaccent.sc ccedilla.sc -30
+KPX kcommaaccent.sc odieresis.sc -35
KPX kcommaaccent.sc odieresis.sc -35
KPX kcommaaccent.sc oslash.sc -35
-KPX kcommaaccent.sc cacute.sc -30
-KPX kcommaaccent.sc ccircumflex.sc -30
-KPX kcommaaccent.sc cdotaccent.sc -30
-KPX kcommaaccent.sc ccaron.sc -30
-KPX kcommaaccent.sc gcircumflex.sc -35
-KPX kcommaaccent.sc gbreve.sc -35
-KPX kcommaaccent.sc gdotaccent.sc -35
-KPX kcommaaccent.sc gcommaaccent.sc -35
-KPX kcommaaccent.sc omacron.sc -35
-KPX kcommaaccent.sc obreve.sc -35
-KPX kcommaaccent.sc ohungarumlaut.sc -35
-KPX kcommaaccent.sc oe.sc -30
-KPX kcommaaccent.sc gcaron.sc -35
-KPX kcommaaccent.sc oogonek.sc -35
-KPX kcommaaccent.sc gacute.sc -35
+KPX kcommaaccent.sc oslash.sc -35
KPX lacute.sc hyphen 25
+KPX lacute.sc hyphen 25
+KPX lacute.sc quoteright -125
KPX lacute.sc quoteright -125
KPX lacute.sc quotedblright -100
+KPX lacute.sc quotedblright -100
+KPX lacute.sc tcaron.sc -50
KPX lacute.sc tcaron.sc -50
KPX lacute.sc ubreve.sc -15
+KPX lacute.sc ubreve.sc -15
+KPX lacute.sc uhungarumlaut.sc -15
KPX lacute.sc uhungarumlaut.sc -15
KPX lacute.sc umacron.sc -15
+KPX lacute.sc umacron.sc -15
KPX lacute.sc uogonek.sc -15
+KPX lacute.sc uogonek.sc -15
+KPX lacute.sc uring.sc -15
KPX lacute.sc uring.sc -15
KPX lacute.sc wacute.sc -60
+KPX lacute.sc wacute.sc -60
+KPX lacute.sc wcircumflex.sc -60
KPX lacute.sc wcircumflex.sc -60
KPX lacute.sc wdieresis.sc -60
+KPX lacute.sc wdieresis.sc -60
+KPX lacute.sc wgrave.sc -60
KPX lacute.sc wgrave.sc -60
KPX lacute.sc ycircumflex.sc -65
+KPX lacute.sc ycircumflex.sc -65
KPX lacute.sc t.sc -50
-KPX lacute.sc u.sc -15
-KPX lacute.sc v.sc -75
-KPX lacute.sc w.sc -60
-KPX lacute.sc y.sc -65
-KPX lacute.sc ucircumflex.sc -15
-KPX lacute.sc udieresis.sc -15
-KPX lacute.sc ydieresis.sc -65
-KPX lacute.sc hyphen 25
-KPX lacute.sc quoteright -125
-KPX lacute.sc quotedblright -100
KPX lacute.sc t.sc -50
KPX lacute.sc u.sc -15
+KPX lacute.sc u.sc -15
KPX lacute.sc v.sc -75
+KPX lacute.sc v.sc -75
+KPX lacute.sc w.sc -60
KPX lacute.sc w.sc -60
KPX lacute.sc y.sc -65
+KPX lacute.sc y.sc -65
+KPX lacute.sc ucircumflex.sc -15
KPX lacute.sc ucircumflex.sc -15
KPX lacute.sc udieresis.sc -15
+KPX lacute.sc udieresis.sc -15
KPX lacute.sc ydieresis.sc -65
-KPX lacute.sc tcaron.sc -50
-KPX lacute.sc umacron.sc -15
-KPX lacute.sc ubreve.sc -15
-KPX lacute.sc uring.sc -15
-KPX lacute.sc uhungarumlaut.sc -15
-KPX lacute.sc uogonek.sc -15
-KPX lacute.sc wcircumflex.sc -60
-KPX lacute.sc ycircumflex.sc -65
-KPX lacute.sc wgrave.sc -60
-KPX lacute.sc wacute.sc -60
-KPX lacute.sc wdieresis.sc -60
+KPX lacute.sc ydieresis.sc -65
+KPX lcaron.sc hyphen 25
KPX lcaron.sc hyphen 25
KPX lcaron.sc quoteright -125
+KPX lcaron.sc quoteright -125
KPX lcaron.sc quotedblright -100
+KPX lcaron.sc quotedblright -100
+KPX lcaron.sc udotbelow.sc -10
KPX lcaron.sc udotbelow.sc -10
KPX lcaron.sc uhookabove.sc -10
+KPX lcaron.sc uhookabove.sc -10
+KPX lcaron.sc uhornacute.sc -10
KPX lcaron.sc uhornacute.sc -10
KPX lcaron.sc uhorndotbelow.sc -10
+KPX lcaron.sc uhorndotbelow.sc -10
+KPX lcaron.sc uhorngrave.sc -10
KPX lcaron.sc uhorngrave.sc -10
KPX lcaron.sc uhornhookabove.sc -10
+KPX lcaron.sc uhornhookabove.sc -10
+KPX lcaron.sc uhorntilde.sc -10
KPX lcaron.sc uhorntilde.sc -10
KPX lcaron.sc ydotbelow.sc -35
+KPX lcaron.sc ydotbelow.sc -35
KPX lcaron.sc yhookabove.sc -35
+KPX lcaron.sc yhookabove.sc -35
+KPX lcaron.sc ytilde.sc -35
KPX lcaron.sc ytilde.sc -35
KPX lcaron.sc tcaron.sc -25
+KPX lcaron.sc tcaron.sc -25
+KPX lcaron.sc ubreve.sc -10
KPX lcaron.sc ubreve.sc -10
KPX lcaron.sc uhungarumlaut.sc -10
+KPX lcaron.sc uhungarumlaut.sc -10
+KPX lcaron.sc umacron.sc -10
KPX lcaron.sc umacron.sc -10
KPX lcaron.sc uogonek.sc -10
+KPX lcaron.sc uogonek.sc -10
+KPX lcaron.sc uring.sc -10
KPX lcaron.sc uring.sc -10
KPX lcaron.sc utilde.sc -10
+KPX lcaron.sc utilde.sc -10
KPX lcaron.sc wacute.sc -30
+KPX lcaron.sc wacute.sc -30
+KPX lcaron.sc wcircumflex.sc -30
KPX lcaron.sc wcircumflex.sc -30
KPX lcaron.sc wdieresis.sc -30
+KPX lcaron.sc wdieresis.sc -30
+KPX lcaron.sc wgrave.sc -30
KPX lcaron.sc wgrave.sc -30
KPX lcaron.sc ycircumflex.sc -35
+KPX lcaron.sc ycircumflex.sc -35
+KPX lcaron.sc ygrave.sc -35
KPX lcaron.sc ygrave.sc -35
KPX lcaron.sc t.sc -25
-KPX lcaron.sc u.sc -10
-KPX lcaron.sc v.sc -40
-KPX lcaron.sc w.sc -30
-KPX lcaron.sc y.sc -35
-KPX lcaron.sc ugrave.sc -10
-KPX lcaron.sc uacute.sc -10
-KPX lcaron.sc ucircumflex.sc -10
-KPX lcaron.sc udieresis.sc -10
-KPX lcaron.sc yacute.sc -35
-KPX lcaron.sc ydieresis.sc -35
-KPX lcaron.sc hyphen 25
-KPX lcaron.sc quoteright -125
-KPX lcaron.sc quotedblright -100
KPX lcaron.sc t.sc -25
KPX lcaron.sc u.sc -10
+KPX lcaron.sc u.sc -10
KPX lcaron.sc v.sc -40
+KPX lcaron.sc v.sc -40
+KPX lcaron.sc w.sc -30
KPX lcaron.sc w.sc -30
KPX lcaron.sc y.sc -35
+KPX lcaron.sc y.sc -35
+KPX lcaron.sc ugrave.sc -10
KPX lcaron.sc ugrave.sc -10
KPX lcaron.sc uacute.sc -10
+KPX lcaron.sc uacute.sc -10
+KPX lcaron.sc ucircumflex.sc -10
KPX lcaron.sc ucircumflex.sc -10
KPX lcaron.sc udieresis.sc -10
+KPX lcaron.sc udieresis.sc -10
+KPX lcaron.sc yacute.sc -35
KPX lcaron.sc yacute.sc -35
KPX lcaron.sc ydieresis.sc -35
-KPX lcaron.sc tcaron.sc -25
-KPX lcaron.sc utilde.sc -10
-KPX lcaron.sc umacron.sc -10
-KPX lcaron.sc ubreve.sc -10
-KPX lcaron.sc uring.sc -10
-KPX lcaron.sc uhungarumlaut.sc -10
-KPX lcaron.sc uogonek.sc -10
-KPX lcaron.sc wcircumflex.sc -30
-KPX lcaron.sc ycircumflex.sc -35
-KPX lcaron.sc wgrave.sc -30
-KPX lcaron.sc wacute.sc -30
-KPX lcaron.sc wdieresis.sc -30
-KPX lcaron.sc udotbelow.sc -10
-KPX lcaron.sc uhookabove.sc -10
-KPX lcaron.sc uhornacute.sc -10
-KPX lcaron.sc uhorngrave.sc -10
-KPX lcaron.sc uhornhookabove.sc -10
-KPX lcaron.sc uhorntilde.sc -10
-KPX lcaron.sc uhorndotbelow.sc -10
-KPX lcaron.sc ygrave.sc -35
-KPX lcaron.sc ydotbelow.sc -35
-KPX lcaron.sc yhookabove.sc -35
-KPX lcaron.sc ytilde.sc -35
+KPX lcaron.sc ydieresis.sc -35
KPX lcommaaccent.sc hyphen 25
+KPX lcommaaccent.sc hyphen 25
+KPX lcommaaccent.sc quoteright -125
KPX lcommaaccent.sc quoteright -125
KPX lcommaaccent.sc quotedblright -100
+KPX lcommaaccent.sc quotedblright -100
KPX lcommaaccent.sc tcaron.sc -50
+KPX lcommaaccent.sc tcaron.sc -50
+KPX lcommaaccent.sc ubreve.sc -15
KPX lcommaaccent.sc ubreve.sc -15
KPX lcommaaccent.sc uhungarumlaut.sc -15
+KPX lcommaaccent.sc uhungarumlaut.sc -15
+KPX lcommaaccent.sc umacron.sc -15
KPX lcommaaccent.sc umacron.sc -15
KPX lcommaaccent.sc uogonek.sc -15
+KPX lcommaaccent.sc uogonek.sc -15
+KPX lcommaaccent.sc uring.sc -15
KPX lcommaaccent.sc uring.sc -15
KPX lcommaaccent.sc wacute.sc -60
+KPX lcommaaccent.sc wacute.sc -60
+KPX lcommaaccent.sc wcircumflex.sc -60
KPX lcommaaccent.sc wcircumflex.sc -60
KPX lcommaaccent.sc wdieresis.sc -60
+KPX lcommaaccent.sc wdieresis.sc -60
KPX lcommaaccent.sc wgrave.sc -60
+KPX lcommaaccent.sc wgrave.sc -60
+KPX lcommaaccent.sc ycircumflex.sc -65
KPX lcommaaccent.sc ycircumflex.sc -65
KPX lcommaaccent.sc t.sc -50
-KPX lcommaaccent.sc u.sc -15
-KPX lcommaaccent.sc v.sc -75
-KPX lcommaaccent.sc w.sc -60
-KPX lcommaaccent.sc y.sc -65
-KPX lcommaaccent.sc ucircumflex.sc -15
-KPX lcommaaccent.sc udieresis.sc -15
-KPX lcommaaccent.sc ydieresis.sc -65
-KPX lcommaaccent.sc hyphen 25
-KPX lcommaaccent.sc quoteright -125
-KPX lcommaaccent.sc quotedblright -100
KPX lcommaaccent.sc t.sc -50
KPX lcommaaccent.sc u.sc -15
+KPX lcommaaccent.sc u.sc -15
KPX lcommaaccent.sc v.sc -75
+KPX lcommaaccent.sc v.sc -75
+KPX lcommaaccent.sc w.sc -60
KPX lcommaaccent.sc w.sc -60
KPX lcommaaccent.sc y.sc -65
+KPX lcommaaccent.sc y.sc -65
+KPX lcommaaccent.sc ucircumflex.sc -15
KPX lcommaaccent.sc ucircumflex.sc -15
KPX lcommaaccent.sc udieresis.sc -15
+KPX lcommaaccent.sc udieresis.sc -15
KPX lcommaaccent.sc ydieresis.sc -65
-KPX lcommaaccent.sc tcaron.sc -50
-KPX lcommaaccent.sc umacron.sc -15
-KPX lcommaaccent.sc ubreve.sc -15
-KPX lcommaaccent.sc uring.sc -15
-KPX lcommaaccent.sc uhungarumlaut.sc -15
-KPX lcommaaccent.sc uogonek.sc -15
-KPX lcommaaccent.sc wcircumflex.sc -60
-KPX lcommaaccent.sc ycircumflex.sc -65
-KPX lcommaaccent.sc wgrave.sc -60
-KPX lcommaaccent.sc wacute.sc -60
-KPX lcommaaccent.sc wdieresis.sc -60
+KPX lcommaaccent.sc ydieresis.sc -65
+KPX nacute.sc comma -15
KPX nacute.sc comma -15
KPX nacute.sc period -20
+KPX nacute.sc period -20
+KPX nacute.sc gacute.sc -15
KPX nacute.sc gacute.sc -15
KPX nacute.sc gcaron.sc -15
+KPX nacute.sc gcaron.sc -15
+KPX nacute.sc oogonek.sc -15
KPX nacute.sc oogonek.sc -15
KPX nacute.sc amacron.sc -20
+KPX nacute.sc amacron.sc -20
KPX nacute.sc aogonek.sc -20
+KPX nacute.sc aogonek.sc -20
+KPX nacute.sc aeacute.sc -15
KPX nacute.sc aeacute.sc -15
KPX nacute.sc cacute.sc -10
+KPX nacute.sc cacute.sc -10
+KPX nacute.sc ccaron.sc -10
KPX nacute.sc ccaron.sc -10
KPX nacute.sc ccircumflex.sc -10
+KPX nacute.sc ccircumflex.sc -10
+KPX nacute.sc cdotaccent.sc -10
KPX nacute.sc cdotaccent.sc -10
KPX nacute.sc gbreve.sc -15
+KPX nacute.sc gbreve.sc -15
+KPX nacute.sc gcircumflex.sc -15
KPX nacute.sc gcircumflex.sc -15
KPX nacute.sc gcommaaccent.sc -15
+KPX nacute.sc gcommaaccent.sc -15
KPX nacute.sc gdotaccent.sc -15
+KPX nacute.sc gdotaccent.sc -15
+KPX nacute.sc obreve.sc -15
KPX nacute.sc obreve.sc -15
KPX nacute.sc ohungarumlaut.sc -15
+KPX nacute.sc ohungarumlaut.sc -15
+KPX nacute.sc omacron.sc -15
KPX nacute.sc omacron.sc -15
KPX nacute.sc a.sc -20
-KPX nacute.sc c.sc -10
-KPX nacute.sc g.sc -15
-KPX nacute.sc o.sc -15
-KPX nacute.sc adieresis.sc -20
-KPX nacute.sc aring.sc -20
-KPX nacute.sc ae.sc -15
-KPX nacute.sc ccedilla.sc -10
-KPX nacute.sc odieresis.sc -15
-KPX nacute.sc oslash.sc -15
-KPX nacute.sc comma -15
-KPX nacute.sc period -20
KPX nacute.sc a.sc -20
KPX nacute.sc c.sc -10
+KPX nacute.sc c.sc -10
+KPX nacute.sc g.sc -15
KPX nacute.sc g.sc -15
KPX nacute.sc o.sc -15
+KPX nacute.sc o.sc -15
KPX nacute.sc adieresis.sc -20
+KPX nacute.sc adieresis.sc -20
+KPX nacute.sc aring.sc -20
KPX nacute.sc aring.sc -20
KPX nacute.sc ae.sc -15
+KPX nacute.sc ae.sc -15
+KPX nacute.sc ccedilla.sc -10
KPX nacute.sc ccedilla.sc -10
KPX nacute.sc odieresis.sc -15
+KPX nacute.sc odieresis.sc -15
KPX nacute.sc oslash.sc -15
-KPX nacute.sc amacron.sc -20
-KPX nacute.sc aogonek.sc -20
-KPX nacute.sc cacute.sc -10
-KPX nacute.sc ccircumflex.sc -10
-KPX nacute.sc cdotaccent.sc -10
-KPX nacute.sc ccaron.sc -10
-KPX nacute.sc gcircumflex.sc -15
-KPX nacute.sc gbreve.sc -15
-KPX nacute.sc gdotaccent.sc -15
-KPX nacute.sc gcommaaccent.sc -15
-KPX nacute.sc omacron.sc -15
-KPX nacute.sc obreve.sc -15
-KPX nacute.sc ohungarumlaut.sc -15
-KPX nacute.sc gcaron.sc -15
-KPX nacute.sc oogonek.sc -15
-KPX nacute.sc gacute.sc -15
-KPX nacute.sc aeacute.sc -15
+KPX nacute.sc oslash.sc -15
+KPX ncaron.sc comma -15
KPX ncaron.sc comma -15
KPX ncaron.sc period -20
+KPX ncaron.sc period -20
+KPX ncaron.sc gacute.sc -15
KPX ncaron.sc gacute.sc -15
KPX ncaron.sc gcaron.sc -15
+KPX ncaron.sc gcaron.sc -15
KPX ncaron.sc oogonek.sc -15
+KPX ncaron.sc oogonek.sc -15
+KPX ncaron.sc amacron.sc -20
KPX ncaron.sc amacron.sc -20
KPX ncaron.sc aogonek.sc -20
+KPX ncaron.sc aogonek.sc -20
+KPX ncaron.sc aeacute.sc -15
KPX ncaron.sc aeacute.sc -15
KPX ncaron.sc cacute.sc -10
+KPX ncaron.sc cacute.sc -10
+KPX ncaron.sc ccaron.sc -10
KPX ncaron.sc ccaron.sc -10
KPX ncaron.sc ccircumflex.sc -10
+KPX ncaron.sc ccircumflex.sc -10
+KPX ncaron.sc cdotaccent.sc -10
KPX ncaron.sc cdotaccent.sc -10
KPX ncaron.sc gbreve.sc -15
+KPX ncaron.sc gbreve.sc -15
KPX ncaron.sc gcircumflex.sc -15
+KPX ncaron.sc gcircumflex.sc -15
+KPX ncaron.sc gcommaaccent.sc -15
KPX ncaron.sc gcommaaccent.sc -15
KPX ncaron.sc gdotaccent.sc -15
+KPX ncaron.sc gdotaccent.sc -15
+KPX ncaron.sc obreve.sc -15
KPX ncaron.sc obreve.sc -15
KPX ncaron.sc ohungarumlaut.sc -15
+KPX ncaron.sc ohungarumlaut.sc -15
+KPX ncaron.sc omacron.sc -15
KPX ncaron.sc omacron.sc -15
KPX ncaron.sc a.sc -20
-KPX ncaron.sc c.sc -10
-KPX ncaron.sc g.sc -15
-KPX ncaron.sc o.sc -15
-KPX ncaron.sc adieresis.sc -20
-KPX ncaron.sc aring.sc -20
-KPX ncaron.sc ae.sc -15
-KPX ncaron.sc ccedilla.sc -10
-KPX ncaron.sc odieresis.sc -15
-KPX ncaron.sc oslash.sc -15
-KPX ncaron.sc comma -15
-KPX ncaron.sc period -20
KPX ncaron.sc a.sc -20
KPX ncaron.sc c.sc -10
+KPX ncaron.sc c.sc -10
KPX ncaron.sc g.sc -15
+KPX ncaron.sc g.sc -15
+KPX ncaron.sc o.sc -15
KPX ncaron.sc o.sc -15
KPX ncaron.sc adieresis.sc -20
+KPX ncaron.sc adieresis.sc -20
+KPX ncaron.sc aring.sc -20
KPX ncaron.sc aring.sc -20
KPX ncaron.sc ae.sc -15
+KPX ncaron.sc ae.sc -15
+KPX ncaron.sc ccedilla.sc -10
KPX ncaron.sc ccedilla.sc -10
KPX ncaron.sc odieresis.sc -15
+KPX ncaron.sc odieresis.sc -15
+KPX ncaron.sc oslash.sc -15
KPX ncaron.sc oslash.sc -15
-KPX ncaron.sc amacron.sc -20
-KPX ncaron.sc aogonek.sc -20
-KPX ncaron.sc cacute.sc -10
-KPX ncaron.sc ccircumflex.sc -10
-KPX ncaron.sc cdotaccent.sc -10
-KPX ncaron.sc ccaron.sc -10
-KPX ncaron.sc gcircumflex.sc -15
-KPX ncaron.sc gbreve.sc -15
-KPX ncaron.sc gdotaccent.sc -15
-KPX ncaron.sc gcommaaccent.sc -15
-KPX ncaron.sc omacron.sc -15
-KPX ncaron.sc obreve.sc -15
-KPX ncaron.sc ohungarumlaut.sc -15
-KPX ncaron.sc gcaron.sc -15
-KPX ncaron.sc oogonek.sc -15
-KPX ncaron.sc gacute.sc -15
-KPX ncaron.sc aeacute.sc -15
KPX ncommaaccent.sc comma -15
+KPX ncommaaccent.sc comma -15
+KPX ncommaaccent.sc period -20
KPX ncommaaccent.sc period -20
KPX ncommaaccent.sc gacute.sc -15
+KPX ncommaaccent.sc gacute.sc -15
KPX ncommaaccent.sc gcaron.sc -15
+KPX ncommaaccent.sc gcaron.sc -15
+KPX ncommaaccent.sc oogonek.sc -15
KPX ncommaaccent.sc oogonek.sc -15
KPX ncommaaccent.sc amacron.sc -20
+KPX ncommaaccent.sc amacron.sc -20
+KPX ncommaaccent.sc aogonek.sc -20
KPX ncommaaccent.sc aogonek.sc -20
KPX ncommaaccent.sc aeacute.sc -15
+KPX ncommaaccent.sc aeacute.sc -15
+KPX ncommaaccent.sc cacute.sc -10
KPX ncommaaccent.sc cacute.sc -10
KPX ncommaaccent.sc ccaron.sc -10
+KPX ncommaaccent.sc ccaron.sc -10
+KPX ncommaaccent.sc ccircumflex.sc -10
KPX ncommaaccent.sc ccircumflex.sc -10
KPX ncommaaccent.sc cdotaccent.sc -10
+KPX ncommaaccent.sc cdotaccent.sc -10
KPX ncommaaccent.sc gbreve.sc -15
+KPX ncommaaccent.sc gbreve.sc -15
+KPX ncommaaccent.sc gcircumflex.sc -15
KPX ncommaaccent.sc gcircumflex.sc -15
KPX ncommaaccent.sc gcommaaccent.sc -15
+KPX ncommaaccent.sc gcommaaccent.sc -15
+KPX ncommaaccent.sc gdotaccent.sc -15
KPX ncommaaccent.sc gdotaccent.sc -15
KPX ncommaaccent.sc obreve.sc -15
+KPX ncommaaccent.sc obreve.sc -15
+KPX ncommaaccent.sc ohungarumlaut.sc -15
KPX ncommaaccent.sc ohungarumlaut.sc -15
KPX ncommaaccent.sc omacron.sc -15
+KPX ncommaaccent.sc omacron.sc -15
KPX ncommaaccent.sc a.sc -20
-KPX ncommaaccent.sc c.sc -10
-KPX ncommaaccent.sc g.sc -15
-KPX ncommaaccent.sc o.sc -15
-KPX ncommaaccent.sc adieresis.sc -20
-KPX ncommaaccent.sc aring.sc -20
-KPX ncommaaccent.sc ae.sc -15
-KPX ncommaaccent.sc ccedilla.sc -10
-KPX ncommaaccent.sc odieresis.sc -15
-KPX ncommaaccent.sc oslash.sc -15
-KPX ncommaaccent.sc comma -15
-KPX ncommaaccent.sc period -20
KPX ncommaaccent.sc a.sc -20
KPX ncommaaccent.sc c.sc -10
+KPX ncommaaccent.sc c.sc -10
+KPX ncommaaccent.sc g.sc -15
KPX ncommaaccent.sc g.sc -15
KPX ncommaaccent.sc o.sc -15
+KPX ncommaaccent.sc o.sc -15
+KPX ncommaaccent.sc adieresis.sc -20
KPX ncommaaccent.sc adieresis.sc -20
KPX ncommaaccent.sc aring.sc -20
+KPX ncommaaccent.sc aring.sc -20
+KPX ncommaaccent.sc ae.sc -15
KPX ncommaaccent.sc ae.sc -15
KPX ncommaaccent.sc ccedilla.sc -10
+KPX ncommaaccent.sc ccedilla.sc -10
+KPX ncommaaccent.sc odieresis.sc -15
KPX ncommaaccent.sc odieresis.sc -15
KPX ncommaaccent.sc oslash.sc -15
-KPX ncommaaccent.sc amacron.sc -20
-KPX ncommaaccent.sc aogonek.sc -20
-KPX ncommaaccent.sc cacute.sc -10
-KPX ncommaaccent.sc ccircumflex.sc -10
-KPX ncommaaccent.sc cdotaccent.sc -10
-KPX ncommaaccent.sc ccaron.sc -10
-KPX ncommaaccent.sc gcircumflex.sc -15
-KPX ncommaaccent.sc gbreve.sc -15
-KPX ncommaaccent.sc gdotaccent.sc -15
-KPX ncommaaccent.sc gcommaaccent.sc -15
-KPX ncommaaccent.sc omacron.sc -15
-KPX ncommaaccent.sc obreve.sc -15
-KPX ncommaaccent.sc ohungarumlaut.sc -15
-KPX ncommaaccent.sc gcaron.sc -15
-KPX ncommaaccent.sc oogonek.sc -15
-KPX ncommaaccent.sc gacute.sc -15
-KPX ncommaaccent.sc aeacute.sc -15
+KPX ncommaaccent.sc oslash.sc -15
+KPX obreve.sc amacron.sc -40
KPX obreve.sc amacron.sc -40
KPX obreve.sc aogonek.sc -40
+KPX obreve.sc aogonek.sc -40
+KPX obreve.sc aeacute.sc -35
KPX obreve.sc aeacute.sc -35
KPX obreve.sc wacute.sc -35
+KPX obreve.sc wacute.sc -35
+KPX obreve.sc wcircumflex.sc -35
KPX obreve.sc wcircumflex.sc -35
KPX obreve.sc wdieresis.sc -35
+KPX obreve.sc wdieresis.sc -35
KPX obreve.sc wgrave.sc -35
+KPX obreve.sc wgrave.sc -35
+KPX obreve.sc ycircumflex.sc -45
KPX obreve.sc ycircumflex.sc -45
KPX obreve.sc a.sc -40
-KPX obreve.sc v.sc -45
-KPX obreve.sc w.sc -35
-KPX obreve.sc x.sc -35
-KPX obreve.sc y.sc -45
-KPX obreve.sc adieresis.sc -40
-KPX obreve.sc aring.sc -40
-KPX obreve.sc ae.sc -35
-KPX obreve.sc ydieresis.sc -45
KPX obreve.sc a.sc -40
KPX obreve.sc v.sc -45
+KPX obreve.sc v.sc -45
KPX obreve.sc w.sc -35
+KPX obreve.sc w.sc -35
+KPX obreve.sc x.sc -35
KPX obreve.sc x.sc -35
KPX obreve.sc y.sc -45
+KPX obreve.sc y.sc -45
KPX obreve.sc adieresis.sc -40
+KPX obreve.sc adieresis.sc -40
+KPX obreve.sc aring.sc -40
KPX obreve.sc aring.sc -40
KPX obreve.sc ae.sc -35
+KPX obreve.sc ae.sc -35
KPX obreve.sc ydieresis.sc -45
-KPX obreve.sc amacron.sc -40
-KPX obreve.sc aogonek.sc -40
-KPX obreve.sc wcircumflex.sc -35
-KPX obreve.sc ycircumflex.sc -45
-KPX obreve.sc aeacute.sc -35
-KPX obreve.sc wgrave.sc -35
-KPX obreve.sc wacute.sc -35
-KPX obreve.sc wdieresis.sc -35
+KPX obreve.sc ydieresis.sc -45
+KPX ohungarumlaut.sc amacron.sc -40
KPX ohungarumlaut.sc amacron.sc -40
KPX ohungarumlaut.sc aogonek.sc -40
+KPX ohungarumlaut.sc aogonek.sc -40
+KPX ohungarumlaut.sc aeacute.sc -35
KPX ohungarumlaut.sc aeacute.sc -35
KPX ohungarumlaut.sc wacute.sc -35
+KPX ohungarumlaut.sc wacute.sc -35
+KPX ohungarumlaut.sc wcircumflex.sc -35
KPX ohungarumlaut.sc wcircumflex.sc -35
KPX ohungarumlaut.sc wdieresis.sc -35
+KPX ohungarumlaut.sc wdieresis.sc -35
KPX ohungarumlaut.sc wgrave.sc -35
+KPX ohungarumlaut.sc wgrave.sc -35
+KPX ohungarumlaut.sc ycircumflex.sc -45
KPX ohungarumlaut.sc ycircumflex.sc -45
KPX ohungarumlaut.sc a.sc -40
-KPX ohungarumlaut.sc v.sc -45
-KPX ohungarumlaut.sc w.sc -35
-KPX ohungarumlaut.sc x.sc -35
-KPX ohungarumlaut.sc y.sc -45
-KPX ohungarumlaut.sc adieresis.sc -40
-KPX ohungarumlaut.sc aring.sc -40
-KPX ohungarumlaut.sc ae.sc -35
-KPX ohungarumlaut.sc ydieresis.sc -45
KPX ohungarumlaut.sc a.sc -40
KPX ohungarumlaut.sc v.sc -45
+KPX ohungarumlaut.sc v.sc -45
KPX ohungarumlaut.sc w.sc -35
+KPX ohungarumlaut.sc w.sc -35
+KPX ohungarumlaut.sc x.sc -35
KPX ohungarumlaut.sc x.sc -35
KPX ohungarumlaut.sc y.sc -45
+KPX ohungarumlaut.sc y.sc -45
+KPX ohungarumlaut.sc adieresis.sc -40
KPX ohungarumlaut.sc adieresis.sc -40
KPX ohungarumlaut.sc aring.sc -40
+KPX ohungarumlaut.sc aring.sc -40
+KPX ohungarumlaut.sc ae.sc -35
KPX ohungarumlaut.sc ae.sc -35
KPX ohungarumlaut.sc ydieresis.sc -45
-KPX ohungarumlaut.sc amacron.sc -40
-KPX ohungarumlaut.sc aogonek.sc -40
-KPX ohungarumlaut.sc wcircumflex.sc -35
-KPX ohungarumlaut.sc ycircumflex.sc -45
-KPX ohungarumlaut.sc aeacute.sc -35
-KPX ohungarumlaut.sc wgrave.sc -35
-KPX ohungarumlaut.sc wacute.sc -35
-KPX ohungarumlaut.sc wdieresis.sc -35
+KPX ohungarumlaut.sc ydieresis.sc -45
+KPX omacron.sc amacron.sc -40
KPX omacron.sc amacron.sc -40
KPX omacron.sc aogonek.sc -40
+KPX omacron.sc aogonek.sc -40
+KPX omacron.sc aeacute.sc -35
KPX omacron.sc aeacute.sc -35
KPX omacron.sc wacute.sc -35
+KPX omacron.sc wacute.sc -35
+KPX omacron.sc wcircumflex.sc -35
KPX omacron.sc wcircumflex.sc -35
KPX omacron.sc wdieresis.sc -35
+KPX omacron.sc wdieresis.sc -35
+KPX omacron.sc wgrave.sc -35
KPX omacron.sc wgrave.sc -35
KPX omacron.sc ycircumflex.sc -45
+KPX omacron.sc ycircumflex.sc -45
KPX omacron.sc a.sc -40
-KPX omacron.sc v.sc -45
-KPX omacron.sc w.sc -35
-KPX omacron.sc x.sc -35
-KPX omacron.sc y.sc -45
-KPX omacron.sc adieresis.sc -40
-KPX omacron.sc aring.sc -40
-KPX omacron.sc ae.sc -35
-KPX omacron.sc ydieresis.sc -45
KPX omacron.sc a.sc -40
KPX omacron.sc v.sc -45
+KPX omacron.sc v.sc -45
KPX omacron.sc w.sc -35
+KPX omacron.sc w.sc -35
+KPX omacron.sc x.sc -35
KPX omacron.sc x.sc -35
KPX omacron.sc y.sc -45
+KPX omacron.sc y.sc -45
KPX omacron.sc adieresis.sc -40
+KPX omacron.sc adieresis.sc -40
+KPX omacron.sc aring.sc -40
KPX omacron.sc aring.sc -40
KPX omacron.sc ae.sc -35
+KPX omacron.sc ae.sc -35
KPX omacron.sc ydieresis.sc -45
-KPX omacron.sc amacron.sc -40
-KPX omacron.sc aogonek.sc -40
-KPX omacron.sc wcircumflex.sc -35
-KPX omacron.sc ycircumflex.sc -45
-KPX omacron.sc aeacute.sc -35
-KPX omacron.sc wgrave.sc -35
-KPX omacron.sc wacute.sc -35
-KPX omacron.sc wdieresis.sc -35
+KPX omacron.sc ydieresis.sc -45
+KPX racute.sc hyphen -50
KPX racute.sc hyphen -50
KPX racute.sc gacute.sc -30
+KPX racute.sc gacute.sc -30
+KPX racute.sc gcaron.sc -30
KPX racute.sc gcaron.sc -30
KPX racute.sc oe.sc -25
+KPX racute.sc oe.sc -25
+KPX racute.sc oogonek.sc -30
KPX racute.sc oogonek.sc -30
KPX racute.sc cacute.sc -25
+KPX racute.sc cacute.sc -25
KPX racute.sc ccaron.sc -25
+KPX racute.sc ccaron.sc -25
+KPX racute.sc ccircumflex.sc -25
KPX racute.sc ccircumflex.sc -25
KPX racute.sc cdotaccent.sc -25
+KPX racute.sc cdotaccent.sc -25
+KPX racute.sc gbreve.sc -30
KPX racute.sc gbreve.sc -30
KPX racute.sc gcircumflex.sc -30
+KPX racute.sc gcircumflex.sc -30
+KPX racute.sc gcommaaccent.sc -30
KPX racute.sc gcommaaccent.sc -30
KPX racute.sc gdotaccent.sc -30
+KPX racute.sc gdotaccent.sc -30
+KPX racute.sc obreve.sc -30
KPX racute.sc obreve.sc -30
KPX racute.sc ohungarumlaut.sc -30
+KPX racute.sc ohungarumlaut.sc -30
KPX racute.sc omacron.sc -30
+KPX racute.sc omacron.sc -30
+KPX racute.sc tcaron.sc -25
KPX racute.sc tcaron.sc -25
KPX racute.sc ubreve.sc -35
+KPX racute.sc ubreve.sc -35
+KPX racute.sc uhungarumlaut.sc -35
KPX racute.sc uhungarumlaut.sc -35
KPX racute.sc umacron.sc -35
+KPX racute.sc umacron.sc -35
+KPX racute.sc uogonek.sc -35
KPX racute.sc uogonek.sc -35
KPX racute.sc uring.sc -35
+KPX racute.sc uring.sc -35
+KPX racute.sc wacute.sc -45
KPX racute.sc wacute.sc -45
KPX racute.sc wcircumflex.sc -45
+KPX racute.sc wcircumflex.sc -45
KPX racute.sc wdieresis.sc -45
+KPX racute.sc wdieresis.sc -45
+KPX racute.sc wgrave.sc -45
KPX racute.sc wgrave.sc -45
KPX racute.sc ycircumflex.sc -50
+KPX racute.sc ycircumflex.sc -50
KPX racute.sc c.sc -25
-KPX racute.sc g.sc -30
-KPX racute.sc o.sc -30
-KPX racute.sc t.sc -25
-KPX racute.sc u.sc -35
-KPX racute.sc v.sc -50
-KPX racute.sc w.sc -45
-KPX racute.sc y.sc -50
-KPX racute.sc ccedilla.sc -25
-KPX racute.sc odieresis.sc -30
-KPX racute.sc oslash.sc -30
-KPX racute.sc ucircumflex.sc -35
-KPX racute.sc udieresis.sc -35
-KPX racute.sc ydieresis.sc -50
-KPX racute.sc hyphen -50
KPX racute.sc c.sc -25
KPX racute.sc g.sc -30
+KPX racute.sc g.sc -30
KPX racute.sc o.sc -30
+KPX racute.sc o.sc -30
+KPX racute.sc t.sc -25
KPX racute.sc t.sc -25
KPX racute.sc u.sc -35
+KPX racute.sc u.sc -35
+KPX racute.sc v.sc -50
KPX racute.sc v.sc -50
KPX racute.sc w.sc -45
+KPX racute.sc w.sc -45
+KPX racute.sc y.sc -50
KPX racute.sc y.sc -50
KPX racute.sc ccedilla.sc -25
+KPX racute.sc ccedilla.sc -25
+KPX racute.sc odieresis.sc -30
KPX racute.sc odieresis.sc -30
KPX racute.sc oslash.sc -30
+KPX racute.sc oslash.sc -30
KPX racute.sc ucircumflex.sc -35
+KPX racute.sc ucircumflex.sc -35
+KPX racute.sc udieresis.sc -35
KPX racute.sc udieresis.sc -35
KPX racute.sc ydieresis.sc -50
-KPX racute.sc cacute.sc -25
-KPX racute.sc ccircumflex.sc -25
-KPX racute.sc cdotaccent.sc -25
-KPX racute.sc ccaron.sc -25
-KPX racute.sc gcircumflex.sc -30
-KPX racute.sc gbreve.sc -30
-KPX racute.sc gdotaccent.sc -30
-KPX racute.sc gcommaaccent.sc -30
-KPX racute.sc omacron.sc -30
-KPX racute.sc obreve.sc -30
-KPX racute.sc ohungarumlaut.sc -30
-KPX racute.sc oe.sc -25
-KPX racute.sc tcaron.sc -25
-KPX racute.sc umacron.sc -35
-KPX racute.sc ubreve.sc -35
-KPX racute.sc uring.sc -35
-KPX racute.sc uhungarumlaut.sc -35
-KPX racute.sc uogonek.sc -35
-KPX racute.sc wcircumflex.sc -45
-KPX racute.sc ycircumflex.sc -50
-KPX racute.sc gcaron.sc -30
-KPX racute.sc oogonek.sc -30
-KPX racute.sc gacute.sc -30
-KPX racute.sc wgrave.sc -45
-KPX racute.sc wacute.sc -45
-KPX racute.sc wdieresis.sc -45
+KPX racute.sc ydieresis.sc -50
KPX rcaron.sc hyphen -50
+KPX rcaron.sc hyphen -50
+KPX rcaron.sc gacute.sc -30
KPX rcaron.sc gacute.sc -30
KPX rcaron.sc gcaron.sc -30
+KPX rcaron.sc gcaron.sc -30
+KPX rcaron.sc oe.sc -25
KPX rcaron.sc oe.sc -25
KPX rcaron.sc oogonek.sc -30
+KPX rcaron.sc oogonek.sc -30
+KPX rcaron.sc cacute.sc -25
KPX rcaron.sc cacute.sc -25
KPX rcaron.sc ccaron.sc -25
+KPX rcaron.sc ccaron.sc -25
KPX rcaron.sc ccircumflex.sc -25
+KPX rcaron.sc ccircumflex.sc -25
+KPX rcaron.sc cdotaccent.sc -25
KPX rcaron.sc cdotaccent.sc -25
KPX rcaron.sc gbreve.sc -30
+KPX rcaron.sc gbreve.sc -30
+KPX rcaron.sc gcircumflex.sc -30
KPX rcaron.sc gcircumflex.sc -30
KPX rcaron.sc gcommaaccent.sc -30
+KPX rcaron.sc gcommaaccent.sc -30
+KPX rcaron.sc gdotaccent.sc -30
KPX rcaron.sc gdotaccent.sc -30
KPX rcaron.sc obreve.sc -30
+KPX rcaron.sc obreve.sc -30
+KPX rcaron.sc ohungarumlaut.sc -30
KPX rcaron.sc ohungarumlaut.sc -30
KPX rcaron.sc omacron.sc -30
+KPX rcaron.sc omacron.sc -30
KPX rcaron.sc tcaron.sc -25
+KPX rcaron.sc tcaron.sc -25
+KPX rcaron.sc ubreve.sc -35
KPX rcaron.sc ubreve.sc -35
KPX rcaron.sc uhungarumlaut.sc -35
+KPX rcaron.sc uhungarumlaut.sc -35
+KPX rcaron.sc umacron.sc -35
KPX rcaron.sc umacron.sc -35
KPX rcaron.sc uogonek.sc -35
+KPX rcaron.sc uogonek.sc -35
+KPX rcaron.sc uring.sc -35
KPX rcaron.sc uring.sc -35
KPX rcaron.sc wacute.sc -45
+KPX rcaron.sc wacute.sc -45
+KPX rcaron.sc wcircumflex.sc -45
KPX rcaron.sc wcircumflex.sc -45
KPX rcaron.sc wdieresis.sc -45
+KPX rcaron.sc wdieresis.sc -45
KPX rcaron.sc wgrave.sc -45
+KPX rcaron.sc wgrave.sc -45
+KPX rcaron.sc ycircumflex.sc -50
KPX rcaron.sc ycircumflex.sc -50
KPX rcaron.sc c.sc -25
-KPX rcaron.sc g.sc -30
-KPX rcaron.sc o.sc -30
-KPX rcaron.sc t.sc -25
-KPX rcaron.sc u.sc -35
-KPX rcaron.sc v.sc -50
-KPX rcaron.sc w.sc -45
-KPX rcaron.sc y.sc -50
-KPX rcaron.sc ccedilla.sc -25
-KPX rcaron.sc odieresis.sc -30
-KPX rcaron.sc oslash.sc -30
-KPX rcaron.sc ucircumflex.sc -35
-KPX rcaron.sc udieresis.sc -35
-KPX rcaron.sc ydieresis.sc -50
-KPX rcaron.sc hyphen -50
KPX rcaron.sc c.sc -25
KPX rcaron.sc g.sc -30
+KPX rcaron.sc g.sc -30
+KPX rcaron.sc o.sc -30
KPX rcaron.sc o.sc -30
KPX rcaron.sc t.sc -25
+KPX rcaron.sc t.sc -25
+KPX rcaron.sc u.sc -35
KPX rcaron.sc u.sc -35
KPX rcaron.sc v.sc -50
+KPX rcaron.sc v.sc -50
+KPX rcaron.sc w.sc -45
KPX rcaron.sc w.sc -45
KPX rcaron.sc y.sc -50
+KPX rcaron.sc y.sc -50
KPX rcaron.sc ccedilla.sc -25
+KPX rcaron.sc ccedilla.sc -25
+KPX rcaron.sc odieresis.sc -30
KPX rcaron.sc odieresis.sc -30
KPX rcaron.sc oslash.sc -30
+KPX rcaron.sc oslash.sc -30
+KPX rcaron.sc ucircumflex.sc -35
KPX rcaron.sc ucircumflex.sc -35
KPX rcaron.sc udieresis.sc -35
+KPX rcaron.sc udieresis.sc -35
+KPX rcaron.sc ydieresis.sc -50
KPX rcaron.sc ydieresis.sc -50
-KPX rcaron.sc cacute.sc -25
-KPX rcaron.sc ccircumflex.sc -25
-KPX rcaron.sc cdotaccent.sc -25
-KPX rcaron.sc ccaron.sc -25
-KPX rcaron.sc gcircumflex.sc -30
-KPX rcaron.sc gbreve.sc -30
-KPX rcaron.sc gdotaccent.sc -30
-KPX rcaron.sc gcommaaccent.sc -30
-KPX rcaron.sc omacron.sc -30
-KPX rcaron.sc obreve.sc -30
-KPX rcaron.sc ohungarumlaut.sc -30
-KPX rcaron.sc oe.sc -25
-KPX rcaron.sc tcaron.sc -25
-KPX rcaron.sc umacron.sc -35
-KPX rcaron.sc ubreve.sc -35
-KPX rcaron.sc uring.sc -35
-KPX rcaron.sc uhungarumlaut.sc -35
-KPX rcaron.sc uogonek.sc -35
-KPX rcaron.sc wcircumflex.sc -45
-KPX rcaron.sc ycircumflex.sc -50
-KPX rcaron.sc gcaron.sc -30
-KPX rcaron.sc oogonek.sc -30
-KPX rcaron.sc gacute.sc -30
-KPX rcaron.sc wgrave.sc -45
-KPX rcaron.sc wacute.sc -45
-KPX rcaron.sc wdieresis.sc -45
KPX rcommaaccent.sc hyphen -50
+KPX rcommaaccent.sc hyphen -50
+KPX rcommaaccent.sc gacute.sc -30
KPX rcommaaccent.sc gacute.sc -30
KPX rcommaaccent.sc gcaron.sc -30
+KPX rcommaaccent.sc gcaron.sc -30
+KPX rcommaaccent.sc oe.sc -25
KPX rcommaaccent.sc oe.sc -25
KPX rcommaaccent.sc oogonek.sc -30
+KPX rcommaaccent.sc oogonek.sc -30
+KPX rcommaaccent.sc cacute.sc -25
KPX rcommaaccent.sc cacute.sc -25
KPX rcommaaccent.sc ccaron.sc -25
+KPX rcommaaccent.sc ccaron.sc -25
+KPX rcommaaccent.sc ccircumflex.sc -25
KPX rcommaaccent.sc ccircumflex.sc -25
KPX rcommaaccent.sc cdotaccent.sc -25
+KPX rcommaaccent.sc cdotaccent.sc -25
KPX rcommaaccent.sc gbreve.sc -30
+KPX rcommaaccent.sc gbreve.sc -30
+KPX rcommaaccent.sc gcircumflex.sc -30
KPX rcommaaccent.sc gcircumflex.sc -30
KPX rcommaaccent.sc gcommaaccent.sc -30
+KPX rcommaaccent.sc gcommaaccent.sc -30
+KPX rcommaaccent.sc gdotaccent.sc -30
KPX rcommaaccent.sc gdotaccent.sc -30
KPX rcommaaccent.sc obreve.sc -30
+KPX rcommaaccent.sc obreve.sc -30
+KPX rcommaaccent.sc ohungarumlaut.sc -30
KPX rcommaaccent.sc ohungarumlaut.sc -30
KPX rcommaaccent.sc omacron.sc -30
+KPX rcommaaccent.sc omacron.sc -30
+KPX rcommaaccent.sc tcaron.sc -25
KPX rcommaaccent.sc tcaron.sc -25
KPX rcommaaccent.sc ubreve.sc -35
+KPX rcommaaccent.sc ubreve.sc -35
KPX rcommaaccent.sc uhungarumlaut.sc -35
+KPX rcommaaccent.sc uhungarumlaut.sc -35
+KPX rcommaaccent.sc umacron.sc -35
KPX rcommaaccent.sc umacron.sc -35
KPX rcommaaccent.sc uogonek.sc -35
+KPX rcommaaccent.sc uogonek.sc -35
+KPX rcommaaccent.sc uring.sc -35
KPX rcommaaccent.sc uring.sc -35
KPX rcommaaccent.sc wacute.sc -45
+KPX rcommaaccent.sc wacute.sc -45
+KPX rcommaaccent.sc wcircumflex.sc -45
KPX rcommaaccent.sc wcircumflex.sc -45
KPX rcommaaccent.sc wdieresis.sc -45
+KPX rcommaaccent.sc wdieresis.sc -45
+KPX rcommaaccent.sc wgrave.sc -45
KPX rcommaaccent.sc wgrave.sc -45
KPX rcommaaccent.sc ycircumflex.sc -50
+KPX rcommaaccent.sc ycircumflex.sc -50
KPX rcommaaccent.sc c.sc -25
-KPX rcommaaccent.sc g.sc -30
-KPX rcommaaccent.sc o.sc -30
-KPX rcommaaccent.sc t.sc -25
-KPX rcommaaccent.sc u.sc -35
-KPX rcommaaccent.sc v.sc -50
-KPX rcommaaccent.sc w.sc -45
-KPX rcommaaccent.sc y.sc -50
-KPX rcommaaccent.sc ccedilla.sc -25
-KPX rcommaaccent.sc odieresis.sc -30
-KPX rcommaaccent.sc oslash.sc -30
-KPX rcommaaccent.sc ucircumflex.sc -35
-KPX rcommaaccent.sc udieresis.sc -35
-KPX rcommaaccent.sc ydieresis.sc -50
-KPX rcommaaccent.sc hyphen -50
KPX rcommaaccent.sc c.sc -25
KPX rcommaaccent.sc g.sc -30
+KPX rcommaaccent.sc g.sc -30
KPX rcommaaccent.sc o.sc -30
+KPX rcommaaccent.sc o.sc -30
+KPX rcommaaccent.sc t.sc -25
KPX rcommaaccent.sc t.sc -25
KPX rcommaaccent.sc u.sc -35
+KPX rcommaaccent.sc u.sc -35
KPX rcommaaccent.sc v.sc -50
+KPX rcommaaccent.sc v.sc -50
+KPX rcommaaccent.sc w.sc -45
KPX rcommaaccent.sc w.sc -45
KPX rcommaaccent.sc y.sc -50
+KPX rcommaaccent.sc y.sc -50
+KPX rcommaaccent.sc ccedilla.sc -25
KPX rcommaaccent.sc ccedilla.sc -25
KPX rcommaaccent.sc odieresis.sc -30
+KPX rcommaaccent.sc odieresis.sc -30
+KPX rcommaaccent.sc oslash.sc -30
KPX rcommaaccent.sc oslash.sc -30
KPX rcommaaccent.sc ucircumflex.sc -35
+KPX rcommaaccent.sc ucircumflex.sc -35
+KPX rcommaaccent.sc udieresis.sc -35
KPX rcommaaccent.sc udieresis.sc -35
KPX rcommaaccent.sc ydieresis.sc -50
-KPX rcommaaccent.sc cacute.sc -25
-KPX rcommaaccent.sc ccircumflex.sc -25
-KPX rcommaaccent.sc cdotaccent.sc -25
-KPX rcommaaccent.sc ccaron.sc -25
-KPX rcommaaccent.sc gcircumflex.sc -30
-KPX rcommaaccent.sc gbreve.sc -30
-KPX rcommaaccent.sc gdotaccent.sc -30
-KPX rcommaaccent.sc gcommaaccent.sc -30
-KPX rcommaaccent.sc omacron.sc -30
-KPX rcommaaccent.sc obreve.sc -30
-KPX rcommaaccent.sc ohungarumlaut.sc -30
-KPX rcommaaccent.sc oe.sc -25
-KPX rcommaaccent.sc tcaron.sc -25
-KPX rcommaaccent.sc umacron.sc -35
-KPX rcommaaccent.sc ubreve.sc -35
-KPX rcommaaccent.sc uring.sc -35
-KPX rcommaaccent.sc uhungarumlaut.sc -35
-KPX rcommaaccent.sc uogonek.sc -35
-KPX rcommaaccent.sc wcircumflex.sc -45
-KPX rcommaaccent.sc ycircumflex.sc -50
-KPX rcommaaccent.sc gcaron.sc -30
-KPX rcommaaccent.sc oogonek.sc -30
-KPX rcommaaccent.sc gacute.sc -30
-KPX rcommaaccent.sc wgrave.sc -45
-KPX rcommaaccent.sc wacute.sc -45
-KPX rcommaaccent.sc wdieresis.sc -45
+KPX rcommaaccent.sc ydieresis.sc -50
+KPX sacute.sc amacron.sc -25
KPX sacute.sc amacron.sc -25
KPX sacute.sc aogonek.sc -25
+KPX sacute.sc aogonek.sc -25
+KPX sacute.sc aeacute.sc -20
KPX sacute.sc aeacute.sc -20
KPX sacute.sc tcaron.sc -15
+KPX sacute.sc tcaron.sc -15
+KPX sacute.sc wacute.sc -15
KPX sacute.sc wacute.sc -15
KPX sacute.sc wcircumflex.sc -15
+KPX sacute.sc wcircumflex.sc -15
+KPX sacute.sc wdieresis.sc -15
KPX sacute.sc wdieresis.sc -15
KPX sacute.sc wgrave.sc -15
+KPX sacute.sc wgrave.sc -15
+KPX sacute.sc ycircumflex.sc -20
KPX sacute.sc ycircumflex.sc -20
KPX sacute.sc a.sc -25
-KPX sacute.sc t.sc -15
-KPX sacute.sc v.sc -15
-KPX sacute.sc w.sc -15
-KPX sacute.sc y.sc -20
-KPX sacute.sc adieresis.sc -25
-KPX sacute.sc aring.sc -25
-KPX sacute.sc ae.sc -20
-KPX sacute.sc ydieresis.sc -20
KPX sacute.sc a.sc -25
KPX sacute.sc t.sc -15
+KPX sacute.sc t.sc -15
+KPX sacute.sc v.sc -15
KPX sacute.sc v.sc -15
KPX sacute.sc w.sc -15
+KPX sacute.sc w.sc -15
+KPX sacute.sc y.sc -20
KPX sacute.sc y.sc -20
KPX sacute.sc adieresis.sc -25
+KPX sacute.sc adieresis.sc -25
+KPX sacute.sc aring.sc -25
KPX sacute.sc aring.sc -25
KPX sacute.sc ae.sc -20
+KPX sacute.sc ae.sc -20
KPX sacute.sc ydieresis.sc -20
-KPX sacute.sc amacron.sc -25
-KPX sacute.sc aogonek.sc -25
-KPX sacute.sc tcaron.sc -15
-KPX sacute.sc wcircumflex.sc -15
-KPX sacute.sc ycircumflex.sc -20
-KPX sacute.sc aeacute.sc -20
-KPX sacute.sc wgrave.sc -15
-KPX sacute.sc wacute.sc -15
-KPX sacute.sc wdieresis.sc -15
+KPX sacute.sc ydieresis.sc -20
+KPX scedilla.sc amacron.sc -25
KPX scedilla.sc amacron.sc -25
KPX scedilla.sc aogonek.sc -25
+KPX scedilla.sc aogonek.sc -25
+KPX scedilla.sc aeacute.sc -20
KPX scedilla.sc aeacute.sc -20
KPX scedilla.sc tcaron.sc -15
+KPX scedilla.sc tcaron.sc -15
KPX scedilla.sc wacute.sc -15
+KPX scedilla.sc wacute.sc -15
+KPX scedilla.sc wcircumflex.sc -15
KPX scedilla.sc wcircumflex.sc -15
KPX scedilla.sc wdieresis.sc -15
+KPX scedilla.sc wdieresis.sc -15
+KPX scedilla.sc wgrave.sc -15
KPX scedilla.sc wgrave.sc -15
KPX scedilla.sc ycircumflex.sc -20
+KPX scedilla.sc ycircumflex.sc -20
KPX scedilla.sc a.sc -25
-KPX scedilla.sc t.sc -15
-KPX scedilla.sc v.sc -15
-KPX scedilla.sc w.sc -15
-KPX scedilla.sc y.sc -20
-KPX scedilla.sc adieresis.sc -25
-KPX scedilla.sc aring.sc -25
-KPX scedilla.sc ae.sc -20
-KPX scedilla.sc ydieresis.sc -20
KPX scedilla.sc a.sc -25
KPX scedilla.sc t.sc -15
+KPX scedilla.sc t.sc -15
+KPX scedilla.sc v.sc -15
KPX scedilla.sc v.sc -15
KPX scedilla.sc w.sc -15
+KPX scedilla.sc w.sc -15
+KPX scedilla.sc y.sc -20
KPX scedilla.sc y.sc -20
KPX scedilla.sc adieresis.sc -25
+KPX scedilla.sc adieresis.sc -25
KPX scedilla.sc aring.sc -25
+KPX scedilla.sc aring.sc -25
+KPX scedilla.sc ae.sc -20
KPX scedilla.sc ae.sc -20
KPX scedilla.sc ydieresis.sc -20
-KPX scedilla.sc amacron.sc -25
-KPX scedilla.sc aogonek.sc -25
-KPX scedilla.sc tcaron.sc -15
-KPX scedilla.sc wcircumflex.sc -15
-KPX scedilla.sc ycircumflex.sc -20
-KPX scedilla.sc aeacute.sc -20
-KPX scedilla.sc wgrave.sc -15
-KPX scedilla.sc wacute.sc -15
-KPX scedilla.sc wdieresis.sc -15
+KPX scedilla.sc ydieresis.sc -20
+KPX scircumflex.sc amacron.sc -25
KPX scircumflex.sc amacron.sc -25
KPX scircumflex.sc aogonek.sc -25
+KPX scircumflex.sc aogonek.sc -25
+KPX scircumflex.sc aeacute.sc -20
KPX scircumflex.sc aeacute.sc -20
KPX scircumflex.sc tcaron.sc -15
+KPX scircumflex.sc tcaron.sc -15
+KPX scircumflex.sc wacute.sc -15
KPX scircumflex.sc wacute.sc -15
KPX scircumflex.sc wcircumflex.sc -15
+KPX scircumflex.sc wcircumflex.sc -15
KPX scircumflex.sc wdieresis.sc -15
+KPX scircumflex.sc wdieresis.sc -15
+KPX scircumflex.sc wgrave.sc -15
KPX scircumflex.sc wgrave.sc -15
KPX scircumflex.sc ycircumflex.sc -20
+KPX scircumflex.sc ycircumflex.sc -20
KPX scircumflex.sc a.sc -25
-KPX scircumflex.sc t.sc -15
-KPX scircumflex.sc v.sc -15
-KPX scircumflex.sc w.sc -15
-KPX scircumflex.sc y.sc -20
-KPX scircumflex.sc adieresis.sc -25
-KPX scircumflex.sc aring.sc -25
-KPX scircumflex.sc ae.sc -20
-KPX scircumflex.sc ydieresis.sc -20
KPX scircumflex.sc a.sc -25
KPX scircumflex.sc t.sc -15
+KPX scircumflex.sc t.sc -15
+KPX scircumflex.sc v.sc -15
KPX scircumflex.sc v.sc -15
KPX scircumflex.sc w.sc -15
+KPX scircumflex.sc w.sc -15
+KPX scircumflex.sc y.sc -20
KPX scircumflex.sc y.sc -20
KPX scircumflex.sc adieresis.sc -25
+KPX scircumflex.sc adieresis.sc -25
+KPX scircumflex.sc aring.sc -25
KPX scircumflex.sc aring.sc -25
KPX scircumflex.sc ae.sc -20
+KPX scircumflex.sc ae.sc -20
KPX scircumflex.sc ydieresis.sc -20
-KPX scircumflex.sc amacron.sc -25
-KPX scircumflex.sc aogonek.sc -25
-KPX scircumflex.sc tcaron.sc -15
-KPX scircumflex.sc wcircumflex.sc -15
-KPX scircumflex.sc ycircumflex.sc -20
-KPX scircumflex.sc aeacute.sc -20
-KPX scircumflex.sc wgrave.sc -15
-KPX scircumflex.sc wacute.sc -15
-KPX scircumflex.sc wdieresis.sc -15
+KPX scircumflex.sc ydieresis.sc -20
+KPX tcaron.sc comma -75
KPX tcaron.sc comma -75
KPX tcaron.sc hyphen -75
+KPX tcaron.sc hyphen -75
+KPX tcaron.sc period -80
KPX tcaron.sc period -80
KPX tcaron.sc colon -90
+KPX tcaron.sc colon -90
+KPX tcaron.sc semicolon -85
KPX tcaron.sc semicolon -85
KPX tcaron.sc jacute.sc -15
+KPX tcaron.sc jacute.sc -15
+KPX tcaron.sc amacron.sc -35
KPX tcaron.sc amacron.sc -35
KPX tcaron.sc aogonek.sc -35
+KPX tcaron.sc aogonek.sc -35
KPX tcaron.sc aeacute.sc -30
+KPX tcaron.sc aeacute.sc -30
+KPX tcaron.sc jcircumflex.sc -15
KPX tcaron.sc jcircumflex.sc -15
KPX tcaron.sc wacute.sc 15
+KPX tcaron.sc wacute.sc 15
+KPX tcaron.sc wcircumflex.sc 15
KPX tcaron.sc wcircumflex.sc 15
KPX tcaron.sc wdieresis.sc 15
+KPX tcaron.sc wdieresis.sc 15
+KPX tcaron.sc wgrave.sc 15
KPX tcaron.sc wgrave.sc 15
KPX tcaron.sc ycircumflex.sc 5
+KPX tcaron.sc ycircumflex.sc 5
KPX tcaron.sc a.sc -35
-KPX tcaron.sc j.sc -15
-KPX tcaron.sc v.sc 10
-KPX tcaron.sc w.sc 15
-KPX tcaron.sc y.sc 5
-KPX tcaron.sc adieresis.sc -35
-KPX tcaron.sc aring.sc -35
-KPX tcaron.sc ae.sc -30
-KPX tcaron.sc ydieresis.sc 5
-KPX tcaron.sc comma -75
-KPX tcaron.sc hyphen -75
-KPX tcaron.sc period -80
-KPX tcaron.sc colon -90
-KPX tcaron.sc semicolon -85
KPX tcaron.sc a.sc -35
KPX tcaron.sc j.sc -15
+KPX tcaron.sc j.sc -15
+KPX tcaron.sc v.sc 10
KPX tcaron.sc v.sc 10
KPX tcaron.sc w.sc 15
+KPX tcaron.sc w.sc 15
+KPX tcaron.sc y.sc 5
KPX tcaron.sc y.sc 5
KPX tcaron.sc adieresis.sc -35
+KPX tcaron.sc adieresis.sc -35
+KPX tcaron.sc aring.sc -35
KPX tcaron.sc aring.sc -35
KPX tcaron.sc ae.sc -30
+KPX tcaron.sc ae.sc -30
+KPX tcaron.sc ydieresis.sc 5
KPX tcaron.sc ydieresis.sc 5
-KPX tcaron.sc amacron.sc -35
-KPX tcaron.sc aogonek.sc -35
-KPX tcaron.sc jcircumflex.sc -15
-KPX tcaron.sc wcircumflex.sc 15
-KPX tcaron.sc ycircumflex.sc 5
-KPX tcaron.sc aeacute.sc -30
-KPX tcaron.sc wgrave.sc 15
-KPX tcaron.sc wacute.sc 15
-KPX tcaron.sc wdieresis.sc 15
-KPX tcaron.sc jacute.sc -15
KPX ubreve.sc comma -30
+KPX ubreve.sc comma -30
+KPX ubreve.sc period -35
KPX ubreve.sc period -35
KPX ubreve.sc amacron.sc -45
+KPX ubreve.sc amacron.sc -45
+KPX ubreve.sc aogonek.sc -45
KPX ubreve.sc aogonek.sc -45
KPX ubreve.sc aeacute.sc -40
+KPX ubreve.sc aeacute.sc -40
KPX ubreve.sc a.sc -45
-KPX ubreve.sc adieresis.sc -45
-KPX ubreve.sc aring.sc -45
-KPX ubreve.sc ae.sc -40
-KPX ubreve.sc comma -30
-KPX ubreve.sc period -35
KPX ubreve.sc a.sc -45
KPX ubreve.sc adieresis.sc -45
+KPX ubreve.sc adieresis.sc -45
+KPX ubreve.sc aring.sc -45
KPX ubreve.sc aring.sc -45
KPX ubreve.sc ae.sc -40
-KPX ubreve.sc amacron.sc -45
-KPX ubreve.sc aogonek.sc -45
-KPX ubreve.sc aeacute.sc -40
+KPX ubreve.sc ae.sc -40
KPX uhungarumlaut.sc comma -30
+KPX uhungarumlaut.sc comma -30
+KPX uhungarumlaut.sc period -35
KPX uhungarumlaut.sc period -35
KPX uhungarumlaut.sc amacron.sc -45
+KPX uhungarumlaut.sc amacron.sc -45
+KPX uhungarumlaut.sc aogonek.sc -45
KPX uhungarumlaut.sc aogonek.sc -45
KPX uhungarumlaut.sc aeacute.sc -40
+KPX uhungarumlaut.sc aeacute.sc -40
KPX uhungarumlaut.sc a.sc -45
-KPX uhungarumlaut.sc adieresis.sc -45
-KPX uhungarumlaut.sc aring.sc -45
-KPX uhungarumlaut.sc ae.sc -40
-KPX uhungarumlaut.sc comma -30
-KPX uhungarumlaut.sc period -35
KPX uhungarumlaut.sc a.sc -45
KPX uhungarumlaut.sc adieresis.sc -45
+KPX uhungarumlaut.sc adieresis.sc -45
+KPX uhungarumlaut.sc aring.sc -45
KPX uhungarumlaut.sc aring.sc -45
KPX uhungarumlaut.sc ae.sc -40
-KPX uhungarumlaut.sc amacron.sc -45
-KPX uhungarumlaut.sc aogonek.sc -45
-KPX uhungarumlaut.sc aeacute.sc -40
+KPX uhungarumlaut.sc ae.sc -40
KPX umacron.sc comma -30
+KPX umacron.sc comma -30
+KPX umacron.sc period -35
KPX umacron.sc period -35
KPX umacron.sc amacron.sc -45
+KPX umacron.sc amacron.sc -45
KPX umacron.sc aogonek.sc -45
+KPX umacron.sc aogonek.sc -45
+KPX umacron.sc aeacute.sc -40
KPX umacron.sc aeacute.sc -40
KPX umacron.sc a.sc -45
-KPX umacron.sc adieresis.sc -45
-KPX umacron.sc aring.sc -45
-KPX umacron.sc ae.sc -40
-KPX umacron.sc comma -30
-KPX umacron.sc period -35
KPX umacron.sc a.sc -45
KPX umacron.sc adieresis.sc -45
+KPX umacron.sc adieresis.sc -45
+KPX umacron.sc aring.sc -45
KPX umacron.sc aring.sc -45
KPX umacron.sc ae.sc -40
-KPX umacron.sc amacron.sc -45
-KPX umacron.sc aogonek.sc -45
-KPX umacron.sc aeacute.sc -40
+KPX umacron.sc ae.sc -40
KPX uogonek.sc comma -30
+KPX uogonek.sc comma -30
+KPX uogonek.sc period -35
KPX uogonek.sc period -35
KPX uogonek.sc amacron.sc -45
+KPX uogonek.sc amacron.sc -45
+KPX uogonek.sc aogonek.sc -45
KPX uogonek.sc aogonek.sc -45
KPX uogonek.sc aeacute.sc -40
+KPX uogonek.sc aeacute.sc -40
KPX uogonek.sc a.sc -45
-KPX uogonek.sc adieresis.sc -45
-KPX uogonek.sc aring.sc -45
-KPX uogonek.sc ae.sc -40
-KPX uogonek.sc comma -30
-KPX uogonek.sc period -35
KPX uogonek.sc a.sc -45
KPX uogonek.sc adieresis.sc -45
+KPX uogonek.sc adieresis.sc -45
+KPX uogonek.sc aring.sc -45
KPX uogonek.sc aring.sc -45
KPX uogonek.sc ae.sc -40
-KPX uogonek.sc amacron.sc -45
-KPX uogonek.sc aogonek.sc -45
-KPX uogonek.sc aeacute.sc -40
+KPX uogonek.sc ae.sc -40
KPX uring.sc comma -30
+KPX uring.sc comma -30
+KPX uring.sc period -35
KPX uring.sc period -35
KPX uring.sc amacron.sc -45
+KPX uring.sc amacron.sc -45
+KPX uring.sc aogonek.sc -45
KPX uring.sc aogonek.sc -45
KPX uring.sc aeacute.sc -40
+KPX uring.sc aeacute.sc -40
KPX uring.sc a.sc -45
-KPX uring.sc adieresis.sc -45
-KPX uring.sc aring.sc -45
-KPX uring.sc ae.sc -40
-KPX uring.sc comma -30
-KPX uring.sc period -35
KPX uring.sc a.sc -45
KPX uring.sc adieresis.sc -45
+KPX uring.sc adieresis.sc -45
+KPX uring.sc aring.sc -45
KPX uring.sc aring.sc -45
KPX uring.sc ae.sc -40
-KPX uring.sc amacron.sc -45
-KPX uring.sc aogonek.sc -45
-KPX uring.sc aeacute.sc -40
+KPX uring.sc ae.sc -40
KPX utilde.sc a.sc -45
KPX utilde.sc a.sc -45
KPX wacute.sc comma -90
+KPX wacute.sc comma -90
+KPX wacute.sc hyphen -55
KPX wacute.sc hyphen -55
KPX wacute.sc period -95
+KPX wacute.sc period -95
+KPX wacute.sc colon -80
KPX wacute.sc colon -80
KPX wacute.sc semicolon -80
+KPX wacute.sc semicolon -80
+KPX wacute.sc gacute.sc -35
KPX wacute.sc gacute.sc -35
KPX wacute.sc gcaron.sc -35
+KPX wacute.sc gcaron.sc -35
+KPX wacute.sc oogonek.sc -35
KPX wacute.sc oogonek.sc -35
KPX wacute.sc scaron.sc -25
+KPX wacute.sc scaron.sc -25
KPX wacute.sc amacron.sc -75
+KPX wacute.sc amacron.sc -75
+KPX wacute.sc aogonek.sc -75
KPX wacute.sc aogonek.sc -75
KPX wacute.sc aeacute.sc -65
+KPX wacute.sc aeacute.sc -65
+KPX wacute.sc cacute.sc -35
KPX wacute.sc cacute.sc -35
KPX wacute.sc ccaron.sc -35
+KPX wacute.sc ccaron.sc -35
+KPX wacute.sc ccircumflex.sc -35
KPX wacute.sc ccircumflex.sc -35
KPX wacute.sc cdotaccent.sc -35
+KPX wacute.sc cdotaccent.sc -35
+KPX wacute.sc gbreve.sc -35
KPX wacute.sc gbreve.sc -35
KPX wacute.sc gcircumflex.sc -35
+KPX wacute.sc gcircumflex.sc -35
KPX wacute.sc gcommaaccent.sc -35
+KPX wacute.sc gcommaaccent.sc -35
+KPX wacute.sc gdotaccent.sc -35
KPX wacute.sc gdotaccent.sc -35
KPX wacute.sc obreve.sc -35
+KPX wacute.sc obreve.sc -35
+KPX wacute.sc ohungarumlaut.sc -35
KPX wacute.sc ohungarumlaut.sc -35
KPX wacute.sc omacron.sc -35
+KPX wacute.sc omacron.sc -35
KPX wacute.sc sacute.sc -25
+KPX wacute.sc sacute.sc -25
+KPX wacute.sc scedilla.sc -25
KPX wacute.sc scedilla.sc -25
KPX wacute.sc scircumflex.sc -25
+KPX wacute.sc scircumflex.sc -25
+KPX wacute.sc tcaron.sc 10
KPX wacute.sc tcaron.sc 10
KPX wacute.sc a.sc -75
-KPX wacute.sc c.sc -35
-KPX wacute.sc g.sc -35
-KPX wacute.sc o.sc -35
-KPX wacute.sc s.sc -25
-KPX wacute.sc t.sc 10
-KPX wacute.sc adieresis.sc -75
-KPX wacute.sc aring.sc -75
-KPX wacute.sc ae.sc -65
-KPX wacute.sc ccedilla.sc -35
-KPX wacute.sc odieresis.sc -35
-KPX wacute.sc oslash.sc -35
-KPX wacute.sc comma -90
-KPX wacute.sc hyphen -55
-KPX wacute.sc period -95
-KPX wacute.sc colon -80
-KPX wacute.sc semicolon -80
KPX wacute.sc a.sc -75
KPX wacute.sc c.sc -35
+KPX wacute.sc c.sc -35
+KPX wacute.sc g.sc -35
KPX wacute.sc g.sc -35
KPX wacute.sc o.sc -35
+KPX wacute.sc o.sc -35
KPX wacute.sc s.sc -25
+KPX wacute.sc s.sc -25
+KPX wacute.sc t.sc 10
KPX wacute.sc t.sc 10
KPX wacute.sc adieresis.sc -75
+KPX wacute.sc adieresis.sc -75
+KPX wacute.sc aring.sc -75
KPX wacute.sc aring.sc -75
KPX wacute.sc ae.sc -65
+KPX wacute.sc ae.sc -65
+KPX wacute.sc ccedilla.sc -35
KPX wacute.sc ccedilla.sc -35
KPX wacute.sc odieresis.sc -35
+KPX wacute.sc odieresis.sc -35
KPX wacute.sc oslash.sc -35
-KPX wacute.sc amacron.sc -75
-KPX wacute.sc aogonek.sc -75
-KPX wacute.sc cacute.sc -35
-KPX wacute.sc ccircumflex.sc -35
-KPX wacute.sc cdotaccent.sc -35
-KPX wacute.sc ccaron.sc -35
-KPX wacute.sc gcircumflex.sc -35
-KPX wacute.sc gbreve.sc -35
-KPX wacute.sc gdotaccent.sc -35
-KPX wacute.sc gcommaaccent.sc -35
-KPX wacute.sc omacron.sc -35
-KPX wacute.sc obreve.sc -35
-KPX wacute.sc ohungarumlaut.sc -35
-KPX wacute.sc sacute.sc -25
-KPX wacute.sc scircumflex.sc -25
-KPX wacute.sc scedilla.sc -25
-KPX wacute.sc scaron.sc -25
-KPX wacute.sc tcaron.sc 10
-KPX wacute.sc gcaron.sc -35
-KPX wacute.sc oogonek.sc -35
-KPX wacute.sc gacute.sc -35
-KPX wacute.sc aeacute.sc -65
+KPX wacute.sc oslash.sc -35
+KPX wcircumflex.sc comma -90
KPX wcircumflex.sc comma -90
KPX wcircumflex.sc hyphen -55
+KPX wcircumflex.sc hyphen -55
+KPX wcircumflex.sc period -95
KPX wcircumflex.sc period -95
KPX wcircumflex.sc colon -80
+KPX wcircumflex.sc colon -80
+KPX wcircumflex.sc semicolon -80
KPX wcircumflex.sc semicolon -80
KPX wcircumflex.sc gacute.sc -35
+KPX wcircumflex.sc gacute.sc -35
KPX wcircumflex.sc gcaron.sc -35
+KPX wcircumflex.sc gcaron.sc -35
+KPX wcircumflex.sc oogonek.sc -35
KPX wcircumflex.sc oogonek.sc -35
KPX wcircumflex.sc scaron.sc -25
+KPX wcircumflex.sc scaron.sc -25
+KPX wcircumflex.sc amacron.sc -75
KPX wcircumflex.sc amacron.sc -75
KPX wcircumflex.sc aogonek.sc -75
+KPX wcircumflex.sc aogonek.sc -75
+KPX wcircumflex.sc aeacute.sc -65
KPX wcircumflex.sc aeacute.sc -65
KPX wcircumflex.sc cacute.sc -35
+KPX wcircumflex.sc cacute.sc -35
+KPX wcircumflex.sc ccaron.sc -35
KPX wcircumflex.sc ccaron.sc -35
KPX wcircumflex.sc ccircumflex.sc -35
+KPX wcircumflex.sc ccircumflex.sc -35
KPX wcircumflex.sc cdotaccent.sc -35
+KPX wcircumflex.sc cdotaccent.sc -35
+KPX wcircumflex.sc gbreve.sc -35
KPX wcircumflex.sc gbreve.sc -35
KPX wcircumflex.sc gcircumflex.sc -35
+KPX wcircumflex.sc gcircumflex.sc -35
+KPX wcircumflex.sc gcommaaccent.sc -35
KPX wcircumflex.sc gcommaaccent.sc -35
KPX wcircumflex.sc gdotaccent.sc -35
+KPX wcircumflex.sc gdotaccent.sc -35
KPX wcircumflex.sc obreve.sc -35
+KPX wcircumflex.sc obreve.sc -35
+KPX wcircumflex.sc ohungarumlaut.sc -35
KPX wcircumflex.sc ohungarumlaut.sc -35
KPX wcircumflex.sc omacron.sc -35
+KPX wcircumflex.sc omacron.sc -35
+KPX wcircumflex.sc sacute.sc -25
KPX wcircumflex.sc sacute.sc -25
KPX wcircumflex.sc scedilla.sc -25
+KPX wcircumflex.sc scedilla.sc -25
KPX wcircumflex.sc scircumflex.sc -25
+KPX wcircumflex.sc scircumflex.sc -25
+KPX wcircumflex.sc tcaron.sc 10
KPX wcircumflex.sc tcaron.sc 10
KPX wcircumflex.sc a.sc -75
-KPX wcircumflex.sc c.sc -35
-KPX wcircumflex.sc g.sc -35
-KPX wcircumflex.sc o.sc -35
-KPX wcircumflex.sc s.sc -25
-KPX wcircumflex.sc t.sc 10
-KPX wcircumflex.sc adieresis.sc -75
-KPX wcircumflex.sc aring.sc -75
-KPX wcircumflex.sc ae.sc -65
-KPX wcircumflex.sc ccedilla.sc -35
-KPX wcircumflex.sc odieresis.sc -35
-KPX wcircumflex.sc oslash.sc -35
-KPX wcircumflex.sc comma -90
-KPX wcircumflex.sc hyphen -55
-KPX wcircumflex.sc period -95
-KPX wcircumflex.sc colon -80
-KPX wcircumflex.sc semicolon -80
KPX wcircumflex.sc a.sc -75
KPX wcircumflex.sc c.sc -35
+KPX wcircumflex.sc c.sc -35
+KPX wcircumflex.sc g.sc -35
KPX wcircumflex.sc g.sc -35
KPX wcircumflex.sc o.sc -35
+KPX wcircumflex.sc o.sc -35
+KPX wcircumflex.sc s.sc -25
KPX wcircumflex.sc s.sc -25
KPX wcircumflex.sc t.sc 10
+KPX wcircumflex.sc t.sc 10
+KPX wcircumflex.sc adieresis.sc -75
KPX wcircumflex.sc adieresis.sc -75
KPX wcircumflex.sc aring.sc -75
+KPX wcircumflex.sc aring.sc -75
+KPX wcircumflex.sc ae.sc -65
KPX wcircumflex.sc ae.sc -65
KPX wcircumflex.sc ccedilla.sc -35
+KPX wcircumflex.sc ccedilla.sc -35
+KPX wcircumflex.sc odieresis.sc -35
KPX wcircumflex.sc odieresis.sc -35
KPX wcircumflex.sc oslash.sc -35
-KPX wcircumflex.sc amacron.sc -75
-KPX wcircumflex.sc aogonek.sc -75
-KPX wcircumflex.sc cacute.sc -35
-KPX wcircumflex.sc ccircumflex.sc -35
-KPX wcircumflex.sc cdotaccent.sc -35
-KPX wcircumflex.sc ccaron.sc -35
-KPX wcircumflex.sc gcircumflex.sc -35
-KPX wcircumflex.sc gbreve.sc -35
-KPX wcircumflex.sc gdotaccent.sc -35
-KPX wcircumflex.sc gcommaaccent.sc -35
-KPX wcircumflex.sc omacron.sc -35
-KPX wcircumflex.sc obreve.sc -35
-KPX wcircumflex.sc ohungarumlaut.sc -35
-KPX wcircumflex.sc sacute.sc -25
-KPX wcircumflex.sc scircumflex.sc -25
-KPX wcircumflex.sc scedilla.sc -25
-KPX wcircumflex.sc scaron.sc -25
-KPX wcircumflex.sc tcaron.sc 10
-KPX wcircumflex.sc gcaron.sc -35
-KPX wcircumflex.sc oogonek.sc -35
-KPX wcircumflex.sc gacute.sc -35
-KPX wcircumflex.sc aeacute.sc -65
+KPX wcircumflex.sc oslash.sc -35
KPX wdieresis.sc comma -90
+KPX wdieresis.sc comma -90
+KPX wdieresis.sc hyphen -55
KPX wdieresis.sc hyphen -55
KPX wdieresis.sc period -95
+KPX wdieresis.sc period -95
KPX wdieresis.sc colon -80
+KPX wdieresis.sc colon -80
+KPX wdieresis.sc semicolon -80
KPX wdieresis.sc semicolon -80
KPX wdieresis.sc gacute.sc -35
+KPX wdieresis.sc gacute.sc -35
+KPX wdieresis.sc gcaron.sc -35
KPX wdieresis.sc gcaron.sc -35
KPX wdieresis.sc oogonek.sc -35
+KPX wdieresis.sc oogonek.sc -35
+KPX wdieresis.sc scaron.sc -25
KPX wdieresis.sc scaron.sc -25
KPX wdieresis.sc amacron.sc -75
+KPX wdieresis.sc amacron.sc -75
+KPX wdieresis.sc aogonek.sc -75
KPX wdieresis.sc aogonek.sc -75
KPX wdieresis.sc aeacute.sc -65
+KPX wdieresis.sc aeacute.sc -65
KPX wdieresis.sc cacute.sc -35
+KPX wdieresis.sc cacute.sc -35
+KPX wdieresis.sc ccaron.sc -35
KPX wdieresis.sc ccaron.sc -35
KPX wdieresis.sc ccircumflex.sc -35
+KPX wdieresis.sc ccircumflex.sc -35
+KPX wdieresis.sc cdotaccent.sc -35
KPX wdieresis.sc cdotaccent.sc -35
KPX wdieresis.sc gbreve.sc -35
+KPX wdieresis.sc gbreve.sc -35
+KPX wdieresis.sc gcircumflex.sc -35
KPX wdieresis.sc gcircumflex.sc -35
KPX wdieresis.sc gcommaaccent.sc -35
+KPX wdieresis.sc gcommaaccent.sc -35
+KPX wdieresis.sc gdotaccent.sc -35
KPX wdieresis.sc gdotaccent.sc -35
KPX wdieresis.sc obreve.sc -35
+KPX wdieresis.sc obreve.sc -35
KPX wdieresis.sc ohungarumlaut.sc -35
+KPX wdieresis.sc ohungarumlaut.sc -35
+KPX wdieresis.sc omacron.sc -35
KPX wdieresis.sc omacron.sc -35
KPX wdieresis.sc sacute.sc -25
+KPX wdieresis.sc sacute.sc -25
+KPX wdieresis.sc scedilla.sc -25
KPX wdieresis.sc scedilla.sc -25
KPX wdieresis.sc scircumflex.sc -25
+KPX wdieresis.sc scircumflex.sc -25
+KPX wdieresis.sc tcaron.sc 10
KPX wdieresis.sc tcaron.sc 10
KPX wdieresis.sc a.sc -75
-KPX wdieresis.sc c.sc -35
-KPX wdieresis.sc g.sc -35
-KPX wdieresis.sc o.sc -35
-KPX wdieresis.sc s.sc -25
-KPX wdieresis.sc t.sc 10
-KPX wdieresis.sc adieresis.sc -75
-KPX wdieresis.sc aring.sc -75
-KPX wdieresis.sc ae.sc -65
-KPX wdieresis.sc ccedilla.sc -35
-KPX wdieresis.sc odieresis.sc -35
-KPX wdieresis.sc oslash.sc -35
-KPX wdieresis.sc comma -90
-KPX wdieresis.sc hyphen -55
-KPX wdieresis.sc period -95
-KPX wdieresis.sc colon -80
-KPX wdieresis.sc semicolon -80
KPX wdieresis.sc a.sc -75
KPX wdieresis.sc c.sc -35
+KPX wdieresis.sc c.sc -35
+KPX wdieresis.sc g.sc -35
KPX wdieresis.sc g.sc -35
KPX wdieresis.sc o.sc -35
+KPX wdieresis.sc o.sc -35
+KPX wdieresis.sc s.sc -25
KPX wdieresis.sc s.sc -25
KPX wdieresis.sc t.sc 10
+KPX wdieresis.sc t.sc 10
KPX wdieresis.sc adieresis.sc -75
+KPX wdieresis.sc adieresis.sc -75
+KPX wdieresis.sc aring.sc -75
KPX wdieresis.sc aring.sc -75
KPX wdieresis.sc ae.sc -65
+KPX wdieresis.sc ae.sc -65
+KPX wdieresis.sc ccedilla.sc -35
KPX wdieresis.sc ccedilla.sc -35
KPX wdieresis.sc odieresis.sc -35
+KPX wdieresis.sc odieresis.sc -35
KPX wdieresis.sc oslash.sc -35
-KPX wdieresis.sc amacron.sc -75
-KPX wdieresis.sc aogonek.sc -75
-KPX wdieresis.sc cacute.sc -35
-KPX wdieresis.sc ccircumflex.sc -35
-KPX wdieresis.sc cdotaccent.sc -35
-KPX wdieresis.sc ccaron.sc -35
-KPX wdieresis.sc gcircumflex.sc -35
-KPX wdieresis.sc gbreve.sc -35
-KPX wdieresis.sc gdotaccent.sc -35
-KPX wdieresis.sc gcommaaccent.sc -35
-KPX wdieresis.sc omacron.sc -35
-KPX wdieresis.sc obreve.sc -35
-KPX wdieresis.sc ohungarumlaut.sc -35
-KPX wdieresis.sc sacute.sc -25
-KPX wdieresis.sc scircumflex.sc -25
-KPX wdieresis.sc scedilla.sc -25
-KPX wdieresis.sc scaron.sc -25
-KPX wdieresis.sc tcaron.sc 10
-KPX wdieresis.sc gcaron.sc -35
-KPX wdieresis.sc oogonek.sc -35
-KPX wdieresis.sc gacute.sc -35
-KPX wdieresis.sc aeacute.sc -65
+KPX wdieresis.sc oslash.sc -35
+KPX wgrave.sc comma -90
KPX wgrave.sc comma -90
KPX wgrave.sc hyphen -55
+KPX wgrave.sc hyphen -55
+KPX wgrave.sc period -95
KPX wgrave.sc period -95
KPX wgrave.sc colon -80
+KPX wgrave.sc colon -80
+KPX wgrave.sc semicolon -80
KPX wgrave.sc semicolon -80
KPX wgrave.sc gacute.sc -35
+KPX wgrave.sc gacute.sc -35
+KPX wgrave.sc gcaron.sc -35
KPX wgrave.sc gcaron.sc -35
KPX wgrave.sc oogonek.sc -35
+KPX wgrave.sc oogonek.sc -35
KPX wgrave.sc scaron.sc -25
+KPX wgrave.sc scaron.sc -25
+KPX wgrave.sc amacron.sc -75
KPX wgrave.sc amacron.sc -75
KPX wgrave.sc aogonek.sc -75
+KPX wgrave.sc aogonek.sc -75
+KPX wgrave.sc aeacute.sc -65
KPX wgrave.sc aeacute.sc -65
KPX wgrave.sc cacute.sc -35
+KPX wgrave.sc cacute.sc -35
KPX wgrave.sc ccaron.sc -35
+KPX wgrave.sc ccaron.sc -35
+KPX wgrave.sc ccircumflex.sc -35
KPX wgrave.sc ccircumflex.sc -35
KPX wgrave.sc cdotaccent.sc -35
+KPX wgrave.sc cdotaccent.sc -35
+KPX wgrave.sc gbreve.sc -35
KPX wgrave.sc gbreve.sc -35
KPX wgrave.sc gcircumflex.sc -35
+KPX wgrave.sc gcircumflex.sc -35
KPX wgrave.sc gcommaaccent.sc -35
+KPX wgrave.sc gcommaaccent.sc -35
+KPX wgrave.sc gdotaccent.sc -35
KPX wgrave.sc gdotaccent.sc -35
KPX wgrave.sc obreve.sc -35
+KPX wgrave.sc obreve.sc -35
+KPX wgrave.sc ohungarumlaut.sc -35
KPX wgrave.sc ohungarumlaut.sc -35
KPX wgrave.sc omacron.sc -35
+KPX wgrave.sc omacron.sc -35
+KPX wgrave.sc sacute.sc -25
KPX wgrave.sc sacute.sc -25
KPX wgrave.sc scedilla.sc -25
+KPX wgrave.sc scedilla.sc -25
+KPX wgrave.sc scircumflex.sc -25
KPX wgrave.sc scircumflex.sc -25
KPX wgrave.sc tcaron.sc 10
+KPX wgrave.sc tcaron.sc 10
KPX wgrave.sc a.sc -75
-KPX wgrave.sc c.sc -35
-KPX wgrave.sc g.sc -35
-KPX wgrave.sc o.sc -35
-KPX wgrave.sc s.sc -25
-KPX wgrave.sc t.sc 10
-KPX wgrave.sc adieresis.sc -75
-KPX wgrave.sc aring.sc -75
-KPX wgrave.sc ae.sc -65
-KPX wgrave.sc ccedilla.sc -35
-KPX wgrave.sc odieresis.sc -35
-KPX wgrave.sc oslash.sc -35
-KPX wgrave.sc comma -90
-KPX wgrave.sc hyphen -55
-KPX wgrave.sc period -95
-KPX wgrave.sc colon -80
-KPX wgrave.sc semicolon -80
KPX wgrave.sc a.sc -75
KPX wgrave.sc c.sc -35
+KPX wgrave.sc c.sc -35
+KPX wgrave.sc g.sc -35
KPX wgrave.sc g.sc -35
KPX wgrave.sc o.sc -35
+KPX wgrave.sc o.sc -35
+KPX wgrave.sc s.sc -25
KPX wgrave.sc s.sc -25
KPX wgrave.sc t.sc 10
+KPX wgrave.sc t.sc 10
+KPX wgrave.sc adieresis.sc -75
KPX wgrave.sc adieresis.sc -75
KPX wgrave.sc aring.sc -75
+KPX wgrave.sc aring.sc -75
+KPX wgrave.sc ae.sc -65
KPX wgrave.sc ae.sc -65
KPX wgrave.sc ccedilla.sc -35
+KPX wgrave.sc ccedilla.sc -35
+KPX wgrave.sc odieresis.sc -35
KPX wgrave.sc odieresis.sc -35
KPX wgrave.sc oslash.sc -35
-KPX wgrave.sc amacron.sc -75
-KPX wgrave.sc aogonek.sc -75
-KPX wgrave.sc cacute.sc -35
-KPX wgrave.sc ccircumflex.sc -35
-KPX wgrave.sc cdotaccent.sc -35
-KPX wgrave.sc ccaron.sc -35
-KPX wgrave.sc gcircumflex.sc -35
-KPX wgrave.sc gbreve.sc -35
-KPX wgrave.sc gdotaccent.sc -35
-KPX wgrave.sc gcommaaccent.sc -35
-KPX wgrave.sc omacron.sc -35
-KPX wgrave.sc obreve.sc -35
-KPX wgrave.sc ohungarumlaut.sc -35
-KPX wgrave.sc sacute.sc -25
-KPX wgrave.sc scircumflex.sc -25
-KPX wgrave.sc scedilla.sc -25
-KPX wgrave.sc scaron.sc -25
-KPX wgrave.sc tcaron.sc 10
-KPX wgrave.sc gcaron.sc -35
-KPX wgrave.sc oogonek.sc -35
-KPX wgrave.sc gacute.sc -35
-KPX wgrave.sc aeacute.sc -65
+KPX wgrave.sc oslash.sc -35
KPX ycircumflex.sc comma -95
+KPX ycircumflex.sc comma -95
+KPX ycircumflex.sc hyphen -100
KPX ycircumflex.sc hyphen -100
KPX ycircumflex.sc period -105
+KPX ycircumflex.sc period -105
+KPX ycircumflex.sc colon -110
KPX ycircumflex.sc colon -110
KPX ycircumflex.sc semicolon -110
+KPX ycircumflex.sc semicolon -110
KPX ycircumflex.sc gacute.sc -45
+KPX ycircumflex.sc gacute.sc -45
+KPX ycircumflex.sc gcaron.sc -45
KPX ycircumflex.sc gcaron.sc -45
KPX ycircumflex.sc jacute.sc -20
+KPX ycircumflex.sc jacute.sc -20
+KPX ycircumflex.sc oogonek.sc -45
KPX ycircumflex.sc oogonek.sc -45
KPX ycircumflex.sc scaron.sc -30
+KPX ycircumflex.sc scaron.sc -30
KPX ycircumflex.sc amacron.sc -50
+KPX ycircumflex.sc amacron.sc -50
+KPX ycircumflex.sc aogonek.sc -50
KPX ycircumflex.sc aogonek.sc -50
KPX ycircumflex.sc aeacute.sc -45
+KPX ycircumflex.sc aeacute.sc -45
+KPX ycircumflex.sc cacute.sc -45
KPX ycircumflex.sc cacute.sc -45
KPX ycircumflex.sc ccaron.sc -45
+KPX ycircumflex.sc ccaron.sc -45
KPX ycircumflex.sc ccircumflex.sc -45
+KPX ycircumflex.sc ccircumflex.sc -45
+KPX ycircumflex.sc cdotaccent.sc -45
KPX ycircumflex.sc cdotaccent.sc -45
KPX ycircumflex.sc gbreve.sc -45
+KPX ycircumflex.sc gbreve.sc -45
+KPX ycircumflex.sc gcircumflex.sc -45
KPX ycircumflex.sc gcircumflex.sc -45
KPX ycircumflex.sc gcommaaccent.sc -45
+KPX ycircumflex.sc gcommaaccent.sc -45
+KPX ycircumflex.sc gdotaccent.sc -45
KPX ycircumflex.sc gdotaccent.sc -45
KPX ycircumflex.sc jcircumflex.sc -20
+KPX ycircumflex.sc jcircumflex.sc -20
+KPX ycircumflex.sc obreve.sc -45
KPX ycircumflex.sc obreve.sc -45
KPX ycircumflex.sc ohungarumlaut.sc -45
+KPX ycircumflex.sc ohungarumlaut.sc -45
KPX ycircumflex.sc omacron.sc -45
+KPX ycircumflex.sc omacron.sc -45
+KPX ycircumflex.sc sacute.sc -30
KPX ycircumflex.sc sacute.sc -30
KPX ycircumflex.sc scedilla.sc -30
+KPX ycircumflex.sc scedilla.sc -30
+KPX ycircumflex.sc scircumflex.sc -30
KPX ycircumflex.sc scircumflex.sc -30
KPX ycircumflex.sc tcaron.sc 10
+KPX ycircumflex.sc tcaron.sc 10
KPX ycircumflex.sc a.sc -50
-KPX ycircumflex.sc c.sc -45
-KPX ycircumflex.sc g.sc -45
-KPX ycircumflex.sc j.sc -20
-KPX ycircumflex.sc o.sc -45
-KPX ycircumflex.sc s.sc -30
-KPX ycircumflex.sc t.sc 10
-KPX ycircumflex.sc adieresis.sc -50
-KPX ycircumflex.sc aring.sc -50
-KPX ycircumflex.sc ae.sc -45
-KPX ycircumflex.sc ccedilla.sc -45
-KPX ycircumflex.sc odieresis.sc -45
-KPX ycircumflex.sc oslash.sc -45
-KPX ycircumflex.sc comma -95
-KPX ycircumflex.sc hyphen -100
-KPX ycircumflex.sc period -105
-KPX ycircumflex.sc colon -110
-KPX ycircumflex.sc semicolon -110
KPX ycircumflex.sc a.sc -50
KPX ycircumflex.sc c.sc -45
+KPX ycircumflex.sc c.sc -45
+KPX ycircumflex.sc g.sc -45
KPX ycircumflex.sc g.sc -45
KPX ycircumflex.sc j.sc -20
+KPX ycircumflex.sc j.sc -20
+KPX ycircumflex.sc o.sc -45
KPX ycircumflex.sc o.sc -45
KPX ycircumflex.sc s.sc -30
+KPX ycircumflex.sc s.sc -30
KPX ycircumflex.sc t.sc 10
+KPX ycircumflex.sc t.sc 10
+KPX ycircumflex.sc adieresis.sc -50
KPX ycircumflex.sc adieresis.sc -50
KPX ycircumflex.sc aring.sc -50
+KPX ycircumflex.sc aring.sc -50
+KPX ycircumflex.sc ae.sc -45
KPX ycircumflex.sc ae.sc -45
KPX ycircumflex.sc ccedilla.sc -45
+KPX ycircumflex.sc ccedilla.sc -45
+KPX ycircumflex.sc odieresis.sc -45
KPX ycircumflex.sc odieresis.sc -45
KPX ycircumflex.sc oslash.sc -45
-KPX ycircumflex.sc amacron.sc -50
-KPX ycircumflex.sc aogonek.sc -50
-KPX ycircumflex.sc cacute.sc -45
-KPX ycircumflex.sc ccircumflex.sc -45
-KPX ycircumflex.sc cdotaccent.sc -45
-KPX ycircumflex.sc ccaron.sc -45
-KPX ycircumflex.sc gcircumflex.sc -45
-KPX ycircumflex.sc gbreve.sc -45
-KPX ycircumflex.sc gdotaccent.sc -45
-KPX ycircumflex.sc gcommaaccent.sc -45
-KPX ycircumflex.sc jcircumflex.sc -20
-KPX ycircumflex.sc omacron.sc -45
-KPX ycircumflex.sc obreve.sc -45
-KPX ycircumflex.sc ohungarumlaut.sc -45
-KPX ycircumflex.sc sacute.sc -30
-KPX ycircumflex.sc scircumflex.sc -30
-KPX ycircumflex.sc scedilla.sc -30
-KPX ycircumflex.sc scaron.sc -30
-KPX ycircumflex.sc tcaron.sc 10
-KPX ycircumflex.sc gcaron.sc -45
-KPX ycircumflex.sc oogonek.sc -45
-KPX ycircumflex.sc gacute.sc -45
-KPX ycircumflex.sc aeacute.sc -45
-KPX ycircumflex.sc jacute.sc -20
+KPX ycircumflex.sc oslash.sc -45
+KPX a.sc hyphen -25
KPX a.sc hyphen -25
KPX a.sc ringhalfright -95
+KPX a.sc ringhalfright -95
+KPX a.sc ringhalfleft -95
KPX a.sc ringhalfleft -95
KPX a.sc quoteright -115
+KPX a.sc quoteright -115
+KPX a.sc quotedblright -90
KPX a.sc quotedblright -90
KPX a.sc gacute.sc -35
+KPX a.sc gacute.sc -35
KPX a.sc gcaron.sc -35
+KPX a.sc gcaron.sc -35
+KPX a.sc oogonek.sc -40
KPX a.sc oogonek.sc -40
KPX a.sc cacute.sc -35
+KPX a.sc cacute.sc -35
+KPX a.sc ccaron.sc -35
KPX a.sc ccaron.sc -35
KPX a.sc ccircumflex.sc -35
+KPX a.sc ccircumflex.sc -35
+KPX a.sc cdotaccent.sc -35
KPX a.sc cdotaccent.sc -35
KPX a.sc gbreve.sc -35
+KPX a.sc gbreve.sc -35
+KPX a.sc gcircumflex.sc -35
KPX a.sc gcircumflex.sc -35
KPX a.sc gcommaaccent.sc -35
+KPX a.sc gcommaaccent.sc -35
KPX a.sc gdotaccent.sc -35
+KPX a.sc gdotaccent.sc -35
+KPX a.sc obreve.sc -40
KPX a.sc obreve.sc -40
KPX a.sc ohungarumlaut.sc -40
+KPX a.sc ohungarumlaut.sc -40
+KPX a.sc omacron.sc -40
KPX a.sc omacron.sc -40
KPX a.sc tcaron.sc -35
+KPX a.sc tcaron.sc -35
+KPX a.sc ubreve.sc -40
KPX a.sc ubreve.sc -40
KPX a.sc uhungarumlaut.sc -40
+KPX a.sc uhungarumlaut.sc -40
+KPX a.sc umacron.sc -40
KPX a.sc umacron.sc -40
KPX a.sc uogonek.sc -40
+KPX a.sc uogonek.sc -40
KPX a.sc uring.sc -40
+KPX a.sc uring.sc -40
+KPX a.sc wacute.sc -75
KPX a.sc wacute.sc -75
KPX a.sc wcircumflex.sc -75
+KPX a.sc wcircumflex.sc -75
+KPX a.sc wdieresis.sc -75
KPX a.sc wdieresis.sc -75
KPX a.sc wgrave.sc -75
+KPX a.sc wgrave.sc -75
+KPX a.sc ycircumflex.sc -55
KPX a.sc ycircumflex.sc -55
KPX a.sc c.sc -35
-KPX a.sc g.sc -35
-KPX a.sc o.sc -40
-KPX a.sc q.sc -40
-KPX a.sc t.sc -35
-KPX a.sc u.sc -40
-KPX a.sc v.sc -85
-KPX a.sc w.sc -75
-KPX a.sc y.sc -55
-KPX a.sc ccedilla.sc -35
-KPX a.sc ograve.sc -40
-KPX a.sc odieresis.sc -40
-KPX a.sc oslash.sc -40
-KPX a.sc ucircumflex.sc -40
-KPX a.sc udieresis.sc -40
-KPX a.sc ydieresis.sc -55
-KPX a.sc hyphen -25
-KPX a.sc ringhalfright -95
-KPX a.sc ringhalfleft -95
-KPX a.sc quoteright -115
-KPX a.sc quotedblright -90
KPX a.sc c.sc -35
KPX a.sc g.sc -35
+KPX a.sc g.sc -35
KPX a.sc o.sc -40
+KPX a.sc o.sc -40
+KPX a.sc q.sc -40
KPX a.sc q.sc -40
KPX a.sc t.sc -35
+KPX a.sc t.sc -35
+KPX a.sc u.sc -40
KPX a.sc u.sc -40
KPX a.sc v.sc -85
+KPX a.sc v.sc -85
+KPX a.sc w.sc -75
KPX a.sc w.sc -75
KPX a.sc y.sc -55
+KPX a.sc y.sc -55
+KPX a.sc ccedilla.sc -35
KPX a.sc ccedilla.sc -35
KPX a.sc ograve.sc -40
+KPX a.sc ograve.sc -40
KPX a.sc odieresis.sc -40
+KPX a.sc odieresis.sc -40
+KPX a.sc oslash.sc -40
KPX a.sc oslash.sc -40
KPX a.sc ucircumflex.sc -40
+KPX a.sc ucircumflex.sc -40
+KPX a.sc udieresis.sc -40
KPX a.sc udieresis.sc -40
KPX a.sc ydieresis.sc -55
-KPX a.sc cacute.sc -35
-KPX a.sc ccircumflex.sc -35
-KPX a.sc cdotaccent.sc -35
-KPX a.sc ccaron.sc -35
-KPX a.sc gcircumflex.sc -35
-KPX a.sc gbreve.sc -35
-KPX a.sc gdotaccent.sc -35
-KPX a.sc gcommaaccent.sc -35
-KPX a.sc omacron.sc -40
-KPX a.sc obreve.sc -40
-KPX a.sc ohungarumlaut.sc -40
-KPX a.sc tcaron.sc -35
-KPX a.sc umacron.sc -40
-KPX a.sc ubreve.sc -40
-KPX a.sc uring.sc -40
-KPX a.sc uhungarumlaut.sc -40
-KPX a.sc uogonek.sc -40
-KPX a.sc wcircumflex.sc -75
-KPX a.sc ycircumflex.sc -55
-KPX a.sc gcaron.sc -35
-KPX a.sc oogonek.sc -40
-KPX a.sc gacute.sc -35
-KPX a.sc wgrave.sc -75
-KPX a.sc wacute.sc -75
-KPX a.sc wdieresis.sc -75
+KPX a.sc ydieresis.sc -55
+KPX b.sc abreveacute.sc -35
KPX b.sc abreveacute.sc -35
KPX b.sc abrevedotbelow.sc -35
+KPX b.sc abrevedotbelow.sc -35
+KPX b.sc abrevegrave.sc -35
KPX b.sc abrevegrave.sc -35
KPX b.sc abrevehookabove.sc -35
+KPX b.sc abrevehookabove.sc -35
+KPX b.sc abrevetilde.sc -35
KPX b.sc abrevetilde.sc -35
KPX b.sc acircumflexacute.sc -35
+KPX b.sc acircumflexacute.sc -35
KPX b.sc acircumflexdotbelow.sc -35
+KPX b.sc acircumflexdotbelow.sc -35
+KPX b.sc acircumflexgrave.sc -35
KPX b.sc acircumflexgrave.sc -35
KPX b.sc acircumflexhookabove.sc -35
+KPX b.sc acircumflexhookabove.sc -35
+KPX b.sc acircumflextilde.sc -35
KPX b.sc acircumflextilde.sc -35
KPX b.sc adotbelow.sc -35
+KPX b.sc adotbelow.sc -35
+KPX b.sc ahookabove.sc -35
KPX b.sc ahookabove.sc -35
KPX b.sc ocircumflexacute.sc -15
+KPX b.sc ocircumflexacute.sc -15
+KPX b.sc ocircumflexdotbelow.sc -15
KPX b.sc ocircumflexdotbelow.sc -15
KPX b.sc ocircumflexgrave.sc -15
+KPX b.sc ocircumflexgrave.sc -15
KPX b.sc ocircumflexhookabove.sc -15
+KPX b.sc ocircumflexhookabove.sc -15
+KPX b.sc ocircumflextilde.sc -15
KPX b.sc ocircumflextilde.sc -15
KPX b.sc odotbelow.sc -15
+KPX b.sc odotbelow.sc -15
+KPX b.sc oe.sc -15
KPX b.sc oe.sc -15
KPX b.sc ohookabove.sc -15
+KPX b.sc ohookabove.sc -15
+KPX b.sc ohornacute.sc -15
KPX b.sc ohornacute.sc -15
KPX b.sc ohorndotbelow.sc -15
+KPX b.sc ohorndotbelow.sc -15
+KPX b.sc ohorngrave.sc -15
KPX b.sc ohorngrave.sc -15
KPX b.sc ohornhookabove.sc -15
+KPX b.sc ohornhookabove.sc -15
KPX b.sc ohorntilde.sc -15
+KPX b.sc ohorntilde.sc -15
+KPX b.sc oogonek.sc -15
KPX b.sc oogonek.sc -15
KPX b.sc abreve.sc -35
+KPX b.sc abreve.sc -35
+KPX b.sc amacron.sc -35
KPX b.sc amacron.sc -35
KPX b.sc aogonek.sc -35
+KPX b.sc aogonek.sc -35
+KPX b.sc aeacute.sc -30
KPX b.sc aeacute.sc -30
KPX b.sc obreve.sc -15
+KPX b.sc obreve.sc -15
+KPX b.sc ohungarumlaut.sc -15
KPX b.sc ohungarumlaut.sc -15
KPX b.sc omacron.sc -15
+KPX b.sc omacron.sc -15
KPX b.sc wacute.sc -40
+KPX b.sc wacute.sc -40
+KPX b.sc wcircumflex.sc -40
KPX b.sc wcircumflex.sc -40
KPX b.sc wdieresis.sc -40
+KPX b.sc wdieresis.sc -40
+KPX b.sc wgrave.sc -40
KPX b.sc wgrave.sc -40
KPX b.sc ycircumflex.sc -45
+KPX b.sc ycircumflex.sc -45
KPX b.sc a.sc -35
-KPX b.sc o.sc -15
-KPX b.sc v.sc -45
-KPX b.sc w.sc -40
-KPX b.sc y.sc -45
-KPX b.sc agrave.sc -35
-KPX b.sc aacute.sc -35
-KPX b.sc acircumflex.sc -35
-KPX b.sc atilde.sc -35
-KPX b.sc adieresis.sc -35
-KPX b.sc aring.sc -35
-KPX b.sc ae.sc -30
-KPX b.sc ograve.sc -15
-KPX b.sc oacute.sc -15
-KPX b.sc ocircumflex.sc -15
-KPX b.sc otilde.sc -15
-KPX b.sc odieresis.sc -15
-KPX b.sc oslash.sc -15
-KPX b.sc ydieresis.sc -45
KPX b.sc a.sc -35
KPX b.sc o.sc -15
+KPX b.sc o.sc -15
+KPX b.sc v.sc -45
KPX b.sc v.sc -45
KPX b.sc w.sc -40
+KPX b.sc w.sc -40
+KPX b.sc y.sc -45
KPX b.sc y.sc -45
KPX b.sc agrave.sc -35
+KPX b.sc agrave.sc -35
KPX b.sc aacute.sc -35
+KPX b.sc aacute.sc -35
+KPX b.sc acircumflex.sc -35
KPX b.sc acircumflex.sc -35
KPX b.sc atilde.sc -35
+KPX b.sc atilde.sc -35
+KPX b.sc adieresis.sc -35
KPX b.sc adieresis.sc -35
KPX b.sc aring.sc -35
+KPX b.sc aring.sc -35
+KPX b.sc ae.sc -30
KPX b.sc ae.sc -30
KPX b.sc ograve.sc -15
+KPX b.sc ograve.sc -15
+KPX b.sc oacute.sc -15
KPX b.sc oacute.sc -15
KPX b.sc ocircumflex.sc -15
+KPX b.sc ocircumflex.sc -15
KPX b.sc otilde.sc -15
+KPX b.sc otilde.sc -15
+KPX b.sc odieresis.sc -15
KPX b.sc odieresis.sc -15
KPX b.sc oslash.sc -15
+KPX b.sc oslash.sc -15
+KPX b.sc ydieresis.sc -45
KPX b.sc ydieresis.sc -45
-KPX b.sc amacron.sc -35
-KPX b.sc abreve.sc -35
-KPX b.sc aogonek.sc -35
-KPX b.sc omacron.sc -15
-KPX b.sc obreve.sc -15
-KPX b.sc ohungarumlaut.sc -15
-KPX b.sc oe.sc -15
-KPX b.sc wcircumflex.sc -40
-KPX b.sc ycircumflex.sc -45
-KPX b.sc oogonek.sc -15
-KPX b.sc aeacute.sc -30
-KPX b.sc wgrave.sc -40
-KPX b.sc wacute.sc -40
-KPX b.sc wdieresis.sc -40
-KPX b.sc adotbelow.sc -35
-KPX b.sc ahookabove.sc -35
-KPX b.sc acircumflexacute.sc -35
-KPX b.sc acircumflexgrave.sc -35
-KPX b.sc acircumflexhookabove.sc -35
-KPX b.sc acircumflextilde.sc -35
-KPX b.sc acircumflexdotbelow.sc -35
-KPX b.sc abreveacute.sc -35
-KPX b.sc abrevegrave.sc -35
-KPX b.sc abrevehookabove.sc -35
-KPX b.sc abrevetilde.sc -35
-KPX b.sc abrevedotbelow.sc -35
-KPX b.sc odotbelow.sc -15
-KPX b.sc ohookabove.sc -15
-KPX b.sc ocircumflexacute.sc -15
-KPX b.sc ocircumflexgrave.sc -15
-KPX b.sc ocircumflexhookabove.sc -15
-KPX b.sc ocircumflextilde.sc -15
-KPX b.sc ocircumflexdotbelow.sc -15
-KPX b.sc ohornacute.sc -15
-KPX b.sc ohorngrave.sc -15
-KPX b.sc ohornhookabove.sc -15
-KPX b.sc ohorntilde.sc -15
-KPX b.sc ohorndotbelow.sc -15
KPX c.sc abreveacute.sc -15
+KPX c.sc abreveacute.sc -15
+KPX c.sc abrevedotbelow.sc -15
KPX c.sc abrevedotbelow.sc -15
KPX c.sc abrevegrave.sc -15
+KPX c.sc abrevegrave.sc -15
KPX c.sc abrevehookabove.sc -15
+KPX c.sc abrevehookabove.sc -15
+KPX c.sc abrevetilde.sc -15
KPX c.sc abrevetilde.sc -15
KPX c.sc acircumflexacute.sc -15
+KPX c.sc acircumflexacute.sc -15
+KPX c.sc acircumflexdotbelow.sc -15
KPX c.sc acircumflexdotbelow.sc -15
KPX c.sc acircumflexgrave.sc -15
+KPX c.sc acircumflexgrave.sc -15
+KPX c.sc acircumflexhookabove.sc -15
KPX c.sc acircumflexhookabove.sc -15
KPX c.sc acircumflextilde.sc -15
+KPX c.sc acircumflextilde.sc -15
+KPX c.sc adotbelow.sc -15
KPX c.sc adotbelow.sc -15
KPX c.sc ahookabove.sc -15
+KPX c.sc ahookabove.sc -15
KPX c.sc ocircumflexacute.sc -5
+KPX c.sc ocircumflexacute.sc -5
+KPX c.sc ocircumflexdotbelow.sc -5
KPX c.sc ocircumflexdotbelow.sc -5
KPX c.sc ocircumflexgrave.sc -5
+KPX c.sc ocircumflexgrave.sc -5
+KPX c.sc ocircumflexhookabove.sc -5
KPX c.sc ocircumflexhookabove.sc -5
KPX c.sc ocircumflextilde.sc -5
+KPX c.sc ocircumflextilde.sc -5
KPX c.sc odotbelow.sc -5
+KPX c.sc odotbelow.sc -5
+KPX c.sc ohookabove.sc -5
KPX c.sc ohookabove.sc -5
KPX c.sc ohornacute.sc -5
+KPX c.sc ohornacute.sc -5
+KPX c.sc ohorndotbelow.sc -5
KPX c.sc ohorndotbelow.sc -5
KPX c.sc ohorngrave.sc -5
+KPX c.sc ohorngrave.sc -5
KPX c.sc ohornhookabove.sc -5
+KPX c.sc ohornhookabove.sc -5
+KPX c.sc ohorntilde.sc -5
KPX c.sc ohorntilde.sc -5
KPX c.sc oogonek.sc -5
+KPX c.sc oogonek.sc -5
+KPX c.sc abreve.sc -15
KPX c.sc abreve.sc -15
KPX c.sc amacron.sc -15
+KPX c.sc amacron.sc -15
+KPX c.sc aogonek.sc -15
KPX c.sc aogonek.sc -15
KPX c.sc aeacute.sc -10
+KPX c.sc aeacute.sc -10
+KPX c.sc obreve.sc -5
KPX c.sc obreve.sc -5
KPX c.sc ohungarumlaut.sc -5
+KPX c.sc ohungarumlaut.sc -5
+KPX c.sc omacron.sc -5
KPX c.sc omacron.sc -5
KPX c.sc a.sc -15
-KPX c.sc o.sc -5
-KPX c.sc agrave.sc -15
-KPX c.sc aacute.sc -15
-KPX c.sc acircumflex.sc -15
-KPX c.sc atilde.sc -15
-KPX c.sc adieresis.sc -15
-KPX c.sc aring.sc -15
-KPX c.sc ae.sc -10
-KPX c.sc ograve.sc -5
-KPX c.sc oacute.sc -5
-KPX c.sc ocircumflex.sc -5
-KPX c.sc otilde.sc -5
-KPX c.sc odieresis.sc -5
-KPX c.sc oslash.sc -5
KPX c.sc a.sc -15
KPX c.sc o.sc -5
+KPX c.sc o.sc -5
+KPX c.sc agrave.sc -15
KPX c.sc agrave.sc -15
KPX c.sc aacute.sc -15
+KPX c.sc aacute.sc -15
KPX c.sc acircumflex.sc -15
+KPX c.sc acircumflex.sc -15
+KPX c.sc atilde.sc -15
KPX c.sc atilde.sc -15
KPX c.sc adieresis.sc -15
+KPX c.sc adieresis.sc -15
+KPX c.sc aring.sc -15
KPX c.sc aring.sc -15
KPX c.sc ae.sc -10
+KPX c.sc ae.sc -10
+KPX c.sc ograve.sc -5
KPX c.sc ograve.sc -5
KPX c.sc oacute.sc -5
+KPX c.sc oacute.sc -5
+KPX c.sc ocircumflex.sc -5
KPX c.sc ocircumflex.sc -5
KPX c.sc otilde.sc -5
+KPX c.sc otilde.sc -5
+KPX c.sc odieresis.sc -5
KPX c.sc odieresis.sc -5
KPX c.sc oslash.sc -5
-KPX c.sc amacron.sc -15
-KPX c.sc abreve.sc -15
-KPX c.sc aogonek.sc -15
-KPX c.sc omacron.sc -5
-KPX c.sc obreve.sc -5
-KPX c.sc ohungarumlaut.sc -5
-KPX c.sc oogonek.sc -5
-KPX c.sc aeacute.sc -10
-KPX c.sc adotbelow.sc -15
-KPX c.sc ahookabove.sc -15
-KPX c.sc acircumflexacute.sc -15
-KPX c.sc acircumflexgrave.sc -15
-KPX c.sc acircumflexhookabove.sc -15
-KPX c.sc acircumflextilde.sc -15
-KPX c.sc acircumflexdotbelow.sc -15
-KPX c.sc abreveacute.sc -15
-KPX c.sc abrevegrave.sc -15
-KPX c.sc abrevehookabove.sc -15
-KPX c.sc abrevetilde.sc -15
-KPX c.sc abrevedotbelow.sc -15
-KPX c.sc odotbelow.sc -5
-KPX c.sc ohookabove.sc -5
-KPX c.sc ocircumflexacute.sc -5
-KPX c.sc ocircumflexgrave.sc -5
-KPX c.sc ocircumflexhookabove.sc -5
-KPX c.sc ocircumflextilde.sc -5
-KPX c.sc ocircumflexdotbelow.sc -5
-KPX c.sc ohornacute.sc -5
-KPX c.sc ohorngrave.sc -5
-KPX c.sc ohornhookabove.sc -5
-KPX c.sc ohorntilde.sc -5
-KPX c.sc ohorndotbelow.sc -5
+KPX c.sc oslash.sc -5
KPX d.sc abreveacute.sc -45
+KPX d.sc abreveacute.sc -45
+KPX d.sc abrevedotbelow.sc -45
KPX d.sc abrevedotbelow.sc -45
KPX d.sc abrevegrave.sc -45
+KPX d.sc abrevegrave.sc -45
KPX d.sc abrevehookabove.sc -45
+KPX d.sc abrevehookabove.sc -45
+KPX d.sc acircumflexacute.sc -45
KPX d.sc acircumflexacute.sc -45
KPX d.sc acircumflexdotbelow.sc -45
+KPX d.sc acircumflexdotbelow.sc -45
+KPX d.sc acircumflexgrave.sc -45
KPX d.sc acircumflexgrave.sc -45
KPX d.sc acircumflexhookabove.sc -45
+KPX d.sc acircumflexhookabove.sc -45
+KPX d.sc acircumflextilde.sc -45
KPX d.sc acircumflextilde.sc -45
KPX d.sc adotbelow.sc -45
+KPX d.sc adotbelow.sc -45
+KPX d.sc ahookabove.sc -45
KPX d.sc ahookabove.sc -45
KPX d.sc jacute.sc -25
+KPX d.sc jacute.sc -25
KPX d.sc abreve.sc -45
+KPX d.sc abreve.sc -45
+KPX d.sc amacron.sc -45
KPX d.sc amacron.sc -45
KPX d.sc aogonek.sc -45
+KPX d.sc aogonek.sc -45
+KPX d.sc jcircumflex.sc -25
KPX d.sc jcircumflex.sc -25
KPX d.sc wacute.sc -35
+KPX d.sc wacute.sc -35
+KPX d.sc wcircumflex.sc -35
KPX d.sc wcircumflex.sc -35
KPX d.sc wdieresis.sc -35
+KPX d.sc wdieresis.sc -35
+KPX d.sc wgrave.sc -35
KPX d.sc wgrave.sc -35
KPX d.sc ycircumflex.sc -50
+KPX d.sc ycircumflex.sc -50
KPX d.sc a.sc -45
-KPX d.sc j.sc -25
-KPX d.sc v.sc -45
-KPX d.sc w.sc -35
-KPX d.sc x.sc -45
-KPX d.sc y.sc -50
-KPX d.sc agrave.sc -45
-KPX d.sc aacute.sc -45
-KPX d.sc acircumflex.sc -45
-KPX d.sc atilde.sc -45
-KPX d.sc adieresis.sc -45
-KPX d.sc aring.sc -45
-KPX d.sc ydieresis.sc -50
KPX d.sc a.sc -45
KPX d.sc j.sc -25
+KPX d.sc j.sc -25
KPX d.sc v.sc -45
+KPX d.sc v.sc -45
+KPX d.sc w.sc -35
KPX d.sc w.sc -35
KPX d.sc x.sc -45
+KPX d.sc x.sc -45
+KPX d.sc y.sc -50
KPX d.sc y.sc -50
KPX d.sc agrave.sc -45
+KPX d.sc agrave.sc -45
KPX d.sc aacute.sc -45
+KPX d.sc aacute.sc -45
+KPX d.sc acircumflex.sc -45
KPX d.sc acircumflex.sc -45
KPX d.sc atilde.sc -45
+KPX d.sc atilde.sc -45
+KPX d.sc adieresis.sc -45
KPX d.sc adieresis.sc -45
KPX d.sc aring.sc -45
+KPX d.sc aring.sc -45
+KPX d.sc ydieresis.sc -50
KPX d.sc ydieresis.sc -50
-KPX d.sc amacron.sc -45
-KPX d.sc abreve.sc -45
-KPX d.sc aogonek.sc -45
-KPX d.sc jcircumflex.sc -25
-KPX d.sc wcircumflex.sc -35
-KPX d.sc ycircumflex.sc -50
-KPX d.sc wgrave.sc -35
-KPX d.sc wacute.sc -35
-KPX d.sc wdieresis.sc -35
-KPX d.sc adotbelow.sc -45
-KPX d.sc ahookabove.sc -45
-KPX d.sc acircumflexacute.sc -45
-KPX d.sc acircumflexgrave.sc -45
-KPX d.sc acircumflexhookabove.sc -45
-KPX d.sc acircumflextilde.sc -45
-KPX d.sc acircumflexdotbelow.sc -45
-KPX d.sc abreveacute.sc -45
-KPX d.sc abrevegrave.sc -45
-KPX d.sc abrevehookabove.sc -45
-KPX d.sc abrevedotbelow.sc -45
-KPX d.sc jacute.sc -25
KPX f.sc comma -50
+KPX f.sc comma -50
+KPX f.sc period -60
KPX f.sc period -60
KPX f.sc jacute.sc -10
+KPX f.sc jacute.sc -10
+KPX f.sc amacron.sc -45
KPX f.sc amacron.sc -45
KPX f.sc aogonek.sc -45
+KPX f.sc aogonek.sc -45
+KPX f.sc jcircumflex.sc -10
KPX f.sc jcircumflex.sc -10
KPX f.sc a.sc -45
-KPX f.sc j.sc -10
-KPX f.sc adieresis.sc -45
-KPX f.sc aring.sc -45
-KPX f.sc comma -50
-KPX f.sc period -60
KPX f.sc a.sc -45
KPX f.sc j.sc -10
+KPX f.sc j.sc -10
+KPX f.sc adieresis.sc -45
KPX f.sc adieresis.sc -45
KPX f.sc aring.sc -45
-KPX f.sc amacron.sc -45
-KPX f.sc aogonek.sc -45
-KPX f.sc jcircumflex.sc -10
-KPX f.sc jacute.sc -10
+KPX f.sc aring.sc -45
KPX g.sc abreveacute.sc -15
+KPX g.sc abreveacute.sc -15
+KPX g.sc abrevedotbelow.sc -15
KPX g.sc abrevedotbelow.sc -15
KPX g.sc abrevegrave.sc -15
+KPX g.sc abrevegrave.sc -15
+KPX g.sc abrevehookabove.sc -15
KPX g.sc abrevehookabove.sc -15
KPX g.sc abrevetilde.sc -15
+KPX g.sc abrevetilde.sc -15
+KPX g.sc acircumflexacute.sc -15
KPX g.sc acircumflexacute.sc -15
KPX g.sc acircumflexdotbelow.sc -15
+KPX g.sc acircumflexdotbelow.sc -15
+KPX g.sc acircumflexgrave.sc -15
KPX g.sc acircumflexgrave.sc -15
KPX g.sc acircumflexhookabove.sc -15
+KPX g.sc acircumflexhookabove.sc -15
KPX g.sc acircumflextilde.sc -15
+KPX g.sc acircumflextilde.sc -15
+KPX g.sc adotbelow.sc -15
KPX g.sc adotbelow.sc -15
KPX g.sc ahookabove.sc -15
+KPX g.sc ahookabove.sc -15
+KPX g.sc abreve.sc -15
KPX g.sc abreve.sc -15
KPX g.sc amacron.sc -15
+KPX g.sc amacron.sc -15
+KPX g.sc aogonek.sc -15
KPX g.sc aogonek.sc -15
KPX g.sc aeacute.sc -15
+KPX g.sc aeacute.sc -15
+KPX g.sc tcaron.sc -15
KPX g.sc tcaron.sc -15
KPX g.sc wacute.sc -15
+KPX g.sc wacute.sc -15
KPX g.sc wcircumflex.sc -15
+KPX g.sc wcircumflex.sc -15
+KPX g.sc wdieresis.sc -15
KPX g.sc wdieresis.sc -15
KPX g.sc wgrave.sc -15
+KPX g.sc wgrave.sc -15
+KPX g.sc ycircumflex.sc -15
KPX g.sc ycircumflex.sc -15
KPX g.sc a.sc -15
-KPX g.sc t.sc -15
-KPX g.sc v.sc -15
-KPX g.sc w.sc -15
-KPX g.sc y.sc -15
-KPX g.sc agrave.sc -15
-KPX g.sc aacute.sc -15
-KPX g.sc acircumflex.sc -15
-KPX g.sc atilde.sc -15
-KPX g.sc adieresis.sc -15
-KPX g.sc aring.sc -15
-KPX g.sc ae.sc -15
-KPX g.sc ydieresis.sc -15
KPX g.sc a.sc -15
KPX g.sc t.sc -15
+KPX g.sc t.sc -15
+KPX g.sc v.sc -15
KPX g.sc v.sc -15
KPX g.sc w.sc -15
+KPX g.sc w.sc -15
+KPX g.sc y.sc -15
KPX g.sc y.sc -15
KPX g.sc agrave.sc -15
+KPX g.sc agrave.sc -15
+KPX g.sc aacute.sc -15
KPX g.sc aacute.sc -15
KPX g.sc acircumflex.sc -15
+KPX g.sc acircumflex.sc -15
+KPX g.sc atilde.sc -15
KPX g.sc atilde.sc -15
KPX g.sc adieresis.sc -15
+KPX g.sc adieresis.sc -15
+KPX g.sc aring.sc -15
KPX g.sc aring.sc -15
KPX g.sc ae.sc -15
+KPX g.sc ae.sc -15
+KPX g.sc ydieresis.sc -15
KPX g.sc ydieresis.sc -15
-KPX g.sc amacron.sc -15
-KPX g.sc abreve.sc -15
-KPX g.sc aogonek.sc -15
-KPX g.sc tcaron.sc -15
-KPX g.sc wcircumflex.sc -15
-KPX g.sc ycircumflex.sc -15
-KPX g.sc aeacute.sc -15
-KPX g.sc wgrave.sc -15
-KPX g.sc wacute.sc -15
-KPX g.sc wdieresis.sc -15
-KPX g.sc adotbelow.sc -15
-KPX g.sc ahookabove.sc -15
-KPX g.sc acircumflexacute.sc -15
-KPX g.sc acircumflexgrave.sc -15
-KPX g.sc acircumflexhookabove.sc -15
-KPX g.sc acircumflextilde.sc -15
-KPX g.sc acircumflexdotbelow.sc -15
-KPX g.sc abreveacute.sc -15
-KPX g.sc abrevegrave.sc -15
-KPX g.sc abrevehookabove.sc -15
-KPX g.sc abrevetilde.sc -15
-KPX g.sc abrevedotbelow.sc -15
KPX j.sc amacron.sc -35
+KPX j.sc amacron.sc -35
+KPX j.sc aogonek.sc -35
KPX j.sc aogonek.sc -35
KPX j.sc aeacute.sc -30
+KPX j.sc aeacute.sc -30
KPX j.sc a.sc -35
-KPX j.sc adieresis.sc -35
-KPX j.sc aring.sc -35
-KPX j.sc ae.sc -30
KPX j.sc a.sc -35
KPX j.sc adieresis.sc -35
+KPX j.sc adieresis.sc -35
+KPX j.sc aring.sc -35
KPX j.sc aring.sc -35
KPX j.sc ae.sc -30
-KPX j.sc amacron.sc -35
-KPX j.sc aogonek.sc -35
-KPX j.sc aeacute.sc -30
+KPX j.sc ae.sc -30
+KPX k.sc hyphen -65
KPX k.sc hyphen -65
KPX k.sc gacute.sc -35
+KPX k.sc gacute.sc -35
KPX k.sc gcaron.sc -35
+KPX k.sc gcaron.sc -35
+KPX k.sc oe.sc -30
KPX k.sc oe.sc -30
KPX k.sc oogonek.sc -35
+KPX k.sc oogonek.sc -35
+KPX k.sc cacute.sc -30
KPX k.sc cacute.sc -30
KPX k.sc ccaron.sc -30
+KPX k.sc ccaron.sc -30
+KPX k.sc ccircumflex.sc -30
KPX k.sc ccircumflex.sc -30
KPX k.sc cdotaccent.sc -30
+KPX k.sc cdotaccent.sc -30
+KPX k.sc gbreve.sc -35
KPX k.sc gbreve.sc -35
KPX k.sc gcircumflex.sc -35
+KPX k.sc gcircumflex.sc -35
KPX k.sc gcommaaccent.sc -35
+KPX k.sc gcommaaccent.sc -35
+KPX k.sc gdotaccent.sc -35
KPX k.sc gdotaccent.sc -35
KPX k.sc obreve.sc -35
+KPX k.sc obreve.sc -35
+KPX k.sc ohungarumlaut.sc -35
KPX k.sc ohungarumlaut.sc -35
KPX k.sc omacron.sc -35
+KPX k.sc omacron.sc -35
KPX k.sc c.sc -30
-KPX k.sc g.sc -35
-KPX k.sc o.sc -35
-KPX k.sc ccedilla.sc -30
-KPX k.sc odieresis.sc -35
-KPX k.sc oslash.sc -35
-KPX k.sc hyphen -65
KPX k.sc c.sc -30
KPX k.sc g.sc -35
+KPX k.sc g.sc -35
+KPX k.sc o.sc -35
KPX k.sc o.sc -35
KPX k.sc ccedilla.sc -30
+KPX k.sc ccedilla.sc -30
+KPX k.sc odieresis.sc -35
KPX k.sc odieresis.sc -35
KPX k.sc oslash.sc -35
-KPX k.sc cacute.sc -30
-KPX k.sc ccircumflex.sc -30
-KPX k.sc cdotaccent.sc -30
-KPX k.sc ccaron.sc -30
-KPX k.sc gcircumflex.sc -35
-KPX k.sc gbreve.sc -35
-KPX k.sc gdotaccent.sc -35
-KPX k.sc gcommaaccent.sc -35
-KPX k.sc omacron.sc -35
-KPX k.sc obreve.sc -35
-KPX k.sc ohungarumlaut.sc -35
-KPX k.sc oe.sc -30
-KPX k.sc gcaron.sc -35
-KPX k.sc oogonek.sc -35
-KPX k.sc gacute.sc -35
+KPX k.sc oslash.sc -35
KPX l.sc hyphen 25
+KPX l.sc hyphen 25
+KPX l.sc quoteright -125
KPX l.sc quoteright -125
KPX l.sc quotedblright -100
+KPX l.sc quotedblright -100
+KPX l.sc udotbelow.sc -15
KPX l.sc udotbelow.sc -15
KPX l.sc uhookabove.sc -15
+KPX l.sc uhookabove.sc -15
KPX l.sc uhornacute.sc -15
+KPX l.sc uhornacute.sc -15
+KPX l.sc uhorndotbelow.sc -15
KPX l.sc uhorndotbelow.sc -15
KPX l.sc uhorngrave.sc -15
+KPX l.sc uhorngrave.sc -15
+KPX l.sc uhornhookabove.sc -15
KPX l.sc uhornhookabove.sc -15
KPX l.sc uhorntilde.sc -15
+KPX l.sc uhorntilde.sc -15
+KPX l.sc tcaron.sc -50
KPX l.sc tcaron.sc -50
KPX l.sc ubreve.sc -15
+KPX l.sc ubreve.sc -15
+KPX l.sc uhungarumlaut.sc -15
KPX l.sc uhungarumlaut.sc -15
KPX l.sc umacron.sc -15
+KPX l.sc umacron.sc -15
KPX l.sc uogonek.sc -15
+KPX l.sc uogonek.sc -15
+KPX l.sc uring.sc -15
KPX l.sc uring.sc -15
KPX l.sc utilde.sc -15
+KPX l.sc utilde.sc -15
+KPX l.sc wacute.sc -60
KPX l.sc wacute.sc -60
KPX l.sc wcircumflex.sc -60
+KPX l.sc wcircumflex.sc -60
+KPX l.sc wdieresis.sc -60
KPX l.sc wdieresis.sc -60
KPX l.sc wgrave.sc -60
+KPX l.sc wgrave.sc -60
+KPX l.sc ycircumflex.sc -65
KPX l.sc ycircumflex.sc -65
KPX l.sc t.sc -50
-KPX l.sc u.sc -15
-KPX l.sc v.sc -75
-KPX l.sc w.sc -60
-KPX l.sc y.sc -65
-KPX l.sc ugrave.sc -15
-KPX l.sc uacute.sc -15
-KPX l.sc ucircumflex.sc -15
-KPX l.sc udieresis.sc -15
-KPX l.sc yacute.sc -65
-KPX l.sc ydieresis.sc -65
-KPX l.sc hyphen 25
-KPX l.sc quoteright -125
-KPX l.sc quotedblright -100
KPX l.sc t.sc -50
KPX l.sc u.sc -15
+KPX l.sc u.sc -15
KPX l.sc v.sc -75
+KPX l.sc v.sc -75
+KPX l.sc w.sc -60
KPX l.sc w.sc -60
KPX l.sc y.sc -65
+KPX l.sc y.sc -65
+KPX l.sc ugrave.sc -15
KPX l.sc ugrave.sc -15
KPX l.sc uacute.sc -15
+KPX l.sc uacute.sc -15
KPX l.sc ucircumflex.sc -15
+KPX l.sc ucircumflex.sc -15
+KPX l.sc udieresis.sc -15
KPX l.sc udieresis.sc -15
KPX l.sc yacute.sc -65
+KPX l.sc yacute.sc -65
KPX l.sc ydieresis.sc -65
-KPX l.sc tcaron.sc -50
-KPX l.sc utilde.sc -15
-KPX l.sc umacron.sc -15
-KPX l.sc ubreve.sc -15
-KPX l.sc uring.sc -15
-KPX l.sc uhungarumlaut.sc -15
-KPX l.sc uogonek.sc -15
-KPX l.sc wcircumflex.sc -60
-KPX l.sc ycircumflex.sc -65
-KPX l.sc wgrave.sc -60
-KPX l.sc wacute.sc -60
-KPX l.sc wdieresis.sc -60
-KPX l.sc udotbelow.sc -15
-KPX l.sc uhookabove.sc -15
-KPX l.sc uhornacute.sc -15
-KPX l.sc uhorngrave.sc -15
-KPX l.sc uhornhookabove.sc -15
-KPX l.sc uhorntilde.sc -15
-KPX l.sc uhorndotbelow.sc -15
+KPX l.sc ydieresis.sc -65
+KPX n.sc comma -15
KPX n.sc comma -15
KPX n.sc period -20
+KPX n.sc period -20
+KPX n.sc abreveacute.sc -20
KPX n.sc abreveacute.sc -20
KPX n.sc abrevedotbelow.sc -20
+KPX n.sc abrevedotbelow.sc -20
KPX n.sc abrevegrave.sc -20
+KPX n.sc abrevegrave.sc -20
+KPX n.sc acircumflexacute.sc -20
KPX n.sc acircumflexacute.sc -20
KPX n.sc acircumflexdotbelow.sc -20
+KPX n.sc acircumflexdotbelow.sc -20
+KPX n.sc acircumflexgrave.sc -20
KPX n.sc acircumflexgrave.sc -20
KPX n.sc acircumflexhookabove.sc -20
+KPX n.sc acircumflexhookabove.sc -20
+KPX n.sc acircumflextilde.sc -20
KPX n.sc acircumflextilde.sc -20
KPX n.sc adotbelow.sc -20
+KPX n.sc adotbelow.sc -20
+KPX n.sc ahookabove.sc -20
KPX n.sc ahookabove.sc -20
KPX n.sc gacute.sc -15
+KPX n.sc gacute.sc -15
KPX n.sc gcaron.sc -15
+KPX n.sc gcaron.sc -15
+KPX n.sc ocircumflexacute.sc -15
KPX n.sc ocircumflexacute.sc -15
KPX n.sc ocircumflexdotbelow.sc -15
+KPX n.sc ocircumflexdotbelow.sc -15
+KPX n.sc ocircumflexgrave.sc -15
KPX n.sc ocircumflexgrave.sc -15
KPX n.sc ocircumflexhookabove.sc -15
+KPX n.sc ocircumflexhookabove.sc -15
KPX n.sc ocircumflextilde.sc -15
+KPX n.sc ocircumflextilde.sc -15
+KPX n.sc odotbelow.sc -15
KPX n.sc odotbelow.sc -15
KPX n.sc ohookabove.sc -15
+KPX n.sc ohookabove.sc -15
+KPX n.sc ohornacute.sc -15
KPX n.sc ohornacute.sc -15
KPX n.sc ohorndotbelow.sc -15
+KPX n.sc ohorndotbelow.sc -15
KPX n.sc ohorngrave.sc -15
+KPX n.sc ohorngrave.sc -15
+KPX n.sc ohornhookabove.sc -15
KPX n.sc ohornhookabove.sc -15
KPX n.sc ohorntilde.sc -15
+KPX n.sc ohorntilde.sc -15
+KPX n.sc oogonek.sc -15
KPX n.sc oogonek.sc -15
KPX n.sc abreve.sc -20
+KPX n.sc abreve.sc -20
+KPX n.sc amacron.sc -20
KPX n.sc amacron.sc -20
KPX n.sc aogonek.sc -20
+KPX n.sc aogonek.sc -20
+KPX n.sc aeacute.sc -15
KPX n.sc aeacute.sc -15
KPX n.sc cacute.sc -10
+KPX n.sc cacute.sc -10
KPX n.sc ccaron.sc -10
+KPX n.sc ccaron.sc -10
+KPX n.sc ccircumflex.sc -10
KPX n.sc ccircumflex.sc -10
KPX n.sc cdotaccent.sc -10
+KPX n.sc cdotaccent.sc -10
+KPX n.sc gbreve.sc -15
KPX n.sc gbreve.sc -15
KPX n.sc gcircumflex.sc -15
+KPX n.sc gcircumflex.sc -15
+KPX n.sc gcommaaccent.sc -15
KPX n.sc gcommaaccent.sc -15
KPX n.sc gdotaccent.sc -15
+KPX n.sc gdotaccent.sc -15
+KPX n.sc obreve.sc -15
KPX n.sc obreve.sc -15
KPX n.sc ohungarumlaut.sc -15
+KPX n.sc ohungarumlaut.sc -15
+KPX n.sc omacron.sc -15
KPX n.sc omacron.sc -15
KPX n.sc a.sc -20
-KPX n.sc c.sc -10
-KPX n.sc g.sc -15
-KPX n.sc o.sc -15
-KPX n.sc agrave.sc -20
-KPX n.sc aacute.sc -20
-KPX n.sc acircumflex.sc -20
-KPX n.sc atilde.sc -20
-KPX n.sc adieresis.sc -20
-KPX n.sc aring.sc -20
-KPX n.sc ae.sc -15
-KPX n.sc ccedilla.sc -10
-KPX n.sc ograve.sc -15
-KPX n.sc oacute.sc -15
-KPX n.sc ocircumflex.sc -15
-KPX n.sc otilde.sc -15
-KPX n.sc odieresis.sc -15
-KPX n.sc oslash.sc -15
-KPX n.sc comma -15
-KPX n.sc period -20
KPX n.sc a.sc -20
KPX n.sc c.sc -10
+KPX n.sc c.sc -10
+KPX n.sc g.sc -15
KPX n.sc g.sc -15
KPX n.sc o.sc -15
+KPX n.sc o.sc -15
+KPX n.sc agrave.sc -20
KPX n.sc agrave.sc -20
KPX n.sc aacute.sc -20
+KPX n.sc aacute.sc -20
+KPX n.sc acircumflex.sc -20
KPX n.sc acircumflex.sc -20
KPX n.sc atilde.sc -20
+KPX n.sc atilde.sc -20
KPX n.sc adieresis.sc -20
+KPX n.sc adieresis.sc -20
+KPX n.sc aring.sc -20
KPX n.sc aring.sc -20
KPX n.sc ae.sc -15
+KPX n.sc ae.sc -15
+KPX n.sc ccedilla.sc -10
KPX n.sc ccedilla.sc -10
KPX n.sc ograve.sc -15
+KPX n.sc ograve.sc -15
+KPX n.sc oacute.sc -15
KPX n.sc oacute.sc -15
KPX n.sc ocircumflex.sc -15
+KPX n.sc ocircumflex.sc -15
+KPX n.sc otilde.sc -15
KPX n.sc otilde.sc -15
KPX n.sc odieresis.sc -15
+KPX n.sc odieresis.sc -15
KPX n.sc oslash.sc -15
-KPX n.sc amacron.sc -20
-KPX n.sc abreve.sc -20
-KPX n.sc aogonek.sc -20
-KPX n.sc cacute.sc -10
-KPX n.sc ccircumflex.sc -10
-KPX n.sc cdotaccent.sc -10
-KPX n.sc ccaron.sc -10
-KPX n.sc gcircumflex.sc -15
-KPX n.sc gbreve.sc -15
-KPX n.sc gdotaccent.sc -15
-KPX n.sc gcommaaccent.sc -15
-KPX n.sc omacron.sc -15
-KPX n.sc obreve.sc -15
-KPX n.sc ohungarumlaut.sc -15
-KPX n.sc gcaron.sc -15
-KPX n.sc oogonek.sc -15
-KPX n.sc gacute.sc -15
-KPX n.sc aeacute.sc -15
-KPX n.sc adotbelow.sc -20
-KPX n.sc ahookabove.sc -20
-KPX n.sc acircumflexacute.sc -20
-KPX n.sc acircumflexgrave.sc -20
-KPX n.sc acircumflexhookabove.sc -20
-KPX n.sc acircumflextilde.sc -20
-KPX n.sc acircumflexdotbelow.sc -20
-KPX n.sc abreveacute.sc -20
-KPX n.sc abrevegrave.sc -20
-KPX n.sc abrevedotbelow.sc -20
-KPX n.sc odotbelow.sc -15
-KPX n.sc ohookabove.sc -15
-KPX n.sc ocircumflexacute.sc -15
-KPX n.sc ocircumflexgrave.sc -15
-KPX n.sc ocircumflexhookabove.sc -15
-KPX n.sc ocircumflextilde.sc -15
-KPX n.sc ocircumflexdotbelow.sc -15
-KPX n.sc ohornacute.sc -15
-KPX n.sc ohorngrave.sc -15
-KPX n.sc ohornhookabove.sc -15
-KPX n.sc ohorntilde.sc -15
-KPX n.sc ohorndotbelow.sc -15
+KPX n.sc oslash.sc -15
+KPX o.sc abreveacute.sc -40
KPX o.sc abreveacute.sc -40
KPX o.sc abrevedotbelow.sc -40
+KPX o.sc abrevedotbelow.sc -40
+KPX o.sc abrevegrave.sc -40
KPX o.sc abrevegrave.sc -40
KPX o.sc abrevehookabove.sc -40
+KPX o.sc abrevehookabove.sc -40
KPX o.sc abrevetilde.sc -40
+KPX o.sc abrevetilde.sc -40
+KPX o.sc adotbelow.sc -40
KPX o.sc adotbelow.sc -40
KPX o.sc ahookabove.sc -40
+KPX o.sc ahookabove.sc -40
+KPX o.sc abreve.sc -40
KPX o.sc abreve.sc -40
KPX o.sc amacron.sc -40
+KPX o.sc amacron.sc -40
+KPX o.sc aogonek.sc -40
KPX o.sc aogonek.sc -40
KPX o.sc aeacute.sc -35
+KPX o.sc aeacute.sc -35
+KPX o.sc wacute.sc -35
KPX o.sc wacute.sc -35
KPX o.sc wcircumflex.sc -35
+KPX o.sc wcircumflex.sc -35
KPX o.sc wdieresis.sc -35
+KPX o.sc wdieresis.sc -35
+KPX o.sc wgrave.sc -35
KPX o.sc wgrave.sc -35
KPX o.sc ycircumflex.sc -45
+KPX o.sc ycircumflex.sc -45
KPX o.sc a.sc -40
-KPX o.sc v.sc -45
-KPX o.sc w.sc -35
-KPX o.sc x.sc -35
-KPX o.sc y.sc -45
-KPX o.sc agrave.sc -40
-KPX o.sc aacute.sc -40
-KPX o.sc atilde.sc -40
-KPX o.sc adieresis.sc -40
-KPX o.sc aring.sc -40
-KPX o.sc ae.sc -35
-KPX o.sc ydieresis.sc -45
KPX o.sc a.sc -40
KPX o.sc v.sc -45
+KPX o.sc v.sc -45
KPX o.sc w.sc -35
+KPX o.sc w.sc -35
+KPX o.sc x.sc -35
KPX o.sc x.sc -35
KPX o.sc y.sc -45
+KPX o.sc y.sc -45
KPX o.sc agrave.sc -40
+KPX o.sc agrave.sc -40
+KPX o.sc aacute.sc -40
KPX o.sc aacute.sc -40
KPX o.sc atilde.sc -40
+KPX o.sc atilde.sc -40
+KPX o.sc adieresis.sc -40
KPX o.sc adieresis.sc -40
KPX o.sc aring.sc -40
+KPX o.sc aring.sc -40
+KPX o.sc ae.sc -35
KPX o.sc ae.sc -35
KPX o.sc ydieresis.sc -45
-KPX o.sc amacron.sc -40
-KPX o.sc abreve.sc -40
-KPX o.sc aogonek.sc -40
-KPX o.sc wcircumflex.sc -35
-KPX o.sc ycircumflex.sc -45
-KPX o.sc aeacute.sc -35
-KPX o.sc wgrave.sc -35
-KPX o.sc wacute.sc -35
-KPX o.sc wdieresis.sc -35
-KPX o.sc adotbelow.sc -40
-KPX o.sc ahookabove.sc -40
-KPX o.sc abreveacute.sc -40
-KPX o.sc abrevegrave.sc -40
-KPX o.sc abrevehookabove.sc -40
-KPX o.sc abrevetilde.sc -40
-KPX o.sc abrevedotbelow.sc -40
+KPX o.sc ydieresis.sc -45
KPX p.sc comma -95
+KPX p.sc comma -95
+KPX p.sc hyphen -40
KPX p.sc hyphen -40
KPX p.sc period -100
+KPX p.sc period -100
+KPX p.sc jacute.sc -35
KPX p.sc jacute.sc -35
KPX p.sc amacron.sc -60
+KPX p.sc amacron.sc -60
KPX p.sc aogonek.sc -60
+KPX p.sc aogonek.sc -60
+KPX p.sc aeacute.sc -60
KPX p.sc aeacute.sc -60
KPX p.sc jcircumflex.sc -35
+KPX p.sc jcircumflex.sc -35
KPX p.sc a.sc -60
-KPX p.sc j.sc -35
-KPX p.sc aacute.sc -60
-KPX p.sc adieresis.sc -60
-KPX p.sc aring.sc -60
-KPX p.sc ae.sc -60
-KPX p.sc comma -95
-KPX p.sc hyphen -40
-KPX p.sc period -100
KPX p.sc a.sc -60
KPX p.sc j.sc -35
+KPX p.sc j.sc -35
+KPX p.sc aacute.sc -60
KPX p.sc aacute.sc -60
KPX p.sc adieresis.sc -60
+KPX p.sc adieresis.sc -60
+KPX p.sc aring.sc -60
KPX p.sc aring.sc -60
KPX p.sc ae.sc -60
-KPX p.sc amacron.sc -60
-KPX p.sc aogonek.sc -60
-KPX p.sc jcircumflex.sc -35
-KPX p.sc aeacute.sc -60
-KPX p.sc jacute.sc -35
+KPX p.sc ae.sc -60
+KPX r.sc hyphen -50
KPX r.sc hyphen -50
KPX r.sc gacute.sc -30
+KPX r.sc gacute.sc -30
+KPX r.sc gcaron.sc -30
KPX r.sc gcaron.sc -30
KPX r.sc ocircumflexacute.sc -30
+KPX r.sc ocircumflexacute.sc -30
+KPX r.sc ocircumflexdotbelow.sc -30
KPX r.sc ocircumflexdotbelow.sc -30
KPX r.sc ocircumflexgrave.sc -30
+KPX r.sc ocircumflexgrave.sc -30
KPX r.sc ocircumflexhookabove.sc -30
+KPX r.sc ocircumflexhookabove.sc -30
+KPX r.sc ocircumflextilde.sc -30
KPX r.sc ocircumflextilde.sc -30
KPX r.sc odotbelow.sc -30
+KPX r.sc odotbelow.sc -30
+KPX r.sc oe.sc -25
KPX r.sc oe.sc -25
KPX r.sc ohookabove.sc -30
+KPX r.sc ohookabove.sc -30
+KPX r.sc ohornacute.sc -30
KPX r.sc ohornacute.sc -30
KPX r.sc ohorndotbelow.sc -30
+KPX r.sc ohorndotbelow.sc -30
+KPX r.sc ohorngrave.sc -30
KPX r.sc ohorngrave.sc -30
KPX r.sc ohornhookabove.sc -30
+KPX r.sc ohornhookabove.sc -30
KPX r.sc ohorntilde.sc -30
+KPX r.sc ohorntilde.sc -30
+KPX r.sc oogonek.sc -30
KPX r.sc oogonek.sc -30
KPX r.sc udotbelow.sc -35
+KPX r.sc udotbelow.sc -35
+KPX r.sc uhookabove.sc -35
KPX r.sc uhookabove.sc -35
KPX r.sc uhornacute.sc -35
+KPX r.sc uhornacute.sc -35
+KPX r.sc uhorndotbelow.sc -35
KPX r.sc uhorndotbelow.sc -35
KPX r.sc uhorngrave.sc -35
+KPX r.sc uhorngrave.sc -35
+KPX r.sc uhornhookabove.sc -35
KPX r.sc uhornhookabove.sc -35
KPX r.sc uhorntilde.sc -35
+KPX r.sc uhorntilde.sc -35
KPX r.sc cacute.sc -25
+KPX r.sc cacute.sc -25
+KPX r.sc ccaron.sc -25
KPX r.sc ccaron.sc -25
KPX r.sc ccircumflex.sc -25
+KPX r.sc ccircumflex.sc -25
+KPX r.sc cdotaccent.sc -25
KPX r.sc cdotaccent.sc -25
KPX r.sc gbreve.sc -30
+KPX r.sc gbreve.sc -30
+KPX r.sc gcircumflex.sc -30
KPX r.sc gcircumflex.sc -30
KPX r.sc gcommaaccent.sc -30
+KPX r.sc gcommaaccent.sc -30
+KPX r.sc gdotaccent.sc -30
KPX r.sc gdotaccent.sc -30
KPX r.sc obreve.sc -30
+KPX r.sc obreve.sc -30
KPX r.sc ohungarumlaut.sc -30
+KPX r.sc ohungarumlaut.sc -30
+KPX r.sc omacron.sc -30
KPX r.sc omacron.sc -30
KPX r.sc tcaron.sc -25
+KPX r.sc tcaron.sc -25
+KPX r.sc ubreve.sc -35
KPX r.sc ubreve.sc -35
KPX r.sc uhungarumlaut.sc -35
+KPX r.sc uhungarumlaut.sc -35
KPX r.sc umacron.sc -35
+KPX r.sc umacron.sc -35
+KPX r.sc uogonek.sc -35
KPX r.sc uogonek.sc -35
KPX r.sc uring.sc -35
+KPX r.sc uring.sc -35
+KPX r.sc utilde.sc -35
KPX r.sc utilde.sc -35
KPX r.sc wacute.sc -45
+KPX r.sc wacute.sc -45
KPX r.sc wcircumflex.sc -45
+KPX r.sc wcircumflex.sc -45
+KPX r.sc wdieresis.sc -45
KPX r.sc wdieresis.sc -45
KPX r.sc wgrave.sc -45
+KPX r.sc wgrave.sc -45
+KPX r.sc ycircumflex.sc -50
KPX r.sc ycircumflex.sc -50
KPX r.sc c.sc -25
-KPX r.sc g.sc -30
-KPX r.sc o.sc -30
-KPX r.sc t.sc -25
-KPX r.sc u.sc -35
-KPX r.sc v.sc -50
-KPX r.sc w.sc -45
-KPX r.sc y.sc -50
-KPX r.sc ccedilla.sc -25
-KPX r.sc ograve.sc -30
-KPX r.sc oacute.sc -30
-KPX r.sc ocircumflex.sc -30
-KPX r.sc otilde.sc -30
-KPX r.sc odieresis.sc -30
-KPX r.sc oslash.sc -30
-KPX r.sc ugrave.sc -35
-KPX r.sc uacute.sc -35
-KPX r.sc ucircumflex.sc -35
-KPX r.sc udieresis.sc -35
-KPX r.sc ydieresis.sc -50
-KPX r.sc hyphen -50
KPX r.sc c.sc -25
KPX r.sc g.sc -30
+KPX r.sc g.sc -30
+KPX r.sc o.sc -30
KPX r.sc o.sc -30
KPX r.sc t.sc -25
+KPX r.sc t.sc -25
KPX r.sc u.sc -35
+KPX r.sc u.sc -35
+KPX r.sc v.sc -50
KPX r.sc v.sc -50
KPX r.sc w.sc -45
+KPX r.sc w.sc -45
+KPX r.sc y.sc -50
KPX r.sc y.sc -50
KPX r.sc ccedilla.sc -25
+KPX r.sc ccedilla.sc -25
+KPX r.sc ograve.sc -30
KPX r.sc ograve.sc -30
KPX r.sc oacute.sc -30
+KPX r.sc oacute.sc -30
+KPX r.sc ocircumflex.sc -30
KPX r.sc ocircumflex.sc -30
KPX r.sc otilde.sc -30
+KPX r.sc otilde.sc -30
KPX r.sc odieresis.sc -30
+KPX r.sc odieresis.sc -30
+KPX r.sc oslash.sc -30
KPX r.sc oslash.sc -30
KPX r.sc ugrave.sc -35
+KPX r.sc ugrave.sc -35
+KPX r.sc uacute.sc -35
KPX r.sc uacute.sc -35
KPX r.sc ucircumflex.sc -35
+KPX r.sc ucircumflex.sc -35
+KPX r.sc udieresis.sc -35
KPX r.sc udieresis.sc -35
KPX r.sc ydieresis.sc -50
-KPX r.sc cacute.sc -25
-KPX r.sc ccircumflex.sc -25
-KPX r.sc cdotaccent.sc -25
-KPX r.sc ccaron.sc -25
-KPX r.sc gcircumflex.sc -30
-KPX r.sc gbreve.sc -30
-KPX r.sc gdotaccent.sc -30
-KPX r.sc gcommaaccent.sc -30
-KPX r.sc omacron.sc -30
-KPX r.sc obreve.sc -30
-KPX r.sc ohungarumlaut.sc -30
-KPX r.sc oe.sc -25
-KPX r.sc tcaron.sc -25
-KPX r.sc utilde.sc -35
-KPX r.sc umacron.sc -35
-KPX r.sc ubreve.sc -35
-KPX r.sc uring.sc -35
-KPX r.sc uhungarumlaut.sc -35
-KPX r.sc uogonek.sc -35
-KPX r.sc wcircumflex.sc -45
-KPX r.sc ycircumflex.sc -50
-KPX r.sc gcaron.sc -30
-KPX r.sc oogonek.sc -30
-KPX r.sc gacute.sc -30
-KPX r.sc wgrave.sc -45
-KPX r.sc wacute.sc -45
-KPX r.sc wdieresis.sc -45
-KPX r.sc odotbelow.sc -30
-KPX r.sc ohookabove.sc -30
-KPX r.sc ocircumflexacute.sc -30
-KPX r.sc ocircumflexgrave.sc -30
-KPX r.sc ocircumflexhookabove.sc -30
-KPX r.sc ocircumflextilde.sc -30
-KPX r.sc ocircumflexdotbelow.sc -30
-KPX r.sc ohornacute.sc -30
-KPX r.sc ohorngrave.sc -30
-KPX r.sc ohornhookabove.sc -30
-KPX r.sc ohorntilde.sc -30
-KPX r.sc ohorndotbelow.sc -30
-KPX r.sc udotbelow.sc -35
-KPX r.sc uhookabove.sc -35
-KPX r.sc uhornacute.sc -35
-KPX r.sc uhorngrave.sc -35
-KPX r.sc uhornhookabove.sc -35
-KPX r.sc uhorntilde.sc -35
-KPX r.sc uhorndotbelow.sc -35
+KPX r.sc ydieresis.sc -50
+KPX s.sc abreveacute.sc -25
KPX s.sc abreveacute.sc -25
KPX s.sc abrevedotbelow.sc -25
+KPX s.sc abrevedotbelow.sc -25
KPX s.sc abrevegrave.sc -25
+KPX s.sc abrevegrave.sc -25
+KPX s.sc abrevetilde.sc -25
KPX s.sc abrevetilde.sc -25
KPX s.sc acircumflexacute.sc -25
+KPX s.sc acircumflexacute.sc -25
+KPX s.sc acircumflexdotbelow.sc -25
KPX s.sc acircumflexdotbelow.sc -25
KPX s.sc acircumflexgrave.sc -25
+KPX s.sc acircumflexgrave.sc -25
+KPX s.sc acircumflexhookabove.sc -25
KPX s.sc acircumflexhookabove.sc -25
KPX s.sc acircumflextilde.sc -25
+KPX s.sc acircumflextilde.sc -25
+KPX s.sc adotbelow.sc -25
KPX s.sc adotbelow.sc -25
KPX s.sc ahookabove.sc -25
+KPX s.sc ahookabove.sc -25
KPX s.sc abreve.sc -25
+KPX s.sc abreve.sc -25
+KPX s.sc amacron.sc -25
KPX s.sc amacron.sc -25
KPX s.sc aogonek.sc -25
+KPX s.sc aogonek.sc -25
+KPX s.sc aeacute.sc -20
KPX s.sc aeacute.sc -20
KPX s.sc tcaron.sc -15
+KPX s.sc tcaron.sc -15
+KPX s.sc wacute.sc -15
KPX s.sc wacute.sc -15
KPX s.sc wcircumflex.sc -15
+KPX s.sc wcircumflex.sc -15
+KPX s.sc wdieresis.sc -15
KPX s.sc wdieresis.sc -15
KPX s.sc wgrave.sc -15
+KPX s.sc wgrave.sc -15
+KPX s.sc ycircumflex.sc -20
KPX s.sc ycircumflex.sc -20
KPX s.sc a.sc -25
-KPX s.sc t.sc -15
-KPX s.sc v.sc -15
-KPX s.sc w.sc -15
-KPX s.sc y.sc -20
-KPX s.sc agrave.sc -25
-KPX s.sc aacute.sc -25
-KPX s.sc acircumflex.sc -25
-KPX s.sc atilde.sc -25
-KPX s.sc adieresis.sc -25
-KPX s.sc aring.sc -25
-KPX s.sc ae.sc -20
-KPX s.sc ydieresis.sc -20
KPX s.sc a.sc -25
KPX s.sc t.sc -15
+KPX s.sc t.sc -15
+KPX s.sc v.sc -15
KPX s.sc v.sc -15
KPX s.sc w.sc -15
+KPX s.sc w.sc -15
+KPX s.sc y.sc -20
KPX s.sc y.sc -20
KPX s.sc agrave.sc -25
+KPX s.sc agrave.sc -25
KPX s.sc aacute.sc -25
+KPX s.sc aacute.sc -25
+KPX s.sc acircumflex.sc -25
KPX s.sc acircumflex.sc -25
KPX s.sc atilde.sc -25
+KPX s.sc atilde.sc -25
+KPX s.sc adieresis.sc -25
KPX s.sc adieresis.sc -25
KPX s.sc aring.sc -25
+KPX s.sc aring.sc -25
+KPX s.sc ae.sc -20
KPX s.sc ae.sc -20
KPX s.sc ydieresis.sc -20
-KPX s.sc amacron.sc -25
-KPX s.sc abreve.sc -25
-KPX s.sc aogonek.sc -25
-KPX s.sc tcaron.sc -15
-KPX s.sc wcircumflex.sc -15
-KPX s.sc ycircumflex.sc -20
-KPX s.sc aeacute.sc -20
-KPX s.sc wgrave.sc -15
-KPX s.sc wacute.sc -15
-KPX s.sc wdieresis.sc -15
-KPX s.sc adotbelow.sc -25
-KPX s.sc ahookabove.sc -25
-KPX s.sc acircumflexacute.sc -25
-KPX s.sc acircumflexgrave.sc -25
-KPX s.sc acircumflexhookabove.sc -25
-KPX s.sc acircumflextilde.sc -25
-KPX s.sc acircumflexdotbelow.sc -25
-KPX s.sc abreveacute.sc -25
-KPX s.sc abrevegrave.sc -25
-KPX s.sc abrevetilde.sc -25
-KPX s.sc abrevedotbelow.sc -25
+KPX s.sc ydieresis.sc -20
+KPX t.sc comma -75
KPX t.sc comma -75
KPX t.sc hyphen -75
+KPX t.sc hyphen -75
+KPX t.sc period -80
KPX t.sc period -80
KPX t.sc colon -90
+KPX t.sc colon -90
+KPX t.sc semicolon -85
KPX t.sc semicolon -85
KPX t.sc abreveacute.sc -35
+KPX t.sc abreveacute.sc -35
+KPX t.sc abrevedotbelow.sc -35
KPX t.sc abrevedotbelow.sc -35
KPX t.sc abrevegrave.sc -35
+KPX t.sc abrevegrave.sc -35
KPX t.sc abrevehookabove.sc -35
+KPX t.sc abrevehookabove.sc -35
+KPX t.sc acircumflexacute.sc -35
KPX t.sc acircumflexacute.sc -35
KPX t.sc acircumflexdotbelow.sc -35
+KPX t.sc acircumflexdotbelow.sc -35
+KPX t.sc acircumflexgrave.sc -35
KPX t.sc acircumflexgrave.sc -35
KPX t.sc acircumflexhookabove.sc -35
+KPX t.sc acircumflexhookabove.sc -35
+KPX t.sc adotbelow.sc -35
KPX t.sc adotbelow.sc -35
KPX t.sc ahookabove.sc -35
+KPX t.sc ahookabove.sc -35
+KPX t.sc jacute.sc -15
KPX t.sc jacute.sc -15
KPX t.sc abreve.sc -35
+KPX t.sc abreve.sc -35
KPX t.sc amacron.sc -35
+KPX t.sc amacron.sc -35
+KPX t.sc aogonek.sc -35
KPX t.sc aogonek.sc -35
KPX t.sc aeacute.sc -30
+KPX t.sc aeacute.sc -30
+KPX t.sc jcircumflex.sc -15
KPX t.sc jcircumflex.sc -15
KPX t.sc wacute.sc 15
+KPX t.sc wacute.sc 15
+KPX t.sc wcircumflex.sc 15
KPX t.sc wcircumflex.sc 15
KPX t.sc wdieresis.sc 15
+KPX t.sc wdieresis.sc 15
+KPX t.sc wgrave.sc 15
KPX t.sc wgrave.sc 15
KPX t.sc ycircumflex.sc 5
+KPX t.sc ycircumflex.sc 5
KPX t.sc a.sc -35
-KPX t.sc j.sc -15
-KPX t.sc v.sc 10
-KPX t.sc w.sc 15
-KPX t.sc y.sc 5
-KPX t.sc agrave.sc -35
-KPX t.sc aacute.sc -35
-KPX t.sc acircumflex.sc -35
-KPX t.sc atilde.sc -35
-KPX t.sc adieresis.sc -35
-KPX t.sc aring.sc -35
-KPX t.sc ae.sc -30
-KPX t.sc ydieresis.sc 5
-KPX t.sc comma -75
-KPX t.sc hyphen -75
-KPX t.sc period -80
-KPX t.sc colon -90
-KPX t.sc semicolon -85
KPX t.sc a.sc -35
KPX t.sc j.sc -15
+KPX t.sc j.sc -15
KPX t.sc v.sc 10
+KPX t.sc v.sc 10
+KPX t.sc w.sc 15
KPX t.sc w.sc 15
KPX t.sc y.sc 5
+KPX t.sc y.sc 5
+KPX t.sc agrave.sc -35
KPX t.sc agrave.sc -35
KPX t.sc aacute.sc -35
+KPX t.sc aacute.sc -35
+KPX t.sc acircumflex.sc -35
KPX t.sc acircumflex.sc -35
KPX t.sc atilde.sc -35
+KPX t.sc atilde.sc -35
+KPX t.sc adieresis.sc -35
KPX t.sc adieresis.sc -35
KPX t.sc aring.sc -35
+KPX t.sc aring.sc -35
+KPX t.sc ae.sc -30
KPX t.sc ae.sc -30
KPX t.sc ydieresis.sc 5
-KPX t.sc amacron.sc -35
-KPX t.sc abreve.sc -35
-KPX t.sc aogonek.sc -35
-KPX t.sc jcircumflex.sc -15
-KPX t.sc wcircumflex.sc 15
-KPX t.sc ycircumflex.sc 5
-KPX t.sc aeacute.sc -30
-KPX t.sc wgrave.sc 15
-KPX t.sc wacute.sc 15
-KPX t.sc wdieresis.sc 15
-KPX t.sc adotbelow.sc -35
-KPX t.sc ahookabove.sc -35
-KPX t.sc acircumflexacute.sc -35
-KPX t.sc acircumflexgrave.sc -35
-KPX t.sc acircumflexhookabove.sc -35
-KPX t.sc acircumflexdotbelow.sc -35
-KPX t.sc abreveacute.sc -35
-KPX t.sc abrevegrave.sc -35
-KPX t.sc abrevehookabove.sc -35
-KPX t.sc abrevedotbelow.sc -35
-KPX t.sc jacute.sc -15
+KPX t.sc ydieresis.sc 5
KPX u.sc comma -30
+KPX u.sc comma -30
+KPX u.sc period -35
KPX u.sc period -35
KPX u.sc abreveacute.sc -45
+KPX u.sc abreveacute.sc -45
+KPX u.sc abrevedotbelow.sc -45
KPX u.sc abrevedotbelow.sc -45
KPX u.sc abrevegrave.sc -45
+KPX u.sc abrevegrave.sc -45
KPX u.sc abrevehookabove.sc -45
+KPX u.sc abrevehookabove.sc -45
+KPX u.sc acircumflexacute.sc -45
KPX u.sc acircumflexacute.sc -45
KPX u.sc acircumflexdotbelow.sc -45
+KPX u.sc acircumflexdotbelow.sc -45
+KPX u.sc acircumflexgrave.sc -45
KPX u.sc acircumflexgrave.sc -45
KPX u.sc acircumflexhookabove.sc -45
+KPX u.sc acircumflexhookabove.sc -45
+KPX u.sc acircumflextilde.sc -45
KPX u.sc acircumflextilde.sc -45
KPX u.sc adotbelow.sc -45
+KPX u.sc adotbelow.sc -45
+KPX u.sc ahookabove.sc -45
KPX u.sc ahookabove.sc -45
KPX u.sc abreve.sc -45
+KPX u.sc abreve.sc -45
KPX u.sc amacron.sc -45
+KPX u.sc amacron.sc -45
+KPX u.sc aogonek.sc -45
KPX u.sc aogonek.sc -45
KPX u.sc aeacute.sc -40
+KPX u.sc aeacute.sc -40
KPX u.sc a.sc -45
-KPX u.sc agrave.sc -45
-KPX u.sc aacute.sc -45
-KPX u.sc acircumflex.sc -45
-KPX u.sc atilde.sc -45
-KPX u.sc adieresis.sc -45
-KPX u.sc aring.sc -45
-KPX u.sc ae.sc -40
-KPX u.sc comma -30
-KPX u.sc period -35
KPX u.sc a.sc -45
KPX u.sc agrave.sc -45
+KPX u.sc agrave.sc -45
KPX u.sc aacute.sc -45
+KPX u.sc aacute.sc -45
+KPX u.sc acircumflex.sc -45
KPX u.sc acircumflex.sc -45
KPX u.sc atilde.sc -45
+KPX u.sc atilde.sc -45
+KPX u.sc adieresis.sc -45
KPX u.sc adieresis.sc -45
KPX u.sc aring.sc -45
+KPX u.sc aring.sc -45
KPX u.sc ae.sc -40
-KPX u.sc amacron.sc -45
-KPX u.sc abreve.sc -45
-KPX u.sc aogonek.sc -45
-KPX u.sc aeacute.sc -40
-KPX u.sc adotbelow.sc -45
-KPX u.sc ahookabove.sc -45
-KPX u.sc acircumflexacute.sc -45
-KPX u.sc acircumflexgrave.sc -45
-KPX u.sc acircumflexhookabove.sc -45
-KPX u.sc acircumflextilde.sc -45
-KPX u.sc acircumflexdotbelow.sc -45
-KPX u.sc abreveacute.sc -45
-KPX u.sc abrevegrave.sc -45
-KPX u.sc abrevehookabove.sc -45
-KPX u.sc abrevedotbelow.sc -45
+KPX u.sc ae.sc -40
+KPX v.sc comma -105
KPX v.sc comma -105
KPX v.sc hyphen -70
+KPX v.sc hyphen -70
KPX v.sc period -110
+KPX v.sc period -110
+KPX v.sc colon -90
KPX v.sc colon -90
KPX v.sc semicolon -90
+KPX v.sc semicolon -90
+KPX v.sc abreveacute.sc -85
KPX v.sc abreveacute.sc -85
KPX v.sc abrevedotbelow.sc -85
+KPX v.sc abrevedotbelow.sc -85
KPX v.sc abrevegrave.sc -85
+KPX v.sc abrevegrave.sc -85
+KPX v.sc abrevehookabove.sc -85
KPX v.sc abrevehookabove.sc -85
KPX v.sc acircumflexacute.sc -85
+KPX v.sc acircumflexacute.sc -85
+KPX v.sc acircumflexdotbelow.sc -85
KPX v.sc acircumflexdotbelow.sc -85
KPX v.sc acircumflexgrave.sc -85
+KPX v.sc acircumflexgrave.sc -85
KPX v.sc acircumflexhookabove.sc -85
+KPX v.sc acircumflexhookabove.sc -85
+KPX v.sc acircumflextilde.sc -85
KPX v.sc acircumflextilde.sc -85
KPX v.sc adotbelow.sc -85
+KPX v.sc adotbelow.sc -85
+KPX v.sc ahookabove.sc -85
KPX v.sc ahookabove.sc -85
KPX v.sc gacute.sc -45
+KPX v.sc gacute.sc -45
+KPX v.sc gcaron.sc -45
KPX v.sc gcaron.sc -45
KPX v.sc ocircumflexacute.sc -45
+KPX v.sc ocircumflexacute.sc -45
+KPX v.sc ocircumflexdotbelow.sc -45
KPX v.sc ocircumflexdotbelow.sc -45
KPX v.sc ocircumflexgrave.sc -45
+KPX v.sc ocircumflexgrave.sc -45
KPX v.sc ocircumflexhookabove.sc -45
+KPX v.sc ocircumflexhookabove.sc -45
+KPX v.sc ocircumflextilde.sc -45
KPX v.sc ocircumflextilde.sc -45
KPX v.sc odotbelow.sc -45
+KPX v.sc odotbelow.sc -45
+KPX v.sc ohookabove.sc -45
KPX v.sc ohookabove.sc -45
KPX v.sc ohornacute.sc -45
+KPX v.sc ohornacute.sc -45
+KPX v.sc ohorndotbelow.sc -45
KPX v.sc ohorndotbelow.sc -45
KPX v.sc ohorngrave.sc -45
+KPX v.sc ohorngrave.sc -45
+KPX v.sc ohornhookabove.sc -45
KPX v.sc ohornhookabove.sc -45
KPX v.sc ohorntilde.sc -45
+KPX v.sc ohorntilde.sc -45
KPX v.sc oogonek.sc -45
+KPX v.sc oogonek.sc -45
+KPX v.sc scaron.sc -30
KPX v.sc scaron.sc -30
KPX v.sc abreve.sc -85
+KPX v.sc abreve.sc -85
+KPX v.sc amacron.sc -85
KPX v.sc amacron.sc -85
KPX v.sc aogonek.sc -85
+KPX v.sc aogonek.sc -85
+KPX v.sc aeacute.sc -70
KPX v.sc aeacute.sc -70
KPX v.sc cacute.sc -45
+KPX v.sc cacute.sc -45
+KPX v.sc ccaron.sc -45
KPX v.sc ccaron.sc -45
KPX v.sc ccircumflex.sc -45
+KPX v.sc ccircumflex.sc -45
KPX v.sc cdotaccent.sc -45
+KPX v.sc cdotaccent.sc -45
+KPX v.sc gbreve.sc -45
KPX v.sc gbreve.sc -45
KPX v.sc gcircumflex.sc -45
+KPX v.sc gcircumflex.sc -45
+KPX v.sc gcommaaccent.sc -45
KPX v.sc gcommaaccent.sc -45
KPX v.sc gdotaccent.sc -45
+KPX v.sc gdotaccent.sc -45
+KPX v.sc obreve.sc -45
KPX v.sc obreve.sc -45
KPX v.sc ohungarumlaut.sc -45
+KPX v.sc ohungarumlaut.sc -45
+KPX v.sc omacron.sc -45
KPX v.sc omacron.sc -45
KPX v.sc sacute.sc -30
+KPX v.sc sacute.sc -30
KPX v.sc scedilla.sc -30
+KPX v.sc scedilla.sc -30
+KPX v.sc scircumflex.sc -30
KPX v.sc scircumflex.sc -30
KPX v.sc a.sc -85
-KPX v.sc c.sc -45
-KPX v.sc g.sc -45
-KPX v.sc o.sc -45
-KPX v.sc s.sc -30
-KPX v.sc agrave.sc -85
-KPX v.sc aacute.sc -85
-KPX v.sc acircumflex.sc -85
-KPX v.sc atilde.sc -85
-KPX v.sc adieresis.sc -85
-KPX v.sc aring.sc -85
-KPX v.sc ae.sc -70
-KPX v.sc ccedilla.sc -45
-KPX v.sc ograve.sc -45
-KPX v.sc oacute.sc -45
-KPX v.sc ocircumflex.sc -45
-KPX v.sc otilde.sc -45
-KPX v.sc odieresis.sc -45
-KPX v.sc oslash.sc -45
-KPX v.sc comma -105
-KPX v.sc hyphen -70
-KPX v.sc period -110
-KPX v.sc colon -90
-KPX v.sc semicolon -90
KPX v.sc a.sc -85
KPX v.sc c.sc -45
+KPX v.sc c.sc -45
+KPX v.sc g.sc -45
KPX v.sc g.sc -45
KPX v.sc o.sc -45
+KPX v.sc o.sc -45
+KPX v.sc s.sc -30
KPX v.sc s.sc -30
KPX v.sc agrave.sc -85
+KPX v.sc agrave.sc -85
+KPX v.sc aacute.sc -85
KPX v.sc aacute.sc -85
KPX v.sc acircumflex.sc -85
+KPX v.sc acircumflex.sc -85
KPX v.sc atilde.sc -85
+KPX v.sc atilde.sc -85
+KPX v.sc adieresis.sc -85
KPX v.sc adieresis.sc -85
KPX v.sc aring.sc -85
+KPX v.sc aring.sc -85
+KPX v.sc ae.sc -70
KPX v.sc ae.sc -70
KPX v.sc ccedilla.sc -45
+KPX v.sc ccedilla.sc -45
KPX v.sc ograve.sc -45
+KPX v.sc ograve.sc -45
+KPX v.sc oacute.sc -45
KPX v.sc oacute.sc -45
KPX v.sc ocircumflex.sc -45
+KPX v.sc ocircumflex.sc -45
+KPX v.sc otilde.sc -45
KPX v.sc otilde.sc -45
KPX v.sc odieresis.sc -45
+KPX v.sc odieresis.sc -45
+KPX v.sc oslash.sc -45
KPX v.sc oslash.sc -45
-KPX v.sc amacron.sc -85
-KPX v.sc abreve.sc -85
-KPX v.sc aogonek.sc -85
-KPX v.sc cacute.sc -45
-KPX v.sc ccircumflex.sc -45
-KPX v.sc cdotaccent.sc -45
-KPX v.sc ccaron.sc -45
-KPX v.sc gcircumflex.sc -45
-KPX v.sc gbreve.sc -45
-KPX v.sc gdotaccent.sc -45
-KPX v.sc gcommaaccent.sc -45
-KPX v.sc omacron.sc -45
-KPX v.sc obreve.sc -45
-KPX v.sc ohungarumlaut.sc -45
-KPX v.sc sacute.sc -30
-KPX v.sc scircumflex.sc -30
-KPX v.sc scedilla.sc -30
-KPX v.sc scaron.sc -30
-KPX v.sc gcaron.sc -45
-KPX v.sc oogonek.sc -45
-KPX v.sc gacute.sc -45
-KPX v.sc aeacute.sc -70
-KPX v.sc adotbelow.sc -85
-KPX v.sc ahookabove.sc -85
-KPX v.sc acircumflexacute.sc -85
-KPX v.sc acircumflexgrave.sc -85
-KPX v.sc acircumflexhookabove.sc -85
-KPX v.sc acircumflextilde.sc -85
-KPX v.sc acircumflexdotbelow.sc -85
-KPX v.sc abreveacute.sc -85
-KPX v.sc abrevegrave.sc -85
-KPX v.sc abrevehookabove.sc -85
-KPX v.sc abrevedotbelow.sc -85
-KPX v.sc odotbelow.sc -45
-KPX v.sc ohookabove.sc -45
-KPX v.sc ocircumflexacute.sc -45
-KPX v.sc ocircumflexgrave.sc -45
-KPX v.sc ocircumflexhookabove.sc -45
-KPX v.sc ocircumflextilde.sc -45
-KPX v.sc ocircumflexdotbelow.sc -45
-KPX v.sc ohornacute.sc -45
-KPX v.sc ohorngrave.sc -45
-KPX v.sc ohornhookabove.sc -45
-KPX v.sc ohorntilde.sc -45
-KPX v.sc ohorndotbelow.sc -45
KPX w.sc comma -90
+KPX w.sc comma -90
+KPX w.sc hyphen -55
KPX w.sc hyphen -55
KPX w.sc period -95
+KPX w.sc period -95
KPX w.sc colon -80
+KPX w.sc colon -80
+KPX w.sc semicolon -80
KPX w.sc semicolon -80
KPX w.sc gacute.sc -35
+KPX w.sc gacute.sc -35
+KPX w.sc gcaron.sc -35
KPX w.sc gcaron.sc -35
KPX w.sc oogonek.sc -35
+KPX w.sc oogonek.sc -35
+KPX w.sc scaron.sc -25
KPX w.sc scaron.sc -25
KPX w.sc amacron.sc -75
+KPX w.sc amacron.sc -75
+KPX w.sc aogonek.sc -75
KPX w.sc aogonek.sc -75
KPX w.sc aeacute.sc -65
+KPX w.sc aeacute.sc -65
KPX w.sc cacute.sc -35
+KPX w.sc cacute.sc -35
+KPX w.sc ccaron.sc -35
KPX w.sc ccaron.sc -35
KPX w.sc ccircumflex.sc -35
+KPX w.sc ccircumflex.sc -35
+KPX w.sc cdotaccent.sc -35
KPX w.sc cdotaccent.sc -35
KPX w.sc gbreve.sc -35
+KPX w.sc gbreve.sc -35
+KPX w.sc gcircumflex.sc -35
KPX w.sc gcircumflex.sc -35
KPX w.sc gcommaaccent.sc -35
+KPX w.sc gcommaaccent.sc -35
+KPX w.sc gdotaccent.sc -35
KPX w.sc gdotaccent.sc -35
KPX w.sc obreve.sc -35
+KPX w.sc obreve.sc -35
KPX w.sc ohungarumlaut.sc -35
+KPX w.sc ohungarumlaut.sc -35
+KPX w.sc omacron.sc -35
KPX w.sc omacron.sc -35
KPX w.sc sacute.sc -25
+KPX w.sc sacute.sc -25
+KPX w.sc scedilla.sc -25
KPX w.sc scedilla.sc -25
KPX w.sc scircumflex.sc -25
+KPX w.sc scircumflex.sc -25
+KPX w.sc tcaron.sc 10
KPX w.sc tcaron.sc 10
KPX w.sc a.sc -75
-KPX w.sc c.sc -35
-KPX w.sc g.sc -35
-KPX w.sc o.sc -35
-KPX w.sc s.sc -25
-KPX w.sc t.sc 10
-KPX w.sc adieresis.sc -75
-KPX w.sc aring.sc -75
-KPX w.sc ae.sc -65
-KPX w.sc ccedilla.sc -35
-KPX w.sc odieresis.sc -35
-KPX w.sc oslash.sc -35
-KPX w.sc comma -90
-KPX w.sc hyphen -55
-KPX w.sc period -95
-KPX w.sc colon -80
-KPX w.sc semicolon -80
KPX w.sc a.sc -75
KPX w.sc c.sc -35
+KPX w.sc c.sc -35
+KPX w.sc g.sc -35
KPX w.sc g.sc -35
KPX w.sc o.sc -35
+KPX w.sc o.sc -35
+KPX w.sc s.sc -25
KPX w.sc s.sc -25
KPX w.sc t.sc 10
+KPX w.sc t.sc 10
KPX w.sc adieresis.sc -75
+KPX w.sc adieresis.sc -75
+KPX w.sc aring.sc -75
KPX w.sc aring.sc -75
KPX w.sc ae.sc -65
+KPX w.sc ae.sc -65
+KPX w.sc ccedilla.sc -35
KPX w.sc ccedilla.sc -35
KPX w.sc odieresis.sc -35
+KPX w.sc odieresis.sc -35
KPX w.sc oslash.sc -35
-KPX w.sc amacron.sc -75
-KPX w.sc aogonek.sc -75
-KPX w.sc cacute.sc -35
-KPX w.sc ccircumflex.sc -35
-KPX w.sc cdotaccent.sc -35
-KPX w.sc ccaron.sc -35
-KPX w.sc gcircumflex.sc -35
-KPX w.sc gbreve.sc -35
-KPX w.sc gdotaccent.sc -35
-KPX w.sc gcommaaccent.sc -35
-KPX w.sc omacron.sc -35
-KPX w.sc obreve.sc -35
-KPX w.sc ohungarumlaut.sc -35
-KPX w.sc sacute.sc -25
-KPX w.sc scircumflex.sc -25
-KPX w.sc scedilla.sc -25
-KPX w.sc scaron.sc -25
-KPX w.sc tcaron.sc 10
-KPX w.sc gcaron.sc -35
-KPX w.sc oogonek.sc -35
-KPX w.sc gacute.sc -35
-KPX w.sc aeacute.sc -65
+KPX w.sc oslash.sc -35
+KPX x.sc hyphen -55
KPX x.sc hyphen -55
KPX x.sc ocircumflexacute.sc -40
+KPX x.sc ocircumflexacute.sc -40
+KPX x.sc ocircumflexdotbelow.sc -40
KPX x.sc ocircumflexdotbelow.sc -40
KPX x.sc ocircumflexgrave.sc -40
+KPX x.sc ocircumflexgrave.sc -40
+KPX x.sc ocircumflexhookabove.sc -40
KPX x.sc ocircumflexhookabove.sc -40
KPX x.sc odotbelow.sc -40
+KPX x.sc odotbelow.sc -40
+KPX x.sc ohookabove.sc -40
KPX x.sc ohookabove.sc -40
KPX x.sc ohornacute.sc -40
+KPX x.sc ohornacute.sc -40
KPX x.sc ohorndotbelow.sc -40
+KPX x.sc ohorndotbelow.sc -40
+KPX x.sc ohorngrave.sc -40
KPX x.sc ohorngrave.sc -40
KPX x.sc ohornhookabove.sc -40
+KPX x.sc ohornhookabove.sc -40
+KPX x.sc ohorntilde.sc -40
KPX x.sc ohorntilde.sc -40
KPX x.sc oogonek.sc -40
+KPX x.sc oogonek.sc -40
KPX x.sc cacute.sc -35
+KPX x.sc cacute.sc -35
+KPX x.sc ccaron.sc -35
KPX x.sc ccaron.sc -35
KPX x.sc ccircumflex.sc -35
+KPX x.sc ccircumflex.sc -35
+KPX x.sc cdotaccent.sc -35
KPX x.sc cdotaccent.sc -35
KPX x.sc obreve.sc -40
+KPX x.sc obreve.sc -40
KPX x.sc ohungarumlaut.sc -40
+KPX x.sc ohungarumlaut.sc -40
+KPX x.sc omacron.sc -40
KPX x.sc omacron.sc -40
KPX x.sc c.sc -35
-KPX x.sc o.sc -40
-KPX x.sc q.sc -40
-KPX x.sc ccedilla.sc -35
-KPX x.sc ograve.sc -40
-KPX x.sc oacute.sc -40
-KPX x.sc ocircumflex.sc -40
-KPX x.sc otilde.sc -40
-KPX x.sc odieresis.sc -40
-KPX x.sc oslash.sc -40
-KPX x.sc hyphen -55
KPX x.sc c.sc -35
KPX x.sc o.sc -40
+KPX x.sc o.sc -40
KPX x.sc q.sc -40
+KPX x.sc q.sc -40
+KPX x.sc ccedilla.sc -35
KPX x.sc ccedilla.sc -35
KPX x.sc ograve.sc -40
+KPX x.sc ograve.sc -40
+KPX x.sc oacute.sc -40
KPX x.sc oacute.sc -40
KPX x.sc ocircumflex.sc -40
+KPX x.sc ocircumflex.sc -40
KPX x.sc otilde.sc -40
+KPX x.sc otilde.sc -40
+KPX x.sc odieresis.sc -40
KPX x.sc odieresis.sc -40
KPX x.sc oslash.sc -40
-KPX x.sc cacute.sc -35
-KPX x.sc ccircumflex.sc -35
-KPX x.sc cdotaccent.sc -35
-KPX x.sc ccaron.sc -35
-KPX x.sc omacron.sc -40
-KPX x.sc obreve.sc -40
-KPX x.sc ohungarumlaut.sc -40
-KPX x.sc oogonek.sc -40
-KPX x.sc odotbelow.sc -40
-KPX x.sc ohookabove.sc -40
-KPX x.sc ocircumflexacute.sc -40
-KPX x.sc ocircumflexgrave.sc -40
-KPX x.sc ocircumflexhookabove.sc -40
-KPX x.sc ocircumflexdotbelow.sc -40
-KPX x.sc ohornacute.sc -40
-KPX x.sc ohorngrave.sc -40
-KPX x.sc ohornhookabove.sc -40
-KPX x.sc ohorntilde.sc -40
-KPX x.sc ohorndotbelow.sc -40
+KPX x.sc oslash.sc -40
KPX y.sc comma -95
+KPX y.sc comma -95
+KPX y.sc hyphen -100
KPX y.sc hyphen -100
KPX y.sc period -105
+KPX y.sc period -105
+KPX y.sc colon -110
KPX y.sc colon -110
KPX y.sc semicolon -110
+KPX y.sc semicolon -110
KPX y.sc gacute.sc -45
+KPX y.sc gacute.sc -45
+KPX y.sc gcaron.sc -45
KPX y.sc gcaron.sc -45
KPX y.sc jacute.sc -20
+KPX y.sc jacute.sc -20
+KPX y.sc oogonek.sc -45
KPX y.sc oogonek.sc -45
KPX y.sc scaron.sc -30
+KPX y.sc scaron.sc -30
+KPX y.sc amacron.sc -50
KPX y.sc amacron.sc -50
KPX y.sc aogonek.sc -50
+KPX y.sc aogonek.sc -50
+KPX y.sc aeacute.sc -45
KPX y.sc aeacute.sc -45
KPX y.sc cacute.sc -45
+KPX y.sc cacute.sc -45
KPX y.sc ccaron.sc -45
+KPX y.sc ccaron.sc -45
+KPX y.sc ccircumflex.sc -45
KPX y.sc ccircumflex.sc -45
KPX y.sc cdotaccent.sc -45
+KPX y.sc cdotaccent.sc -45
+KPX y.sc gbreve.sc -45
KPX y.sc gbreve.sc -45
KPX y.sc gcircumflex.sc -45
+KPX y.sc gcircumflex.sc -45
+KPX y.sc gcommaaccent.sc -45
KPX y.sc gcommaaccent.sc -45
KPX y.sc gdotaccent.sc -45
+KPX y.sc gdotaccent.sc -45
+KPX y.sc jcircumflex.sc -20
KPX y.sc jcircumflex.sc -20
KPX y.sc obreve.sc -45
+KPX y.sc obreve.sc -45
KPX y.sc ohungarumlaut.sc -45
+KPX y.sc ohungarumlaut.sc -45
+KPX y.sc omacron.sc -45
KPX y.sc omacron.sc -45
KPX y.sc sacute.sc -30
+KPX y.sc sacute.sc -30
+KPX y.sc scedilla.sc -30
KPX y.sc scedilla.sc -30
KPX y.sc scircumflex.sc -30
+KPX y.sc scircumflex.sc -30
+KPX y.sc tcaron.sc 10
KPX y.sc tcaron.sc 10
KPX y.sc a.sc -50
-KPX y.sc c.sc -45
-KPX y.sc g.sc -45
-KPX y.sc j.sc -20
-KPX y.sc o.sc -45
-KPX y.sc s.sc -30
-KPX y.sc t.sc 10
-KPX y.sc adieresis.sc -50
-KPX y.sc aring.sc -50
-KPX y.sc ae.sc -45
-KPX y.sc ccedilla.sc -45
-KPX y.sc odieresis.sc -45
-KPX y.sc oslash.sc -45
-KPX y.sc comma -95
-KPX y.sc hyphen -100
-KPX y.sc period -105
-KPX y.sc colon -110
-KPX y.sc semicolon -110
KPX y.sc a.sc -50
KPX y.sc c.sc -45
+KPX y.sc c.sc -45
+KPX y.sc g.sc -45
KPX y.sc g.sc -45
KPX y.sc j.sc -20
+KPX y.sc j.sc -20
+KPX y.sc o.sc -45
KPX y.sc o.sc -45
KPX y.sc s.sc -30
+KPX y.sc s.sc -30
KPX y.sc t.sc 10
+KPX y.sc t.sc 10
+KPX y.sc adieresis.sc -50
KPX y.sc adieresis.sc -50
KPX y.sc aring.sc -50
+KPX y.sc aring.sc -50
+KPX y.sc ae.sc -45
KPX y.sc ae.sc -45
KPX y.sc ccedilla.sc -45
+KPX y.sc ccedilla.sc -45
+KPX y.sc odieresis.sc -45
KPX y.sc odieresis.sc -45
KPX y.sc oslash.sc -45
-KPX y.sc amacron.sc -50
-KPX y.sc aogonek.sc -50
-KPX y.sc cacute.sc -45
-KPX y.sc ccircumflex.sc -45
-KPX y.sc cdotaccent.sc -45
-KPX y.sc ccaron.sc -45
-KPX y.sc gcircumflex.sc -45
-KPX y.sc gbreve.sc -45
-KPX y.sc gdotaccent.sc -45
-KPX y.sc gcommaaccent.sc -45
-KPX y.sc jcircumflex.sc -20
-KPX y.sc omacron.sc -45
-KPX y.sc obreve.sc -45
-KPX y.sc ohungarumlaut.sc -45
-KPX y.sc sacute.sc -30
-KPX y.sc scircumflex.sc -30
-KPX y.sc scedilla.sc -30
-KPX y.sc scaron.sc -30
-KPX y.sc tcaron.sc 10
-KPX y.sc gcaron.sc -45
-KPX y.sc oogonek.sc -45
-KPX y.sc gacute.sc -45
-KPX y.sc aeacute.sc -45
-KPX y.sc jacute.sc -20
+KPX y.sc oslash.sc -45
KPX agrave.sc o.sc -40
-KPX agrave.sc u.sc -40
-KPX agrave.sc y.sc -55
KPX agrave.sc o.sc -40
KPX agrave.sc u.sc -40
+KPX agrave.sc u.sc -40
+KPX agrave.sc y.sc -55
KPX agrave.sc y.sc -55
KPX aacute.sc c.sc -35
-KPX aacute.sc o.sc -40
-KPX aacute.sc t.sc -35
-KPX aacute.sc u.sc -40
-KPX aacute.sc y.sc -55
KPX aacute.sc c.sc -35
KPX aacute.sc o.sc -40
+KPX aacute.sc o.sc -40
KPX aacute.sc t.sc -35
+KPX aacute.sc t.sc -35
+KPX aacute.sc u.sc -40
KPX aacute.sc u.sc -40
KPX aacute.sc y.sc -55
+KPX aacute.sc y.sc -55
KPX acircumflex.sc u.sc -40
-KPX acircumflex.sc y.sc -55
KPX acircumflex.sc u.sc -40
KPX acircumflex.sc y.sc -55
+KPX acircumflex.sc y.sc -55
KPX atilde.sc o.sc -40
-KPX atilde.sc y.sc -55
KPX atilde.sc o.sc -40
KPX atilde.sc y.sc -55
+KPX atilde.sc y.sc -55
KPX adieresis.sc hyphen -25
+KPX adieresis.sc hyphen -25
+KPX adieresis.sc quoteright -115
KPX adieresis.sc quoteright -115
KPX adieresis.sc quotedblright -90
+KPX adieresis.sc quotedblright -90
KPX adieresis.sc gacute.sc -35
+KPX adieresis.sc gacute.sc -35
+KPX adieresis.sc gcaron.sc -35
KPX adieresis.sc gcaron.sc -35
KPX adieresis.sc oogonek.sc -40
+KPX adieresis.sc oogonek.sc -40
+KPX adieresis.sc cacute.sc -35
KPX adieresis.sc cacute.sc -35
KPX adieresis.sc ccaron.sc -35
+KPX adieresis.sc ccaron.sc -35
KPX adieresis.sc ccircumflex.sc -35
+KPX adieresis.sc ccircumflex.sc -35
+KPX adieresis.sc cdotaccent.sc -35
KPX adieresis.sc cdotaccent.sc -35
KPX adieresis.sc gbreve.sc -35
+KPX adieresis.sc gbreve.sc -35
+KPX adieresis.sc gcircumflex.sc -35
KPX adieresis.sc gcircumflex.sc -35
KPX adieresis.sc gcommaaccent.sc -35
+KPX adieresis.sc gcommaaccent.sc -35
+KPX adieresis.sc gdotaccent.sc -35
KPX adieresis.sc gdotaccent.sc -35
KPX adieresis.sc obreve.sc -40
+KPX adieresis.sc obreve.sc -40
+KPX adieresis.sc ohungarumlaut.sc -40
KPX adieresis.sc ohungarumlaut.sc -40
KPX adieresis.sc omacron.sc -40
+KPX adieresis.sc omacron.sc -40
KPX adieresis.sc tcaron.sc -35
+KPX adieresis.sc tcaron.sc -35
+KPX adieresis.sc ubreve.sc -40
KPX adieresis.sc ubreve.sc -40
KPX adieresis.sc uhungarumlaut.sc -40
+KPX adieresis.sc uhungarumlaut.sc -40
+KPX adieresis.sc umacron.sc -40
KPX adieresis.sc umacron.sc -40
KPX adieresis.sc uogonek.sc -40
+KPX adieresis.sc uogonek.sc -40
+KPX adieresis.sc uring.sc -40
KPX adieresis.sc uring.sc -40
KPX adieresis.sc wacute.sc -75
+KPX adieresis.sc wacute.sc -75
+KPX adieresis.sc wcircumflex.sc -75
KPX adieresis.sc wcircumflex.sc -75
KPX adieresis.sc wdieresis.sc -75
+KPX adieresis.sc wdieresis.sc -75
KPX adieresis.sc wgrave.sc -75
+KPX adieresis.sc wgrave.sc -75
+KPX adieresis.sc ycircumflex.sc -55
KPX adieresis.sc ycircumflex.sc -55
KPX adieresis.sc c.sc -35
-KPX adieresis.sc g.sc -35
-KPX adieresis.sc o.sc -40
-KPX adieresis.sc q.sc -40
-KPX adieresis.sc t.sc -35
-KPX adieresis.sc u.sc -40
-KPX adieresis.sc v.sc -85
-KPX adieresis.sc w.sc -75
-KPX adieresis.sc y.sc -55
-KPX adieresis.sc ccedilla.sc -35
-KPX adieresis.sc odieresis.sc -40
-KPX adieresis.sc oslash.sc -40
-KPX adieresis.sc ucircumflex.sc -40
-KPX adieresis.sc udieresis.sc -40
-KPX adieresis.sc ydieresis.sc -55
-KPX adieresis.sc hyphen -25
-KPX adieresis.sc quoteright -115
-KPX adieresis.sc quotedblright -90
KPX adieresis.sc c.sc -35
KPX adieresis.sc g.sc -35
+KPX adieresis.sc g.sc -35
KPX adieresis.sc o.sc -40
+KPX adieresis.sc o.sc -40
+KPX adieresis.sc q.sc -40
KPX adieresis.sc q.sc -40
KPX adieresis.sc t.sc -35
+KPX adieresis.sc t.sc -35
+KPX adieresis.sc u.sc -40
KPX adieresis.sc u.sc -40
KPX adieresis.sc v.sc -85
+KPX adieresis.sc v.sc -85
+KPX adieresis.sc w.sc -75
KPX adieresis.sc w.sc -75
KPX adieresis.sc y.sc -55
+KPX adieresis.sc y.sc -55
KPX adieresis.sc ccedilla.sc -35
+KPX adieresis.sc ccedilla.sc -35
+KPX adieresis.sc odieresis.sc -40
KPX adieresis.sc odieresis.sc -40
KPX adieresis.sc oslash.sc -40
+KPX adieresis.sc oslash.sc -40
+KPX adieresis.sc ucircumflex.sc -40
KPX adieresis.sc ucircumflex.sc -40
KPX adieresis.sc udieresis.sc -40
+KPX adieresis.sc udieresis.sc -40
+KPX adieresis.sc ydieresis.sc -55
KPX adieresis.sc ydieresis.sc -55
-KPX adieresis.sc cacute.sc -35
-KPX adieresis.sc ccircumflex.sc -35
-KPX adieresis.sc cdotaccent.sc -35
-KPX adieresis.sc ccaron.sc -35
-KPX adieresis.sc gcircumflex.sc -35
-KPX adieresis.sc gbreve.sc -35
-KPX adieresis.sc gdotaccent.sc -35
-KPX adieresis.sc gcommaaccent.sc -35
-KPX adieresis.sc omacron.sc -40
-KPX adieresis.sc obreve.sc -40
-KPX adieresis.sc ohungarumlaut.sc -40
-KPX adieresis.sc tcaron.sc -35
-KPX adieresis.sc umacron.sc -40
-KPX adieresis.sc ubreve.sc -40
-KPX adieresis.sc uring.sc -40
-KPX adieresis.sc uhungarumlaut.sc -40
-KPX adieresis.sc uogonek.sc -40
-KPX adieresis.sc wcircumflex.sc -75
-KPX adieresis.sc ycircumflex.sc -55
-KPX adieresis.sc gcaron.sc -35
-KPX adieresis.sc oogonek.sc -40
-KPX adieresis.sc gacute.sc -35
-KPX adieresis.sc wgrave.sc -75
-KPX adieresis.sc wacute.sc -75
-KPX adieresis.sc wdieresis.sc -75
KPX aring.sc hyphen -25
+KPX aring.sc hyphen -25
+KPX aring.sc quoteright -115
KPX aring.sc quoteright -115
KPX aring.sc quotedblright -90
+KPX aring.sc quotedblright -90
+KPX aring.sc gacute.sc -35
KPX aring.sc gacute.sc -35
KPX aring.sc gcaron.sc -35
+KPX aring.sc gcaron.sc -35
KPX aring.sc oogonek.sc -40
+KPX aring.sc oogonek.sc -40
+KPX aring.sc cacute.sc -35
KPX aring.sc cacute.sc -35
KPX aring.sc ccaron.sc -35
+KPX aring.sc ccaron.sc -35
+KPX aring.sc ccircumflex.sc -35
KPX aring.sc ccircumflex.sc -35
KPX aring.sc cdotaccent.sc -35
+KPX aring.sc cdotaccent.sc -35
+KPX aring.sc gbreve.sc -35
KPX aring.sc gbreve.sc -35
KPX aring.sc gcircumflex.sc -35
+KPX aring.sc gcircumflex.sc -35
+KPX aring.sc gcommaaccent.sc -35
KPX aring.sc gcommaaccent.sc -35
KPX aring.sc gdotaccent.sc -35
+KPX aring.sc gdotaccent.sc -35
KPX aring.sc obreve.sc -40
+KPX aring.sc obreve.sc -40
+KPX aring.sc ohungarumlaut.sc -40
KPX aring.sc ohungarumlaut.sc -40
KPX aring.sc omacron.sc -40
+KPX aring.sc omacron.sc -40
+KPX aring.sc tcaron.sc -35
KPX aring.sc tcaron.sc -35
KPX aring.sc ubreve.sc -40
+KPX aring.sc ubreve.sc -40
+KPX aring.sc uhungarumlaut.sc -40
KPX aring.sc uhungarumlaut.sc -40
KPX aring.sc umacron.sc -40
+KPX aring.sc umacron.sc -40
+KPX aring.sc uogonek.sc -40
KPX aring.sc uogonek.sc -40
KPX aring.sc uring.sc -40
+KPX aring.sc uring.sc -40
KPX aring.sc wacute.sc -75
+KPX aring.sc wacute.sc -75
+KPX aring.sc wcircumflex.sc -75
KPX aring.sc wcircumflex.sc -75
KPX aring.sc wdieresis.sc -75
+KPX aring.sc wdieresis.sc -75
+KPX aring.sc wgrave.sc -75
KPX aring.sc wgrave.sc -75
KPX aring.sc ycircumflex.sc -55
+KPX aring.sc ycircumflex.sc -55
KPX aring.sc c.sc -35
-KPX aring.sc g.sc -35
-KPX aring.sc o.sc -40
-KPX aring.sc q.sc -40
-KPX aring.sc t.sc -35
-KPX aring.sc u.sc -40
-KPX aring.sc v.sc -85
-KPX aring.sc w.sc -75
-KPX aring.sc y.sc -55
-KPX aring.sc ccedilla.sc -35
-KPX aring.sc odieresis.sc -40
-KPX aring.sc oslash.sc -40
-KPX aring.sc ucircumflex.sc -40
-KPX aring.sc udieresis.sc -40
-KPX aring.sc ydieresis.sc -55
-KPX aring.sc hyphen -25
-KPX aring.sc quoteright -115
-KPX aring.sc quotedblright -90
KPX aring.sc c.sc -35
KPX aring.sc g.sc -35
+KPX aring.sc g.sc -35
+KPX aring.sc o.sc -40
KPX aring.sc o.sc -40
KPX aring.sc q.sc -40
+KPX aring.sc q.sc -40
+KPX aring.sc t.sc -35
KPX aring.sc t.sc -35
KPX aring.sc u.sc -40
+KPX aring.sc u.sc -40
KPX aring.sc v.sc -85
+KPX aring.sc v.sc -85
+KPX aring.sc w.sc -75
KPX aring.sc w.sc -75
KPX aring.sc y.sc -55
+KPX aring.sc y.sc -55
+KPX aring.sc ccedilla.sc -35
KPX aring.sc ccedilla.sc -35
KPX aring.sc odieresis.sc -40
+KPX aring.sc odieresis.sc -40
+KPX aring.sc oslash.sc -40
KPX aring.sc oslash.sc -40
KPX aring.sc ucircumflex.sc -40
+KPX aring.sc ucircumflex.sc -40
+KPX aring.sc udieresis.sc -40
KPX aring.sc udieresis.sc -40
KPX aring.sc ydieresis.sc -55
-KPX aring.sc cacute.sc -35
-KPX aring.sc ccircumflex.sc -35
-KPX aring.sc cdotaccent.sc -35
-KPX aring.sc ccaron.sc -35
-KPX aring.sc gcircumflex.sc -35
-KPX aring.sc gbreve.sc -35
-KPX aring.sc gdotaccent.sc -35
-KPX aring.sc gcommaaccent.sc -35
-KPX aring.sc omacron.sc -40
-KPX aring.sc obreve.sc -40
-KPX aring.sc ohungarumlaut.sc -40
-KPX aring.sc tcaron.sc -35
-KPX aring.sc umacron.sc -40
-KPX aring.sc ubreve.sc -40
-KPX aring.sc uring.sc -40
-KPX aring.sc uhungarumlaut.sc -40
-KPX aring.sc uogonek.sc -40
-KPX aring.sc wcircumflex.sc -75
-KPX aring.sc ycircumflex.sc -55
-KPX aring.sc gcaron.sc -35
-KPX aring.sc oogonek.sc -40
-KPX aring.sc gacute.sc -35
-KPX aring.sc wgrave.sc -75
-KPX aring.sc wacute.sc -75
-KPX aring.sc wdieresis.sc -75
+KPX aring.sc ydieresis.sc -55
KPX ccedilla.sc oogonek.sc -5
+KPX ccedilla.sc oogonek.sc -5
+KPX ccedilla.sc amacron.sc -15
KPX ccedilla.sc amacron.sc -15
KPX ccedilla.sc aogonek.sc -15
+KPX ccedilla.sc aogonek.sc -15
KPX ccedilla.sc aeacute.sc -10
+KPX ccedilla.sc aeacute.sc -10
+KPX ccedilla.sc obreve.sc -5
KPX ccedilla.sc obreve.sc -5
KPX ccedilla.sc ohungarumlaut.sc -5
+KPX ccedilla.sc ohungarumlaut.sc -5
+KPX ccedilla.sc omacron.sc -5
KPX ccedilla.sc omacron.sc -5
KPX ccedilla.sc a.sc -15
-KPX ccedilla.sc o.sc -5
-KPX ccedilla.sc adieresis.sc -15
-KPX ccedilla.sc aring.sc -15
-KPX ccedilla.sc ae.sc -10
-KPX ccedilla.sc odieresis.sc -5
-KPX ccedilla.sc oslash.sc -5
KPX ccedilla.sc a.sc -15
KPX ccedilla.sc o.sc -5
+KPX ccedilla.sc o.sc -5
KPX ccedilla.sc adieresis.sc -15
+KPX ccedilla.sc adieresis.sc -15
+KPX ccedilla.sc aring.sc -15
KPX ccedilla.sc aring.sc -15
KPX ccedilla.sc ae.sc -10
+KPX ccedilla.sc ae.sc -10
+KPX ccedilla.sc odieresis.sc -5
KPX ccedilla.sc odieresis.sc -5
KPX ccedilla.sc oslash.sc -5
-KPX ccedilla.sc amacron.sc -15
-KPX ccedilla.sc aogonek.sc -15
-KPX ccedilla.sc omacron.sc -5
-KPX ccedilla.sc obreve.sc -5
-KPX ccedilla.sc ohungarumlaut.sc -5
-KPX ccedilla.sc oogonek.sc -5
-KPX ccedilla.sc aeacute.sc -10
+KPX ccedilla.sc oslash.sc -5
+KPX ntilde.sc comma -15
KPX ntilde.sc comma -15
KPX ntilde.sc period -20
+KPX ntilde.sc period -20
+KPX ntilde.sc gacute.sc -15
KPX ntilde.sc gacute.sc -15
KPX ntilde.sc gcaron.sc -15
+KPX ntilde.sc gcaron.sc -15
KPX ntilde.sc oogonek.sc -15
+KPX ntilde.sc oogonek.sc -15
+KPX ntilde.sc amacron.sc -20
KPX ntilde.sc amacron.sc -20
KPX ntilde.sc aogonek.sc -20
+KPX ntilde.sc aogonek.sc -20
+KPX ntilde.sc aeacute.sc -15
KPX ntilde.sc aeacute.sc -15
KPX ntilde.sc cacute.sc -10
+KPX ntilde.sc cacute.sc -10
+KPX ntilde.sc ccaron.sc -10
KPX ntilde.sc ccaron.sc -10
KPX ntilde.sc ccircumflex.sc -10
+KPX ntilde.sc ccircumflex.sc -10
+KPX ntilde.sc cdotaccent.sc -10
KPX ntilde.sc cdotaccent.sc -10
KPX ntilde.sc gbreve.sc -15
+KPX ntilde.sc gbreve.sc -15
KPX ntilde.sc gcircumflex.sc -15
+KPX ntilde.sc gcircumflex.sc -15
+KPX ntilde.sc gcommaaccent.sc -15
KPX ntilde.sc gcommaaccent.sc -15
KPX ntilde.sc gdotaccent.sc -15
+KPX ntilde.sc gdotaccent.sc -15
+KPX ntilde.sc obreve.sc -15
KPX ntilde.sc obreve.sc -15
KPX ntilde.sc ohungarumlaut.sc -15
+KPX ntilde.sc ohungarumlaut.sc -15
+KPX ntilde.sc omacron.sc -15
KPX ntilde.sc omacron.sc -15
KPX ntilde.sc a.sc -20
-KPX ntilde.sc c.sc -10
-KPX ntilde.sc g.sc -15
-KPX ntilde.sc o.sc -15
-KPX ntilde.sc adieresis.sc -20
-KPX ntilde.sc aring.sc -20
-KPX ntilde.sc ae.sc -15
-KPX ntilde.sc ccedilla.sc -10
-KPX ntilde.sc odieresis.sc -15
-KPX ntilde.sc oslash.sc -15
-KPX ntilde.sc comma -15
-KPX ntilde.sc period -20
KPX ntilde.sc a.sc -20
KPX ntilde.sc c.sc -10
+KPX ntilde.sc c.sc -10
KPX ntilde.sc g.sc -15
+KPX ntilde.sc g.sc -15
+KPX ntilde.sc o.sc -15
KPX ntilde.sc o.sc -15
KPX ntilde.sc adieresis.sc -20
+KPX ntilde.sc adieresis.sc -20
+KPX ntilde.sc aring.sc -20
KPX ntilde.sc aring.sc -20
KPX ntilde.sc ae.sc -15
+KPX ntilde.sc ae.sc -15
+KPX ntilde.sc ccedilla.sc -10
KPX ntilde.sc ccedilla.sc -10
KPX ntilde.sc odieresis.sc -15
+KPX ntilde.sc odieresis.sc -15
+KPX ntilde.sc oslash.sc -15
KPX ntilde.sc oslash.sc -15
-KPX ntilde.sc amacron.sc -20
-KPX ntilde.sc aogonek.sc -20
-KPX ntilde.sc cacute.sc -10
-KPX ntilde.sc ccircumflex.sc -10
-KPX ntilde.sc cdotaccent.sc -10
-KPX ntilde.sc ccaron.sc -10
-KPX ntilde.sc gcircumflex.sc -15
-KPX ntilde.sc gbreve.sc -15
-KPX ntilde.sc gdotaccent.sc -15
-KPX ntilde.sc gcommaaccent.sc -15
-KPX ntilde.sc omacron.sc -15
-KPX ntilde.sc obreve.sc -15
-KPX ntilde.sc ohungarumlaut.sc -15
-KPX ntilde.sc gcaron.sc -15
-KPX ntilde.sc oogonek.sc -15
-KPX ntilde.sc gacute.sc -15
-KPX ntilde.sc aeacute.sc -15
KPX ograve.sc a.sc -40
KPX ograve.sc a.sc -40
KPX oacute.sc a.sc -40
KPX oacute.sc a.sc -40
KPX odieresis.sc amacron.sc -40
+KPX odieresis.sc amacron.sc -40
+KPX odieresis.sc aogonek.sc -40
KPX odieresis.sc aogonek.sc -40
KPX odieresis.sc aeacute.sc -35
+KPX odieresis.sc aeacute.sc -35
+KPX odieresis.sc wacute.sc -35
KPX odieresis.sc wacute.sc -35
KPX odieresis.sc wcircumflex.sc -35
+KPX odieresis.sc wcircumflex.sc -35
+KPX odieresis.sc wdieresis.sc -35
KPX odieresis.sc wdieresis.sc -35
KPX odieresis.sc wgrave.sc -35
+KPX odieresis.sc wgrave.sc -35
+KPX odieresis.sc ycircumflex.sc -45
KPX odieresis.sc ycircumflex.sc -45
KPX odieresis.sc a.sc -40
-KPX odieresis.sc v.sc -45
-KPX odieresis.sc w.sc -35
-KPX odieresis.sc x.sc -35
-KPX odieresis.sc y.sc -45
-KPX odieresis.sc adieresis.sc -40
-KPX odieresis.sc aring.sc -40
-KPX odieresis.sc ae.sc -35
-KPX odieresis.sc ydieresis.sc -45
KPX odieresis.sc a.sc -40
KPX odieresis.sc v.sc -45
+KPX odieresis.sc v.sc -45
KPX odieresis.sc w.sc -35
+KPX odieresis.sc w.sc -35
+KPX odieresis.sc x.sc -35
KPX odieresis.sc x.sc -35
KPX odieresis.sc y.sc -45
+KPX odieresis.sc y.sc -45
KPX odieresis.sc adieresis.sc -40
+KPX odieresis.sc adieresis.sc -40
+KPX odieresis.sc aring.sc -40
KPX odieresis.sc aring.sc -40
KPX odieresis.sc ae.sc -35
+KPX odieresis.sc ae.sc -35
KPX odieresis.sc ydieresis.sc -45
-KPX odieresis.sc amacron.sc -40
-KPX odieresis.sc aogonek.sc -40
-KPX odieresis.sc wcircumflex.sc -35
-KPX odieresis.sc ycircumflex.sc -45
-KPX odieresis.sc aeacute.sc -35
-KPX odieresis.sc wgrave.sc -35
-KPX odieresis.sc wacute.sc -35
-KPX odieresis.sc wdieresis.sc -35
+KPX odieresis.sc ydieresis.sc -45
+KPX oslash.sc amacron.sc -40
KPX oslash.sc amacron.sc -40
KPX oslash.sc aogonek.sc -40
+KPX oslash.sc aogonek.sc -40
+KPX oslash.sc aeacute.sc -35
KPX oslash.sc aeacute.sc -35
KPX oslash.sc wacute.sc -35
+KPX oslash.sc wacute.sc -35
+KPX oslash.sc wcircumflex.sc -35
KPX oslash.sc wcircumflex.sc -35
KPX oslash.sc wdieresis.sc -35
+KPX oslash.sc wdieresis.sc -35
KPX oslash.sc wgrave.sc -35
+KPX oslash.sc wgrave.sc -35
+KPX oslash.sc ycircumflex.sc -45
KPX oslash.sc ycircumflex.sc -45
KPX oslash.sc a.sc -40
-KPX oslash.sc v.sc -45
-KPX oslash.sc w.sc -35
-KPX oslash.sc x.sc -35
-KPX oslash.sc y.sc -45
-KPX oslash.sc adieresis.sc -40
-KPX oslash.sc aring.sc -40
-KPX oslash.sc ae.sc -35
-KPX oslash.sc ydieresis.sc -45
KPX oslash.sc a.sc -40
KPX oslash.sc v.sc -45
+KPX oslash.sc v.sc -45
+KPX oslash.sc w.sc -35
KPX oslash.sc w.sc -35
KPX oslash.sc x.sc -35
+KPX oslash.sc x.sc -35
+KPX oslash.sc y.sc -45
KPX oslash.sc y.sc -45
KPX oslash.sc adieresis.sc -40
+KPX oslash.sc adieresis.sc -40
+KPX oslash.sc aring.sc -40
KPX oslash.sc aring.sc -40
KPX oslash.sc ae.sc -35
+KPX oslash.sc ae.sc -35
+KPX oslash.sc ydieresis.sc -45
KPX oslash.sc ydieresis.sc -45
-KPX oslash.sc amacron.sc -40
-KPX oslash.sc aogonek.sc -40
-KPX oslash.sc wcircumflex.sc -35
-KPX oslash.sc ycircumflex.sc -45
-KPX oslash.sc aeacute.sc -35
-KPX oslash.sc wgrave.sc -35
-KPX oslash.sc wacute.sc -35
-KPX oslash.sc wdieresis.sc -35
KPX ugrave.sc a.sc -45
KPX ugrave.sc a.sc -45
KPX uacute.sc a.sc -45
KPX uacute.sc a.sc -45
KPX ucircumflex.sc comma -30
+KPX ucircumflex.sc comma -30
+KPX ucircumflex.sc period -35
KPX ucircumflex.sc period -35
KPX ucircumflex.sc amacron.sc -45
+KPX ucircumflex.sc amacron.sc -45
+KPX ucircumflex.sc aogonek.sc -45
KPX ucircumflex.sc aogonek.sc -45
KPX ucircumflex.sc aeacute.sc -40
+KPX ucircumflex.sc aeacute.sc -40
KPX ucircumflex.sc a.sc -45
-KPX ucircumflex.sc adieresis.sc -45
-KPX ucircumflex.sc aring.sc -45
-KPX ucircumflex.sc ae.sc -40
-KPX ucircumflex.sc comma -30
-KPX ucircumflex.sc period -35
KPX ucircumflex.sc a.sc -45
KPX ucircumflex.sc adieresis.sc -45
+KPX ucircumflex.sc adieresis.sc -45
+KPX ucircumflex.sc aring.sc -45
KPX ucircumflex.sc aring.sc -45
KPX ucircumflex.sc ae.sc -40
-KPX ucircumflex.sc amacron.sc -45
-KPX ucircumflex.sc aogonek.sc -45
-KPX ucircumflex.sc aeacute.sc -40
+KPX ucircumflex.sc ae.sc -40
+KPX udieresis.sc comma -30
KPX udieresis.sc comma -30
KPX udieresis.sc period -35
+KPX udieresis.sc period -35
+KPX udieresis.sc amacron.sc -45
KPX udieresis.sc amacron.sc -45
KPX udieresis.sc aogonek.sc -45
+KPX udieresis.sc aogonek.sc -45
+KPX udieresis.sc aeacute.sc -40
KPX udieresis.sc aeacute.sc -40
KPX udieresis.sc a.sc -45
-KPX udieresis.sc adieresis.sc -45
-KPX udieresis.sc aring.sc -45
-KPX udieresis.sc ae.sc -40
-KPX udieresis.sc comma -30
-KPX udieresis.sc period -35
KPX udieresis.sc a.sc -45
KPX udieresis.sc adieresis.sc -45
+KPX udieresis.sc adieresis.sc -45
+KPX udieresis.sc aring.sc -45
KPX udieresis.sc aring.sc -45
KPX udieresis.sc ae.sc -40
-KPX udieresis.sc amacron.sc -45
-KPX udieresis.sc aogonek.sc -45
-KPX udieresis.sc aeacute.sc -40
+KPX udieresis.sc ae.sc -40
KPX yacute.sc c.sc -45
-KPX yacute.sc t.sc 10
KPX yacute.sc c.sc -45
KPX yacute.sc t.sc 10
+KPX yacute.sc t.sc 10
+KPX ydieresis.sc comma -95
KPX ydieresis.sc comma -95
KPX ydieresis.sc hyphen -100
+KPX ydieresis.sc hyphen -100
+KPX ydieresis.sc period -105
KPX ydieresis.sc period -105
KPX ydieresis.sc colon -110
+KPX ydieresis.sc colon -110
KPX ydieresis.sc semicolon -110
+KPX ydieresis.sc semicolon -110
+KPX ydieresis.sc gacute.sc -45
KPX ydieresis.sc gacute.sc -45
KPX ydieresis.sc gcaron.sc -45
+KPX ydieresis.sc gcaron.sc -45
+KPX ydieresis.sc jacute.sc -20
KPX ydieresis.sc jacute.sc -20
KPX ydieresis.sc oogonek.sc -45
+KPX ydieresis.sc oogonek.sc -45
+KPX ydieresis.sc scaron.sc -30
KPX ydieresis.sc scaron.sc -30
KPX ydieresis.sc amacron.sc -50
+KPX ydieresis.sc amacron.sc -50
+KPX ydieresis.sc aogonek.sc -50
KPX ydieresis.sc aogonek.sc -50
KPX ydieresis.sc aeacute.sc -45
+KPX ydieresis.sc aeacute.sc -45
KPX ydieresis.sc cacute.sc -45
+KPX ydieresis.sc cacute.sc -45
+KPX ydieresis.sc ccaron.sc -45
KPX ydieresis.sc ccaron.sc -45
KPX ydieresis.sc ccircumflex.sc -45
+KPX ydieresis.sc ccircumflex.sc -45
+KPX ydieresis.sc cdotaccent.sc -45
KPX ydieresis.sc cdotaccent.sc -45
KPX ydieresis.sc gbreve.sc -45
+KPX ydieresis.sc gbreve.sc -45
+KPX ydieresis.sc gcircumflex.sc -45
KPX ydieresis.sc gcircumflex.sc -45
KPX ydieresis.sc gcommaaccent.sc -45
+KPX ydieresis.sc gcommaaccent.sc -45
+KPX ydieresis.sc gdotaccent.sc -45
KPX ydieresis.sc gdotaccent.sc -45
KPX ydieresis.sc jcircumflex.sc -20
+KPX ydieresis.sc jcircumflex.sc -20
KPX ydieresis.sc obreve.sc -45
+KPX ydieresis.sc obreve.sc -45
+KPX ydieresis.sc ohungarumlaut.sc -45
KPX ydieresis.sc ohungarumlaut.sc -45
KPX ydieresis.sc omacron.sc -45
+KPX ydieresis.sc omacron.sc -45
+KPX ydieresis.sc sacute.sc -30
KPX ydieresis.sc sacute.sc -30
KPX ydieresis.sc scedilla.sc -30
+KPX ydieresis.sc scedilla.sc -30
+KPX ydieresis.sc scircumflex.sc -30
KPX ydieresis.sc scircumflex.sc -30
KPX ydieresis.sc tcaron.sc 10
+KPX ydieresis.sc tcaron.sc 10
KPX ydieresis.sc a.sc -50
-KPX ydieresis.sc c.sc -45
-KPX ydieresis.sc g.sc -45
-KPX ydieresis.sc j.sc -20
-KPX ydieresis.sc o.sc -45
-KPX ydieresis.sc s.sc -30
-KPX ydieresis.sc t.sc 10
-KPX ydieresis.sc adieresis.sc -50
-KPX ydieresis.sc aring.sc -50
-KPX ydieresis.sc ae.sc -45
-KPX ydieresis.sc ccedilla.sc -45
-KPX ydieresis.sc odieresis.sc -45
-KPX ydieresis.sc oslash.sc -45
-KPX ydieresis.sc comma -95
-KPX ydieresis.sc hyphen -100
-KPX ydieresis.sc period -105
-KPX ydieresis.sc colon -110
-KPX ydieresis.sc semicolon -110
KPX ydieresis.sc a.sc -50
KPX ydieresis.sc c.sc -45
+KPX ydieresis.sc c.sc -45
+KPX ydieresis.sc g.sc -45
KPX ydieresis.sc g.sc -45
KPX ydieresis.sc j.sc -20
+KPX ydieresis.sc j.sc -20
KPX ydieresis.sc o.sc -45
+KPX ydieresis.sc o.sc -45
+KPX ydieresis.sc s.sc -30
KPX ydieresis.sc s.sc -30
KPX ydieresis.sc t.sc 10
+KPX ydieresis.sc t.sc 10
+KPX ydieresis.sc adieresis.sc -50
KPX ydieresis.sc adieresis.sc -50
KPX ydieresis.sc aring.sc -50
+KPX ydieresis.sc aring.sc -50
+KPX ydieresis.sc ae.sc -45
KPX ydieresis.sc ae.sc -45
KPX ydieresis.sc ccedilla.sc -45
+KPX ydieresis.sc ccedilla.sc -45
+KPX ydieresis.sc odieresis.sc -45
KPX ydieresis.sc odieresis.sc -45
KPX ydieresis.sc oslash.sc -45
-KPX ydieresis.sc amacron.sc -50
-KPX ydieresis.sc aogonek.sc -50
-KPX ydieresis.sc cacute.sc -45
-KPX ydieresis.sc ccircumflex.sc -45
-KPX ydieresis.sc cdotaccent.sc -45
-KPX ydieresis.sc ccaron.sc -45
-KPX ydieresis.sc gcircumflex.sc -45
-KPX ydieresis.sc gbreve.sc -45
-KPX ydieresis.sc gdotaccent.sc -45
-KPX ydieresis.sc gcommaaccent.sc -45
-KPX ydieresis.sc jcircumflex.sc -20
-KPX ydieresis.sc omacron.sc -45
-KPX ydieresis.sc obreve.sc -45
-KPX ydieresis.sc ohungarumlaut.sc -45
-KPX ydieresis.sc sacute.sc -30
-KPX ydieresis.sc scircumflex.sc -30
-KPX ydieresis.sc scedilla.sc -30
-KPX ydieresis.sc scaron.sc -30
-KPX ydieresis.sc tcaron.sc 10
-KPX ydieresis.sc gcaron.sc -45
-KPX ydieresis.sc oogonek.sc -45
-KPX ydieresis.sc gacute.sc -45
-KPX ydieresis.sc aeacute.sc -45
-KPX ydieresis.sc jacute.sc -20
+KPX ydieresis.sc oslash.sc -45
KPX ff parenright 55
KPX ff bracketright 55
KPX a.pc hyphen -25
@@ -22663,6 +23037,15 @@ KPX jacute.pc ae.pc -30
KPX jacute.pc amacron.pc -35
KPX jacute.pc aogonek.pc -35
KPX jacute.pc aeacute.pc -30
+KPX zero.numr fraction 20
+KPX one.numr fraction 34
+KPX two.numr fraction 40
+KPX three.numr fraction 20
+KPX four.numr fraction 5
+KPX six.numr fraction 13
+KPX seven.numr fraction -59
+KPX eight.numr fraction 15
+KPX nine.numr fraction -36
EndKernPairs
EndKernData
EndFontMetrics
diff --git a/fonts/newtx/afm/ztmrsl.afm b/fonts/newtx/afm/ztmrsl.afm
index a4dfc6fa59..5f22df29a5 100644
--- a/fonts/newtx/afm/ztmrsl.afm
+++ b/fonts/newtx/afm/ztmrsl.afm
@@ -1,6 +1,6 @@
StartFontMetrics 2.0
Comment Generated by FontForge 20230101
-Comment Creation Date: Tue Sep 19 17:51:12 2023
+Comment Creation Date: Tue Nov 14 16:01:05 2023
FontName TeXGyreTermesX-Slanted
FullName TeXGyreTermesX Slanted
FamilyName TeXGyreTermesX
@@ -21,7 +21,7 @@ CapHeight 662
XHeight 450
Ascender 662
Descender -217
-StartCharMetrics 1688
+StartCharMetrics 1720
C 0 ; WX 250 ; N space ; B 0 0 0 0 ;
C 1 ; WX 333 ; N exclam ; B 139 -9 402 676 ;
C 2 ; WX 408 ; N quotedbl ; B 224 431 503 676 ;
@@ -1710,6 +1710,38 @@ C -1 ; WX 425 ; N six.inferior ; B 28 -236 434 267 ;
C -1 ; WX 398 ; N seven.inferior ; B 81 -235 421 252 ;
C -1 ; WX 392 ; N eight.inferior ; B 9 -236 375 258 ;
C -1 ; WX 423 ; N nine.inferior ; B 4 -244 403 258 ;
+C -1 ; WX 500 ; N zero.up ; B 24 -14 476 676 ;
+C -1 ; WX 500 ; N one.up ; B 111 0 394 676 ;
+C -1 ; WX 500 ; N two.up ; B 30 0 475 676 ;
+C -1 ; WX 500 ; N three.up ; B 43 -14 432 676 ;
+C -1 ; WX 500 ; N four.up ; B 12 0 472 676 ;
+C -1 ; WX 500 ; N five.up ; B 32 -14 438 688 ;
+C -1 ; WX 500 ; N six.up ; B 34 -14 468 684 ;
+C -1 ; WX 500 ; N seven.up ; B 20 -8 449 662 ;
+C -1 ; WX 500 ; N eight.up ; B 56 -14 445 676 ;
+C -1 ; WX 500 ; N nine.up ; B 30 -22 459 676 ;
+C -1 ; WX 373 ; N exclam.up ; B 160 -9 267 676 ;
+C -1 ; WX 399 ; N parenleft.up ; B 114 -177 370 676 ;
+C -1 ; WX 438 ; N parenright.up ; B 199 -177 455 676 ;
+C -1 ; WX 489 ; N question.up ; B 98 -8 444 676 ;
+C -1 ; WX 398 ; N bracketleft.up ; B 204 -156 415 662 ;
+C -1 ; WX 423 ; N bracketright.up ; B 184 -156 395 662 ;
+C -1 ; WX 402 ; N braceleft.up ; B 70 -181 330 680 ;
+C -1 ; WX 400 ; N braceright.up ; B 70 -181 332 680 ;
+C -1 ; WX 333 ; N exclamdown.up ; B 96 -226 203 459 ;
+C -1 ; WX 444 ; N questiondown.up ; B 30 -226 376 458 ;
+C -1 ; WX 278 ; N colon.up ; B 97 -11 208 459 ;
+C -1 ; WX 298 ; N semicolon.up ; B 100 -141 239 459 ;
+C -1 ; WX 532 ; N zero.osfup ; B 40 -20 492 470 ;
+C -1 ; WX 363 ; N one.osfup ; B 40 0 323 471 ;
+C -1 ; WX 525 ; N two.osfup ; B 40 0 485 470 ;
+C -1 ; WX 469 ; N three.osfup ; B 40 -220 429 470 ;
+C -1 ; WX 540 ; N four.osfup ; B 40 -167 500 509 ;
+C -1 ; WX 486 ; N five.osfup ; B 40 -232 446 470 ;
+C -1 ; WX 514 ; N six.osfup ; B 40 -14 474 684 ;
+C -1 ; WX 509 ; N seven.osfup ; B 40 -214 469 456 ;
+C -1 ; WX 469 ; N eight.osfup ; B 40 -14 429 676 ;
+C -1 ; WX 509 ; N nine.osfup ; B 40 -228 469 470 ;
EndCharMetrics
StartKernData
StartKernPairs 21301
diff --git a/fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf b/fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
index 2499583686..8f143a32e8 100644
--- a/fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
+++ b/fonts/newtx/opentype/TeXGyreTermesX-Slanted.otf
Binary files differ
diff --git a/fonts/newtx/tex/newtxtext.sty b/fonts/newtx/tex/newtxtext.sty
index 16a475b3f5..1b694330c0 100644
--- a/fonts/newtx/tex/newtxtext.sty
+++ b/fonts/newtx/tex/newtxtext.sty
@@ -11,8 +11,8 @@
%\def\ntx@state{0} % 0 for both, 1 for tutex only, 2 for legacy only
\def\setstate#1{\if 1\ntx@showstate\typeout{State=#1}\fi}
-\def\fileversion{1.733}
-\def\filedate{2023/11/08}
+\def\fileversion{1.734}
+\def\filedate{2023/11/14}
\ProvidesPackage{newtxtext}[%
\filedate\space v\fileversion (Michael Sharpe) latex and unicode latex support for TeXGyreTermesX]
diff --git a/fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm b/fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
index 3c524090f2..037d690bf3 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-osf-ly1.tfm
Binary files differ
diff --git a/fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm b/fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
index f497734bde..c994e93d82 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-osf-ot1.tfm
Binary files differ
diff --git a/fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm b/fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
index db565837db..c8e3b1dc0f 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-osf-t1.tfm
Binary files differ
diff --git a/fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm b/fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
index 16f71d866b..5217ee0a2e 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-tlf-ly1.tfm
Binary files differ
diff --git a/fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm b/fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
index ec885b1b3f..a9b69c3cfa 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-tlf-ot1.tfm
Binary files differ
diff --git a/fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm b/fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
index 1c108988e1..ae5ebd656d 100644
--- a/fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
+++ b/fonts/newtx/tfm/ntxth-Slanted-tlf-t1.tfm
Binary files differ
diff --git a/fonts/newtx/type1/ztmrsl.pfb b/fonts/newtx/type1/ztmrsl.pfb
index 6af860a708..b5eb745a00 100644
--- a/fonts/newtx/type1/ztmrsl.pfb
+++ b/fonts/newtx/type1/ztmrsl.pfb
Binary files differ
diff --git a/macros/generic/tex-ini-files/README.md b/macros/generic/tex-ini-files/README.md
index 3a7b94b0bd..89bb9db879 100644
--- a/macros/generic/tex-ini-files/README.md
+++ b/macros/generic/tex-ini-files/README.md
@@ -46,9 +46,10 @@ Major changes:
- 2016-02-27 First version of bundle
- 2016-04-14 Do not assume e-TeX availability in `pdftexconfig.tex`
- 2016-04-15 New approach to loading shared pdfTeX/LuaTeX data
+- 2023-11-15 Align setting of interaction mode across LaTeX .ini files
A full history of this bundle is available from
-https://github.com/josephwright/tex-ini-files
+https://github.com/latex3/tex-ini-files
## Legal
diff --git a/macros/generic/tex-ini-files/latex.ini b/macros/generic/tex-ini-files/latex.ini
new file mode 100644
index 0000000000..876958555e
--- /dev/null
+++ b/macros/generic/tex-ini-files/latex.ini
@@ -0,0 +1,24 @@
+% tex-ini-files 2016-05-10: latex.ini
+
+% Thomas Esser, 1998. public domain.
+%
+\ifx\pdfoutput\undefined \else
+ \ifx\pdfoutput\relax \else
+ %
+ % We're building the latex format with the pdfetex engine (started 2004).
+ \input pdftexconfig
+ \pdfoutput=0
+ %
+ % pdfTeX related primitives are no longer hidden by default
+ % (started 2005). Uncomment and recreate the format files by running
+ % "fmtutil --all" resp. "fmtutil-sys --all" to revert to the old
+ % (2004) behaviour.
+ % \input pdftex-dvi.tex
+ %
+ \fi
+\fi
+%
+% the usual format initialization.
+\scrollmode
+\input latex.ltx
+\endinput
diff --git a/macros/generic/tex-ini-files/mllatex.ini b/macros/generic/tex-ini-files/mllatex.ini
new file mode 100644
index 0000000000..d0886079b8
--- /dev/null
+++ b/macros/generic/tex-ini-files/mllatex.ini
@@ -0,0 +1,5 @@
+% tex-ini-files 2016-05-10: mllatex.ini
+
+% Thomas Esser, 1998. public domain.
+\scrollmode
+\input latex.ltx
diff --git a/macros/generic/tex-ini-files/pdflatex.ini b/macros/generic/tex-ini-files/pdflatex.ini
new file mode 100644
index 0000000000..8105e23a9e
--- /dev/null
+++ b/macros/generic/tex-ini-files/pdflatex.ini
@@ -0,0 +1,6 @@
+% tex-ini-files 2023-11-15: pdflatex.ini
+
+% Thomas Esser, 1998. public domain.
+\input pdftexconfig.tex
+\input latex.ltx
+\endinput
diff --git a/macros/generic/tex-ini-files/pdfxmltex.ini b/macros/generic/tex-ini-files/pdfxmltex.ini
new file mode 100644
index 0000000000..c36bb5137a
--- /dev/null
+++ b/macros/generic/tex-ini-files/pdfxmltex.ini
@@ -0,0 +1,10 @@
+% tex-ini-files 2016-05-10: pdfxmltex.ini
+
+% public domain.
+\let\primitivedump=\dump
+\let\dump=\relax
+\input pdflatex.ini
+\let\dump=\primitivedump
+
+% then read jadetex. pdf output must be set first, since it needs hyperref.
+\input xmltex.tex
diff --git a/macros/generic/tex-ini-files/xmltex.ini b/macros/generic/tex-ini-files/xmltex.ini
new file mode 100644
index 0000000000..bd18c4900e
--- /dev/null
+++ b/macros/generic/tex-ini-files/xmltex.ini
@@ -0,0 +1,9 @@
+% tex-ini-files 2016-05-10: xmltex.ini
+
+% public domain.
+\let\primitivedump=\dump
+\let\dump=\relax
+\input latex.ini
+\let\dump=\primitivedump
+
+\input xmltex.tex
diff --git a/macros/latex/contrib/expex-glossonly/README.md b/macros/latex/contrib/expex-glossonly/README.md
index 627f813b6e..6e4794381d 100644
--- a/macros/latex/contrib/expex-glossonly/README.md
+++ b/macros/latex/contrib/expex-glossonly/README.md
@@ -1,6 +1,6 @@
# The `expex-glossonly` package
-## Version 0.7 2023/08/17
+## Version 0.8 2023/11/15
`expex-glossonly` is a package which allows users of other popular example numbering package (`gb4e`, `linguex`, and `covington`) to use the glossing macros
of the ExPex package, while still using the standard example and subexample numbering macros of those respective packages.
diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf b/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
index 22873f4f56..4f104484d3 100644
--- a/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
+++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.pdf
Binary files differ
diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.sty b/macros/latex/contrib/expex-glossonly/expex-glossonly.sty
index d881bfdf24..8c0d721ac1 100644
--- a/macros/latex/contrib/expex-glossonly/expex-glossonly.sty
+++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.sty
@@ -1,8 +1,8 @@
-\def\EPGL@version{0.7}
-\def\EPGL@date{2023/08/17}
-% expex-glossonly is a package which allows gb4e and linguex users to use the glossing macros
-% of the ExPex package, while still using the standard example and subexample numbering macros of
-% those respective packages.
+\def\EPGL@version{0.8}
+\def\EPGL@date{2023/11/15}
+% expex-glossonly is a package which allows gb4e and linguex and covington users to use
+% the glossing macros of the ExPex package, while still using the standard example and
+% subexample numbering macros of those respective packages.
%
% Copyright 2016-2023 by Alan Munn
%
@@ -19,7 +19,8 @@
% The Current Maintainer of this package is Alan Munn.
%
% This package consists of the file expex-glossonly.sty and documentation files
-% expex-glossonly.tex and expex-glossonly.pdf plus two test files: gb4e-expex.tex and linguex-expex.tex
+% expex-glossonly.tex and expex-glossonly.pdf plus three test files:
+% gb4e-expex.tex, linguex-expex.tex, and covington-expex.tex
%
% This package is currently experimental. Use at your own risk.
%
@@ -30,7 +31,7 @@
\@ifpackageloaded{linguex}{\PackageError{expex-glossonly}{Please load linguex using the package option!}{Please load linguex using the package option!}}{}
\@ifpackageloaded{gb4e}{\PackageError{expex-glossonly}{Please load gb4e using the package option!}{Please load gb4e using the package option!}}{}
\@ifpackageloaded{covington}{\PackageError{expex-glossonly}{Please load covington using the package option!}{Please load covington using the package option!}}{}
-% for now this is a separate macro in case it needs to be changed per package.
+% This is a separate macro because it needs to be changed per package.
\newcommand\EPGL@setglossmargin{\setlength{\leftskip}{\@totalleftmargin}}
\def\EPGL@patchexpexgloss{%
\let\xe\relax
@@ -88,6 +89,7 @@ linguex.code = {
\RequirePackage{linguex}
\EPGL@examplesloadedtrue
\EPGL@patchexpexgloss
+ \def\printGramm{\makebox[0pt][r]{\normalfont\the\CollectTokens}\renewcommand\EPGL@setglossmargin{\setlength{\leftskip}{0pt}}\ignorespaces}
\lingset{belowglpreambleskip=-0.5ex, aboveglftskip=-0.5ex,everygla=\eachwordone}
\PackageInfo{expex-glossonly}{Patching ExPex for use with linguex}
\typeout{Patching ExPex for use with linguex}
diff --git a/macros/latex/contrib/expex-glossonly/expex-glossonly.tex b/macros/latex/contrib/expex-glossonly/expex-glossonly.tex
index cc64244625..02617bba4f 100644
--- a/macros/latex/contrib/expex-glossonly/expex-glossonly.tex
+++ b/macros/latex/contrib/expex-glossonly/expex-glossonly.tex
@@ -1,11 +1,13 @@
% !TEX TS-program = lualatexmk
-\def\EPGLversion{0.7}
-\def\EPGLdate{August 17, 2023}
+\def\EPGLversion{0.8}
+\def\EPGLdate{November 15, 2023}
\documentclass[11pt]{article}
\title{\textbf{The \textsf{expex-glossonly} package}}
-\author{\textbf{Alan Munn}\\Department of Linguistics and Languages\\Michigan State University\\\texttt{\href{mailto:amunn@msu.edu}{amunn@msu.edu}}}
+\author{\textbf{Alan Munn}\\Department of Linguistics, Languages, and Cultures\\Michigan State University\\\texttt{\href{mailto:amunn@msu.edu}{amunn@msu.edu}}}
\date{Version \EPGLversion\\\EPGLdate}
\usepackage[margin=1in,includefoot]{geometry}
+\usepackage{fontspec}
+\setmonofont[Scale=MatchLowercase]{DejaVu Sans Mono}
\usepackage{titling}
\usepackage{array, booktabs, multicol, fancyhdr, xspace,tabularx}
\usepackage{enumitem}
@@ -17,21 +19,11 @@
\DefineShortVerb{\|}
\newcommand*\bs{\textbackslash}
-\IfFileExists{luximono.sty}%
-{%
- \usepackage[scaled]{luximono}%
-}
-{%
- \IfFileExists{beramono.sty}%
- {%
- \usepackage[scaled]{beramono}%
- }{}
-}
-
\lstset{%
basicstyle=\ttfamily\small,
commentstyle=\itshape\ttfamily\small,
+ keywordstyle={},
showspaces=false,
showstringspaces=false,
breaklines=true,
@@ -73,7 +65,7 @@ On the other hand, for those users who have heavily invested in using \pkg{gb4e}
This package is an attempt to have the best of both worlds: it allows \pkg{gb4e}, \pkg{linguex}, or \pkg{covington} users to keep using those packages for basic example numbering and formatting, but also allows them to use the glossing macros that ExPex provides.
\section{Package usage}
-Usage of the package is simple: simply load it instead of your usual example numbering package, and specify as a package option which numbering package you're using. So for example. Four example numbering packages are currently supported: \pkg{gb4e}, \pkg{linguex}, \pkg{covington}, and \pkg{gb4e-emulate}. The latter is an experimental reimplementation of \pkg{gb4e} using \pkg{enumitem} and is not currently released to CTAN, but available on GitHub. Package options for loading \pkg{covington} can be given by adding them to the |covington| package option. Since they are an argument of the |covington| key, the set of options must be enclosed in |{...}|.
+Usage of the package is simple: simply load it instead of your usual example numbering package, and specify as a package option which numbering package you're using. So for example. Four example numbering packages are currently supported: \pkg{gb4e}, \pkg{linguex}, \pkg{covington}, and \pkg{gb4e-emulate}. The latter is an experimental reimplementation of \pkg{gb4e} using \pkg{enumitem} and is not currently released to CTAN, but available on \href{https://github.com/amunn/gb4e-emulate}{GitHub}. Package options for loading \pkg{covington} can be given by adding them to the |covington| package option. Since they are an argument of the |covington| key, the set of options must be enclosed in |{...}|.
\begin{table}
\centering
@@ -152,7 +144,7 @@ Here are some sample documents using the supported packages:
\endgl
\bg. János háza\\
John house.his\\
- \glt `John's house'
+ `John's house'
\end{document}
\end{lstlisting}
@@ -189,7 +181,7 @@ Here are some sample documents using the supported packages:
\section{Bugs and support}
This is \emph{experimental} and has not been extensively tested. Use at your own risk. You're welcome to raise issues at the \href{https://github.com/amunn/expex-glossonly}{GitHub repository}, however.
\section{Version history}
-The initial version of the package (0.6) supported only \pkg{linguex} and \pkg{gb4e}. Version 0.7 changed the loading interface to provide support for \pkg{covington} and added support for \pkg{gb4e-emulate}.
+The initial version of the package (0.6) supported only \pkg{linguex} and \pkg{gb4e}. Version 0.7 changed the loading interface to provide support for \pkg{covington} and added support for \pkg{gb4e-emulate}. Version 0.8 fixed fixed a spacing bug with grammaticality judgements in \pkg{linguex}.
\section{Acknowledgements}
As always, thanks to the members of the LaTeX development team and other users who are always happy to answer questions in the \href{https://tex.stackexchange.com}{TeX.se} chat room. Thanks especially to Ulrike Fischer who told me of the magical |\@totalleftmargin| length. Thanks also to Jürgen Spitzmüller for discussion of the \pkg{covington} support.
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf b/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
index f86b9e3b68..9efbb4f7bc 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
+++ b/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.pdf
Binary files differ
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex b/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
index f3375ad736..2d80992827 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
+++ b/macros/latex/contrib/expex-glossonly/testfiles/covington-expex.tex
@@ -1,8 +1,9 @@
+% !TEX TS-program = LuaLaTeX
\documentclass{article}
\usepackage[covington]{expex-glossonly}
\begin{document}
-
+% Examples here show a mixture of ExPex and covington glosses in the same example set.
\begin{examples}
\item An example
\item Another example
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
index 104dae2f80..dd79c4383d 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
+++ b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.pdf
Binary files differ
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
index b6709fead5..4d5c1a6d61 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
+++ b/macros/latex/contrib/expex-glossonly/testfiles/gb4e-expex.tex
@@ -1,8 +1,10 @@
+% !TEX TS-program = LuaLaTeX
+
\documentclass[12pt,letterpaper]{article}
\usepackage[gb4e]{expex-glossonly}
\usepackage{cgloss}
\begin{document}
-
+% Examples here show a mixture of ExPex and gb4e glosses in the same example set.
\begin{exe}
\ex
\begin{xlist}
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
index f7d8140075..0f00058124 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
+++ b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.pdf
Binary files differ
diff --git a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
index 0a63e88d75..e5a607df9e 100644
--- a/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
+++ b/macros/latex/contrib/expex-glossonly/testfiles/linguex-expex.tex
@@ -1,18 +1,40 @@
-\documentclass[12pt,letterpaper]{article}
+% !TEX TS-program = LuaLaTeX
+\documentclass[12pt,letterpaper]{article}
\usepackage[linguex]{expex-glossonly}
\begin{document}
+% Examples here show with and without grammaticality judgements.
+% Also a mixture of ExPex and linguex glossing in the same example set.
\ex.
-\a.
+\a. *
+ \begingl
+ \gla J\'anos h\'aza//
+ \glb John house.his//
+ \glft `John's house'//
+ \endgl
+\bg. János háza\\
+ John house.his\\
+ `John's house'
+
+\ex. ?*
\begingl
\gla\rightcomment{(Hungarian)}J\'anos h\'aza//
\glb John house.his//
\glft `John's house'//
\endgl
+
+\ex.
+\a.
+ \begingl
+ \gla J\'anos h\'aza//
+ \glb John house.his//
+ \glft `John's house'//
+ \endgl
\bg. János háza\\
John house.his\\
- \glt `John's house'
+ `John's house'
+
\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/ipsum/doc/ipsum-doc.pdf b/macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
index ed8b6003cc..d21801f7df 100644
--- a/macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
+++ b/macros/latex/contrib/ipsum/doc/ipsum-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/ipsum/doc/ipsum-doc.tex b/macros/latex/contrib/ipsum/doc/ipsum-doc.tex
index 3b5133b056..bbd4094c17 100644
--- a/macros/latex/contrib/ipsum/doc/ipsum-doc.tex
+++ b/macros/latex/contrib/ipsum/doc/ipsum-doc.tex
@@ -23,8 +23,8 @@
\hypersetup{pdfborder=0 0 0}
\usepackage[margin=2cm]{geometry}
\setlength{\parindent}{0pt}
-\def\TPversion{0.1.1}
-\def\TPdate{09/11/2023}
+\def\TPversion{0.1.2}
+\def\TPdate{15/11/2023}
\usepackage{tcolorbox}
\tcbuselibrary{skins,hooks}
\usepackage{soul}
@@ -39,11 +39,11 @@
\hrule\par\smallskip
\ipsum<Type=sent,Lang=#2>[5-6]\par\smallskip
\hrule\par\smallskip
- \ipsum<lang=#2>[2]\par\smallskip
+ \ipsum<Lang=#2>[2]\par\smallskip
\hrule\par\smallskip
- \ipsum<lang=#2>[1-3]\par\smallskip
+ \ipsum<Lang=#2>[1-3]\par\smallskip
\hrule\par\smallskip
- \ipsum<lang=#2>[6-7]\par\smallskip
+ \ipsum<Lang=#2>[6-7]\par\smallskip
\hrule\par\smallskip
\ipsum<Type=enum,Lang=#2>[2-4]\par\smallskip
\hrule\par\smallskip
@@ -150,7 +150,7 @@ To load the package, simply use :
\begin{quote}
\begin{verbatim}
-0.1.0 : Fix typo in doc
+0.1.2 : Fix typo in doc
0.1.0 : Initial version
\end{verbatim}
\end{quote}
diff --git a/macros/latex/contrib/ipsum/tex/ipsum.sty b/macros/latex/contrib/ipsum/tex/ipsum.sty
index 1264fb4f85..71cc4a9994 100644
--- a/macros/latex/contrib/ipsum/tex/ipsum.sty
+++ b/macros/latex/contrib/ipsum/tex/ipsum.sty
@@ -3,9 +3,10 @@
% Source : https://ipsum.one/
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ipsum}[2023/11/09 0.1.1 Multilanguage simply dummy texts]
+\ProvidesPackage{ipsum}[2023/11/15 0.1.2 Multilanguage simply dummy texts]
%====HISTORIQUE
+% v 0.1.2 Fix typo in doc
% v 0.1.1 Fix typo in doc
% v 0.1.0 Initial version
@@ -133,7 +134,7 @@ Quali fioretti dal notturno gelo chinati e chiusi, poi che l sol li mbianca, si
Questi parea che contra me venisse con la test alta e con rabbiosa fame, sì che parea che l aere ne tremesse.Ed una lupa, che di tutte brame sembiava carca ne la sua magrezza, e molte genti fé già viver grame, questa mi porse tanto di gravezza con la paura ch uscia di sua vista, ch io perdei la speranza de l altezza.\par
}
\xdef\ipsum@par@IT@G{%
-GIntesi ch a così fatto tormento enno dannati i peccator carnali, che la ragion sommettono al talento.E come li stornei ne portan l ali nel freddo tempo, a schiera larga e piena, così quel fiato li spiriti mali di qua, di là, di giù, di sù li mena nulla speranza li conforta mai, non che di posa, ma di minor pena.\par
+Gintesi ch a così fatto tormento enno dannati i peccator carnali, che la ragion sommettono al talento.E come li stornei ne portan l ali nel freddo tempo, a schiera larga e piena, così quel fiato li spiriti mali di qua, di là, di giù, di sù li mena nulla speranza li conforta mai, non che di posa, ma di minor pena.\par
}
%==[SP]
\xdef\ipsum@par@ES@A{%
diff --git a/macros/latex/contrib/ukbill/immigration-bill.pdf b/macros/latex/contrib/ukbill/immigration-bill.pdf
index 0e5bc67347..7e2ebf234a 100644
--- a/macros/latex/contrib/ukbill/immigration-bill.pdf
+++ b/macros/latex/contrib/ukbill/immigration-bill.pdf
Binary files differ
diff --git a/macros/latex/contrib/ukbill/ukbill-documentation.pdf b/macros/latex/contrib/ukbill/ukbill-documentation.pdf
index 58a59e11af..0ea80331cf 100644
--- a/macros/latex/contrib/ukbill/ukbill-documentation.pdf
+++ b/macros/latex/contrib/ukbill/ukbill-documentation.pdf
Binary files differ
diff --git a/macros/latex/contrib/ukbill/ukbill-documentation.tex b/macros/latex/contrib/ukbill/ukbill-documentation.tex
index 69b80a38d3..a4577f8c76 100644
--- a/macros/latex/contrib/ukbill/ukbill-documentation.tex
+++ b/macros/latex/contrib/ukbill/ukbill-documentation.tex
@@ -143,7 +143,9 @@ Private bills have a different enacting formula and also make use of recitals. D
\section{Licence}
This project is licensed under the Latex Public Project Licence version 1.3\textit{c}. This documentation is copyright of the author but licensed under CC-BY-SA 4.0.
\section{Version History}
- \subsection{\normalfont\texttt{1.0.2}}
+ \subsection{\normalfont\texttt{1.0.2}}
+\ttfamily 13 December 2022: fixed an error with changes made in 1.0.2
+\subsection{\normalfont\texttt{1.0.2}}
\ttfamily 13 December 2022: fixed an error with indent in the `nostat' environment
\subsection{\normalfont\texttt{1.0.1}}
\ttfamily 12 December 2022: Fixes to example documentation
@@ -166,7 +168,7 @@ firstnumber=last
]
{latex}
\NeedsTeXFormat{LaTeX2e}
-\def\ukbillversionnumber{1.0.2}
+\def\ukbillversionnumber{1.0.3}
\ProvidesClass{ukbill}[2022-12-01 A Class for Legal Notes]
% !TeX program = lualatex
% !TeX encoding = utf8
@@ -416,16 +418,14 @@ firstnumber=last
\begin{center}
\printpartname\hspace{1ex}\arabic{part}\\
\printparttitle{#1}\normalfont\normalsize\\\end{center}
-\addcontentsline{toc}{part}{\normalsize\bfseries\printpartname\hspace{1ex}%
-\arabic{part}\normalfont\\
+\addcontentsline{toc}{part}{\normalsize\bfseries\printpartname\hspace{1ex}\arabic{part}\normalfont\\
\centerline{\normalsize\normalfont\scshape\printparttitle{#1}}}
}
\renewcommand\contentsname{CONTENTS}%
\renewcommand{\chapter}[1]{\stepcounter{chapter}\markright{#1}
\begin{center}
-\itshape\printchaptertitle{#1}\normalfont\normalsize\\%
-\end{center}
+\itshape\printchaptertitle{#1}\normalfont\normalsize\\\end{center}
\addcontentsline{toc}{chapter}{\normalsize\itshape
\centerline{\normalsize\normalfont\itshape\printchaptertitle{#1}}}
}
@@ -522,8 +522,7 @@ BoldFont={PalatineP-Bold},
}%
\item[]}%
{\end{list}}
-\newenvironment{nostat}{\begin{enumerate}[nosep,leftmargin=1.25cm,%
-labelindent=5pt,itemindent=0,label=]}{\end{enumerate}}
+\newenvironment{nostat}{\begin{enumerate}[nosep,leftmargin=1.7cm,labelindent=0pt,itemindent=0pt,label=]}{\end{enumerate}}
\newenvironment{numstat}%
{%
%\vspace{-9ex}%
@@ -566,8 +565,7 @@ leftmargin=0em,rightmargin=0em,label=]%
\newenvironment{alphstat}%
{%
\vspace{-3ex}%
-\begin{enumerate}[leftmargin=7.5ex,topsep=0ex,partopsep=1ex,parsep=0.5ex,%
-itemsep=0ex,labelsep=3ex,label=({\alph*})]%
+\begin{enumerate}[leftmargin=7.5ex,topsep=0ex,partopsep=1ex,parsep=0.5ex,itemsep=0ex,labelsep=3ex,label=({\alph*})]%
\item[]}%
{\end{enumerate}%
@@ -575,8 +573,7 @@ itemsep=0ex,labelsep=3ex,label=({\alph*})]%
\newenvironment{romstat}%
{%
\vspace{-3ex}%
-\begin{enumerate}[topsep=0ex,partopsep=1ex,parsep=0.5ex,itemsep=0ex,%
-label=(\roman*)]%
+\begin{enumerate}[topsep=0ex,partopsep=1ex,parsep=0.5ex,itemsep=0ex,label=(\roman*)]%
\item[]}%
{\end{enumerate}%
@@ -584,8 +581,7 @@ label=(\roman*)]%
\newenvironment{twoalphstat}%
{%
\vspace{-3ex}%
-\begin{enumerate}[leftmargin=7.5ex,topsep=0ex,partopsep=1ex,parsep=0.5ex,%
-itemsep=0ex,labelsep=3ex,label=({\alph*}{\alph*})]%
+\begin{enumerate}[leftmargin=7.5ex,topsep=0ex,partopsep=1ex,parsep=0.5ex,itemsep=0ex,labelsep=3ex,label=({\alph*}{\alph*})]%
\item[]}%
{\end{enumerate}%
@@ -626,13 +622,11 @@ itemsep=0ex,labelsep=3ex,label=({\alph*}{\alph*})]%
\newcommand{\currentsubsection}{}
\let\oldsubsection\subsection
-\renewcommand{\subsection}[1]{\oldsubsection{#1}\renewcommand{%
-\currentsubsection}{#1}}
+\renewcommand{\subsection}[1]{\oldsubsection{#1}\renewcommand{\currentsubsection}{#1}}
\newcommand{\currentsubsubsection}{}
\let\oldsubsubsection\subsubsection
-\renewcommand{\subsubsection}[1]{\oldsubsubsection{#1}\renewcommand{%
-\currentsubsubsection}{#1}}
+\renewcommand{\subsubsection}[1]{\oldsubsubsection{#1}\renewcommand{\currentsubsubsection}{#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
% enacting
diff --git a/macros/latex/contrib/ukbill/ukbill.cls b/macros/latex/contrib/ukbill/ukbill.cls
index 51db40edf0..ef19b7b602 100644
--- a/macros/latex/contrib/ukbill/ukbill.cls
+++ b/macros/latex/contrib/ukbill/ukbill.cls
@@ -1,6 +1,6 @@
\NeedsTeXFormat{LaTeX2e}
-\def\ukbillversionnumber{1.0.2}
-\ProvidesClass{ukbill}[2022-12-13 A Class for Legal Notes]
+\def\ukbillversionnumber{1.0.3}
+\ProvidesClass{ukbill}[2022-12-01 A Class for Legal Notes]
% !TeX program = lualatex
% !TeX encoding = utf8
% This work may be distributed and/or modified under the
@@ -353,7 +353,8 @@ BoldFont={PalatineP-Bold},
}%
\item[]}%
{\end{list}}
-\renewenvironment{nostat}{\begin{enumerate}[leftmargin=1.7cm,labelindent=15pt,itemindent=0pt,label=]}{\end{enumerate}}
+\newenvironment{nostat}{\begin{enumerate}[nosep,leftmargin=1.7cm,labelindent=0pt,itemindent=0pt,label=]}{\end{enumerate}}
+\newenvironment{numstat}%
{%
%\vspace{-9ex}%
\begin{enumerate}[nosep,partopsep=0pt,
diff --git a/macros/latex/contrib/unbtex/README.md b/macros/latex/contrib/unbtex/README.md
index 7f6a1eed57..94f844f944 100644
--- a/macros/latex/contrib/unbtex/README.md
+++ b/macros/latex/contrib/unbtex/README.md
@@ -1,6 +1,6 @@
# UnBTeX: A class for bachelor, master, and doctoral thesis at the
University of Brasilia (UnB), Brazil.
-Version 1.3.3 2023/11/02
+Version 1.4 2023/11/15
Copyright (C) 2021-2023 by Henrique C. Ferreira <hcferreira@unb.br>
@@ -63,6 +63,16 @@ Here is a history of changes:
bibliographic references in accordance with updates to ABNT's NBR
6023:2018 and NBR 10520:2023 standards
. Example and code comments improvements
+ 1.4 (2023-11-15):
+ . Text main font based on stix2 package has been replace by stickstoo
+ package to improve math subscript spacing
+ . Sans serif font scale has been adjusted (helvet package)
+ . Typewriter font and scale have been changed (inconsolata package)
+ . Font size and line spread of verbatim environment have beem modified
+ . Cross-references names for listing, algorithm, and theorem
+ environments have been corrected
+ . Indentation and line spacing of references list have been adjusted
+ . Figure and table numbering by chapter have been corrected
## Overleaf
diff --git a/macros/latex/contrib/unbtex/unbtex-example.pdf b/macros/latex/contrib/unbtex/unbtex-example.pdf
index 5aff44aefc..153199da18 100644
--- a/macros/latex/contrib/unbtex/unbtex-example.pdf
+++ b/macros/latex/contrib/unbtex/unbtex-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example.tex b/macros/latex/contrib/unbtex/unbtex-example.tex
index 5d6c4e4952..f62347759b 100644
--- a/macros/latex/contrib/unbtex/unbtex-example.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example.tex
@@ -1,7 +1,7 @@
%%
%% UnBTeX: A class for bachelor, master, and doctoral thesis at the
%% University of Brasilia (UnB), Brazil
-%% Version 1.3.3 2023/11/02
+%% Version 1.4 2023/11/15
%% Copyright (C) 2021-2023 by Henrique C. Ferreira <hcferreira@unb.br>
%%
%% This class file may be distributed and/or modified under the conditions
@@ -20,11 +20,10 @@
\documentclass[
% -- opções da classe memoir -- https://www.ctan.org/pkg/memoir
- 12pt, % tamanho da fonte
+ 12pt, % tamanho da fonte
openright, % capítulos começam em página ímpar
- % (insere página vazia caso preciso)
- oneside, % caso queira imprimir em frente e verso, use
- %twoside,
+ % (insere página vazia caso preciso)
+ oneside, % caso queira imprimir em frente e verso, use twoside,
a4paper, % tamanho do papel.
sumario=tradicional,
% -- opções do pacote babel --
@@ -45,9 +44,6 @@
\def\UrlRight{}
\urlstyle{same}
-% Referências cruzadas automáticas, dependendo do tipo de referência (figuras, tabelas, equações, etc.)
-\RequirePackage[nameinlink,noabbrev,english,brazilian]{cleveref}
-
% ---
% Compila o índice
% ---
@@ -94,8 +90,6 @@
\graphicspath{{unbtex-example/figuras/}}
% ---
-\usepackage{fancyvrb} % permite selecionar o tamanho da fonte no comando \Verb
-
% ------------------------------------------------------------------------
% ------------------------------------------------------------------------
% Informações do trabalho
@@ -131,7 +125,7 @@
% Local e data
\local{Brasília}
-\dia{02}
+\dia{15}
\mes{novembro}
\ano{2023}
@@ -177,7 +171,6 @@
\IfStrEq*{\languagename}{brazil}{
\thmnamebr
\renewcommand{\bibname}{Referências}
-\renewcommand{\lstlistingname}{Código}
\renewcommand{\orientadorname}{Orientador} % O gênero pode ser alterado para Orientadora
\renewcommand{\coorientadorname}{Coorientador} % O gênero pode ser alterado para Coorientadora
\renewcommand{\anexoname}{Anexo}
@@ -185,7 +178,6 @@
}{
\thmnameen
\renewcommand{\bibname}{References}
-\renewcommand{\lstlistingname}{Code}
\renewcommand{\orientadorname}{Orientador} % O gênero pode ser alterado para Orientadora. Não alterar para Supervisor/Advisor, mesmo que o trabalho seja em inglês.
\renewcommand{\coorientadorname}{Coorientador} % O gênero pode ser alterado para Coorientadora. Não alterar para Co-Supervisor/Co-Advisor, mesmo que o trabalho seja em inglês.
\renewcommand{\anexoname}{Annex}
@@ -194,7 +186,6 @@
% Configurações do pacote backref
% Usado sem a opção hyperpageref de backref
-
\IfStrEq*{\languagename}{brazil}{
\renewcommand{\backrefpagesname}{Citado na(s) página(s):~}
% Texto padrão antes do número das páginas
@@ -202,11 +193,11 @@
% Define os textos da citação
\renewcommand*{\backrefalt}[4]{
\ifcase #1 %
- Nenhuma citação no texto.%
+ Nenhuma citação no texto.%
\or
- Citado na p. #2.%
+ Citado na p. #2.%
\else
- Citado nas pp. #2.%
+ Citado nas pp. #2.%
\fi}%
}{
\renewcommand*{\backrefalt}[4]{%
@@ -309,8 +300,7 @@ Agradecimentos do segundo autor.
\begin{epigrafe}
\vspace*{\fill}
\begin{flushright}
- \textit{``If you find that you're spending almost all your time on theory,\\ start turning some attention to practical things; \\ it will improve your theories.\\ If you find that you're spending almost all your time on practice, \\ start turning some attention to theoretical things; \\ it will improve your practice.''\\
- (Donald Knuth)}
+ \textit{``If you find that you're spending almost all your time on theory,\\ start turning some attention to practical things; \\ it will improve your theories.\\ If you find that you're spending almost all your time on practice, \\ start turning some attention to theoretical things; \\ it will improve your practice.''\\ (Donald Knuth)}
\end{flushright}
\end{epigrafe}
% ---
@@ -436,10 +426,10 @@ This is the english abstract.
% Referências bibliográficas
% ---
% Seleciona o arquivo de estilo de citações
-\IfStrEq*{\languagename}{english}{
-\bibliographystyle{unbtexcite-en}
-}{
+\IfStrEq*{\languagename}{brazil}{
\bibliographystyle{unbtexcite-pt}
+}{
+\bibliographystyle{unbtexcite-en}
}
% Arquivos com as referências bibliográficas
\bibliography{unbtex-example/referencias,unbtex-example/references}
diff --git a/macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex b/macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
index fbe40c99cb..ab842bb745 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/anexo-a.tex
@@ -12,4 +12,4 @@
\noindent\includegraphics[scale=0.5]{example-image-c}
-\noindent\includegraphics[width=3cm]{example-image} \ No newline at end of file
+\noindent\includegraphics[width=3cm]{example-image} \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex b/macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
index 1e09fd37d0..e70fab3bb4 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/apendice-a.tex
@@ -27,7 +27,7 @@ pode ser citada no texto com
\end{verbatim}
e a citação apareceria assim: \cite{greenwade93}.
-Para fazer uma citação direta no formato ABNT, criamos o ambiente \Verb[fontsize=\normalsize]|citacao|, que é uma simples generalização do ambiente \Verb[fontsize=\normalsize]|quotation| (habilitado por padrão) com um campo específico de autor. Veja o exemplo a seguir:
+Para fazer uma citação direta no formato ABNT, criamos o ambiente \verb|citacao|, que é uma simples generalização do ambiente \verb|quotation| (habilitado por padrão) com um campo específico de autor. Veja o exemplo a seguir:
\begin{verbatim}
\begin{citacao}{Carl Sagan}
Alegações extraordinárias exigem evidências extraordinárias.
@@ -37,7 +37,7 @@ Esse código gera uma citação assim:
\begin{citacao}{Carl Sagan}
Alegações extraordinárias exigem evidências extraordinárias.
\end{citacao}
-O comando \Verb[fontsize=\normalsize]|\cite{...}| pode ser usado como indicação do autor:
+O comando \verb|\cite{...}| pode ser usado como indicação do autor:
\begin{verbatim}
\begin{citacao}{\cite{greenwade93}}
TEX is a typesetting program designed for high-quality composition of material
@@ -48,7 +48,7 @@ for preparation of his book series ``The Art of Computer Programming''. TEX
has been made freely available by Knuth.
\end{citacao}
\end{verbatim}
-Naturalmente, a referência \Verb[fontsize=\normalsize]|grennwade93| deve estar definida no arquivo Bib\TeX\ (aqui, \Verb[fontsize=\normalsize]|references.bib|). Confira o resultado:
+Naturalmente, a referência \verb|grennwade93| deve estar definida no arquivo Bib\TeX\ (aqui, \verb|references.bib|). Confira o resultado:
\begin{citacao}{\cite{greenwade93}}
TEX is a typesetting program designed for high-quality composition of material that contains a lot of mathematical and technical expressions. It has been adopted by many authors and publishers who generate technical books and papers. It was created by Professor Donald E. Knuth of Stanford University, originally for preparation of his book series ``The Art of Computer Programming''. TEX has been made freely available by Knuth.
\end{citacao} \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex b/macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
index 5bb320803a..812fe936f5 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/apendice-b.tex
@@ -3,10 +3,10 @@
% ----------------------------------------------------------
\section{Projeto do Controlador com Realimentação de Estados}
-\lstinputlisting[language=Matlab,caption=Código de Matlab]{unbtex-example/codigos/controle.m}
+\lstinputlisting[language=Matlab,caption={Código de Matlab},label={cod_matlab}]{unbtex-example/codigos/controle.m}
\section{Exemplo de teste em Malha Fechada com Rampa}
-\lstinputlisting[language=Python,caption=Código de Python]{unbtex-example/codigos/controleSmithPredictor.py}
+\lstinputlisting[language=Python,caption={Código de Python},label={cod_python}]{unbtex-example/codigos/controleSmithPredictor.py}
\section{Redução modal}
-\lstinputlisting[language=Julia,caption=Código de Julia]{unbtex-example/codigos/ModalReduction.jl} \ No newline at end of file
+\lstinputlisting[language=Julia,caption={Código de Julia},label={cod_julia}]{unbtex-example/codigos/ModalReduction.jl} \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex b/macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
index 9f30b390ac..151822d3e0 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/capitulo1.tex
@@ -3,9 +3,9 @@
\label{cap_intr}
% ----------------------------------------------------------
-Este documento exemplifica a elaboração de trabalho acadêmico (trabalho de conclusão de curso, dissertação e tese) a partir da classe UnB\TeX, uma customização da classe {\small\textsf{abntex2}} para a Universidade de Brasília (UnB).
+Este documento exemplifica a elaboração de trabalho acadêmico (trabalho de conclusão de curso, dissertação e tese) a partir da classe UnB\TeX, uma customização da classe \textsf{abntex2} para a Universidade de Brasília (UnB).
-A classe {\small\textsf{abntex2}}, por sua vez, é uma customização da classe {\small\textsf{memoir}} para atender aos requisitos da norma ABNT NBR 14724:2011 \emph{Informação e documentação -- Trabalhos acadêmicos -- Apresentação}. Uma lista completa das normas observadas pelo \abnTeX\ é apresentada em \citeonline{abntex2classe}.
+A classe \textsf{abntex2}, por sua vez, é uma customização da classe \textsf{memoir} para atender aos requisitos da norma ABNT NBR 14724:2011 \emph{Informação e documentação -- Trabalhos acadêmicos -- Apresentação}. Uma lista completa das normas observadas pelo \abnTeX\ é apresentada em \citeonline{abntex2classe}.
Parte das customizações utilizadas na classe UnB\TeX\ baseia-se em soluções adotadas por \citeonline{Castro2019} para editoração dos livros da série \textit{Ensino de graduação} da Editora UnB. A classe UnB\TeX\ também contempla atualizações mais recentes das normas NBR 6023 \cite{NBR6023:2018} e NBR 10520 \cite{NBR10520:2023} da ABNT, não consideradas no \abnTeX.
@@ -13,7 +13,7 @@ Parte das customizações utilizadas na classe UnB\TeX\ baseia-se em soluções
\nomenclature[A]{ABNT}{Associação Brasileira de Normas Técnicas}
\nomenclature[A]{UnB}{Universidade de Brasília}
-Este documento deve ser utilizado como complemento do manual do \abnTeX\ \cite{abntex2classe} e da classe {\small\textsf{memoir}} \cite{memoir}.
+Este documento deve ser utilizado como complemento do manual do \abnTeX\ \cite{abntex2classe} e da classe \textsf{memoir} \cite{memoir}.
%\begin{mdframed}[style=defnSty] % azul
\begin{mdframed}[style=plainSty] % verde
diff --git a/macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex b/macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
index 316fa53a46..a787644a95 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/capitulo2.tex
@@ -9,7 +9,7 @@ Este capítulo ilustra o uso de comandos do \LaTeX, do \abnTeX\ e do UnB\TeX.
\section{Codificação dos arquivos: UTF8}
% ---
-A codificação de todos os arquivos do \abnTeX\ é \texttt{UTF8}. É necessário que você utilize a mesma codificação nos documentos que escrever, inclusive nos arquivos de base bibliográficas \Verb[fontsize=\normalsize]|.bib|.
+A codificação de todos os arquivos do \abnTeX\ é \texttt{UTF8}. É necessário que você utilize a mesma codificação nos documentos que escrever, inclusive nos arquivos de base bibliográficas \texttt{bib}.
% ---
\section{Citações diretas}\label{sec-citacao}
@@ -53,6 +53,88 @@ Citações simples, com até três linhas, devem ser incluídas com aspas. Obser
As notas de rodapé são detalhadas pela NBR 14724:2011 na seção 5.2.1\footnote{As notas devem ser digitadas ou datilografadas dentro das margens, ficando separadas do texto por um espaço simples de entre as linhas e por filete de 5 cm, a partir da margem esquerda. Devem ser alinhadas, a partir da segunda linha da mesma nota, abaixo da primeira letra da primeira palavra, de forma a destacar o expoente, sem espaço entre elas e com fonte menor \citeonline[seção 5.2.1]{NBR14724:2011}.}\footnote{Caso uma série de notas sejam criadas sequencialmente, o \abnTeX\ instrui o \LaTeX\ para que uma vírgula seja colocada após cada número do expoente que indica a nota de rodapé no corpo do texto.}\footnote{Verifique se os números do expoente possuem uma vírgula para dividi-los no corpo do texto.}.
% ---
+\section{Expressões matemáticas}
+\label{sec-mat}
+% ---
+
+Use o ambiente \texttt{equation} para escrever expressões matemáticas numeradas:
+\begin{equation}
+ \forall x \in X, \quad \exists \: y \leq \epsilon
+\end{equation}
+
+Escreva expressões matemáticas entre \$ e \$, como em $ \lim_{x \to \infty} \exp(-x) = 0 $, para que fiquem na mesma linha.
+
+Também é possível usar colchetes para indicar o início de uma expressão matemática que não é numerada:
+\[
+\left|\sum_{i=1}^n a_ib_i\right|
+\le
+\left(\sum_{i=1}^n a_i^2\right)^{1/2}
+\left(\sum_{i=1}^n b_i^2\right)^{1/2}.
+\]
+
+Note que se a equação faz parte do parágrafo, não deixe uma linha em branco entre o texto e a equação. A linha em branco é entendida como o início de um novo parágrafo e o espaçamento fica maior.
+
+Consulte mais informações sobre expressões matemáticas em \url{https://github.com/abntex/abntex2/wiki/Referencias}.
+
+Muitos cientistas gostam de usar \LaTeX\ porque essa ferramenta possibilita escrever facilmente equações como a seguinte:
+\begin{equation}
+p+\frac{1}{2}{\rho}v^2+{\rho}gh = \text{constante},
+\label{eq:Bernoulli}
+\end{equation}
+em que $p$ é a pressão, $v$ é a velocidade e $h$ é a elevação, ou seja, a ``altura do tubo''. A \cref{eq:Bernoulli} pode ser deduzida a partir do \textit{Teorema Trabalho-Energia}.
+
+% Definição da nomenclatura que irá para a lista de símbolos
+\nomenclature[B]{$p$}{Pressão}
+\nomenclature[B]{$v$}{Velocidade}
+\nomenclature[B]{$h$}{Elevação}
+
+A seguir, são apresentados mais alguns exemplos de equações feitas com o \LaTeX.
+
+\newcommand{\vt}[1]{\mathbf{#1}}
+
+\begin{equation}\label{eq:R_f_usual}
+\vt{R}_r(t) = \vt{R}_{\chi}(t) \triangleq
+\begin{bmatrix}
+\cos \chi_0 (t) & -\sin \chi_0 (t) & 0
+\\
+\sin \chi_0 (t) & \cos \chi_0 (t) & 0
+\\
+0 & 0 & 1
+\end{bmatrix}
+\end{equation}
+
+\begin{equation}
+\vt{L}_{ij} =
+\begin{cases}
+-a_{ij}, & \text{se } j \neq i \text{ e } j \in \mathcal{N}_i, \\
+\sum_{k \in \mathcal{N}_i} a_{ik}, & \text{se } j = i, \\
+0, & \text{caso contrário}.
+\end{cases}
+\end{equation}
+
+\begin{subequations}
+\begin{align}
+\tau_{li}^s(t) &= \ddot{p}^d_{li}(t) - k_{d} \dot{e}_{li}(t) - k_{p} e_{li}(t),
+\\
+\dot{\tau}_{li}^f(t) + \xi_{i} \tau_{li}^f(t) &= u_{li}(t),\label{eq:filtro_i}
+\\
+u_{li}(t) &= - \textrm{sign}(s_{li}(t))\eta. \label{eq:u_xbi}
+\end{align}
+\end{subequations}
+
+\begin{equation}\label{eq:point-mass-velocity}
+\begin{split}
+\dot{V}_{i}(t) &{}= \frac{T_{i}(t) - D_i(t)}{m_i} - g \sin \gamma_{i}(t) + b_{ti}(t), \\
+\dot{\chi}_i(t) &{}= \frac{L_i(t) \sin \phi_i(t)}{m_i V_{i}(t) \cos \gamma_{i}(t)} + \frac{b_{\psi i}(t)}{V_{i}(t)\cos \gamma_{i}(t)},\\
+\dot{\gamma}_{i}(t) &{}= \frac{L_i(t) \cos \phi_i(t)}{m_i V_{i}(t)} - \frac{g \cos \gamma_{i}(t)}{V_{i}(t)} + \frac{b_{\theta i}(t)}{V_{i}(t)}.
+\end{split}
+\end{equation}
+
+\nomenclature[C]{$\theta$}{Ângulo de arfagem}
+\nomenclature[C]{$\phi$}{Ângulo de rolamento}
+\nomenclature[C]{$\psi$}{Ângulo de guinada}
+
+% ---
\section{Tabelas}
% ---
@@ -63,12 +145,13 @@ A \cref{tab-nivinv} é um exemplo de tabela construída em
\footnotesize
\caption[Níveis de investigação]{Níveis de investigação.}
\label{tab-nivinv}
+{\renewcommand{\arraystretch}{1.2} % espaçamento entre as linhas da tabela
\begin{tabular}{p{2.6cm}|p{6.0cm}|p{2.25cm}|p{3.40cm}} %\hline
\textbf{Nível de Investigação} & \textbf{Insumos} & \textbf{Sistemas de Investigação} & \textbf{Produtos} \\ \hline
Meta-nível & Filosofia da Ciência & Epistemologia & Paradigma \\ \hline
Nível do objeto & Paradigmas do metanível e evidências do nível inferior & Ciência & Teorias e modelos \\ \hline
Nível inferior & Modelos e métodos do nível do objeto e problemas do nível inferior & Prática & Solução de problemas \\ %\hline
-\end{tabular}
+\end{tabular}}
\legend{Fonte: \citeonline{van86}}
\end{table}
@@ -76,7 +159,7 @@ Já a \cref{tabela-ibge} apresenta uma tabela criada conforme o padrão do \cite
\begin{table}[htb]
\IBGEtab{%
- \caption{Um Exemplo de tabela alinhada que pode ser longa ou curta, conforme padrão IBGE.}%
+ \caption{Um Exemplo de tabela alinhada que pode ser longa ou curta, conforme padrão IBGE}%
\label{tabela-ibge}
}{%
\begin{tabular}{ccc}
@@ -99,7 +182,7 @@ Na \cref{tab:lvlii} são mostrados os componentes curriculares do novo fluxogram
\small
\begin{center}%
\caption{Componentes curriculares do segundo nível} \label{tab:lvlii}
-\noindent%
+{\renewcommand{\arraystretch}{1.2} % espaçamento entre as linhas da tabela
\begin{tabular}{|m{1.5cm}|m{4.3cm}|m{.7cm}|m{.7cm}|m{.7cm}|m{.7cm}|m{.7cm}|m{2.1cm}|}
\hline%
\multicolumn{8}{|l|}{\textbf{2º Nível}} \\\hline%
@@ -116,11 +199,11 @@ ENM0190 & Desenho Mecânico para Engenharia & 30 & 30 & 0 & 0 & 60 & \\\hline%
CIC0090 & Estruturas de Dados & 30 & 30 & 0 & 0 & 60 & CIC0004 \\\hline%
\multicolumn{6}{|l|}{Componentes optativos ou eletivos} & 60 & \multicolumn{1}{r}{} \\\cline{1-7}%
\multicolumn{6}{|l|}{Total de horas do 2º Nível} & 420 & \multicolumn{1}{r}{} \\\cline{1-7}%
-\end{tabular}
+\end{tabular}}
\end{center}%
\end{table}
-É uma boa ideia usar o pacote {\small\textsf{longtable}} para criar tabelas, pois assim uma mesma tabela pode ocupar várias páginas. Também há pacotes que rotacionam tabelas, para que fiquem em uma página em formato paisagem. Faça as tabelas usando como base qualquer um dos exemplos aqui apresentados ou outros que considerar mais adequados e que podem ser facilmente encontrados na internet.
+É uma boa ideia usar o pacote \textsf{longtable} para criar tabelas, pois assim uma mesma tabela pode ocupar várias páginas. Também há pacotes que rotacionam tabelas, para que fiquem em uma página em formato paisagem. Faça as tabelas usando como base qualquer um dos exemplos aqui apresentados ou outros que considerar mais adequados e que podem ser facilmente encontrados na internet.
% ---
\section{Figuras}
@@ -129,28 +212,34 @@ CIC0090 & Estruturas de Dados & 30 & 30 & 0 & 0 & 60 & CIC0004 \\\hline%
Existem pacotes que permitem criar figuras e gráficos no próprio código \LaTeX. Por exemplo, temos
\begin{itemize}
- \item PGFPlots: \url{http://pgfplots.sourceforge.net/}
- \item TikZ: \url{http://www.texample.net/tikz/examples/all/}
- \item Metapost: \url{http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html}
- \item PSTricks: \url{https://tug.org/PSTricks/main.cgi?file=examples}
+ \item \textsf{PGFPlots}: \url{http://pgfplots.sourceforge.net/}
+ \item \textsf{TikZ}: \url{http://www.texample.net/tikz/examples/all/}
+ \item \textsf{Metapost}: \url{http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html}
+ \item \textsf{PSTricks}: \url{https://tug.org/PSTricks/main.cgi?file=examples}
\end{itemize}
-Figuras também podem ser incorporadas de arquivos externos, como é o caso das \cref{fig_blockdiagram,fig_grafico}. Se a figura que for incluída se tratar de um diagrama, um gráfico ou uma ilustração que você mesmo produza, priorize o uso de imagens vetoriais no formato PDF. Com isso, o tamanho do arquivo final do trabalho será menor, e as imagens terão uma apresentação melhor, principalmente quando impressas, uma vez que imagens vetoriais são perfeitamente escaláveis para qualquer dimensão. Nesse caso, se for utilizar o Microsoft Excel para produzir gráficos, ou o Microsoft Word para produzir ilustrações, exporte-os como PDF e os incorpore ao documento conforme o exemplo abaixo. No entanto, para manter a coerência no uso de software livre (já que você está usando \LaTeX\ e \abnTeX), teste a ferramenta {\small\textsf{InkScape}} (\url{http://inkscape.org/}). Ela é uma excelente opção de código-livre para produzir ilustrações vetoriais, similar ao CorelDraw ou ao Adobe Illustrator. De todo modo, caso não seja possível utilizar arquivos de imagens como PDF, utilize qualquer outro formato, como JPEG, GIF, BMP, etc. Nesse caso, você pode tentar aprimorar as imagens incorporadas com o software livre {\small\textsf{Gimp}} (\url{http://www.gimp.org/}). Ele é uma alternativa livre ao Adobe Photoshop.
+Figuras também podem ser incorporadas de arquivos externos, como é o caso das \cref{fig_blockdiagram,fig_grafico}. Se a figura que for incluída se tratar de um diagrama, um gráfico ou uma ilustração que você mesmo produza, priorize o uso de imagens vetoriais no formato \texttt{pdf}. Com isso, o tamanho do arquivo final do trabalho será menor, e as imagens terão uma apresentação melhor, principalmente quando impressas, uma vez que imagens vetoriais são perfeitamente escaláveis para qualquer dimensão.
\begin{figure}[htb]
\centering
\includegraphics[scale=1]{blockdiagram.pdf}
- \caption{\label{fig_blockdiagram}Sistema de controle em malha fechada}
+ \caption{Sistema de controle em malha fechada}
+ \label{fig_blockdiagram}
\end{figure}
\begin{figure}[htb]
\begin{center}
- \includegraphics[scale=0.8]{bodediagram.pdf}
- \caption{\label{fig_grafico}Resposta em frequência de $G(s)$}
+ \includegraphics[scale=1]{bodediagram.pdf}
+ \caption{Resposta em frequência de malha aberta}
+ \label{fig_grafico}
\legend{Fonte: Produzido pelos autores}
\end{center}
\end{figure}
+Para manter a coerência no uso de software livre (já que você está usando \LaTeX\ e \abnTeX), teste a ferramenta \textsf{InkScape} (\url{http://inkscape.org/}). Ela é uma excelente opção de código-livre para produzir ilustrações vetoriais, similar ao CorelDraw ou ao Adobe Illustrator.
+
+De todo modo, caso não seja possível utilizar arquivos de imagens como \texttt{pdf}, utilize qualquer outro formato, como \texttt{jpeg}, \texttt{gif}, \texttt{bmp}, etc. Nesse caso, você pode tentar aprimorar as imagens incorporadas com o software livre \textsf{Gimp} (\url{http://www.gimp.org/}). Ele é uma alternativa livre ao Adobe Photoshop.
+
% ---
\subsection{Figuras em \emph{minipages}}
% ---
@@ -160,16 +249,16 @@ Figuras também podem ser incorporadas de arquivos externos, como é o caso das
\begin{figure}[htb]
\label{teste}
\centering
- \begin{minipage}{0.45\textwidth}
+ \begin{minipage}{0.46\textwidth}
\centering
- \includegraphics[scale=0.95]{circuito.pdf}
+ \includegraphics[scale=1]{circuito.pdf}
\caption{Imagem 1 da minipage} \label{fig_minipage_imagem1}
\legend{Fonte: Produzido pelos autores}
\end{minipage}
\hfill
- \begin{minipage}{0.525\textwidth}
+ \begin{minipage}{0.52\textwidth}
\centering
- \includegraphics[scale=0.9]{curva_diodo.pdf}
+ \includegraphics[scale=1.2]{diodocurva.pdf}
\caption{Gráfico 2 da minipage} \label{fig_minipage_grafico2}
\legend{Fonte: Produzido pelos autores}
\end{minipage}
@@ -177,30 +266,29 @@ Figuras também podem ser incorporadas de arquivos externos, como é o caso das
\subsection{Subfiguras}
-O pacote \texttt{subfig} foi utilizado para inserir as \cref{fig_subfigura_imagem1,fig_subfigura_grafico2}. Subfiguras também podem ser inseridas no texto com o pacote \texttt{subcaption}.
+O pacote \textsf{subfig} foi utilizado para inserir as \cref{fig_subfigura_imagem1,fig_subfigura_grafico2}. Subfiguras também podem ser inseridas no texto com o pacote \textsf{subcaption}.
% utiliza o pacote subfig
-\begin{figure}[h]
+\begin{figure}[htb]
\centering
\subfloat[Primeira subfigura]{\label{fig_subfigura_imagem1} \centering
- \includegraphics[scale=.95]{circuito.pdf}}
- \subfloat[Segunda subfigura]{\label{fig_subfigura_grafico2} \quad
- \centering
- \includegraphics[scale=.9]{curva_diodo.pdf}}
+ \includegraphics[scale=1]{circuito.pdf}}
+ \subfloat[Segunda subfigura]{\label{fig_subfigura_grafico2} \hspace{0.4em}
+ \centering \includegraphics[scale=1.2]{diodocurva.pdf}}
\caption{Figura com subfiguras} \label{fig:tau}
\end{figure}
% utiliza o pacote subcaption
-%\begin{figure}[h]
+%\begin{figure}[htb]
% \centering
-% \begin{subfigure}[t]{0.4\columnwidth}
-% \includegraphics[scale=0.9]{img-marca.pdf}
+% \begin{subfigure}[t]{0.46\textwidth}
+% \includegraphics[scale=1]{circuito.pdf}
% \caption{Primeira subfigura}
% \label{fig_subfigura_imagem1}
% \end{subfigure}%
% \hfill
-% \begin{subfigure}[t]{0.4\columnwidth}
-% \includegraphics[scale=0.2]{img-grafico.pdf}
+% \begin{subfigure}[t]{0.52\textwidth}
+% \includegraphics[scale=1.2]{diodocurva.pdf}
% \caption{Segunda subfigura}
% \label{fig_subfigura_grafico2}
% \end{subfigure}
@@ -208,93 +296,32 @@ O pacote \texttt{subfig} foi utilizado para inserir as \cref{fig_subfigura_image
% \label{fig:tau}
%\end{figure}
-Observe que, segundo a \citeonline[seções 4.2.1.10 e 5.8]{NBR14724:2011}, as ilustrações devem sempre ter numeração contínua e única em todo o documento:
-
-\begin{citacao}
-Qualquer que seja o tipo de ilustração, sua identificação aparece na parte superior, precedida da palavra designativa (desenho, esquema, fluxograma, fotografia, gráfico, mapa, organograma, planta, quadro, retrato, figura, imagem, entre outros), seguida de seu número de ordem de ocorrência no texto, em algarismos arábicos, travessão e do respectivo título. Após a ilustração, na parte inferior, indicar a fonte consultada (elemento obrigatório, mesmo que seja produção do próprio autor), legenda, notas e outras informações necessárias à sua compreensão (se houver). A ilustração deve ser citada no texto e inserida o mais próximo possível do trecho a que se refere. \cite[seção 5.8]{NBR14724:2011}
-\end{citacao}
-
% ---
-\section{Expressões matemáticas}
-\label{sec-mat}
+\subsection{Substituir texto de figura \texttt{eps} por texto e equações com as mesmas fontes usadas no documento}
% ---
-Use o ambiente \texttt{equation} para escrever expressões matemáticas numeradas:
-
-\begin{equation}
- \forall x \in X, \quad \exists \: y \leq \epsilon
-\end{equation}
-
-Escreva expressões matemáticas entre \$ e \$, como em $ \lim_{x \to \infty} \exp(-x) = 0 $, para que fiquem na mesma linha.
-
-Também é possível usar colchetes para indicar o início de uma expressão matemática que não é numerada.
+Caso queira utilizar a mesma fonte do texto para escrever dentro de figuras, como é o caso da \cref{fig_psfrag1} (arquivo \texttt{blockdiagram.pdf}), produza uma figura como a da \cref{fig_psfrag2} e a salve no formato \texttt{eps} (arquivo \texttt{blockdiagram.eps}). Softwares como InkScape, CorelDraw ou Adobe Ilustrator podem ser utilizados para este fim.
-\[
-\left|\sum_{i=1}^n a_ib_i\right|
-\le
-\left(\sum_{i=1}^n a_i^2\right)^{1/2}
-\left(\sum_{i=1}^n b_i^2\right)^{1/2}
-\]
-
-Consulte mais informações sobre expressões matemáticas em \url{https://github.com/abntex/abntex2/wiki/Referencias}.
-
-Muitos cientistas gostam de usar \LaTeX\ porque essa ferramenta possibilita escrever facilmente equações como a seguinte:
-
-\begin{equation}
-p+\frac{1}{2}{\rho}v^2+{\rho}gh = \text{constante},
-\label{eq:Bernoulli}
-\end{equation}
-
-\noindent em que $p$ é a pressão, $v$ é a velocidade e $h$ é a elevação, ou seja, a ``altura do tubo''. A \cref{eq:Bernoulli} pode ser deduzida a partir do \textit{Teorema Trabalho-Energia}.
-
-% Definição da nomenclatura que irá para a lista de símbolos
-\nomenclature[B]{$p$}{Pressão}
-\nomenclature[B]{$v$}{Velocidade}
-\nomenclature[B]{$h$}{Elevação}
-
-A seguir, são apresentados mais alguns exemplos de equações feitas com o \LaTeX.
-
-\newcommand{\vt}[1]{\mathbf{#1}}
-
-\begin{equation}\label{eq:R_f_usual}
-\vt{R}_r(t) = \vt{R}_{\chi}(t) \triangleq
-\begin{bmatrix}
-\cos \chi_0 (t) & -\sin \chi_0 (t) & 0
-\\
-\sin \chi_0 (t) & \cos \chi_0 (t) & 0
-\\
-0 & 0 & 1
-\end{bmatrix}
-\end{equation}
+\begin{figure}[htb]
+ \centering
+ \subfloat[Arquivo \texttt{blockdiagram.pdf}]{\label{fig_psfrag1} \centering
+ \includegraphics[scale=1]{blockdiagram.pdf}} \\
+ \subfloat[Arquivo \texttt{blockdiagram.eps}]{\label{fig_psfrag2}
+ \centering \includegraphics[scale=1]{blockdiagramfrag.eps}}
+ \caption{Uso do pacote \textsf{psfrag}} \label{fig:psgrag}
+\end{figure}
-\begin{equation}
-\vt{L}_{ij} =
-\begin{cases}
--a_{ij}, & \text{se } j \neq i \text{ e } j \in \mathcal{N}_i, \\
-\sum_{k \in \mathcal{N}_i} a_{ik}, & \text{se } j = i, \\
-0, & \text{caso contrário}.
-\end{cases}
-\end{equation}
+Crie no Overleaf um projeto nomeado \texttt{blockdiagram} e que tenha, dentro de um arquivo nomeado \texttt{blockdiagram.tex}, o conteúdo mostrado no \cref{cod_tex}.
-\begin{align}
-\tau_{li}^s(t) &= \ddot{p}^d_{li}(t) - k_{d} \dot{e}_{li}(t) - k_{p} e_{li}(t),
-\\
-\dot{\tau}_{li}^f(t) + \xi_{i} \tau_{li}^f(t) &= u_{li}(t),\label{eq:filtro_i}
-\\
-u_{li}(t) &= - \textrm{sign}(s_{li}(t))\eta. \label{eq:u_xbi}
-\end{align}
+\lstinputlisting[numbers=none,float,caption={\texttt{blockdiagram.tex}},label={cod_tex}]{unbtex-example/codigos/blockdiagram.tex}
-\begin{equation}\label{eq:point-mass-velocity}
-\begin{split}
-\dot{V}_i(t) &{}= \frac{T_i(t) - D_i(t)}{m_i} - g \sin \gamma_i(t) + b_{ti}(t), \\
-\dot{\chi}_i(t) &{}= \frac{L_i(t) \sin \phi_i(t)}{m_i V_i(t) \cos \gamma_i(t)} + \frac{b_{\psi i}(t)}{V_i(t)\cos \gamma_i(t)},\\
-\dot{\gamma}_i(t) &{}= \frac{L_i(t) \cos \phi_i(t)}{m_i V_i(t)} - \frac{g \cos \gamma_i(t)}{V_i(t)} + \frac{b_{\theta i}(t)}{V_i(t)}.
-\end{split}
-\end{equation}
+No menu do Overleaf, defina \texttt{LaTeX} como compilador e o arquivo \texttt{blockdiagram.tex} como principal. Coloque dentro do projeto o arquivo \texttt{blockdiagram.eps} e compile o projeto. A saída gerada corresponde à \cref{fig_psfrag1} e deverá ser salva como \texttt{blockdiagram.pdf}. Este arquivo poderá ser carregado no projeto do texto do trabalho (TCC, dissertação ou tese) que você estiver escrevendo com o UnB\TeX\ (que usa o \texttt{pdfLaTeX} como compilador).
-\nomenclature[C]{$\theta$}{Ângulo de arfagem}
-\nomenclature[C]{$\phi$}{Ângulo de rolamento}
-\nomenclature[C]{$\psi$}{Ângulo de guinada}
+Note no \cref{cod_tex} que o pacote \textsf{psfrag} substitui, por meio do comando
+\begin{verbatim}
+\psfrag{r}[c][c]{\footnotesize $R(s)$}
+\end{verbatim}
+o ``\texttt{r}'' da figura \texttt{eps} por ``\verb|$R(s)$|'', produzindo ``$R(s)$'' na figura \texttt{pdf}. O pacote \textsf{psfrag} funciona apenas com o compilador \texttt{LaTeX}, o que torna a criação de um novo projeto no Overleaf uma boa solução. Este projeto poderá ser aproveitado para gerar outras figuras do seu trabalho.
% ---
\section{Enumerações: alíneas e subalíneas}
@@ -345,13 +372,13 @@ subdividida em alíneas \cite[seção 4.2]{NBR6024:2012}:
É uma boa prática dividir o seu documento em diversos arquivos, e não apenas escrever tudo em um único. Esse recurso foi utilizado neste documento. Para incluir diferentes arquivos em um arquivo principal, de modo que cada arquivo incluído fique em uma página diferente, utilize o comando:
\begin{verbatim}
- \include{documento-a-ser-incluido} % sem a extensão .tex
+\include{documento-a-ser-incluido} % sem a extensão .tex
\end{verbatim}
Para incluir documentos sem quebra de páginas, utilize:
\begin{verbatim}
- \input{documento-a-ser-incluido} % sem a extensão .tex
+\input{documento-a-ser-incluido} % sem a extensão .tex
\end{verbatim}
% ---
@@ -440,7 +467,7 @@ Isso atende à norma \citeonline[seções 5.2.2 a 5.2.4]{NBR14724:2011} e \citeo
Para usar hifenizações de diferentes idiomas, inclua nas opções do documento o nome dos idiomas que o seu texto contém.
-O idioma português-brasileiro (\texttt{brazil}) é incluído automaticamente pela classe {\small\textsf{abntex2}}. Porém, mesmo assim a opção \texttt{brazil} deve ser informada como a última opção da classe para que todos os pacotes reconheçam o idioma. Vale ressaltar que a última opção de idioma é a utilizada por padrão no documento.
+O idioma português-brasileiro (\texttt{brazil}) é incluído automaticamente pela classe \textsf{abntex2}. Porém, mesmo assim a opção \texttt{brazil} deve ser informada como a última opção da classe para que todos os pacotes reconheçam o idioma. Vale ressaltar que a última opção de idioma é a utilizada por padrão no documento.
A lista completa de idiomas suportados, bem como outras opções de hifenização, estão disponíveis em \citeonline[p. 5-6]{babel}.
@@ -464,7 +491,7 @@ A \cref{sec-citacao} descreve o ambiente \texttt{citacao} que pode receber como
\section{Consulte o manual da classe \textsf{abntex2}}
% ---
-Consulte o manual da classe {\small\textsf{abntex2}} \cite{abntex2classe} para uma referência completa das macros e ambientes disponíveis.
+Consulte o manual da classe \textsf{abntex2} \cite{abntex2classe} para uma referência completa das macros e ambientes disponíveis.
Além disso, o manual possui informações adicionais sobre as normas ABNT observadas pelo \abnTeX\ e considerações sobre eventuais requisitos específicos não atendidos, como o caso da \citeonline[seção 5.2.2]{NBR14724:2011}, que especifica o espaçamento entre os capítulos e o início do texto, regra propositalmente não atendida pelo presente modelo.
@@ -472,30 +499,24 @@ Além disso, o manual possui informações adicionais sobre as normas ABNT obser
\section{Referências bibliográficas}
% ---
-A formatação das referências bibliográficas conforme as regras da ABNT são um dos principais objetivos do \abnTeX. Para obter informações sobre como criar entradas em arquivos \Verb[fontsize=\normalsize]|.bib| para diferentes tipos de referências (artigos em periódicos, artigos em anais de eventos, livros, capítulos de livros, etc.) e como utilizá-las, recomenda-se consultar os manuais \citeonline{abntex2cite} e \citeonline{abntex2cite-alf}, disponíveis nos links:
+A formatação das referências bibliográficas conforme as regras da ABNT são um dos principais objetivos do \abnTeX. Para obter informações sobre como criar entradas em arquivos \texttt{bib} para diferentes tipos de referências (artigos em periódicos, artigos em anais de eventos, livros, capítulos de livros, etc.) e como utilizá-las, recomenda-se consultar os manuais \citeonline{abntex2cite} e \citeonline{abntex2cite-alf}, disponíveis nos links:
\begin{itemize}
\item \url{https://tug.ctan.org/macros/latex/contrib/abntex2/doc/abntex2cite.pdf},
\item \url{https://mirrors.ibiblio.org/CTAN/macros/latex/contrib/abntex2/doc/abntex2cite-alf.pdf}.
\end{itemize}
-Note que a classe UnB\TeX\ contempla atualizações mais recentes das normas NBR 6023 \cite{NBR6023:2018} e NBR 10520 \cite{NBR10520:2023} da ABNT, não consideradas no \abnTeX. Os arquivos de estilo \Verb[fontsize=\normalsize]|unbtexcite-en.bst| e \Verb[fontsize=\normalsize]|unbtexcite-pt.bst|, ambos para sistema autor-ano, implementam as alterações nas normas, além de customizar as citações para textos escritos em inglês. O estilo da referências bibliográficas é selecionado por meio do comando \Verb[fontsize=\normalsize]|\bibliographystyle|.
+Note que a classe UnB\TeX\ contempla atualizações mais recentes das normas NBR 6023 \cite{NBR6023:2018} e NBR 10520 \cite{NBR10520:2023} da ABNT, não consideradas no \abnTeX. Os arquivos de estilo \texttt{unbtexcite-en.bst} e \texttt{unbtexcite-pt.bst}, ambos para sistema autor-ano, implementam as alterações nas normas, além de customizar as citações para textos escritos em inglês. O estilo da referências bibliográficas é selecionado por meio do comando \verb|\bibliographystyle|.
Embora as normas da ABNT permitam citações utilizando o formato numérico, é recomendado o uso do sistema autor-ano em trabalhos acadêmicos. A razão é que a leitura por parte do avaliador fica mais simples. Basta ver o nome e o ano para se lembrar rapidamente da referência, sem precisar recorrer frequentemente à lista de referências, que fica no final do texto, tornando a leitura mais agradável.
-No formato autor-data, considere chamar as referências usando o comando \Verb[fontsize=\normalsize]|\citeonline| com maior frequência que o comando \Verb[fontsize=\normalsize]|\cite|. Desse modo, a citação fica melhor incorporada ao texto, outra vantagem do formato autor-data.
+No formato autor-data, considere chamar as referências usando o comando \verb|\citeonline| com maior frequência que o comando \verb|\cite|. Desse modo, a citação fica melhor incorporada ao texto, outra vantagem do formato autor-data.
%-
\subsection{Acentuação de referências bibliográficas}
%-
-Normalmente não há problemas em usar caracteres acentuados em arquivos
-bibliográficos (\Verb[fontsize=\normalsize]|.bib|). Porém, como as regras da ABNT fazem uso quase
-abusivo da conversão para letras maiúsculas, é preciso observar o modo como se
-escreve os nomes dos autores. Na \cref{tabela-acentos} você encontra alguns
-exemplos das conversões mais importantes. Preste atenção especial para `ç' e `í'
-que devem estar envoltos em chaves. A regra geral é sempre usar a acentuação
-neste modo quando houver conversão para letras maiúsculas.
+Normalmente não há problemas em usar caracteres acentuados em arquivos bibliográficos (\texttt{bib}). Porém, como as regras da ABNT fazem uso quase abusivo da conversão para letras maiúsculas, é preciso observar o modo como se escreve os nomes dos autores. Na \cref{tabela-acentos} você encontra alguns exemplos das conversões mais importantes. Preste atenção especial para `ç' e `í' que devem estar envoltos em chaves. A regra geral é sempre usar a acentuação neste modo quando houver conversão para letras maiúsculas.
\begin{table}[htbp]
\begin{center}
@@ -503,9 +524,9 @@ neste modo quando houver conversão para letras maiúsculas.
\label{tabela-acentos}
\begin{tabular}{ll} \hline
acento & bibtex\\ \hline\hline
-à á ã & \verb+\`a+ \verb+\'a+ \verb+\~a+\\ \hline
-í & \verb+{\'\i}+\\ \hline
-ç & \verb+{\c c}+\\ \hline
+à á ã & \verb|\`a| \verb|\'a| \verb|\~a|\\ \hline
+í & \verb|{\'\i}|\\ \hline
+ç & \verb|{\c c}|\\ \hline
\end{tabular}
\end{center}
\end{table}
@@ -516,14 +537,14 @@ acento & bibtex\\ \hline\hline
As listas de ilustrações (figuras) e de tabelas utilizadas ao longo do trabalho são geradas automaticamente e incluídas entre o \emph{Abstract} e o Sumário.
-Para definir um elemento que deverá aparecer na lista de abreviatura e siglas, próximo do texto onde a sigla ou abreviatura aparece, utilize o comando \Verb[fontsize=\normalsize]|\nomenclature|. Por exemplo, para definir as siglas que aparecem no primeiro parágrafo do \cref{cap_intr}, foram utilizados os seguintes comandos:
+Para definir um elemento que deverá aparecer na lista de abreviatura e siglas, próximo do texto onde a sigla ou abreviatura aparece, utilize o comando \verb|\nomenclature|. Por exemplo, para definir as siglas que aparecem no primeiro parágrafo do \cref{cap_intr}, foram utilizados os seguintes comandos:
\begin{verbatim}
\nomenclature[A]{ABNT}{Associação Brasileira de Normas Técnicas}
\nomenclature[A]{UnB}{Universidade de Brasília}
\end{verbatim}
-Para definir um elemento da lista de símbolos, próximo da equação onde o símbolo aparece, utilize também o comando \Verb[fontsize=\normalsize]|\nomenclature|. Por exemplo, para definir os símbolos das equações da \cref{sec-mat}, foram utilizados os comandos:
+Para definir um elemento da lista de símbolos, próximo da equação onde o símbolo aparece, utilize também o comando \verb|\nomenclature|. Por exemplo, para definir os símbolos das equações da \cref{sec-mat}, foram utilizados os comandos:
\begin{verbatim}
\nomenclature[B]{$p$}{Pressão}
@@ -534,19 +555,19 @@ Para definir um elemento da lista de símbolos, próximo da equação onde o sí
\nomenclature[C]{$\psi$}{Ângulo de guinada}
\end{verbatim}
-Note que a letra \Verb[fontsize=\normalsize]|[A]| de \Verb[fontsize=\normalsize]|\nomenclature[A]| indica que o item pertence à lista de abreviaturas e siglas. Já as letras \Verb[fontsize=\normalsize]|[B]| em \Verb[fontsize=\normalsize]|\nomenclature[B]| e \verb|[C]| em \Verb[fontsize=\normalsize]|\nomenclature[C]| referem-se, respectivamente, aos grupos de símbolos romanos e gregos, que compõem a lista de símbolos. As listas e seus grupos estão definidos no arquivo \Verb[fontsize=\normalsize]|unbtex-example.tex|. A ordem de apresentação dos grupos em uma lista segue a ordem alfabética das letras que os designam.
+Note que a letra \verb|[A]| de \verb|\nomenclature[A]| indica que o item pertence à lista de abreviaturas e siglas. Já as letras \verb|[B]| em \verb|\nomenclature[B]| e \verb|[C]| em \verb|\nomenclature[C]| referem-se, respectivamente, aos grupos de símbolos romanos e gregos, que compõem a lista de símbolos. As listas e seus grupos estão definidos no arquivo \texttt{unbtex-example.tex}. A ordem de apresentação dos grupos em uma lista segue a ordem alfabética das letras que os designam.
% ---
\section{Ficha catalográfica com código Cutter-Sanborn}
% ---
A Tabela Cutter-Sanborn é uma codificação elaborada por Charles Ammi Cutter e, posteriormente, expandida por Kate F. Sanborn. Na Tabela Cutter-Sanborn, é possível consultar qual sequência numérica representa a sequência do sobrenome do autor.
-Em vários sites da internet\footnote{\url{https://www.tabelacutter.com/}}\footnote{\url{https://cuttersonline.com.br/registrador-gratuito}} há ferramentas online para obtenção do código. Se o nome do primeiro autor do trabalho for, digamos, Carlos Lisboa, a entrada da ferramenta online deverá ser: \textbf{Lisboa, Carlos}. Nenhuma outra informação é necessária para gerar o código que, no caso desse autor, é \textbf{769}. Considere apenas esses três números. Eventuais letras devem ser ignoradas. No arquivo \Verb[fontsize=\normalsize]|.tex| principal do relatório, na linha que tem o comando \Verb[fontsize=\normalsize]|\numerocutter| troque por
+Em vários sites da internet\footnote{\url{https://www.tabelacutter.com/}}\footnote{\url{https://cuttersonline.com.br/registrador-gratuito}} há ferramentas online para obtenção do código. Se o nome do primeiro autor do trabalho for, digamos, Carlos Lisboa, a entrada da ferramenta online deverá ser: \textbf{Lisboa, Carlos}. Nenhuma outra informação é necessária para gerar o código que, no caso desse autor, é \textbf{769}. Considere apenas esses três números. Eventuais letras devem ser ignoradas. No arquivo \texttt{tex} principal do relatório, na linha que tem o comando \verb|\numerocutter| troque por
\begin{verbatim}
\numerocutter{769}
\end{verbatim}
-Esse número aparecerá na ficha catalográfica gerada. Automaticamente será adicionado na frente do número, a letra \textbf{L} maiúscula, que é a primeira letra do sobrenome \textbf{Lisboa}. Será também adicionado, ao final do número, a letra \textbf{m} minúscula, correspondente à primeira letra do título do trabalho (o título desse relatório de exemplo é ``Modelo de Trabalho Acadêmico com UnB\TeX''). Se seu nome for, por exemplo, Carlos da Silva, utilize como entrada da ferramenta que gera o código: \textbf{Silva, Carlos da}.
+Esse número aparecerá na ficha catalográfica gerada. Automaticamente será adicionado na frente do número, a letra \textbf{L} maiúscula, que é a primeira letra do sobrenome \textbf{Lisboa}. Será também adicionado, ao final do número, a letra \textbf{m} minúscula, correspondente à primeira letra do título do trabalho (o título desse relatório de exemplo é ``Modelo de trabalho acadêmico com UnB\TeX''). Se seu nome for, por exemplo, Carlos da Silva, utilize como entrada da ferramenta que gera o código: \textbf{Silva, Carlos da}.
A ficha catalográfica é um elemento pré-textual obrigatório para todos os trabalhos acadêmicos (teses, dissertações e trabalhos de conclusão de curso: graduação e especialização). \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex b/macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
index 927563d3e7..f63332b28b 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
+++ b/macros/latex/contrib/unbtex/unbtex-example/capitulo3.tex
@@ -9,16 +9,16 @@ Sugiro que você guarde todas as figuras na pasta ``figuras'' para que seu proje
\begin{figure}[htb]
\begin{center}
\includegraphics[width=0.5\linewidth]{1280px-LaTeX-logo.png}
- \caption{Circuito com diodo túnel.} \label{fig:logolatex}
+ \caption{Logo \LaTeX.} \label{fig:logolatex}
\legend{Fonte: Wikimedia Commons \cite{wikimedia-latex}.}
\end{center}
\end{figure}
-Além de figuras, é possível inserir caixas de texto de diversos tipos, como axiomas, teoremas etc.
+Além de figuras, é possível inserir caixas de texto de diversos tipos, como exercícios, exemplos, etc, como o \cref{exc:in} e o \cref{exp:ae}.
\section{Exercício}
-\begin{exercise}
+\begin{exercise}\label{exc:in}
Explique como Isaac Newton usaria cada um dos pacotes seguintes, se vivesse no tempo presente:
\begin{enumerate}[label=(\Alph*)]
\item Metapost
@@ -30,7 +30,7 @@ Além de figuras, é possível inserir caixas de texto de diversos tipos, como a
\section{Exemplo}
-\begin{example}
+\begin{example}\label{exp:ae}
Einstein usaria um editor WYSIWYG ou \LaTeX? \\
Einstein era físico. Portanto, usando o teorema LaTeX-WYSIWYG, concluímos que ele usaria \LaTeX.
\end{example}
@@ -40,48 +40,47 @@ Além de figuras, é possível inserir caixas de texto de diversos tipos, como a
O \cref{alg:NNMPC} é um pseudo-código para obtenção de um controlador preditivo baseado em modelo e em redes neurais.
\begin{algorithm} [ht]
-\caption{NN-based MPC pseudocode for consensus control}
+\caption{Pseudocódigo de MPC baseado em redes neurais para consenso}
\label{alg:NNMPC}
-\begin{algorithmic}[1]
-
+\begin{algorithmic}[1] %\opção para numerar as linhas [1]
%\Procedure{Roy}{$a,b$} \Comment{This is a test}
- \State System Initialization at $x(0), \theta(0)$
+ \State Inicialização do sistema em $x(0), \theta(0)$
\State $J = V(e(0),\theta(0))$
\State $K^{ab}_0 = 0$ $\forall (a,b)$
\State $dataset \gets [K_0,J]$
- \For{$k = 1:k_{max}$} \Comment{Simulation loop}
+ \For{$k = 1:k_{max}$} \Comment{Laço de simulação}
\State $(W,Y) \gets train(dataset)$
\State $\tilde{J} = Y\sigma(Wz)$ $\forall K^{ab}_k\pm \delta_K
$
\State $K_k^{\ast} = arg \min_{K_k}(\tilde{J})$
\State $u(k) = \left( L(\theta(k)) \otimes K_k^{\ast} \right) x(k)$
\State $\hat{x}(k) = x(k)$; $\hat{\theta}(k) = \theta(k)$
- \For{$t = k+1:k+h+1$} \Comment{Prediction loop}
+ \For{$t = k+1:k+h+1$} \Comment{Laço de predição}
%\For{$s = 1:S$} \Comment{Markov loop}
\State $\hat{\theta}(t) = randMarkov(\hat{\theta}(t-1),\Pi)$
\State $p = \hat{\theta}(t)$
\State $\hat{u}(t) = \left( L(p) \otimes K_k^{\ast} \right) \hat{x}(t)$
- \State $\hat{x}(t+1) = F_p(\hat{x}(t))$
+ \State $\hat{x}(t+1) = F_{p}(\hat{x}(t))$
\State $x_0(t) = mean(\hat{x}(t))$
- \State $\hat{e}(t) = F_p(\hat{x}(t)) - \boldsymbol{1_N} f_{p0}(x(t)) $
- \State $\hat{V}_t = \hat{e}^T(t)P_{p}\hat{e}(t)$
+ \State $\hat{e}(t) = F_{p}(\hat{x}(t)) - \boldsymbol{1_N} f_{p0}(x(t)) $
+ \State $\hat{V}_{t} = \hat{e}^T(t)P_{p}\hat{e}(t)$
\EndFor
%\State $r(t) = r(t-k)\Pi^{k}$
%\State $\bar{V}_t = \sum_{s=1}^S r_s(t) V_t^s$
%\EndFor
- \State $\hat{J} = \sum_{t = k+1}^{k+h+1} \hat{V}_t$
+ \State $\hat{J} = \sum_{t = k+1}^{k+h+1} \hat{V}_{t}$
\State $dataset \gets [K^{\ast}_k,\hat{J}]$
- \State $x(k+1) = F_p(x(k))$
+ \State $x(k+1) = F_{p}(x(k))$
\EndFor
-
%\EndProcedure
-
\end{algorithmic}
\end{algorithm}
\section{Programa}
-\begin{lstlisting}
+O \cref{cod_exemplo} é um exemplo de programa. Para mais exemplos, confira o \cref{apd:cdg}.
+
+\begin{lstlisting}[caption={Exemplo de programa},label={cod_exemplo}]
/**
* MSO: ativa o servo cujo eixo eh descrito
* por drive_axis; informacoes de controle
@@ -92,6 +91,4 @@ O \cref{alg:NNMPC} é um pseudo-código para obtenção de um controlador predit
speed[0] := 0.0;
/* Atribui 1 para dataInitialized */
dataInitialized := 1;
-\end{lstlisting}
-
-Para mais exemplos de programas, veja o \cref{apd:cdg} \ No newline at end of file
+\end{lstlisting} \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex b/macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex
new file mode 100644
index 0000000000..e261f6a480
--- /dev/null
+++ b/macros/latex/contrib/unbtex/unbtex-example/codigos/blockdiagram.tex
@@ -0,0 +1,24 @@
+\documentclass[12pt]{article}
+
+\usepackage{stickstootext}
+\usepackage[stickstoo,vvarbb]{newtxmath}
+\usepackage[scaled=0.88]{helvet}
+\usepackage[displaymath,tightpage]{pst-pdf}
+\usepackage{psfrag}
+\usepackage{icomma}
+
+\pagestyle{empty}
+
+\begin{document}
+
+\begin{psfrags}
+ \psfrag{r}[c][c]{\footnotesize $R(s)$}
+ \psfrag{e}[c][c]{\footnotesize $E(s)$}
+ \psfrag{u}[c][c]{\footnotesize $U(s)$}
+ \psfrag{y}[c][c]{\footnotesize $Y(s)$}
+ \psfrag{c}[c][c]{\small $G_C(s)$}
+ \psfrag{g}[c][c]{\small $G(s)$}
+ \includegraphics[scale=1,trim={0pt 0pt 0pt 0pt}]{blockdiagram.eps}
+\end{psfrags}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf b/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
index 95bf0aaf65..0a601849b7 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
+++ b/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagram.pdf
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.eps b/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.eps
new file mode 100644
index 0000000000..76509936e0
--- /dev/null
+++ b/macros/latex/contrib/unbtex/unbtex-example/figuras/blockdiagramfrag.eps
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf b/macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
index fa25eb8161..0ae0b0048a 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
+++ b/macros/latex/contrib/unbtex/unbtex-example/figuras/bodediagram.pdf
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf b/macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
index 4b54436935..f5195b43af 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
+++ b/macros/latex/contrib/unbtex/unbtex-example/figuras/circuito.pdf
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/curva_diodo.pdf b/macros/latex/contrib/unbtex/unbtex-example/figuras/curva_diodo.pdf
deleted file mode 100644
index 760adf341d..0000000000
--- a/macros/latex/contrib/unbtex/unbtex-example/figuras/curva_diodo.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdf b/macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdf
new file mode 100644
index 0000000000..5d2a8759b0
--- /dev/null
+++ b/macros/latex/contrib/unbtex/unbtex-example/figuras/diodocurva.pdf
Binary files differ
diff --git a/macros/latex/contrib/unbtex/unbtex-example/references.bib b/macros/latex/contrib/unbtex/unbtex-example/references.bib
index f951d7b634..e002ec4ac3 100644
--- a/macros/latex/contrib/unbtex/unbtex-example/references.bib
+++ b/macros/latex/contrib/unbtex/unbtex-example/references.bib
@@ -3,7 +3,7 @@
%%%
@misc{wikimedia-latex,
- author = {{WIKIMEDIA COMMONS}},
+ author = {{Wikimedia Commons}},
title = {File: {\normalfont LaTeX logo.svg}},
year = {2008},
note = {Upload de EmilJ. Dispon\'ivel em: \url{https://upload.wikimedia.org/wikipedia/commons/9/92/LaTeX_logo.svg} -- acesso em 24 jan. 2019.}
diff --git a/macros/latex/contrib/unbtex/unbtex.cls b/macros/latex/contrib/unbtex/unbtex.cls
index 57444f3ed9..22649ed005 100644
--- a/macros/latex/contrib/unbtex/unbtex.cls
+++ b/macros/latex/contrib/unbtex/unbtex.cls
@@ -1,7 +1,7 @@
%%
%% UnBTeX: A class for bachelor, master, and doctoral thesis at the
%% University of Brasilia (UnB), Brazil
-%% Version 1.3.3 2023/11/02
+%% Version 1.4 2023/11/15
%% Copyright (C) 2021-2023 by Henrique C. Ferreira <hcferreira@unb.br>
%%
%% This class file may be distributed and/or modified under the conditions
@@ -22,7 +22,7 @@
%%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{unbtex}[2023/11/02 v1.3.3 Modelo da Universidade de Brasília baseado em abnTeX2]
+\ProvidesClass{unbtex}[2023/11/15 v1.4 Modelo da Universidade de Brasília baseado em abnTeX2]
% ---
% Repassa todos os parâmetros a classe abntex2,
@@ -42,21 +42,11 @@
% ---
% Pacotes básicos
% ---
-\RequirePackage[T1]{fontenc} % Seleção de códigos de fonte.
-\RequirePackage[utf8]{inputenc} % Codificação do documento (conversão automática dos acentos)
-\RequirePackage{stix2} % Fonte para o texto e equações
- % Utilizada pelo IEEE, Elsevier, AMS, APS, AIP, ACS...
-\RequirePackage{helvet} % Fonte utilizada para os títulos do trabalho
- % Próxima do padrão da UnB http://www.marca.unb.br/introducao.php
-\RequirePackage{graphicx} % Inclusão de gráficos
-%\RequirePackage{subcaption} % Permite fazer subfiguras
-\RequirePackage{subfig} % Permite fazer subfiguras
-\RequirePackage{icomma} % Configura casas decimais separadas por vírgula
-\RequirePackage{indentfirst} % Indenta o primeiro parágrafo de cada seção.
-\RequirePackage[nopatch=item]{microtype} % Para melhorias de justificação
-\RequirePackage{multirow} % Para combinar linhas nas tabelas
-\RequirePackage[dvipsnames,table]{xcolor} % Para cores da UnB
-\RequirePackage{tocbasic} % Permite ajustar a indentação das listas de figuras e de tabelas
+\RequirePackage{graphicx} % Inclusão de gráficos
+%\RequirePackage{subcaption} % Permite fazer subfiguras
+\RequirePackage{subfig} % Permite fazer subfiguras
+\RequirePackage{multirow} % Para combinar linhas nas tabelas
+\RequirePackage{icomma} % Configura casas decimais separadas por vírgula
% ---
% ---
@@ -72,9 +62,21 @@
% ---
% ---
+% Pacotes de fontes
+% ---
+\RequirePackage{stickstootext} % Fonte para o texto e equações
+ % Utilizada pelo IEEE, Elsevier, AMS, APS, AIP, ACS...
+\RequirePackage[stickstoo,vvarbb]{newtxmath}
+\RequirePackage[scaled=0.88]{helvet}% Fonte utilizada para os títulos do
+ % trabalho (Próxima do padrão da UnB)
+ % http://www.marca.unb.br/introducao.php
+\RequirePackage[scaled=1.03]{inconsolata}
+
+% ---
% Cores verde e azul UnB
% http://www.marca.unb.br/arquivosdigitais/files/guia_pratico/guia_pratico.pdf
% ---
+\RequirePackage[dvipsnames,table]{xcolor} % Para cores da UnB
\definecolor{verdeunb}{cmyk}{1,0,1,0.2}
\definecolor{azulunb}{cmyk}{1,0.65,0,0.35}
@@ -94,15 +96,21 @@
% ---
% Configurações do texto
% ---
-% Tamanho do recuo da primeira linha do parágrafo
-\setlength{\parindent}{1.3cm}
+\RequirePackage{indentfirst} % Indenta o primeiro parágrafo de cada seção.
+\RequirePackage[nopatch=item]{microtype} % Para melhorias de justificação
+\setlength{\parindent}{3em} % Tamanho do recuo da primeira linha do parágrafo
+
+% Ajusta espaço entre texto e figuras/tabelas
+\setlength{\textfloatsep}{18.0pt plus 2.0pt minus 2.0pt}
+\setlength{\floatsep}{12.0pt plus 2.0pt minus 4.0pt}
+\setlength{\intextsep}{12.0pt plus 2.0pt minus 4.0pt}
% Controle do espaçamento entre um parágrafo e outro:
-\setlength{\parskip}{0.2cm} % tente também \onelineskip
+\setlength{\parskip}{4pt}
% Numeração por capítulo das figuras e tabelas
-\renewcommand{\thefigure}{\thechapter.\arabic{figure}}
-\renewcommand{\thetable}{\thechapter.\arabic{table}}
+\renewcommand{\thefigure}{\thechapter.\arabic{figure}}\numberwithin{figure}{chapter}
+\renewcommand{\thetable}{\thechapter.\arabic{table}}\numberwithin{table}{chapter}
% configuração do cabeçalho das páginas
\pagestyle{myheadings} % cabeçalho com linha e numeração da página
@@ -111,8 +119,14 @@
% Retira espaço extra entre as frases.
\frenchspacing
-% Alterando o espaçamento entre linhas do ambiente verbatim
-\def\verbatim@font{\linespread{1}\small\ttfamily}
+% Modifica o tamanho da fonte e espaçamento entre linhas no ambiente verbatim
+\usepackage{fvextra}
+\renewenvironment{verbatim}{%
+ \VerbatimEnvironment
+ \begin{Verbatim}[fontsize=\small,baselinestretch=1.1]%
+}{%
+ \end{Verbatim}%
+}
% Personalização do Sumário
\settocdepth{subsection}
@@ -138,7 +152,7 @@
% ---
% Pacotes para algoritmos
% ---
-\RequirePackage{algorithm}
+\RequirePackage[chapter]{algorithm}
\RequirePackage{algpseudocode}
% ---
@@ -180,56 +194,38 @@
morestring=[m]{'}{'},%
}[keywords,comments,strings]%
-\lstset{%
- language = Julia,
- basicstyle = \ttfamily,
- keywordstyle = \bfseries\color{blue},
- stringstyle = \color{magenta},
- commentstyle = \color{ForestGreen},
- showstringspaces = false
-}
+\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
+\definecolor{mylilas}{RGB}{170,55,241}
-% Python
\lstset{
- language = Python,
- basicstyle=\linespread{1}\ttfamily\small,
- numberstyle=\footnotesize,
- numbers=left,
+ basicstyle=\linespread{1.1}\ttfamily\footnotesize,
+ numbers=left,%
+ numberstyle={\scriptsize \color{black}},% size of the numbers
+ numbersep=9pt, % this defines how far the numbers are from the text
backgroundcolor=\color{gray!10},
- frame=single,
tabsize=2,
+ frame=single,
rulecolor=\color{black!30},
- title=\lstname,
+ %title=\lstname,
+ captionpos=t,
escapeinside={\%*}{*)},
- breaklines=true,
+ breaklines=true,%
breakatwhitespace=true,
framextopmargin=2pt,
framexbottommargin=2pt,
- extendedchars=true,
- inputencoding=utf8,
- literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {â}{{\^a}}1 {õ}{{\~o}}1 {ú}{{\'u}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {Í}{{\'I}}1
-}
-
-\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
-\definecolor{mylilas}{RGB}{170,55,241}
-% Matlab
-\lstset{language=Matlab,%
- %basicstyle=\color{red},
- breaklines=true,%
- morekeywords={matlab2tikz},
keywordstyle=\color{blue},%
morekeywords=[2]{1}, keywordstyle=[2]{\color{black}},
identifierstyle=\color{black},%
stringstyle=\color{mylilas},
commentstyle=\color{mygreen},%
+ extendedchars=true,
+ inputencoding=utf8,
showstringspaces=false,%without this there will be a symbol in the places where there is a space
- numbers=left,%
- numberstyle={\tiny \color{black}},% size of the numbers
- numbersep=9pt, % this defines how far the numbers are from the text
- emph=[1]{for,end,break},emphstyle=[1]\color{red}, %some words to emphasise
- %emph=[2]{word1,word2}, emphstyle=[2]{style},
+ literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {â}{{\^a}}1 {õ}{{\~o}}1 {ú}{{\'u}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {Í}{{\'I}}1
}
-% ---
+
+% Referências cruzadas automáticas, dependendo do tipo de referência (figuras, tabelas, equações, etc.)
+\RequirePackage[nameinlink,noabbrev,english,brazilian]{cleveref}
% ---
% Definição de ambientes definição, teorema, exemplo, demonstração, etc.
@@ -275,7 +271,12 @@
\newcommand{\ecname}{Exercise}
\newcommand{\pbname}{Problem}
\newcommand{\rmname}{Remark}
-\renewcommand{\proofname}{Proof}}
+\renewcommand{\proofname}{Proof}
+\renewcommand{\lstlistingname}{Code}
+\crefname{listing}{code}{codes}
+\Crefname{listing}{Code}{Codes}
+\renewcommand{\ALG@name}{Algorithm}
+}
\newcommand{\thmnamebr}{
\newcommand{\thname}{Teorema}
@@ -288,7 +289,12 @@
\newcommand{\ecname}{Exercício}
\newcommand{\pbname}{Problema}
\newcommand{\rmname}{Observação}
-\renewcommand{\proofname}{Demonstração}}
+\renewcommand{\proofname}{Demonstração}
+\renewcommand{\lstlistingname}{Código}
+\crefname{listing}{código}{códigos}
+\Crefname{listing}{Código}{Códigos}
+\renewcommand{\ALG@name}{Algoritmo}
+}
% ---
% ------------------------------------------------------------------------
@@ -347,19 +353,19 @@
\center
\AddToShipoutPicture*{\BackgroundPic}
\vspace*{7.5cm}
- {\bfseries\sffamily\Large \instituicaoi \par \instituicaoii} \par
- \abntex@ifnotempty{\instituicaoiii}{{\bfseries\sffamily\Large\instituicaoiii}}
+ {\bfseries\sffamily\LARGE \instituicaoi \par \instituicaoii} \par
+ \abntex@ifnotempty{\instituicaoiii}{{\bfseries\sffamily\LARGE\instituicaoiii}}
\begin{center}
\vfill
- \bfseries\sffamily\LARGE\imprimirtitulo
+ \bfseries\sffamily\Huge\imprimirtitulo
\end{center}
\vfill
- {\large\autorinome\ \autorisobrenome
+ {\Large\autorinome\ \autorisobrenome
\par
\abntex@ifnotempty{\autoriinome}{\autoriinome\ \autoriisobrenome}}
\vfill
\begin{center}
- \color{white}{\sffamily\large\expandafter\MakeUppercase\expandafter \imprimirtipotrabalho \par \expandafter\MakeUppercase\expandafter\imprimircurso \\ \vspace{0.5cm} \imprimirlocal \par \imprimirano}
+ \color{white}{\sffamily\Large\expandafter\MakeUppercase\expandafter \imprimirtipotrabalho \par \expandafter\MakeUppercase\expandafter\imprimircurso \\ \vspace{0.2cm} \imprimirlocal \par \imprimirano}
\end{center}
\end{capa}
}
@@ -386,12 +392,12 @@
\renewcommand{\folhaderostocontent}{
\begin{center}
- {\bfseries\sffamily\Large \instituicaoi \par \instituicaoii} \par
- \abntex@ifnotempty{\instituicaoiii}{{\bfseries\sffamily\Large\instituicaoiii}}
+ {\bfseries\sffamily\LARGE \instituicaoi \par \instituicaoii} \par
+ \abntex@ifnotempty{\instituicaoiii}{{\bfseries\sffamily\LARGE\instituicaoiii}}
\vfill\vfill\vfill
\begin{center}
-\color{verdeunb}\bfseries\sffamily\LARGE\ifthenelse{\equal{\imprimirtituloestrangeiro}{}}{\imprimirtitulo}{\imprimirtituloestrangeiro}
+\color{verdeunb}\bfseries\sffamily\Huge\ifthenelse{\equal{\imprimirtituloestrangeiro}{}}{\imprimirtitulo}{\imprimirtituloestrangeiro}
\end{center}
\vfill
@@ -469,11 +475,11 @@
\newcommand{\imprimirfolhadeaprovacao}{
\begin{folhadeaprovacao}
\begin{center}
- {\bfseries\sffamily\Large \instituicaoi \par\vspace{4pt} \instituicaoii} \par
+ {\bfseries\sffamily\Large \instituicaoi \par\vspace{0.5mm} \instituicaoii} \par
\abntex@ifnotempty{\instituicaoiii}{{\bfseries\sffamily\Large\instituicaoiii}}
\vfill\vfill
\begin{center}
- \color{verdeunb}\bfseries\sffamily\Large\imprimirtitulo
+ \color{verdeunb}\bfseries\sffamily\LARGE\imprimirtitulo
\end{center}
\vfill
@@ -495,9 +501,10 @@
\imprimirpreambulo}
}
\end{minipage}%
- \vfill
}%
+\vspace{0.8cm}
+
\raggedright { Trabalho aprovado. \imprimirlocal, \imprimirdia\ de \imprimirmes\ de \imprimirano:}
{
\assinatura{\textbf{\membrodabancainome} \\ \membrodabancaifuncaonome}
@@ -520,19 +527,14 @@
% Correção para o pacote microtype
\makeatletter
\long\def\MT@prot@l#1{%
- \MT@get@prot{#1}{left}%
- \leavevmode
- #1}
-\def\MT@prot@group@@{%
- \catcode`\\=0
- \catcode`\^^M=10
- \makeatletter
- {\expandafter\MT@prot@l\expandafter
- {\expandafter\scantokens\expandafter{\the\MT@toks\noexpand}}}%
- \endgroup}
+ \MT@get@prot{#1}{left}%
+ \leavevmode
+ #1}
+\def\MT@prot@group#{\bgroup\afterassignment\MT@prot@get@firstchar\let\MT@temp= }
\makeatother
% Ajusta a indentação das listas de figuras e de tabelas
+\RequirePackage{tocbasic}
\DeclareTOCStyleEntry[
indent=0pt,
entrynumberformat=\entrynumberwithprefix{\figurename},
diff --git a/macros/latex/contrib/unbtex/unbtexcite-en.bst b/macros/latex/contrib/unbtex/unbtexcite-en.bst
index 62da0cb780..087aca8fe5 100644
--- a/macros/latex/contrib/unbtex/unbtexcite-en.bst
+++ b/macros/latex/contrib/unbtex/unbtexcite-en.bst
@@ -101,7 +101,6 @@ FUNCTION {init.state.consts}
#3 'after.block :=
}
-
%output.nonnull decides what is written before the argument s, if a comma, period etc.
FUNCTION {output.nonnull}
{ 's := %the argument is written into s
@@ -227,7 +226,6 @@ FUNCTION {emphasize}
if$
}
-
FUNCTION {tie.or.space.prefix} %if text length less than 3 chars. uses a tie
{ duplicate$ text.length$ #5 <
{ "~" }
@@ -679,7 +677,6 @@ FUNCTION {format.title.as.author}
s
}
-
%compares current title with the title of the previous entry
FUNCTION {compare.title}
{abnt.repeated.title.omit
@@ -2132,10 +2129,12 @@ FUNCTION {begin.bib}
{"\providecommand{\bibtextitlecommand}[2]{#2}" write$ newline$}
'skip$ if$
"\abntbstabout{" abnt.bst.revision * "}" * write$ newline$
- %Se você não usa abntcite e precisa que a margem direita não
- %seja justificada, descomente a linha seguinte
- %alternativamente coloque \bibliography{abnt-nrj,...
-% "\setlength{\rightskip}{0pt plus 2cm}" write$ newline$
+% Ajusta o espaçamento entre linhas e a indentação nas
+% referênciasbibliográficas
+"\setlength{\baselineskip}{18pt}" write$ newline$
+"\setlength{\leftskip}{3em}" write$ newline$
+"\setlength{\itemindent}{-\leftskip}" write$ newline$
+"\setlength{\itemsep}{0pt}" write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
diff --git a/macros/latex/contrib/unbtex/unbtexcite-pt.bst b/macros/latex/contrib/unbtex/unbtexcite-pt.bst
index 29a648b4e2..4700374c48 100644
--- a/macros/latex/contrib/unbtex/unbtexcite-pt.bst
+++ b/macros/latex/contrib/unbtex/unbtexcite-pt.bst
@@ -2127,10 +2127,12 @@ FUNCTION {begin.bib}
{"\providecommand{\bibtextitlecommand}[2]{#2}" write$ newline$}
'skip$ if$
"\abntbstabout{" abnt.bst.revision * "}" * write$ newline$
- %Se você não usa abntcite e precisa que a margem direita não
- %seja justificada, descomente a linha seguinte
- %alternativamente coloque \bibliography{abnt-nrj,...
-% "\setlength{\rightskip}{0pt plus 2cm}" write$ newline$
+% Ajusta o espaçamento entre linhas e a indentação nas
+% referênciasbibliográficas
+"\setlength{\baselineskip}{18pt}" write$ newline$
+"\setlength{\leftskip}{3em}" write$ newline$
+"\setlength{\itemindent}{-\leftskip}" write$ newline$
+"\setlength{\itemsep}{0pt}" write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdf b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdf
new file mode 100644
index 0000000000..165047d194
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.pdf
Binary files differ
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex
new file mode 100644
index 0000000000..4e2ef345b6
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-5x5-A5.tex
@@ -0,0 +1,27 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[a5paper,11pt]{article}
+\usepackage{WriteOnGrid}
+\usepackage{lipsum}
+\usepackage{frcursive}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{PleinePageCinqCinq}[FormatPapier=A5,NumLignes]
+%entête
+\LignePapierCinqCinq[Echelle=1.25,Ligne=1]{C. PIERQUET \hfill \LaTeX}
+%titre
+\LignePapierCinqCinq[Echelle=1.25,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 1}}
+%cadre de notes
+\CadreNoteCinqCinq{3}
+%ligne pour un petit titre
+\LignePapierCinqCinq[Echelle=1.25,Ligne=8,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
+%%paragraphe lipsum avec une échelle de 1.15 := calcul de l'interligne
+\ParagraphePapierCinqCinq[Ligne=10,Echelle=1.15,Espacement=\fpeval{10/1.15}]{\cursive\lipsum[1][1-7]}
+\end{PleinePageCinqCinq}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdf b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdf
new file mode 100644
index 0000000000..0113533686
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.pdf
Binary files differ
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex
new file mode 100644
index 0000000000..646923f295
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Ruled-A5.tex
@@ -0,0 +1,27 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[a5paper,11pt]{article}
+\usepackage{WriteOnGrid}
+\usepackage{lipsum}
+\usepackage{frcursive}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{PleinePageRuled}[FormatPapier=A5,NumLignes]
+%entête
+\LignePapierRuled[Echelle=1.25,Ligne=1]{C. PIERQUET \hfill \LaTeX}
+%titre
+\LignePapierRuled[Echelle=1.25,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 1}}
+%cadre de notes
+\CadreNoteRuled{3}
+%ligne pour un petit titre
+\LignePapierRuled[Echelle=1.25,Ligne=8,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
+%paragraphe lipsum avec une échelle de 1.15 := calcul de l'interligne
+\ParagraphePapierRuled[Ligne=10,Echelle=1.15,Espacement=\fpeval{9/1.15}]{\cursive\lipsum[1][1-7]}
+\end{PleinePageRuled}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdf b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdf
new file mode 100644
index 0000000000..e4d9b5d64a
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.pdf
Binary files differ
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex
new file mode 100644
index 0000000000..2655e42940
--- /dev/null
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-Seyes-A5.tex
@@ -0,0 +1,27 @@
+% !TeX TXS-program:compile = txs:///arara
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode}
+% arara: pdflatex: {shell: no, synctex: yes, interaction: batchmode} if found('log', '(undefined references|Please rerun|Rerun to get)')
+
+\documentclass[a5paper,11pt]{article}
+\usepackage{WriteOnGrid}
+\usepackage{lipsum}
+\usepackage{frcursive}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{PleinePageSeyes}[FormatPapier=A5,NumLignes,ReglureSeyes=2.5]
+%entête
+\LignePapierSeyes[Echelle=2,Ligne=1]{C. PIERQUET \hfill LaTeX}
+%titre
+\LignePapierSeyes[Echelle=2,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 1}}
+%cadre de notes
+\CadreNoteSeyes[2]{3}
+%ligne pour un petit titre
+\LignePapierSeyes[Echelle=2,Ligne=6,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
+%paragraphe lipsum avec une échelle de 1.5
+\ParagraphePapierSeyes[Ligne=7,Echelle=1.5]{\cursive\lipsum[1][1-7]}
+\end{PleinePageSeyes}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
index 8fd6d57bd4..2e3d3e8a32 100644
--- a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.pdf
Binary files differ
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
index a4eb7773f4..3648aa6f50 100644
--- a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-en.tex
@@ -45,8 +45,8 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\TPversion{0.1.4}
-\def\TPdate{09/08/2023}
+\def\TPversion{0.1.5}
+\def\TPdate{15/11/2023}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
@@ -501,7 +501,9 @@ To sum up, they create full paper grid (by preference for \texttt{\textbf{a4pape
\part*{History}
-\verb|v0.1.4|~:~~~~\texttt{xcolor} isn't loadeed with \textsf{[table,svgnames]})
+\verb|v0.1.4|~:~~~~New \texttt{[keys]} + enhancements for paragraphs, for french version (for the moment\dots)
+
+\verb|v0.1.4|~:~~~~\texttt{xcolor} isn't loaded with \textsf{[table,svgnames]})
\verb|v0.1.3|~:~~~~Command to display a grid (w/o writing on it)
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
index 4d2e8e30a7..c3573469d1 100644
--- a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.pdf
Binary files differ
diff --git a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
index f8eb908f45..74ac22a898 100644
--- a/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
+++ b/macros/latex/contrib/writeongrid/doc/WriteOnGrid-doc-fr.tex
@@ -48,8 +48,8 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\TPversion{0.1.4}
-\def\TPdate{09 août 2023}
+\def\TPversion{0.1.5}
+\def\TPdate{15 novembre 2023}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted}
@@ -290,6 +290,7 @@ Le premier argument, \textit{optionnel}, entre \texttt{[...]} propose les \Cle{c
\item \Cle{Elargir} pour préciser les carreaux de débordements, sous la forme unique \texttt{\textcolor{red}{G}\textcolor{blue}{D}} ou par côté \texttt{\textcolor{red}{G}/\textcolor{blue}{D}} ;\hfill~défaut : \Cle{0}
\item le booléen \Cle{Cadre} pour afficher le cadre de base du quadrillage ;\hfill~défaut : \Cle{false}
\item la clé \Cle{Grille}, parmi \Cle{5x5 / Seyes / Ruled}, pour spécifier le type de quadrillage ;\hfill~défaut : \Cle{5x5}
+ \item la clé \Cle{ReglureSeyes} pour paramétrer (en mm) la réglure dans le cas de lignes Seyes ;\hfill~défaut : \Cle{2}
\item la clé \Cle{CouleurBarreSeyes} pour rajouter un trait vertical pour le papier Seyes .\hfill~défaut : \Cle{red!75}
\end{itemize}
@@ -303,13 +304,11 @@ Le second argument, \textit{optionnel}, entre \texttt{<...>} correspond quant à
\medskip
\begin{PresentationCode}{listing only}
-%des cadres ont été rajoutés pour la sortie
-
%18x4 grands carreaux, sans dépassement, couleurs adaptées, sans marge/barre
-\AffQuadrillage[NbCarreaux=18x4,Grille=Seyes,AffBarre=false]<\CoulSeyes>
+\AffQuadrillage[NbCarreaux=16x4,Grille=Seyes,ReglureSeyes=2.5,AffBarre=false]<\CoulSeyes>
%36x8 petits carreaux, avec débordements 3/3, couleur PapierGris
-\AffQuadrillage[NbCarreaux=36x8,Elargir=3/3]<PapierGris>
+\AffQuadrillage[NbCarreaux=36x6,Elargir=3/3]<PapierGris>
%12x3 lignes "Ruled", sans débordements, couleur Ruled, centré, avec marge
\begin{center}
@@ -319,7 +318,7 @@ Le second argument, \textit{optionnel}, entre \texttt{<...>} correspond quant à
\medskip
-\AffQuadrillage[NbCarreaux=18x4,Grille=Seyes,AffBarre=false]<\CoulSeyes>
+\AffQuadrillage[NbCarreaux=18x4,Grille=Seyes,ReglureSeyes=2.5,AffBarre=false]<\CoulSeyes>
\medskip
@@ -351,6 +350,7 @@ Le premier argument, \textit{optionnel}, entre \texttt{[...]} propose les \Cle{c
\item \Cle{Elargir} pour préciser les carreaux de débordements, sous la forme unique \texttt{\textcolor{red}{G}\textcolor{blue}{D}} ou par côté \texttt{\textcolor{red}{G}/\textcolor{blue}{D}} ;\hfill~défaut : \Cle{0}
\item le booléen \Cle{Cadre} pour afficher le cadre de base du quadrillage ;\hfill~défaut : \Cle{false}
\item la clé \Cle{Grille}, parmi \Cle{5x5 / Seyes / Ruled}, pour spécifier le type de quadrillage ;\hfill~défaut : \Cle{5x5}
+ \item la clé \Cle{ReglureSeyes} pour paramétrer (en mm) la réglure dans le cas de lignes Seyes ;\hfill~défaut : \Cle{2}
\item la clé \Cle{CouleurBarreSeyes} pour rajouter un trait vertical pour le papier Seyes .\hfill~défaut : \Cle{red!75}
\end{itemize}
@@ -475,7 +475,7 @@ Le troisième argument, \textit{obligatoire} et entre \texttt{\{...\}} est quant
Il s'agit ici de créer le quadrillage Seyes sur la page complète, comme pour la copie d'un élève !
-Dans ce cas, le type de papier utilisé \textbf{doit} être \texttt{a4}, et les unités sont fixées à 1~cm !
+Il est possible de paramétrer le type de papier (A4, A5 ou Lxh), et les marges sont adaptées automatiquement pour coller au type de papier.
\smallskip
@@ -505,7 +505,9 @@ Pour l'environnement de création de la grille, l'argument, \textit{optionnel} e
\item la clé \Cle{CouleurP} pour la couleur des \textit{gros traits} ;\hfill~défaut : \Cle{PapierRose}
\item la clé \Cle{CouleurS} pour la couleur des \textit{petits traits} ;\hfill~défaut : \Cle{PapierGris}
\item la clé \Cle{CouleurMarge} pour la couleur du trait de la marge ;\hfill~défaut : \Cle{red!75}
- \item le booléen \Cle{NumLignes} pour afficher le numéro des lignes (pour aider !). \hfill~défaut : \Cle{false}
+ \item le booléen \Cle{NumLignes} pour afficher le numéro des lignes (pour aider !) ; \hfill~défaut : \Cle{false}
+ \item la cle \Cle{ReglureSeyes} pour spécifier la réglure, en mm ;\hfill~défaut : \Cle{2}
+ \item la cle \Cle{FormatPapier} parmi \Cle{A4 / A5 / lxh}. \hfill~défaut : \Cle{A4}
\end{itemize}
\subsection{La commande pour saisir une ligne}
@@ -526,7 +528,7 @@ Le premier argument, \textit{optionnel} et entre \texttt{[...]} propose :
\item la clé \Cle{Couleur} pour spécifier une couleur globale pour le texte ;\hfill~défaut : \Cle{black}
\item la clé \Cle{Echelle} pour spécifier une échelle globale pour le texte ;\hfill~défaut : \Cle{1}
\item la clé \Cle{Ligne} pour spécifier le numéro de ligne sur lequel on souhaite écrire ;\hfill~défaut : \Cle{1}
- \item la clé \Cle{Largeur} pour spécifier la largeur (en cm) de la boîte dans laquelle le texte sera placé.\hfill~défaut : \Cle{16.8}
+ \item la clé \Cle{Largeur} pour spécifier la largeur (en cm) de la boîte dans laquelle le texte sera placé.\hfill~défaut : \Cle{auto}
\end{itemize}
Le deuxième argument, \textit{optionnel} et entre \texttt{<...>}, permet de spécifier l'alignement souhaité pour la ligne, parmi \Cle{left/center/right}, et vaut \Cle{left} par défaut.
@@ -565,9 +567,9 @@ Le premier argument, \textit{optionnel} et entre \texttt{[...]} propose :
\begin{itemize}
\item la clé \Cle{Couleur} pour spécifier une couleur globale pour le texte ;\hfill~défaut : \Cle{black}
- \item la clé \Cle{TaillePolice} pour spécifier la taille, en points, du texte ;\hfill~défaut : \Cle{1}
- \item la clé \Cle{Espacement}, en points, pour que l'interligne soit OK ;\hfill~défaut : \Cle{22.792}
- \item la clé \Cle{Largeur} pour la largeur (en cm) de la boîte dans laquelle le paragraphe sera placé.\hfill~défaut : \Cle{16.8}
+ \item la clé \Cle{Echelle} pour spécifier une échelle pour le texte ; \hfill~défaut : \Cle{1}
+ \item la clé \Cle{Espacement} (éventuellement à \textit{calculer} avec une échelle), pour que l'interligne soit OK ;\hfill~défaut : \Cle{auto}
+ \item la clé \Cle{Largeur} pour la largeur (en cm) de la boîte dans laquelle le paragraphe sera placé.\hfill~défaut : \Cle{auto}
\end{itemize}
Le deuxième argument, \textit{optionnel} et entre \texttt{<...>}, permet de spécifier l'alignement souhaité pour la ligne, parmi \Cle{left/center/right/justify}, et vaut \Cle{justify} par défaut.
@@ -618,7 +620,7 @@ Un exemple \textit{détaillé}, avec le rendu en page suivante, avec quelques co
\end{align*}
}
%un paragraphe multiligne, avec police agrandie
- \ParagraphePapierSeyes[TaillePolice=14,Ligne=30]
+ \ParagraphePapierSeyes[Echelle=1.15,Ligne=30]
{BlablablaBlablabla.\\BlablablaBlablablaBlablablaBlablabla.}
\end{PleinePageSeyes}
\end{PresentationCode}
@@ -658,12 +660,50 @@ Un exemple \textit{détaillé}, avec le rendu en page suivante, avec quelques co
\end{align*}
}
%un paragraphe multiligne, avec police aggrandie
- \ParagraphePapierSeyes[TaillePolice=14,Ligne=30]
+ \ParagraphePapierSeyes[Echelle=1.15,Ligne=30]
{BlablablaBlablabla.\\BlablablaBlablablaBlablablaBlablabla.}
\end{PleinePageSeyes}
\pagebreak
+\subsection{Exemple \og détaillé \fg{} en mode A5}
+
+Un exemple \textit{détaillé}, avec le rendu en page suivante, avec quelques commentaires pour expliquer.
+
+\begin{PresentationCode}{listing only}
+\documentclass[a5paper,11pt]{article}
+\usepackage{WriteOnGrid}
+\usepackage{lipsum}
+\usepackage{frcursive}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\begin{PleinePageSeyes}[FormatPapier=A5,NumLignes,ReglureSeyes=2.5]
+ %entête
+ \LignePapierSeyes[Echelle=2,Ligne=1]{C. PIERQUET \hfill LaTeX}
+ %titre
+ \LignePapierSeyes[Echelle=2,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 1}}
+ %cadre de notes
+ \CadreNoteSeyes[2]{3}
+ %ligne pour un petit titre
+ \LignePapierSeyes[Echelle=2,Ligne=6,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
+ %paragraphe lipsum avec une échelle de 1.5
+ \ParagraphePapierSeyes[Ligne=7,Echelle=1.5]{\cursive\lipsum[1][1-7]}
+\end{PleinePageSeyes}
+
+\end{document}
+\end{PresentationCode}
+
+\pagebreak
+
+\fbox{%
+\includegraphics{WriteOnGrid-Seyes-A5.pdf}
+}
+
+\pagebreak
+
\section{Pages type 5x5 et College Ruled}
\subsection{Fonctionnement global}
@@ -706,8 +746,9 @@ Les exemples des pages suivantes ont été obtenus de la même manière que celu
\LignePapierCinqCinq[Echelle=1.25,Ligne=3,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 2}}
\CadreNoteCinqCinq{4}
\LignePapierCinqCinq[Echelle=1.25,Ligne=9,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
- \ParagraphePapierCinqCinq[Ligne=11]{\cursive\lipsum[1]}
- \ParagraphePapierCinqCinq[Ligne=30]
+ %echelle de 1.25 et espacement de 10mm (2 lignes) := calcul 10/1.25 pour l'espacement
+ \ParagraphePapierCinqCinq[Ligne=11,Echelle=1.25,Espacement=\fpeval{10/1.25}]{\cursive\lipsum[1]}
+ \ParagraphePapierCinqCinq[Ligne=38]
{%
On essaye avec des maths $1+\frac12=\frac32$ en mode ligne avec des lignes assez longues pour voir
ce que ça peut donner\ldots Et une intégrale $\int_0^1 2x dx = 1$.\\On essaye en passant à la ligne !!!
@@ -723,8 +764,9 @@ Les exemples des pages suivantes ont été obtenus de la même manière que celu
\LignePapierRuled[Echelle=1.25,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 3}}
\CadreNoteRuled{3}
\LignePapierRuled[Echelle=1.25,Ligne=8,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
- \ParagraphePapierRuled[Ligne=9]{\cursive\lipsum[1]}
- \ParagraphePapierRuled[Ligne=22]
+ %echelle de 1.33 et espacement de 9mm (1 ligne) := calcul 9/1.33 pour l'espacement
+ \ParagraphePapierRuled[Ligne=9,Echelle=1.33,Espacement=\fpeval{9/1.25}]{\cursive\lipsum[1]}
+ \ParagraphePapierRuled[Ligne=28]
{%
On essaye avec des maths $1+\frac12=\frac32$ en mode ligne avec des lignes assez longues pour voir
ce que ça peut donner\ldots Et une intégrale $\int_0^1 2x dx = 1$.\\On essaye en passant à la ligne !!!
@@ -741,8 +783,9 @@ Les exemples des pages suivantes ont été obtenus de la même manière que celu
\LignePapierCinqCinq[Echelle=1.25,Ligne=3,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 2}}
\CadreNoteCinqCinq{4}
\LignePapierCinqCinq[Echelle=1.25,Ligne=9,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
- \ParagraphePapierCinqCinq[Ligne=11]{\cursive\lipsum[1]}
- \ParagraphePapierCinqCinq[Ligne=30]
+ %echelle de 1.25 et espacement de 10mm (2 lignes) := calcul 10/1.25 pour l'espacement
+ \ParagraphePapierCinqCinq[Ligne=11,Echelle=1.25,Espacement=\fpeval{10/1.25}]{\cursive\lipsum[1]}
+ \ParagraphePapierCinqCinq[Ligne=38]
{%
On essaye avec des maths $1+\frac12=\frac32$ en mode ligne avec des lignes assez longues pour voir
ce que ça peut donner\ldots Et une intégrale $\int_0^1 2x dx = 1$.\\On essaye en passant à la ligne !!!
@@ -758,8 +801,8 @@ Les exemples des pages suivantes ont été obtenus de la même manière que celu
\LignePapierRuled[Echelle=1.25,Ligne=2,Couleur=red]<center>{\underline{\cursive\bfseries Devoir 3}}
\CadreNoteRuled{3}
\LignePapierRuled[Echelle=1.25,Ligne=8,Couleur=green!50!black]{\sffamily\underline{Exercice 1 :}}
- \ParagraphePapierRuled[Ligne=9]{\cursive\lipsum[1]}
- \ParagraphePapierRuled[Ligne=22]
+ \ParagraphePapierRuled[Ligne=9,Echelle=1.33,Espacement=\fpeval{9/1.33}]{\cursive\lipsum[1]}
+ \ParagraphePapierRuled[Ligne=28]
{%
On essaye avec des maths $1+\frac12=\frac32$ en mode ligne avec des lignes assez longues pour voir
ce que ça peut donner\ldots Et une intégrale $\int_0^1 2x dx = 1$.\\On essaye en passant à la ligne !!!
@@ -770,6 +813,10 @@ Les exemples des pages suivantes ont été obtenus de la même manière que celu
\section{Historique}
+\verb|v0.1.5|~:~~~~Possibilité de spécifier la réglure pour les quadrillages de type \textsf{Seyes} + meilleure gestion des paragraphes.
+
+\phantom{\texttt{v0.1.5}}~:~~~~Amélioration de la gestion des paragraphes en mode \textsf{pleine page}.
+
\verb|v0.1.4|~:~~~~Modification de la gestion des couleurs (\texttt{xcolor} n'est plus chargé avec \textsf{[table,svgnames]})
\verb|v0.1.3|~:~~~~Ajout d'une commande pour afficher (sans écrire dessus) une grille
diff --git a/macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty b/macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
index f5a6f6adf9..f6a9d6199e 100644
--- a/macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
+++ b/macros/latex/contrib/writeongrid/tex/WriteOnGrid.sty
@@ -2,7 +2,8 @@
% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{WriteOnGrid}[2023/08/09 v0.1.4 package to write on grid lines]
+\ProvidesPackage{WriteOnGrid}[2023/11/15 v0.1.5 package to write on grid lines]
+% 0.1.5 Choix de la réglure pour le seyes (en pretest) + amélioration de la gestion des paragraphes
% 0.1.4 Suppression des options de xcolor (définition manuelle des couleurs)
% 0.1.3 Ajout de commandes simples pour des mini-quadrillages autonomes, sans texte
% 0.1.2 Modification locale des couleurs + raccourcis couleurs Seyes / Ruled
@@ -10,7 +11,6 @@
% 0.1.0 Version initiale [fr] & [en]
%------Packages utiles
-%\RequirePackage[table,svgnames]{xcolor}
\RequirePackage{tikz}
\RequirePackage{simplekv}
\RequirePackage{xstring}
@@ -24,8 +24,10 @@
\definecolor{TyrianPurple}{rgb}{0.4,0.01,0.24}
\definecolor{PapierRose}{HTML}{E6B8E6}
\definecolor{PapierGris}{HTML}{D7E2EE}
+
\def\CoulSeyes{PapierRose/PapierGris}
\def\CoulRuled{PapierGris/TyrianPurple}
+
\def\ColSeyes{PapierRose/PapierGris}
\def\ColRuled{PapierGris/TyrianPurple}
@@ -44,7 +46,7 @@
\addtocounter{lgquadri}{1}
\useKVdefault[LigneQuadrill]
\setKV[LigneQuadrill]{#1}
- \node[text width=\fpeval{\ValeurCarreau*\QuadNbCol/\QuadEchelle-\ValeurCarreau*\useKV[Quadrill]{Marge}/\QuadEchelle}cm,align=#2,scale=\QuadEchelle,anchor=base west,inner sep={\useKV[LigneQuadrill]{Sep}}] at ($({\ValeurCarreau*\useKV[Quadrill]{Marge}+\ValeurCarreau*\useKV[LigneQuadrill]{DecalH}},{-\ValeurCarreau*\thelgquadri})+(0.025,\useKV[LigneQuadrill]{DecalV})$) {\strut #3} ;
+ \node[text width=\fpeval{\CoeffUnite*\ValeurCarreau*\QuadNbCol/\QuadEchelle-\CoeffUnite*\ValeurCarreau*\useKV[Quadrill]{Marge}/\QuadEchelle}cm,align=#2,scale=\QuadEchelle,anchor=base west,inner sep={\useKV[LigneQuadrill]{Sep}}] at ($({\ValeurCarreau*\useKV[Quadrill]{Marge}+\ValeurCarreau*\useKV[LigneQuadrill]{DecalH}},{-\ValeurCarreau*\thelgquadri})+(0.025,\useKV[LigneQuadrill]{DecalV})$) {\strut #3} ;
}
%déf des clés
@@ -53,7 +55,8 @@
Grille=\xdef\QuadType{#1},%
NbCarreaux=\xdef\QuadNbCar{#1},%
Elargir=\xdef\QuadElar{#1},%
- CouleurBarreSeyes=\xdef\QuadCoulSeyes{#1}
+ CouleurBarreSeyes=\xdef\QuadCoulSeyes{#1},%
+ ReglureSeyes=\xdef\QuadReglureSeyes{#1}
}
\setKVdefault[Quadrill]{%
@@ -64,7 +67,8 @@
Cadre=false,%
Grille=5x5,%
AffBarre=true,%
- CouleurBarreSeyes={red!75}
+ CouleurBarreSeyes={red!75},%
+ ReglureSeyes=2
}
\NewDocumentCommand\AffQuadrillage{ O{} D<>{lightgray!50/lightgray!25} }{%affichage simple du quadrillage
@@ -76,18 +80,19 @@
{\def\QuadCoulA{#2}\def\QuadCoulB{#2}}%
\StrCut{\QuadNbCar}{x}{\QuadNbCol}{\QuadNbLig}%
\IfStrEq{\QuadType}{Seyes}%les types de quadrillages
- {\xdef\ValeurCarreau{0.8}}%
+ {\xdef\ValeurCarreau{0.8}\xdef\CoeffUnite{\fpeval{(\QuadReglureSeyes)/2}}}%
{}%
\IfStrEq{\QuadType}{5x5}%
- {\xdef\ValeurCarreau{0.5}}%
+ {\xdef\ValeurCarreau{0.5}\xdef\CoeffUnite{1}}%
{}%
\IfStrEq{\QuadType}{Ruled}%
- {\xdef\ValeurCarreau{0.9}}%
+ {\xdef\ValeurCarreau{0.9}\xdef\CoeffUnite{1}}%
{}%
+
\IfSubStr{\QuadElar}{/}%on récupère les élargissements G et D
{\StrCut{\QuadElar}{/}{\QuadElarG}{\QuadElarD}}%
{\def\QuadElarG{\QuadElar}\def\QuadElarD{\QuadElar}}%
- \begin{tikzpicture}[xscale={\useKV[Quadrill]{Unite}},yscale={\useKV[Quadrill]{Unite}}]
+ \begin{tikzpicture}[xscale={\CoeffUnite*\useKV[Quadrill]{Unite}},yscale={\CoeffUnite*\useKV[Quadrill]{Unite}}]
\useasboundingbox (0,0) rectangle ({\ValeurCarreau*\QuadNbCol},{-\ValeurCarreau*\QuadNbLig}) ;%on fixe la grille de base, avant élargissement éventuel
\IfStrEq{\QuadType}{Seyes}%
{%
@@ -130,18 +135,18 @@
{\def\QuadCoulA{#2}\def\QuadCoulB{#2}}%
\StrCut{\QuadNbCar}{x}{\QuadNbCol}{\QuadNbLig}%
\IfStrEq{\QuadType}{Seyes}%les types de quadrillages
- {\xdef\ValeurCarreau{0.8}}%
+ {\xdef\ValeurCarreau{0.8}\xdef\CoeffUnite{\fpeval{(\QuadReglureSeyes)/2}}}%
{}%
\IfStrEq{\QuadType}{5x5}%
- {\xdef\ValeurCarreau{0.5}}%
+ {\xdef\ValeurCarreau{0.5}\xdef\CoeffUnite{1}}%
{}%
\IfStrEq{\QuadType}{Ruled}%
- {\xdef\ValeurCarreau{0.9}}%
+ {\xdef\ValeurCarreau{0.9}\xdef\CoeffUnite{1}}%
{}%
\IfSubStr{\QuadElar}{/}%on récupère les élargissements G et D
{\StrCut{\QuadElar}{/}{\QuadElarG}{\QuadElarD}}%
{\def\QuadElarG{\QuadElar}\def\QuadElarD{\QuadElar}}%
- \begin{tikzpicture}[xscale={\useKV[Quadrill]{Unite}},yscale={\useKV[Quadrill]{Unite}}]
+ \begin{tikzpicture}[xscale={\CoeffUnite*\useKV[Quadrill]{Unite}},yscale={\CoeffUnite*\useKV[Quadrill]{Unite}}]
\useasboundingbox (0,0) rectangle ({\ValeurCarreau*\QuadNbCol},{-\ValeurCarreau*\QuadNbLig}) ;%on fixe la grille de base, avant élargissement éventuel
\IfStrEq{\QuadType}{Seyes}%
{%
@@ -305,31 +310,49 @@
\defKV[SeyesFull]{%
CouleurP=\xdef\SeyesFullCoulP{#1},%
CouleurS=\xdef\SeyesFullCoulS{#1},%
- CouleurMarge=\xdef\SeyesFullCoulM{#1}
+ CouleurMarge=\xdef\SeyesFullCoulM{#1},%
+ ReglureSeyes=\xdef\SeyesFullReglureSeyes{#1},%
+ FormatPapier=\xdef\SeyesFullFormatPapier{#1}
}
\setKVdefault[SeyesFull]{%
CouleurP=PapierRose,%
CouleurS=PapierGris,%
CouleurMarge=red!75,
- NumLignes=false
+ NumLignes=false,%
+ ReglureSeyes=2,%
+ FormatPapier=A4
}
-\NewDocumentEnvironment{PleinePageSeyes}{ O{} }%semble OK ^^
+\NewDocumentEnvironment{PleinePageSeyes}{ O{} }%semble OK ^^, à tester avec modification de la taille de papier...
{
- \useKVdefault[SeyesFull]
- \setKV[SeyesFull]{#1}
- \begin{tikzpicture}[remember picture,overlay,x=1cm,y=1cm]
+ \useKVdefault[SeyesFull]%
+ \setKV[SeyesFull]{#1}%
+ \IfEq{\SeyesFullFormatPapier}{A4}%
+ {\xdef\SeyesFullHautPap{29.7}\xdef\SeyesFullLargPap{21}\xdef\SeyesFullMargeH{3}\xdef\SeyesFullMargeG{4}\xdef\SeyesFullHautEff{24}}%
+ {}%
+ \IfEq{\SeyesFullFormatPapier}{A5}%
+ {\xdef\SeyesFullHautPap{21}\xdef\SeyesFullLargPap{14.8}\xdef\SeyesFullMargeH{2.5}\xdef\SeyesFullMargeG{2.5}\xdef\SeyesFullHautEff{17}}%
+ {}%
+ \IfSubStr{\SeyesFullFormatPapier}{x}%
+ {\StrCut{\SeyesFullFormatPapier}{x}{\SeyesFullLargPap}{\SeyesFullHautPap}\xdef\SeyesFullMargeH{3}\xdef\SeyesFullMargeG{3}\xdef\SeyesFullHautEff{\fpeval{\SeyesFullHautPap-6}}}%
+ {}%
+ %calcul du nombre de lignes /colonnes ?
+ \xdef\SeyesFullNbLignP{\fpeval{round(\SeyesFullHautEff/(0.4*\SeyesFullReglureSeyes),0)}}%
+ \xdef\SeyesFullNbLignS{\fpeval{round(\SeyesFullHautEff/(0.1*\SeyesFullReglureSeyes),0)+5}}%
+ \xdef\SeyesFullNbCol{\fpeval{round((\SeyesFullLargPap-\SeyesFullMargeG)/(0.4*\SeyesFullReglureSeyes),0)}}%
+ %création de la grille
+ \begin{tikzpicture}[remember picture,overlay,x=1cm,y=1cm]%
%grille secondaire
- \foreach \L in {0,1,...,125} {\draw[\SeyesFullCoulS] ($(current page.north west)+(0,{-2.4-\L*0.2})$)--++({\paperwidth},0) ;}
+ \foreach \L in {0,...,\SeyesFullNbLignS} {\draw[\SeyesFullCoulS] ($(current page.north west)+(0,{-(\SeyesFullMargeH-0.3*\SeyesFullReglureSeyes)-\L*0.1*\SeyesFullReglureSeyes})$)--++({\paperwidth},0) ;}
%grille principale
- \foreach \C in {1,2,...,21} {\draw[\SeyesFullCoulP] ($(current page.north west)+({4+0.8*\C},0)$)--($(current page.south west)+({4+0.8*\C},0)$) ;}
- \foreach \L in {0,1,...,30} {\draw[\SeyesFullCoulP] ($(current page.north west)+(0,{-3-\L*0.8})$)--++({\paperwidth},0) ;}
+ \foreach \C in {1,...,\SeyesFullNbCol} {\draw[\SeyesFullCoulP] ($(current page.north west)+({\SeyesFullMargeG+(0.4*\SeyesFullReglureSeyes)*\C},0)$)--($(current page.south west)+({\SeyesFullMargeG+(0.4*\SeyesFullReglureSeyes)*\C},0)$) ;}
+ \foreach \L in {0,...,\SeyesFullNbLignP} {\draw[\SeyesFullCoulP] ($(current page.north west)+(0,{-(\SeyesFullMargeH)-\L*(0.4*\SeyesFullReglureSeyes)})$)--++({\paperwidth},0) ;}
%marge
- \draw[\SeyesFullCoulM,thick] ($(current page.north west)+(4,0)$)--($(current page.south west)+(4,0)$) ;
- \coordinate (SeyesOrigine) at ($(current page.north west)+(4,-3)$) ;
+ \draw[\SeyesFullCoulM,thick] ($(current page.north west)+({\SeyesFullMargeG},0)$)--($(current page.south west)+({\SeyesFullMargeG},0)$) ;
+ \coordinate (SeyesOrigine) at ($(current page.north west)+({\SeyesFullMargeG},{-\SeyesFullMargeH})$) ;
\ifboolKV[SeyesFull]{NumLignes}%
{%
- \foreach \lig in {1,2,...,31} {\node[gray,inner sep=0pt,anchor=base east] at ($(SeyesOrigine)+(-0.2,{-0.8*(\lig-1)})$) {\scriptsize\sffamily \lig};}
+ \foreach \lig in {1,...,\inteval{\SeyesFullNbLignP+1}} {\node[gray,inner sep=0pt,anchor=base east] at ($(SeyesOrigine)+(-0.2,{-0.4*\SeyesFullReglureSeyes*(\lig-1)})$) {\scriptsize\sffamily\lig};}
}%
{}
}
@@ -339,11 +362,11 @@
\newcommand\CadreNoteSeyes[2][3]{%on précise la {ligne de début} + [hauteur]
%cadre de note
- \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.8})$) --++ ({\paperwidth-4cm},{0}) ;
- \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.8})$) --++ ({0},{-#1*0.8}) ;
- \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1-#1)*0.8})$) --++ ({\paperwidth-4cm},{0}) ;
- \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.8})$) rectangle++ ({#1.*0.8},{-#1*0.8}) ;
- \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1-#1)*0.8})$) --++ ({#1.*0.8},{#1*0.8}) ;
+ \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.4*\SeyesFullReglureSeyes})$) --++ ({\SeyesFullLargPap-\SeyesFullMargeG},{0}) ;
+ \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.4*\SeyesFullReglureSeyes})$) --++ ({0},{-#1*0.4*\SeyesFullReglureSeyes}) ;
+ \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1-#1)*0.4*\SeyesFullReglureSeyes})$) --++ ({\SeyesFullLargPap-\SeyesFullMargeG},{0}) ;
+ \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1)*0.4*\SeyesFullReglureSeyes})$) rectangle++ ({#1*0.4*\SeyesFullReglureSeyes},{-#1*0.4*\SeyesFullReglureSeyes}) ;
+ \draw[thick] ($(SeyesOrigine)+(0,{(-#2+1-#1)*0.4*\SeyesFullReglureSeyes})$) --++ ({#1*0.4*\SeyesFullReglureSeyes},{#1*0.4*\SeyesFullReglureSeyes}) ;
}
\defKV[SeyesLigne]{%
@@ -356,18 +379,21 @@
Couleur=black,%
Ligne=1,%
Echelle=1,%
- Largeur=16.5
+ Largeur=auto
}
\NewDocumentCommand\LignePapierSeyes{ O{} D<>{left} D(){0,0} m }{%
- \useKVdefault[SeyesLigne]
- \setKV[SeyesLigne]{#1}
- \node[\SeyesLigneCouleur,text width=\fpeval{\SeyesLigneLarg/\SeyesLigneEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\SeyesLigneEchelle] at ($(SeyesOrigine)+(0.05,{-(\SeyesLigne-1)*0.8})+(#3)$) {#4} ;
- }
+ \useKVdefault[SeyesLigne]%
+ \setKV[SeyesLigne]{#1}%
+ \IfEq{\SeyesLigneLarg}{auto}%
+ {\xdef\SeyesLigneLarg{\fpeval{\SeyesFullLargPap-\SeyesFullMargeG-0.25}}}%
+ {}%
+ \node[\SeyesLigneCouleur,text width=\fpeval{\SeyesLigneLarg/\SeyesLigneEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\SeyesLigneEchelle] at ($(SeyesOrigine)+(0.05,{-(\SeyesLigne-1)*0.4*\SeyesFullReglureSeyes})+(#3)$) {#4} ;
+}
\defKV[SeyesPar]{%
Couleur=\xdef\SeyesParCouleur{#1},%
- TaillePolice=\xdef\SeyesParEchelle{#1},%
+ Echelle=\xdef\SeyesParEchelle{#1},%
Espacement=\xdef\SeyesParBase{#1},%
Ligne=\xdef\SeyesPar{#1},%
Largeur=\xdef\SeyesParLarg{#1}
@@ -375,40 +401,66 @@
\setKVdefault[SeyesPar]{%
Couleur=black,%
Ligne=1,%
- TaillePolice=11,%
- Espacement=22.792,%
- Largeur=16.5
+ Echelle=1,%
+ Espacement=auto,%
+ Largeur=auto
}
-\NewDocumentCommand\ParagraphePapierSeyes{ O{} D<>{justify} D(){0,0} m }{%
- \useKVdefault[SeyesPar]
- \setKV[SeyesPar]{#1}
- \node[\SeyesParCouleur,text width=\SeyesParLarg cm,align=#2,inner sep=0pt,anchor=base west,font=\fontsize{\SeyesParEchelle}{\SeyesParBase}\selectfont] at ($(SeyesOrigine)+(0.05,{-(\SeyesPar-1)*0.8})+(#3)$) {#4} ;
+\RequirePackage{setspace}
+
+\NewDocumentCommand\ParagraphePapierSeyes{ O{} D<>{justify} D(){0,0} m }{%essayer de passer à setspace ?
+ \useKVdefault[SeyesPar]%
+ \setKV[SeyesPar]{#1}%
+ \IfEq{\SeyesParLarg}{auto}%
+ {\xdef\SeyesParLarg{\fpeval{\SeyesFullLargPap-\SeyesFullMargeG-0.25}}}%
+ {}%
+ \IfStrEq{\SeyesParBase}{auto}%
+ {%
+ \def\SeyesStretchPar{\fpeval{4*\SeyesFullReglureSeyes/\SeyesParEchelle}}%
+ }%
+ {%
+ \def\SeyesStretchPar{\SeyesParBase}%
+ }%
+ \node[\SeyesParCouleur,text width=\fpeval{\SeyesParLarg/\SeyesParEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\SeyesParEchelle,execute at begin node=\setlength{\baselineskip}{\SeyesStretchPar mm}] at ($(SeyesOrigine)+(0.05,{-(\SeyesPar-1)*0.4*\SeyesFullReglureSeyes})+(#3)$) {#4} ;
}
%------page entière 5x5
\defKV[CxCFull]{%
Couleur=\xdef\CCFullCoul{#1},%
- CouleurMarge=\xdef\CCFullCoulM{#1}
+ CouleurMarge=\xdef\CCFullCoulM{#1},%
+ FormatPapier=\xdef\CCFullFormatPap{#1}
}
\setKVdefault[CxCFull]{%
Couleur=lightgray!50,%
CouleurMarge=gray,%
- NumLignes=false
+ NumLignes=false,%
+ FormatPapier=A4
}
\NewDocumentEnvironment{PleinePageCinqCinq}{ O{} }%semble OK ^^
{
- \useKVdefault[CxCFull]
- \setKV[CxCFull]{#1}
+ \useKVdefault[CxCFull]%
+ \setKV[CxCFull]{#1}%
+ \IfEq{\CCFullFormatPap}{A4}%
+ {\xdef\CCFullHautPap{29.7}\xdef\CCFullLargPap{21}\xdef\CCFullMargeG{1.7}\xdef\CCFullMargeH{1.3}}%
+ {}%
+ \IfEq{\CCFullFormatPap}{A5}%
+ {\xdef\CCFullHautPap{21}\xdef\CCFullLargPap{14.8}\xdef\CCFullMargeG{1.2}\xdef\CCFullMargeH{0.8}}%
+ {}%
+ \IfSubStr{\CCFullFormatPap}{x}%
+ {\StrCut{\CCFullFormatPap}{x}{\CCFullLargPap}{\CCFullHautPap}\xdef\CCFullMargeG{1.7}\xdef\CCFullMargeH{1.3}}%
+ {}%
+ %calcul du nombre de lignes /colonnes ?
+ \xdef\CCFullNbLign{\fpeval{round(\CCFullHautPap/(0.5),0)}}%
+ \xdef\CCFullNbCol{\fpeval{round((\CCFullLargPap)/(0.5),0)}}%
\begin{tikzpicture}[remember picture,overlay,x=1cm,y=1cm]
%lignes horizontales
- \foreach \L in {0,1,...,58} {\draw[\CCFullCoul] ($(current page.north west)+(0,{-0.3-\L*0.5})$)--++({\paperwidth},0) ;}
+ \foreach \L in {0,1,...,\CCFullNbLign} {\draw[\CCFullCoul] ($(current page.north west)+(0,{-0.3-\L*0.5})$)--++({\paperwidth},0) ;}
%lignes verticales
- \foreach \C in {0,1,...,41} {\draw[\CCFullCoul] ($(current page.north west)+({0.2+0.5*\C},0)$)--($(current page.south west)+({0.2+0.5*\C},0)$) ;}
+ \foreach \C in {0,1,...,\CCFullNbCol} {\draw[\CCFullCoul] ($(current page.north west)+({0.2+0.5*\C},0)$)--($(current page.south west)+({0.2+0.5*\C},0)$) ;}
%marge
- \draw[\CCFullCoulM,thick] ($(current page.north west)+(1.7,0)$)--($(current page.south west)+(1.7,0)$) ;
- \coordinate (CinqCinqOrigine) at ($(current page.north west)+(1.7,-1.3)$) ;
+ \draw[\CCFullCoulM,thick] ($(current page.north west)+(\CCFullMargeG,0)$)--($(current page.south west)+(\CCFullMargeG,0)$) ;
+ \coordinate (CinqCinqOrigine) at ($(current page.north west)+({\CCFullMargeG},{-\CCFullMargeH})$) ;
\ifboolKV[CxCFull]{NumLignes}%
{%
\foreach \lig in {1,2,...,57} {\node[gray,inner sep=0pt,anchor=base east] at ($(CinqCinqOrigine)+(-0.2,{-0.5*(\lig-1)})$) {\tiny\sffamily \lig};}
@@ -421,9 +473,9 @@
\newcommand\CadreNoteCinqCinq[2][3]{%on précise la {ligne de début} + [hauteur]
%cadre de note
- \draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1)*0.5})$) --++ ({\paperwidth-1.7cm},{0}) ;
+ \draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1)*0.5})$) --++ ({\CCFullLargPap-\CCFullMargeG},{0}) ;
\draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1)*0.5})$) --++ ({0},{-#1*0.5}) ;
- \draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1-#1)*0.5})$) --++ ({\paperwidth-1.7cm},{0}) ;
+ \draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1-#1)*0.5})$) --++ ({\CCFullLargPap-\CCFullMargeG},{0}) ;
\draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1)*0.5})$) rectangle++ ({#1.*0.5},{-#1*0.5}) ;
\draw[thick] ($(CinqCinqOrigine)+(0,{(-#2+1-#1)*0.5})$) --++ ({#1.*0.5},{#1*0.5}) ;
}
@@ -438,18 +490,21 @@
Couleur=black,%
Ligne=1,%
Echelle=1,%
- Largeur=18.7
+ Largeur=auto
}
\NewDocumentCommand\LignePapierCinqCinq{ O{} D<>{left} D(){0,0} m }{%
- \useKVdefault[CCLigne]
- \setKV[CCLigne]{#1}
+ \useKVdefault[CCLigne]%
+ \setKV[CCLigne]{#1}%
+ \IfEq{\CCLigneLarg}{auto}%
+ {\xdef\CCLigneLarg{\fpeval{\CCFullLargPap-\CCFullMargeG-0.25}}}%
+ {}%
\node[\CCLigneCouleur,text width=\fpeval{\CCLigneLarg/\CCLigneEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\CCLigneEchelle] at ($(CinqCinqOrigine)+(0.05,{-(\CCLigne-1)*0.5})+(#3)$) {#4} ;
}
\defKV[CCPar]{%
Couleur=\xdef\CCParCouleur{#1},%
- TaillePolice=\xdef\CCParEchelle{#1},%
+ Echelle=\xdef\CCParEchelle{#1},%
Espacement=\xdef\CCParBase{#1},%
Ligne=\xdef\CCPar{#1},%
Largeur=\xdef\CCParLarg{#1}
@@ -457,44 +512,69 @@
\setKVdefault[CCPar]{%
Couleur=black,%
Ligne=1,%
- TaillePolice=11,%
- Espacement=28.5,%
- Largeur=18.75
+ Echelle=1,%
+ Espacement=auto,%
+ Largeur=auto
}
\NewDocumentCommand\ParagraphePapierCinqCinq{ O{} D<>{justify} D(){0,0} m }{%
\useKVdefault[CCPar]
- \setKV[CCPar]{#1}
- \node[\CCParCouleur,text width=\CCParLarg cm,align=#2,inner sep=0pt,anchor=base west,font=\fontsize{\CCParEchelle}{\CCParBase}\selectfont] at ($(CinqCinqOrigine)+(0.05,{-(\CCPar-1)*0.5})+(#3)$) {#4} ;
+ \setKV[CCPar]{#1}%
+ \IfEq{\CCParLarg}{auto}%
+ {\xdef\CCParLarg{\fpeval{\CCFullLargPap-\CCFullMargeG-0.25}}}%
+ {}%
+ \IfStrEq{\CCParBase}{auto}%
+ {%
+ \def\CCStretchPar{\fpeval{5/\CCParEchelle}}%
+ }%
+ {%
+ \def\CCStretchPar{\CCParBase}%
+ }
+ \node[\CCParCouleur,text width=\fpeval{\CCParLarg/\CCParEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\CCParEchelle,execute at begin node=\setlength{\baselineskip}{\CCStretchPar mm}] at ($(CinqCinqOrigine)+(0.05,{-(\CCPar-1)*0.5})+(#3)$) {#4} ;
}
%------page entière ruled
\defKV[RuledFull]{%
Couleur=\xdef\RuledFullCoul{#1},%
- CouleurMarge=\xdef\RuledFullCoulMarge{#1}
+ CouleurMarge=\xdef\RuledFullCoulMarge{#1},%
+ FormatPapier=\xdef\RuledFullFormatPapier{#1}
}
\setKVdefault[RuledFull]{%
Couleur=PapierGris,%
CouleurMarge=TyrianPurple,%
- NumLignes=false
+ NumLignes=false,%
+ FormatPapier=A4
}
\NewDocumentEnvironment{PleinePageRuled}{ O{} }%semble OK ^^
{
- \useKVdefault[RuledFull]
- \setKV[RuledFull]{#1}
+ \useKVdefault[RuledFull]%
+ \setKV[RuledFull]{#1}%
+
+ \IfEq{\RuledFullFormatPapier}{A4}%
+ {\xdef\RuledFullHautPap{29.7}\xdef\RuledFullLargPap{21}\xdef\RuledFullMarge{3}\xdef\RuledFullMargeH{1.5}\xdef\RuledFullHautEff{26.1}}%
+ {}%
+ \IfEq{\RuledFullFormatPapier}{A5}%
+ {\xdef\RuledFullHautPap{21}\xdef\RuledFullLargPap{14.8}\xdef\RuledFullMarge{1.5}\xdef\RuledFullMargeH{1.25}\xdef\RuledFullHautEff{18.9}}%
+ {}%
+ \IfSubStr{\RuledFullFormatPapier}{x}%
+ {\StrCut{\RuledFullFormatPapier}{x}{\RuledFullLargPap}{\RuledFullHautPap}\xdef\RuledFullMarge{3}\xdef\RuledFullMargeH{3}\xdef\RuledFullHautEff{\fpeval{\RuledFullHautPap-3.5}}}%
+ {}%
+ %calcul du nombre de lignes /colonnes ?
+ \xdef\RuledFullNbLign{\fpeval{round(\RuledFullHautEff/(0.9),0)}}%
\begin{tikzpicture}[remember picture,overlay,x=1cm,y=1cm]
%lignes horizontales
- \foreach \L in {1.5,2.4,...,27.6} {\draw[\RuledFullCoul] ($(current page.north west)+(0,{-\L})$)--++({\paperwidth},0) ;}
+ \foreach \L in {1,...,\RuledFullNbLign} {\draw[\RuledFullCoul] ($(current page.north west)+(0,{-(\L-1)*0.9-\RuledFullMargeH})$)--++({\paperwidth},0) ;}
+ %\foreach \L in {1.5,2.4,...,27.6} {\draw[\RuledFullCoul] ($(current page.north west)+(0,{-\L})$)--++({\paperwidth},0) ;}
%lignes verticales
- \draw[thick,\RuledFullCoulMarge] ($(current page.north west)+(3,0)$)--($(current page.south west)+(3,0)$) ;
- \draw[thick,\RuledFullCoulMarge] ($(current page.north east)+(-3,0)$)--($(current page.south east)+(-3,0)$) ;
+ \draw[thick,\RuledFullCoulMarge] ($(current page.north west)+({\RuledFullMarge},0)$)--($(current page.south west)+({\RuledFullMarge},0)$) ;
+ \draw[thick,\RuledFullCoulMarge] ($(current page.north east)+({-\RuledFullMarge},0)$)--($(current page.south east)+({-\RuledFullMarge},0)$) ;
%\foreach \C in {3} {\draw[thick,\RuledFullCoulMarge] ($(current page.north west)+({\C},0)$)--($(current page.south west)+({\C},0)$) ;}
%origine
- \coordinate (RuledOrigine) at ($(current page.north west)+(3,-1.5)$) ;
+ \coordinate (RuledOrigine) at ($(current page.north west)+({\RuledFullMarge},{-\RuledFullMargeH})$) ;
\ifboolKV[RuledFull]{NumLignes}%
{%
- \foreach \lig in {1,2,...,30} {\node[gray,inner sep=0pt,anchor=base east] at ($(RuledOrigine)+(-0.2,{-0.9*(\lig-1)})$) {\tiny\sffamily \lig};}
+ \foreach \lig in {1,...,\RuledFullNbLign} {\node[gray,inner sep=0pt,anchor=base east] at ($(RuledOrigine)+(-0.2,{-0.9*(\lig-1)})$) {\tiny\sffamily \lig};}
}%
{}
}
@@ -504,10 +584,10 @@
\newcommand\CadreNoteRuled[2][3]{%on précise la {ligne de début} + [hauteur]
%cadre de note
- \draw[thick] ($(RuledOrigine)+(0,{(-#2+1)*0.9})$) --++ ({\paperwidth-6cm},{0}) ;
+ \draw[thick] ($(RuledOrigine)+(0,{(-#2+1)*0.9})$) --++ ({\RuledFullLargPap-2*\RuledFullMarge},{0}) ;
\draw[thick] ($(RuledOrigine)+(0,{(-#2+1)*0.9})$) --++ ({0},{-#1*0.9}) ;
\draw[thick] ($(RuledOrigine)+({\paperwidth-6},{(-#2+1)*0.9})$) --++ ({0},{-#1*0.9}) ;
- \draw[thick] ($(RuledOrigine)+(0,{(-#2+1-#1)*0.9})$) --++ ({\paperwidth-6cm},{0}) ;
+ \draw[thick] ($(RuledOrigine)+(0,{(-#2+1-#1)*0.9})$) --++ ({\RuledFullLargPap-2*\RuledFullMarge},{0}) ;
\draw[thick] ($(RuledOrigine)+(0,{(-#2+1)*0.9})$) rectangle++ ({#1.*0.9},{-#1*0.9}) ;
\draw[thick] ($(RuledOrigine)+(0,{(-#2+1-#1)*0.9})$) --++ ({#1.*0.9},{#1*0.9}) ;
}
@@ -522,18 +602,22 @@
Couleur=black,%
Ligne=1,%
Echelle=1,%
- Largeur=14.75
+ Largeur=auto
}
\NewDocumentCommand\LignePapierRuled{ O{} D<>{left} D(){0,0} m }{%
- \useKVdefault[RuledLigne]
- \setKV[RuledLigne]{#1}
+ \useKVdefault[RuledLigne]%
+ \setKV[RuledLigne]{#1}%
+ \IfEq{\RuledLigneLarg}{auto}%
+ {\xdef\RuledLigneLarg{\fpeval{\RuledFullLargPap-2*\RuledFullMarge-0.25}}}%
+ {}%
\node[\RuledLigneCouleur,text width=\fpeval{\RuledLigneLarg/\RuledLigneEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\RuledLigneEchelle] at ($(RuledOrigine)+(0.05,{-(\RuledLigne-1)*0.9})+(#3)$) {#4} ;
}
\defKV[RuledPar]{%
Couleur=\xdef\RuledParCouleur{#1},%
- TaillePolice=\xdef\RuledParEchelle{#1},%
+ Echelle=\xdef\RuledParEchelle{#1},%
+ %TaillePolice=\xdef\RuledParEchelle{#1},%
Espacement=\xdef\RuledParBase{#1},%
Ligne=\xdef\RuledPar{#1},%
Largeur=\xdef\RuledParLarg{#1}
@@ -541,15 +625,26 @@
\setKVdefault[RuledPar]{%
Couleur=black,%
Ligne=1,%
- TaillePolice=11,%
- Espacement=25.641,%
- Largeur=14.75
+ %TaillePolice=11,%
+ Echelle=1,%
+ Espacement=auto,%
+ Largeur=auto
}
\NewDocumentCommand\ParagraphePapierRuled{ O{} D<>{justify} D(){0,0} m }{%
- \useKVdefault[RuledPar]
- \setKV[RuledPar]{#1}
- \node[\RuledParCouleur,text width=\RuledParLarg cm,align=#2,inner sep=0pt,anchor=base west,font=\fontsize{\RuledParEchelle}{\RuledParBase}\selectfont] at ($(RuledOrigine)+(0.05,{-(\RuledPar-1)*0.9})+(#3)$) {#4} ;
+ \useKVdefault[RuledPar]%
+ \setKV[RuledPar]{#1}%
+ \IfEq{\RuledParLarg}{auto}%
+ {\xdef\RuledParLarg{\fpeval{\RuledFullLargPap-2*\RuledFullMarge-0.25}}}%
+ {}%
+ \IfStrEq{\RuledParBase}{auto}%
+ {%
+ \def\RuledStretchPar{\fpeval{9/\RuledParEchelle}}%
+ }%
+ {%
+ \def\RuledStretchPar{\RuledParBase}%
+ }
+ \node[\RuledParCouleur,text width=\fpeval{\RuledParLarg/\RuledParEchelle}cm,align=#2,inner sep=0pt,anchor=base west,scale=\RuledParEchelle,execute at begin node=\setlength{\baselineskip}{\RuledStretchPar mm}] at ($(RuledOrigine)+(0.05,{-(\RuledPar-1)*0.9})+(#3)$) {#4} ;
}
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/xcolor/ChangeLog b/macros/latex/contrib/xcolor/ChangeLog
index 7608690902..a85977fdd0 100644
--- a/macros/latex/contrib/xcolor/ChangeLog
+++ b/macros/latex/contrib/xcolor/ChangeLog
@@ -3,12 +3,15 @@ https://github.com/latex3/xcolor/issues
History
=======
+2023/11/15 v3.01
+* only warn and not error if obsolete option usenames is used, issue #31
+
2023/11/11 v3.00
* If a LaTeX older than 2022-06-01 is detected a frozen version is used.
All new features apply only if LaTeX 2022-06-01 or newer is detected.
The frozen version can also be requested with \usepackage{xcolor}[=v2].
* The new LaTeX key/val handler is used for the package options. That means there
- will be less option clash errors, issue #29
+ will be fewer option clash errors, issue #29
* The \rowcolors command has moved to the colortbl package
* The fixpdftex option is obsolete and does nothing at all (issue #20)
* Extended \normalcolor to set also the "dot" color, issue #19
diff --git a/macros/latex/contrib/xcolor/README.md b/macros/latex/contrib/xcolor/README.md
index b7702951cc..2e89dafed9 100644
--- a/macros/latex/contrib/xcolor/README.md
+++ b/macros/latex/contrib/xcolor/README.md
@@ -1,6 +1,6 @@
## Package `xcolor` by Dr. Uwe Kern
-Version 2023-11-11 v3.00
+Version 2023-11-15 v3.01
Maintained by the LaTeX Project https://github.com/latex3/xcolor/issues
diff --git a/macros/latex/contrib/xcolor/xcolor.dtx b/macros/latex/contrib/xcolor/xcolor.dtx
index 8e914bc889..5af5459682 100644
--- a/macros/latex/contrib/xcolor/xcolor.dtx
+++ b/macros/latex/contrib/xcolor/xcolor.dtx
@@ -18,8 +18,8 @@
%%
%</package>
%<*extract|driver|test1|test2|test3|test4>
-\def\XCfileversion{v3.00}%
-\def\XCfiledate{2023/11/11}%
+\def\XCfileversion{v3.01}%
+\def\XCfiledate{2023/11/15}%
%</extract|driver|test1|test2|test3|test4>
%
% This file may be distributed and/or modified under the
@@ -3143,11 +3143,15 @@
%
% \subsection*{History}
% \addcontentsline{toc}{subsection}{History}
+% \subsubsection*{2023/11/15 v3.01}
+% \begin{itemize}
+% \item only warn and not error if obsolete option usenames is used (issue \#31)
+% \end{itemize}
% \subsubsection*{2023/11/11 v3.00}
% \begin{itemize}
% \item if a \LaTeX{} older than 2022-06-01 is detected a frozen version is used.
% All new features apply only if LaTeX 2022-06-01 or newer is detected.
-% The frozen version can also be requested with \verb+\usepackage{xcolor}[=v2]+
+% The frozen version can also be requested with \verb+\usepackage{xcolor}[=v2]+
% \item The new LaTeX key/val handler is used for the package options.
% That means there will be fewer option clash errors (issue \#29).
% item The |\rowcolors| command has moved to the |colortbl| package and is no longer
@@ -3156,15 +3160,15 @@
% \item Extended |\normalcolor| to set also the dot color, issue \#19
% \item Fix Gray color model, issue \#23
% \end{itemize}
-%
+%
% \subsubsection*{2022/06/12 v2.14}
% \begin{itemize}
% \item Load code from \LaTeX\ to define |\mathcolor| if it is available.
% \item Bug fixes:
% \begin{itemize}
% \item Modify |\XC@info| to avoid spurious error from |\colorlet{foo}{}|, issue \#12
-% \item make |\normalcolor|, |\colorbox|, |\fcolorbox|, |\textcolor|, |\pagecolor|,
-% |\nopagecolor|, |\definecolor|, |\DefineNamedColor|
+% \item make |\normalcolor|, |\colorbox|, |\fcolorbox|, |\textcolor|, |\pagecolor|,
+% |\nopagecolor|, |\definecolor|, |\DefineNamedColor|
% protected as in |color.sty|, issue \#17
% \end{itemize}
% \end{itemize}
@@ -4031,17 +4035,9 @@
{
table .code ={\AddToHook{package/xcolor/after}{\RequirePackage{colortbl}}}
,table .usage = preamble
-% \end{macrocode}
-%
-% These options are obsolete and only added for compatibility.
-% \begin{macrocode}
- ,hyperref .code = {}
- ,fixpdftex .code = {}
}
% \end{macrocode}
%
-%
-%
% \subsubsection{Driver options}
%
% \begin{macro}{\Gin@driver}
@@ -4115,7 +4111,25 @@
}
% \end{macrocode}
%
-% All other options (including \LC's \oOption{usenames}, \oOption{nodvipsnames}) error.
+% \subsubsection{Obsolete options}
+% The following options are obsolete but perhaps still around in the wild,
+% so we generate a warning.
+% \begin{macrocode}
+\DeclareKeys
+ {
+ ,usenames .code =
+ {\PackageWarning{xcolor}{Package option `usenames' is obsolete and ignored}}
+ ,usename .usage = preamble
+ ,hyperref .code =
+ {\PackageWarning{xcolor}{Package option `hyperref' is obsolete and ignored}}
+ ,hyperref .usage = preamble
+ ,fixpdftex .code =
+ {\PackageWarning{xcolor}{Package option `fixpdftex' is obsolete and ignored}}
+ ,fixpdftex .usage = preamble
+ }
+% \end{macrocode}
+%
+% All other options (including \LC's \oOption{nodvipsnames}) error.
%
% Choose default options:
% \begin{macrocode}
@@ -4125,7 +4139,6 @@
\SetKeys{natural,showerrors}
% \end{macrocode}
%
-%
% \subsubsection{Processing options}
%
% A local configuration file may declare more options.
diff --git a/macros/latex/contrib/xcolor/xcolor.pdf b/macros/latex/contrib/xcolor/xcolor.pdf
index 2df8ee2081..c9ab96b507 100644
--- a/macros/latex/contrib/xcolor/xcolor.pdf
+++ b/macros/latex/contrib/xcolor/xcolor.pdf
Binary files differ
diff --git a/macros/latex/contrib/xcolor/xcolor2.pdf b/macros/latex/contrib/xcolor/xcolor2.pdf
index 88a91d6a35..07d228343c 100644
--- a/macros/latex/contrib/xcolor/xcolor2.pdf
+++ b/macros/latex/contrib/xcolor/xcolor2.pdf
Binary files differ
diff --git a/support/texshop/README.txt b/support/texshop/README.txt
index 2dafa22db9..b20962d8c4 100644
--- a/support/texshop/README.txt
+++ b/support/texshop/README.txt
@@ -7,4 +7,4 @@ The main author is Richard Koch, koch@uoregon.edu, with supporting contributions
Consult the program web site, https://pages.uoregon.edu/koch/texshop/texshop.html,
for full source code, an extensive Changes document, and other information.
-The current version, 5.21, was released on October 20, 2023. \ No newline at end of file
+The current version, 5.22, was released on November 15, 2023. \ No newline at end of file
diff --git a/support/texshop/texshop521.html b/support/texshop/texshop521.html
deleted file mode 100644
index e97568bfc3..0000000000
--- a/support/texshop/texshop521.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
- <title>TeXShop</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/css" media="screen">@import "v1.css";</style>
-</head>
-
-<body>
-
-The following changes were made:
-<p><ul>
-<li> Jeroen Scheerder improved the support of Typst by using the Packages system now under
-construction in that project. Packages are similar to style and class files in the LaTeX world;
-they extend the capabilities of the typesetting system. Scheerder separated each sample program
-provided in TeXShop 5.20 into a package and a template. The package is hidden away in
-~/Library/Application Support/typst and the template is available in the TeXShop templates pulldown
-in the source window. This makes it possible to start a new project by selecting an initial template
-and adding material to it. The templates can be edited by users to fit their precise requirements.
-<p><li> If a source project opened an html window in TeXShop, and the source was then closed without first closing the html window, TeXShop would sometimes crash. This is fixed.
-<p><li>The Chinese localization in 5.20 had one item translated by Google rather than the official localizer.
-This is fixed.
-<p><li> A small number of Interface Builder connections led to objects that no longer exist. This caused
-cautionary items in the log file, although TeXShop ran fine. The connections are gone and the log entries no longer appear.
-<p><li>The log file complained that "unarchiving safe plist type 'NSString' occurred" and warned that this would
-be disallowed in the future. This is fixed and the log entry is gone.
-
-</ul>
-
-</body>
-</html>
diff --git a/support/texshop/texshop522.html b/support/texshop/texshop522.html
new file mode 100644
index 0000000000..d414786a1d
--- /dev/null
+++ b/support/texshop/texshop522.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>TeXShop</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <style type="text/css" media="screen">@import "v1.css";</style>
+</head>
+
+<body>
+
+The following changes were made:
+<p><ul>
+<li> If the user removes a folder from ~/Library/TeXShop and then runs TeXShop, the folder will be
+recreated with default contents. Curiously, this did not apply to the folder ~/Library/TeXShop/Engines/Inactive,
+but now it does. Before this change, a user could remove ~/Library/TeXShop/Engines and that entire folder would be recreated, including the
+Inactive subdirectory, but that technique destroyed any special engines the user might have created.
+<p>When new versions of TeXShop are introduced, most folders in ~/Library/TeXShop are not changed
+because these folders store files created and edited by the user. But the Inactive folder is updated because users should have the latest versions of
+these items. This update adds new files and folders and modifies existing files and folders, but it does not remove
+files or folders no longer needed. I'm thinking of changing this behavior so Inactive is completely
+"cleaned up", but that is a more drastic step that needs to be carefully considered. In the meantime,
+users can accomplish that complete cleanup by removing the Inactive folder and letting TeXShop
+recreate it.
+<li> The Typst program was recently updated to version 0.9.0, and Jeroen Scheerder updated the
+material in ~/Library/TeXShop/Engines/Inactive/Typst for the new version. If you are already using
+Typst in TeXShop, go to this location. An early section in the document "AboutTypst.pdf" explains
+how to download and install Typst. Follow these instructions to obtain the new version. The last section
+of this document explains how to move the contents of the "Advanced" folder into appropriate places.
+Scheerder revised the contents of "Advanced", so move the revised folders into the same spots.
+<p><li> Version 5.20 added a preference item to activate transparency when calling Ghostscript. That item
+adds a flag to Ghostscript calls, but the flag is only relevant on recent versions of Ghostscript. So
+TeXShop checked the version of Ghostscript and did not add the flag if the version being used was
+not recent enough. This check involved calling a shell script that was incompetently written (by me) and
+failed in Sonoma. The script has been rewritten and the bug is fixed on Sonoma.
+<p><li> In version 4.61, the bibtex UTI was changed from org.tug.bib to org.tug.tex.bibtex at the request of the BibDesk
+team. But not all data structures were changed, breaking the creation of new bibtex files from within TeXShop. This bug was not noticed until now. It is fixed.
+<p><li> Version 5.03 of TeXShop included an example program explaining how to create interactive
+documents using tex4ht. The source code for such a document is ordinary latex. When typeset by pdflatex,
+the result is a static pdf file. But when typeset by tex4ht, the result is a web page with interactive content.
+The sample document is in ~/Library/TeXShop/New/Demo.
+
+<p> Since tex4ht can output MathJax calls, the mathematical formulas on the web pages it creates are essentially perfect. But the
+illustrations are sometimes distorted. Recently I read a brief note by Michal Hoftich, who maintains
+tex4ht, explaining how to fix this problem. So TeXShop 5.22 installs a new folder,
+~/Library/TeXShop/New/Demo-Additions-5.22, containing a Read-Me file explaining the very
+simple modification to the Demo document which fixes illustrations. These Read-Me changes can
+be made in the same manner to other documents typeset by tex4ht.
+</ul>
+</body>
+</html>
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index 9d7e00508a..78e033818c 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -13,6 +13,7 @@ $mirrors = {
'https://mirror.bjtu.edu.cn/CTAN/' => 1,
'https://mirror.nyist.edu.cn/CTAN/' => 1,
'https://mirrors.aliyun.com/CTAN/' => 1,
+ 'https://mirrors.bfsu.edu.cn/CTAN/' => 1,
'https://mirrors.cloud.tencent.com/CTAN/' => 1,
'https://mirrors.cqu.edu.cn/CTAN/' => 1,
'https://mirrors.hit.edu.cn/CTAN/' => 1,
@@ -118,11 +119,13 @@ $mirrors = {
'Greece' => {
'http://ftp.ntua.gr/mirror/ctan/' => 1,
'https://fosszone.csd.auth.gr/CTAN/' => 1,
- 'https://ftp.cc.uoc.gr/mirrors/CTAN/' => 1,
},
'Hungary' => {
'https://mirror.szerverem.hu/ctan/' => 1,
},
+ 'Italy' => {
+ 'https://ctan.mirror.garr.it/mirrors/ctan/' => 1,
+ },
'Netherlands' => {
'https://ftp.snt.utwente.nl/pub/software/tex/' => 1,
'https://mirror.koddos.net/CTAN/' => 1,
@@ -147,7 +150,6 @@ $mirrors = {
'Russia' => {
'https://ctan.altspu.ru/' => 1,
'https://mirror.macomnet.net/pub/CTAN/' => 1,
- 'https://mirror.truenetwork.ru/CTAN/' => 1,
'https://mirrors.mi-ras.ru/CTAN/' => 1,
},
'Spain' => {
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 57f269f581..b940abbbe5 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2023
-depend revision/68831
+depend revision/68849
name 00texlive.image
category TLCore
-revision 68830
+revision 68846
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -2654,6 +2654,7 @@ runfiles size=13141
tlpkg/tlpsrc/listliketab.tlpsrc
tlpkg/tlpsrc/listofitems.tlpsrc
tlpkg/tlpsrc/listofsymbols.tlpsrc
+ tlpkg/tlpsrc/litesolution.tlpsrc
tlpkg/tlpsrc/litetable.tlpsrc
tlpkg/tlpsrc/lithuanian.tlpsrc
tlpkg/tlpsrc/liturg.tlpsrc
@@ -4811,7 +4812,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 68825
+revision 68833
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -8133,30 +8134,30 @@ catalogue-version 1.9.7
name abntexto
category Package
-revision 68554
+revision 68837
shortdesc LaTeX class for formatting academic papers in ABNT standards
relocated 1
longdesc This is a LaTeX class created for Brazilian students to
longdesc facilitate the use of standards from the Associacao Brasileira
longdesc de Normas Tecnicas (ABNT) in academic works like TCCs,
longdesc dissertations, theses.
-containersize 7776
-containerchecksum c87be4a5d47c8c84bdac70b7d0e9351d5353ca6cb82fbe21ec94850d5ad5177ac9a3e95dc6a27a143449b7cecc06392f1d2bd8f7a7824c9d0fb316063b46913f
-doccontainersize 170064
-doccontainerchecksum 606c9e77242d99353f0e35d2328943bc5fc8455d5d699948d7867502080c616d330089362e0bb4b21649846f47d35dc0f73baf414d3ebc0912861217956f4623
-docfiles size=80
+containersize 8164
+containerchecksum 9fb1177d1e97995fa8c7038e38fb827e491c2658af6844f62edb547f281120a9df873a98e509d3e67c577d46472c887ca96ce2e2436f748cba9086c6160f2986
+doccontainersize 203316
+doccontainerchecksum 3d3d58d077f3072e9bfd9bc11e68e17e4885af88864ef80de1010c331c429895c5e03df438d3a0652a8d31623dde5b1cb40daf0a709af6c3a2e90658d13c596c
+docfiles size=90
RELOC/doc/latex/abntexto/README details="Readme"
RELOC/doc/latex/abntexto/abntexto.bib
RELOC/doc/latex/abntexto/abntexto.pdf details="User manual" language="pt-br"
RELOC/doc/latex/abntexto/abntexto.tex
RELOC/doc/latex/abntexto/exemplo.pdf
RELOC/doc/latex/abntexto/exemplo.tex
-runfiles size=8
+runfiles size=7
RELOC/tex/latex/abntexto/abntexto.cls
catalogue-ctan /macros/latex/contrib/abntexto
catalogue-license pd
catalogue-topics class dissertation std-conform portuguese-br
-catalogue-version 3.0.2-beta
+catalogue-version 3.1.0-beta
name aboensis
category Package
@@ -67679,7 +67680,7 @@ catalogue-version 0.3
name cochineal
category Package
-revision 62063
+revision 68834
shortdesc Cochineal fonts with LaTeX support
relocated 1
longdesc Cochineal is a fork from the Crimson fonts (Roman, Italic,
@@ -67697,11 +67698,11 @@ longdesc adding about 2000 additional glyphs, which I could not even
longdesc contemplate. The fonts are provided in OpenType and PostScript
longdesc formats.
execute addMap Cochineal.map
-containersize 2864036
-containerchecksum 9ab8abcb37615f7381132181a991adf35d34d61c81ed5100e02e9d314a0e555669a6488edbf9fd698a239ead8f49221410333705d2074046eb3e467f31ea7196
-doccontainersize 577192
-doccontainerchecksum 5bf6a83c03d5a87567a42379c7f8462b1f52245fad5b18839532761cf855f45e596b76ea266e361527a6f269b008c6a2515cce2a616f372daaf06e6ddd6efe73
-docfiles size=174
+containersize 2584896
+containerchecksum 40fa461f007e72c45e3925b9f924ce9ad970687bac57b89f54ef21ba6883dc4fd424568a69cf28ebbbe729842143ef4424c18796d609d47d5b3f7a62ef409a5e
+doccontainersize 598104
+doccontainerchecksum 402e6614599bdbe1b10e5add2e1296627b2fa169c4cd3526e7498a3657046d745e6be77af1dc763475f55094109cbebaffbca6e5fb3ecb1ad8d8e29dab48bf35
+docfiles size=182
RELOC/doc/fonts/cochineal/OFL-FAQ.txt
RELOC/doc/fonts/cochineal/OFL.txt
RELOC/doc/fonts/cochineal/README details="Readme"
@@ -67709,12 +67710,13 @@ docfiles size=174
RELOC/doc/fonts/cochineal/cochineal-doc.tex
RELOC/doc/fonts/cochineal/cochineal-otf-doc.pdf details="Using the font with XeLaTeX or LuaLaTeX"
RELOC/doc/fonts/cochineal/cochineal-otf-doc.tex
-runfiles size=6084
+ RELOC/doc/fonts/cochineal/newgermanglyphs-crop.pdf
+ RELOC/doc/fonts/cochineal/newgermanglyphs.pdf
+runfiles size=5194
RELOC/fonts/afm/public/cochineal/Cochineal-Bold.afm
RELOC/fonts/afm/public/cochineal/Cochineal-BoldItalic.afm
RELOC/fonts/afm/public/cochineal/Cochineal-Italic.afm
RELOC/fonts/afm/public/cochineal/Cochineal-Roman.afm
- RELOC/fonts/afm/public/cochineal/Cochneal-Roman.afm
RELOC/fonts/afm/public/cochineal/cochBMI.afm
RELOC/fonts/afm/public/cochineal/cochBRM.afm
RELOC/fonts/afm/public/cochineal/cochMI.afm
@@ -67733,157 +67735,157 @@ runfiles size=6084
RELOC/fonts/enc/dvips/cochineal/cochTH-tosf-ly1.enc
RELOC/fonts/enc/dvips/cochineal/cochTH-tosf-ot1.enc
RELOC/fonts/enc/dvips/cochineal/cochTH-tosf-t1.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_2buzhw.enc
RELOC/fonts/enc/dvips/cochineal/coch_2eakhu.enc
- RELOC/fonts/enc/dvips/cochineal/coch_2expjo.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_2fe26m.enc
RELOC/fonts/enc/dvips/cochineal/coch_2gvyjv.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_2lpn7b.enc
RELOC/fonts/enc/dvips/cochineal/coch_2wxnkf.enc
- RELOC/fonts/enc/dvips/cochineal/coch_2zgday.enc
- RELOC/fonts/enc/dvips/cochineal/coch_3brrog.enc
- RELOC/fonts/enc/dvips/cochineal/coch_3q3crd.enc
- RELOC/fonts/enc/dvips/cochineal/coch_3r6zg3.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_325mfe.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_3dtqye.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_3tgzxd.enc
RELOC/fonts/enc/dvips/cochineal/coch_3tt4zg.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_3y7hew.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_3yhlsh.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_3zrls4.enc
RELOC/fonts/enc/dvips/cochineal/coch_47bkd3.enc
- RELOC/fonts/enc/dvips/cochineal/coch_4agesf.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_4ckdxt.enc
RELOC/fonts/enc/dvips/cochineal/coch_4plcvc.enc
- RELOC/fonts/enc/dvips/cochineal/coch_5bitfe.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_4wo7qa.enc
RELOC/fonts/enc/dvips/cochineal/coch_5f3gw2.enc
RELOC/fonts/enc/dvips/cochineal/coch_5o2hga.enc
- RELOC/fonts/enc/dvips/cochineal/coch_5tib5i.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_5psm7v.enc
RELOC/fonts/enc/dvips/cochineal/coch_5tmqae.enc
RELOC/fonts/enc/dvips/cochineal/coch_5xilzy.enc
RELOC/fonts/enc/dvips/cochineal/coch_5xjvtq.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_67hi7w.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_6cgo7o.enc
RELOC/fonts/enc/dvips/cochineal/coch_6lje3b.enc
RELOC/fonts/enc/dvips/cochineal/coch_6ry5ir.enc
RELOC/fonts/enc/dvips/cochineal/coch_6uoyes.enc
- RELOC/fonts/enc/dvips/cochineal/coch_6wh55u.enc
RELOC/fonts/enc/dvips/cochineal/coch_6xmcha.enc
- RELOC/fonts/enc/dvips/cochineal/coch_7fzfry.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_74gf3a.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_7ifgnr.enc
RELOC/fonts/enc/dvips/cochineal/coch_7trhhc.enc
- RELOC/fonts/enc/dvips/cochineal/coch_7v73vk.enc
RELOC/fonts/enc/dvips/cochineal/coch_aeaj7m.enc
- RELOC/fonts/enc/dvips/cochineal/coch_aiajjq.enc
RELOC/fonts/enc/dvips/cochineal/coch_alzuis.enc
RELOC/fonts/enc/dvips/cochineal/coch_awf6hz.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_axxxmh.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_b2cobb.enc
RELOC/fonts/enc/dvips/cochineal/coch_bat6hu.enc
- RELOC/fonts/enc/dvips/cochineal/coch_bhnmej.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_bdtt7o.enc
RELOC/fonts/enc/dvips/cochineal/coch_bi2nei.enc
RELOC/fonts/enc/dvips/cochineal/coch_bjqtqq.enc
RELOC/fonts/enc/dvips/cochineal/coch_bjtzvy.enc
- RELOC/fonts/enc/dvips/cochineal/coch_bnbjdf.enc
RELOC/fonts/enc/dvips/cochineal/coch_bp2pg7.enc
- RELOC/fonts/enc/dvips/cochineal/coch_cacm2n.enc
RELOC/fonts/enc/dvips/cochineal/coch_cbs7ow.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_chayfi.enc
RELOC/fonts/enc/dvips/cochineal/coch_cuw7wa.enc
RELOC/fonts/enc/dvips/cochineal/coch_d2hjcw.enc
- RELOC/fonts/enc/dvips/cochineal/coch_da7weg.enc
RELOC/fonts/enc/dvips/cochineal/coch_dbsvsj.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ddt3vr.enc
- RELOC/fonts/enc/dvips/cochineal/coch_df5kan.enc
RELOC/fonts/enc/dvips/cochineal/coch_djzri5.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_dkeedp.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_dmbown.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_dmx4sk.enc
RELOC/fonts/enc/dvips/cochineal/coch_dwjlw5.enc
- RELOC/fonts/enc/dvips/cochineal/coch_dx3muq.enc
- RELOC/fonts/enc/dvips/cochineal/coch_dxwjai.enc
- RELOC/fonts/enc/dvips/cochineal/coch_e745te.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_dzot3x.enc
RELOC/fonts/enc/dvips/cochineal/coch_e77avd.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ekjpcs.enc
- RELOC/fonts/enc/dvips/cochineal/coch_eluj5m.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ermyhb.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_efnjdi.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_eg73ik.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_fctql4.enc
RELOC/fonts/enc/dvips/cochineal/coch_fdemcn.enc
RELOC/fonts/enc/dvips/cochineal/coch_fgurd2.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_fpoktt.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_fztkeb.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_fzty6b.enc
RELOC/fonts/enc/dvips/cochineal/coch_g2axst.enc
RELOC/fonts/enc/dvips/cochineal/coch_gcpa6j.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_gdi3qw.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_ggpjtx.enc
RELOC/fonts/enc/dvips/cochineal/coch_gkpez6.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_glwe35.enc
RELOC/fonts/enc/dvips/cochineal/coch_grutwx.enc
RELOC/fonts/enc/dvips/cochineal/coch_h2t4ei.enc
- RELOC/fonts/enc/dvips/cochineal/coch_hqneph.enc
- RELOC/fonts/enc/dvips/cochineal/coch_huz7n5.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_hlowy6.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_hw4kem.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_i4rnrp.enc
RELOC/fonts/enc/dvips/cochineal/coch_ibp3xz.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ikkvry.enc
- RELOC/fonts/enc/dvips/cochineal/coch_j7mi7a.enc
- RELOC/fonts/enc/dvips/cochineal/coch_jgxutr.enc
- RELOC/fonts/enc/dvips/cochineal/coch_jhwmea.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_id6srw.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_irebs3.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_irhbzm.enc
RELOC/fonts/enc/dvips/cochineal/coch_jhwq7e.enc
- RELOC/fonts/enc/dvips/cochineal/coch_kbpxlj.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_jvqj6k.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_k4d3tq.enc
RELOC/fonts/enc/dvips/cochineal/coch_kbxkrg.enc
RELOC/fonts/enc/dvips/cochineal/coch_kfj2qw.enc
- RELOC/fonts/enc/dvips/cochineal/coch_kfnsdu.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_kldoom.enc
RELOC/fonts/enc/dvips/cochineal/coch_klonus.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_kngomf.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_ko3w5z.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_kp5j3m.enc
RELOC/fonts/enc/dvips/cochineal/coch_ktoy4w.enc
- RELOC/fonts/enc/dvips/cochineal/coch_kuld3f.enc
- RELOC/fonts/enc/dvips/cochineal/coch_kxx5cy.enc
RELOC/fonts/enc/dvips/cochineal/coch_kzot5v.enc
- RELOC/fonts/enc/dvips/cochineal/coch_l47tcy.enc
RELOC/fonts/enc/dvips/cochineal/coch_l64ji6.enc
RELOC/fonts/enc/dvips/cochineal/coch_lchlkf.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ldgozj.enc
- RELOC/fonts/enc/dvips/cochineal/coch_liz2hd.enc
RELOC/fonts/enc/dvips/cochineal/coch_lqmdx6.enc
- RELOC/fonts/enc/dvips/cochineal/coch_lropbz.enc
- RELOC/fonts/enc/dvips/cochineal/coch_lzqtrs.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_lysrnv.enc
RELOC/fonts/enc/dvips/cochineal/coch_m4bmrm.enc
- RELOC/fonts/enc/dvips/cochineal/coch_max2ec.enc
- RELOC/fonts/enc/dvips/cochineal/coch_mo2enl.enc
- RELOC/fonts/enc/dvips/cochineal/coch_nj5yu3.enc
- RELOC/fonts/enc/dvips/cochineal/coch_nlwa7l.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_mzvjrl.enc
RELOC/fonts/enc/dvips/cochineal/coch_o4vutb.enc
RELOC/fonts/enc/dvips/cochineal/coch_o5mx43.enc
RELOC/fonts/enc/dvips/cochineal/coch_odnecf.enc
- RELOC/fonts/enc/dvips/cochineal/coch_okzdl2.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ol4knl.enc
RELOC/fonts/enc/dvips/cochineal/coch_opxmsy.enc
RELOC/fonts/enc/dvips/cochineal/coch_oqmhja.enc
RELOC/fonts/enc/dvips/cochineal/coch_otkq6i.enc
RELOC/fonts/enc/dvips/cochineal/coch_p7j4gw.enc
RELOC/fonts/enc/dvips/cochineal/coch_pf3hrr.enc
- RELOC/fonts/enc/dvips/cochineal/coch_pfcyih.enc
- RELOC/fonts/enc/dvips/cochineal/coch_pilffg.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_poizrv.enc
RELOC/fonts/enc/dvips/cochineal/coch_pqzq4p.enc
- RELOC/fonts/enc/dvips/cochineal/coch_q35ey5.enc
- RELOC/fonts/enc/dvips/cochineal/coch_q4ulxa.enc
RELOC/fonts/enc/dvips/cochineal/coch_qkxc47.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_qlft4c.enc
RELOC/fonts/enc/dvips/cochineal/coch_qqsbmj.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_qw7mrz.enc
RELOC/fonts/enc/dvips/cochineal/coch_qy633g.enc
RELOC/fonts/enc/dvips/cochineal/coch_qyvxxn.enc
RELOC/fonts/enc/dvips/cochineal/coch_qzhi24.enc
RELOC/fonts/enc/dvips/cochineal/coch_r2kqsv.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_rftgut.enc
RELOC/fonts/enc/dvips/cochineal/coch_rix5n3.enc
- RELOC/fonts/enc/dvips/cochineal/coch_rv5tmq.enc
- RELOC/fonts/enc/dvips/cochineal/coch_s4niqi.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_rqtv55.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_rwqxgv.enc
RELOC/fonts/enc/dvips/cochineal/coch_saoql6.enc
RELOC/fonts/enc/dvips/cochineal/coch_sc4bro.enc
RELOC/fonts/enc/dvips/cochineal/coch_sq6y2y.enc
- RELOC/fonts/enc/dvips/cochineal/coch_sygphi.enc
- RELOC/fonts/enc/dvips/cochineal/coch_syo7sr.enc
- RELOC/fonts/enc/dvips/cochineal/coch_t556x2.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_t6r2tr.enc
RELOC/fonts/enc/dvips/cochineal/coch_t7e5d4.enc
RELOC/fonts/enc/dvips/cochineal/coch_tfefcu.enc
- RELOC/fonts/enc/dvips/cochineal/coch_th736v.enc
- RELOC/fonts/enc/dvips/cochineal/coch_tjygyt.enc
- RELOC/fonts/enc/dvips/cochineal/coch_tkhq7f.enc
- RELOC/fonts/enc/dvips/cochineal/coch_tnxjqs.enc
RELOC/fonts/enc/dvips/cochineal/coch_u3j4lk.enc
RELOC/fonts/enc/dvips/cochineal/coch_uavkhn.enc
- RELOC/fonts/enc/dvips/cochineal/coch_uemkt3.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_uc55q5.enc
RELOC/fonts/enc/dvips/cochineal/coch_uh66oa.enc
- RELOC/fonts/enc/dvips/cochineal/coch_uqbj7f.enc
- RELOC/fonts/enc/dvips/cochineal/coch_vew4u5.enc
- RELOC/fonts/enc/dvips/cochineal/coch_vpdkzq.enc
- RELOC/fonts/enc/dvips/cochineal/coch_w6vdgs.enc
- RELOC/fonts/enc/dvips/cochineal/coch_wa4y3o.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_uxmidq.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_vagwxd.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_vnykvh.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_vy7gw7.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_w4444f.enc
RELOC/fonts/enc/dvips/cochineal/coch_wcbuwv.enc
- RELOC/fonts/enc/dvips/cochineal/coch_wnd62o.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_wdogf3.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_wlbou2.enc
RELOC/fonts/enc/dvips/cochineal/coch_wpweoy.enc
- RELOC/fonts/enc/dvips/cochineal/coch_wuwrcy.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_wrtftx.enc
RELOC/fonts/enc/dvips/cochineal/coch_x3v6nt.enc
RELOC/fonts/enc/dvips/cochineal/coch_x4ugem.enc
- RELOC/fonts/enc/dvips/cochineal/coch_xaxcx7.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_x6gz7p.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_xdw2p4.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_xkc2zu.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_xqkgrj.enc
RELOC/fonts/enc/dvips/cochineal/coch_xsridg.enc
- RELOC/fonts/enc/dvips/cochineal/coch_y3tmc2.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ygltby.enc
- RELOC/fonts/enc/dvips/cochineal/coch_ylbzwi.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_y57dtg.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_yarih3.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_ymkfht.enc
RELOC/fonts/enc/dvips/cochineal/coch_yprnrw.enc
RELOC/fonts/enc/dvips/cochineal/coch_z2oun7.enc
- RELOC/fonts/enc/dvips/cochineal/coch_zbphsw.enc
+ RELOC/fonts/enc/dvips/cochineal/coch_z7fogm.enc
RELOC/fonts/enc/dvips/cochineal/coch_zg5irv.enc
RELOC/fonts/enc/dvips/cochineal/cochalph.enc
RELOC/fonts/enc/dvips/cochineal/cochlf-lgr.enc
@@ -68269,6 +68271,13 @@ runfiles size=6084
RELOC/fonts/tfm/public/cochineal/Cochineal-Roman-tosf-t1.tfm
RELOC/fonts/tfm/public/cochineal/Cochineal-Roman-ts1--base.tfm
RELOC/fonts/tfm/public/cochineal/Cochineal-Roman-ts1.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Bold-ts1--base.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Bold-ts1.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Bolditalic-ts1--base.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Bolditalic-ts1.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Italic-ts1--base.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Italic-ts1.tfm
+ RELOC/fonts/tfm/public/cochineal/Cochineal-Sups-Roman-ts1.tfm
RELOC/fonts/tfm/public/cochineal/Cochineal-alph.tfm
RELOC/fonts/tfm/public/cochineal/Cochineal-osf.tfm
RELOC/fonts/tfm/public/cochineal/cochBMI.tfm
@@ -68456,15 +68465,12 @@ runfiles size=6084
RELOC/tex/latex/cochineal/TS1Cochineal-TOsF.fd
RELOC/tex/latex/cochineal/cochineal.fontspec
RELOC/tex/latex/cochineal/cochineal.sty
- RELOC/tex/latex/cochineal/ly1mincochineal.fd
RELOC/tex/latex/cochineal/omlzcochmi.fd
- RELOC/tex/latex/cochineal/ot1mincochineal.fd
- RELOC/tex/latex/cochineal/t1mincochineal.fd
RELOC/tex/latex/cochineal/uzcochmia.fd
catalogue-ctan /fonts/cochineal
catalogue-license ofl lppl1.3
catalogue-topics font font-body font-serif font-multilingual font-greek font-cyrillic font-proportional font-otf font-type1 font-t1enc font-supp
-catalogue-version 1.077
+catalogue-version 1.08
name codeanatomy
category Package
@@ -71355,7 +71361,7 @@ containerchecksum c73220abd1545907a1d8de37cb534d2c6bd2534f1b55f03c069f39f535c326
name collection-latexextra
category Collection
-revision 68830
+revision 68839
shortdesc LaTeX additional packages
relocated 1
longdesc A very large collection of add-on packages for LaTeX.
@@ -72161,6 +72167,7 @@ depend listingsutf8
depend listlbls
depend listliketab
depend listofsymbols
+depend litesolution
depend litetable
depend lkproof
depend lmake
@@ -72876,8 +72883,8 @@ depend zref-clever
depend zref-vario
depend zwgetfdate
depend zwpagelayout
-containersize 7032
-containerchecksum eae94d921dd7cc3b916afe5203b9012c2af654964d7896796b795572c10047c0b2a945c60e8ca7a4b7a2f178b81e387554dc585f46488edcaf92b2451325fb59
+containersize 7040
+containerchecksum 09740e588b37869785d8b251b049c7cc5359972af9d145b1fd23075c43097f905ad06ae9fb063f2e40d5e57de211c3f3de6b53f2ba4a5e5a9e8f2f8a2b50a999
name collection-latexrecommended
category Collection
@@ -94483,7 +94490,7 @@ catalogue-topics font font-symbol font-type1 linguistic
name diffcoeff
category Package
-revision 66834
+revision 68838
shortdesc Write differential coefficients easily and consistently
relocated 1
longdesc This package allows the easy and consistent writing of
@@ -94496,11 +94503,11 @@ longdesc and the placement of the differentiand (numerator or appended).
longdesc The package is built on xtemplate and the configurability it
longdesc enables, extending to differentials (including simple line
longdesc elements) and jacobians.
-containersize 11336
-containerchecksum 6d2b901257dc8b5d4d7c5999e4da9527efc35fee22143e5b2a03c74fbf7bcf841ccdb4e836826ca188e39723d9dd0e85368242731489abc337e0af8b86f6e2d4
-doccontainersize 1335424
-doccontainerchecksum bf7a956836a631a478089f6148abea5a823fada666f50ef458e7740d94e4eef0abad7c05712eb6c9606219e96f7e840bd3930a34eeb05e44faedf9fc31c4ebe3
-docfiles size=455
+containersize 11436
+containerchecksum a40e95018d471504d5d0cfa2d6ed3c43bb7d4a749a97200b2ed682905d6b448cbb51b80d27d772673b747fdfa3c9b02515ffb32ee9e44efc67445bc4c8cba3ba
+doccontainersize 1346876
+doccontainerchecksum 65646cb4ad22f5755be51c5c8e1ff907803d9d3817b76da8146d81b7b42ea4c9af07710d55d861795a2e7f25f0adbf4f0c55bdce208a563c3ad34d32992c17ec
+docfiles size=456
RELOC/doc/latex/diffcoeff/README.txt details="Readme"
RELOC/doc/latex/diffcoeff/diffcoeff.pdf details="Package documentation"
RELOC/doc/latex/diffcoeff/diffcoeff.tex
@@ -94515,7 +94522,7 @@ catalogue-also derivative
catalogue-ctan /macros/latex/contrib/diffcoeff
catalogue-license lppl1.3c
catalogue-topics maths expl3
-catalogue-version 5.3
+catalogue-version 5.4
name digestif
category Package
@@ -100446,7 +100453,7 @@ catalogue-version 1.031
name dtk
category Package
-revision 67781
+revision 68849
shortdesc Document class for the journal of DANTE
relocated 1
longdesc The bundle provides a class and style file for typesetting "Die
@@ -100454,10 +100461,10 @@ longdesc TeXnische Komodie" -- the communications of the German TeX
longdesc Users Group DANTE e.V. The arrangement means that the class may
longdesc be used by article writers to typeset a single article, as well
longdesc as to produce the complete journal.
-containersize 14620
-containerchecksum 8ff18a26f2e36610fb5094ccee492cbf7df790a38b648b00491982beb1dbde5ddf52d60031f91fc2177e06b1d3b7b58d0b479e22fe86f62a813940f47a800a17
-doccontainersize 79072
-doccontainerchecksum 92f3c2b1bd2c3650bc79adc84d04a007584d4af5ec8f180ed519079ddc18267ae393d968268aaac4bd66a93f6d98484d6536d4d89bd00d4d17d49569ea5f0af9
+containersize 14632
+containerchecksum fef5d494604434e725a79e2dc8165cc25bb01953e31bd64046af11ea6513314afc879c86dfb8aff814e25ea3d6eb3a64a4896c0e5992a87c44af3444eb1439c5
+doccontainersize 78848
+doccontainerchecksum 5ef9df97097a35a4598ee8fd0fd5a506510479195a8dbb9c4bd221324b091f1d62da62a4f7ef8e422fc4a01ac494384882d24d102d1b7cd4b59d72f821e415a4
docfiles size=28
RELOC/doc/latex/dtk/README.md details="Readme"
RELOC/doc/latex/dtk/doc/beispiel.bib
@@ -100482,6 +100489,7 @@ catalogue-contact-repository https://github.com/rolfn/dtk
catalogue-ctan /usergrps/dante/dtk
catalogue-license lppl1.3c
catalogue-topics journalpub class
+catalogue-version 2.10b
name dtk-bibliography
category Package
@@ -192277,6 +192285,40 @@ catalogue-license lppl
catalogue-topics toc-etc
catalogue-version 0.2
+name litesolution
+category Package
+revision 68839
+shortdesc A template providing a light design for solutions of test papers
+relocated 1
+longdesc This template provides a light and fresh template, mainly used
+longdesc for typesetting solutions of final, textbook and other
+longdesc exercises. The template has been developed based on elegantbook
+longdesc and VividBooK and has ported and improved the chapter design
+longdesc module code of the Legrand Orange Book Template.
+containersize 5220
+containerchecksum add09913e8030aaf7ed40f2aab86bd055e30e4fbbd27653704fc185800db7958f4f2af6edb524922826e9355afe599d543fcb38dad2c55a15a2e0eb0b8c5b1c1
+doccontainersize 703852
+doccontainerchecksum 30d31916bcd4a79937f3497052ac91f4dd07bbdbe339ad6e3b8a1d2e84080fd785e251e0ae13644673338d6664c8c31b8887b5b30046d609e7c066aff8a57026
+docfiles size=308
+ RELOC/doc/latex/litesolution/License
+ RELOC/doc/latex/litesolution/README.md details="Readme"
+ RELOC/doc/latex/litesolution/figures/HDU.pdf
+ RELOC/doc/latex/litesolution/figures/cover1.png
+ RELOC/doc/latex/litesolution/litesolution-demo.tex
+ RELOC/doc/latex/litesolution/litesolution-doc.tex
+ RELOC/doc/latex/litesolution/litesolution.pdf details="Package documentation"
+ RELOC/doc/latex/litesolution/litesolution.tex
+runfiles size=4
+ RELOC/tex/latex/litesolution/litesolution.cls
+catalogue-contact-bugs https://github.com/xiamyphys/LiteSolution/issues
+catalogue-contact-development https://github.com/xiamyphys
+catalogue-contact-repository https://github.com/xiamyphys/LiteSolution
+catalogue-contact-support https://qm.qq.com/q/RGFmHwBecC
+catalogue-ctan /macros/latex/contrib/litesolution
+catalogue-license lppl1.3c
+catalogue-topics class doc-templ chinese
+catalogue-version 1.0a
+
name litetable
category Package
revision 68782
@@ -198512,18 +198554,18 @@ catalogue-version 1.4.0
name luarandom
category Package
-revision 49419
+revision 68847
shortdesc Create lists of random numbers
relocated 1
longdesc This package can create lists of random numbers for any given
longdesc interval [a;b]. It is possible to get lists with or without
longdesc multiple numbers. The random generator will be initialized by
longdesc the system time. The package can only be used with LuaLaTeX!
-containersize 1392
-containerchecksum 54019dd968b2cf3b6ab9a3777e609789c04a0d369b1ae938df152ded3bf54607140fe6265b81ca2a75f458e9b8144000f0bf2e9d77fb00aa923f7ce9569c423f
-doccontainersize 50272
-doccontainerchecksum f7fa30cd6668674cfee8116bdacd3c457fe6e1a3ef4a1c0da603db2fbaae77d187bfc5b4867aea0410a906238769d7138672b89b51eccc9fc4d110a079784092
-docfiles size=16
+containersize 1416
+containerchecksum 1b5f4f420fe5acd552e7ff34459184319337a586b19f3b53111940fa648b09924f03ce7ce4da7463cbc894e65ef87647ada660922ab252b560dfe99295255097
+doccontainersize 70264
+doccontainerchecksum 4be8b8d72bdd6d4eb33999d662e06a60c8971d5a990b649e37c990dcc6f708856ee61a59ad1dddb6c083eab09e809ddfb65a1730a8e76bb6aadb1a240c809a26
+docfiles size=21
RELOC/doc/lualatex/luarandom/Changes
RELOC/doc/lualatex/luarandom/README details="Readme"
RELOC/doc/lualatex/luarandom/luarandom-doc.pdf details="Package documentation"
@@ -198533,7 +198575,7 @@ runfiles size=1
catalogue-ctan /macros/luatex/latex/luarandom
catalogue-license lppl1.3
catalogue-topics luatex random calculation
-catalogue-version 0.01
+catalogue-version 0.02
name luaset
category Package
@@ -226384,7 +226426,7 @@ catalogue-version 0.55
name newpx
category Package
-revision 68798
+revision 68835
shortdesc Alternative uses of the PX fonts, with improved metrics
relocated 1
longdesc This package, initially based on pxfonts, provides many fixes
@@ -226395,10 +226437,10 @@ longdesc options. For proper operation, the packages require that the
longdesc packages newtxmath, pxfonts, and TeXGyrePagella be installed
longdesc and their map files enabled.
execute addMap newpx.map
-containersize 4743784
-containerchecksum 059f88afef1ce466c1f9df996afe551ab8423f19817c76886de2d25e78c3d8fcc29318a5e4edb0e9da3aa1173866a7547b71eda017e7f0cfcf8e345f76130269
-doccontainersize 476656
-doccontainerchecksum a69c57dd4c2eb25d61bd79850de9090315ec6f8a38ab337702b4f3f8d8c2f70761e0ca73d77f93c59bffa72dcbf98758039a56960a1c21f09df6c80c1d8da13b
+containersize 4743888
+containerchecksum a733665b6b1c3b1149b3420967b4ff2a74788c801acbb18c8312a35a53e14a6922ec6499bfdf7b9274ebcfa28120f3f2abf17a3136d6d893b6af13554d317622
+doccontainersize 476872
+doccontainerchecksum 0e071fa94c85e60912d1ba2f085940b6e88176b29377d6cc603719583a15f8c0a8c09ca16e2c3845f441e89db10bbf10f4f443b535cfd793d5e63fff9d384048
docfiles size=146
RELOC/doc/fonts/newpx/ChangesInV1.4.txt
RELOC/doc/fonts/newpx/MANIFEST-newpx.txt
@@ -226409,7 +226451,7 @@ docfiles size=146
RELOC/doc/fonts/newpx/newpxeg-crop.pdf
RELOC/doc/fonts/newpx/pxfontseg-crop.pdf
srccontainersize 392
-srccontainerchecksum 0d4a7a70877461fe98675a85948452fd968c5ae37ed686503d4859663feb74a8245831561ed48d0ce1e182a8ffe5fc45c0275d4095960e8a3b1a5dc12a9face4
+srccontainerchecksum 9538c5d23d061c6f7651a668fda12f800460acd5b5e1491aaaea41fc20fb1fce7ed0ef27cf24721f2d8a7b2b9abc4af59ce1807d958a4ae225b65d23e1e8693c
srcfiles size=1
RELOC/source/fonts/newpx/TRK.fea
runfiles size=3690
@@ -227043,9 +227085,9 @@ runfiles size=3690
RELOC/tex/latex/newpx/unpxsym.fd
RELOC/tex/latex/newpx/unpxtt.fd
catalogue-ctan /fonts/newpx
-catalogue-license lppl ofl
+catalogue-license lppl gfl
catalogue-topics font font-body font-maths font-serif font-proportional font-type1 font-otf font-supp font-t1enc
-catalogue-version 1.533
+catalogue-version 1.534
name newsletr
category Package
@@ -229348,7 +229390,7 @@ catalogue-version 0.0.1
name njuthesis
category Package
-revision 67309
+revision 68848
shortdesc LaTeX thesis template for Nanjing University
relocated 1
longdesc The njuthesis class is intended for typesetting Nanjing
@@ -229356,17 +229398,17 @@ longdesc University dissertations with LaTeX, providing support for
longdesc bachelor, master, and doctoral theses as well as postdoctoral
longdesc reports. Compilation of this class requires either XeLaTeX or
longdesc LuaLaTeX.
-containersize 22476
-containerchecksum 40de1fae1ccb3d801bddfd7d43f733c3eafee243bcfc09e8c77e07bd8f89b456139a8e1bcc7c0d6c385e4e35d88aa9ae0f2ef7d398d118e51cac5b2470cc07f6
-doccontainersize 1244196
-doccontainerchecksum 127bced82b3a7eaf4ef0aedbfd843c62cf671cdc4deec7299021659767872f3a301306ed175c5d84fb6a0f1de2eaffeded9e0c1baa7f64d81916483e9f301539
+containersize 22628
+containerchecksum 8fa2fac222886f7d2803f30ee0ab498812c5f986a458414720b73d83edb9884f2c36ce67cf4f113357773894113f40f8cf967178e3aa8dce125d442f39ff058a
+doccontainersize 1243316
+doccontainerchecksum 90b7482509e5a0e9e9097f0265b9a7aef7915e6a96f5fbf741e60444928265ea63acdfb4e80151ff0f46eee209b907f0381e1d669af5f002c267ac97f2d6f66c
docfiles size=312
RELOC/doc/latex/njuthesis/LICENSE
RELOC/doc/latex/njuthesis/README.md details="Readme"
RELOC/doc/latex/njuthesis/njuthesis.pdf details="Package documentation" language="zh"
-srccontainersize 67840
-srccontainerchecksum b6c2650dd191680ccd996529194b91233ce98b849133739701d9eb04a51cd8b7e0017919edde330ee9b6a36428e964e1d4857cc8b7c5dad542671543a3ed7d50
-srcfiles size=78
+srccontainersize 68208
+srccontainerchecksum 5e24084a2f1c673ad2ff3b0801aa747e3cdb7e391e30d18a3221956e13886471730037d538564ad856accec50b9a1bef0697774ce2e4fea99fc269e7a517369a
+srcfiles size=79
RELOC/source/latex/njuthesis/njuthesis.dtx
RELOC/source/latex/njuthesis/njuthesis.ins
runfiles size=33
@@ -229383,7 +229425,7 @@ catalogue-contact-support https://github.com/nju-lug/NJUThesis/discussions
catalogue-ctan /macros/unicodetex/latex/njuthesis
catalogue-license lppl1.3c
catalogue-topics class dissertation proposal expl3 latex3 chinese
-catalogue-version 1.3.0
+catalogue-version 1.3.1
name njuvisual
category Package
@@ -256878,18 +256920,18 @@ catalogue-version 1.4
name pmdraw
category Package
-revision 68766
-shortdesc Draw elements of the partition monoids
+revision 68836
+shortdesc Draw elements of partition monoids
relocated 1
-longdesc The pmdraw package allows you to draw elements of the Partition
-longdesc Monoids, commonly referred to as diagrams. The package provides
-longdesc a lot of flexibility to draw most diagrams and can be
-longdesc customised as needed.
-containersize 6348
-containerchecksum 3d6ed6af4316818881d4c93bce0ae58bdc06de4e0a3201c95076dcc9593ab5fca290c9e788110e4add478e05f4640484d9d2132b6852f279470be94b01049a4a
-doccontainersize 377412
-doccontainerchecksum 6eb34b3f95553d00ee4a1f9ac32ecdfb670e5ae131d2b619c2b06217effc1cf0c256788ec8823efadcce3ee285bbeef608ae54ec2f714ab9c9055b9375320dbc
-docfiles size=141
+longdesc This package allows you to draw elements of Partition Monoids,
+longdesc commonly referred to as diagrams. The package provides a lot of
+longdesc flexibility to draw most diagrams and can be customised as
+longdesc needed.
+containersize 6396
+containerchecksum fe39ae082f99f32aea1a055788a10f2b7fdf381abf97537e9f3365962db6679d6e3b40dec99e61cd51e30831c9d59649da48551b63091e055e91a8cac7e24a9c
+doccontainersize 379264
+doccontainerchecksum fdb1834542ff5d4d1d826394de9125936cdc7404a11a92295c8e78a099bf66db738d958161f32ac3947f4245f2e3663f71e6f246d7038e3e44941bc2e7f0386e
+docfiles size=143
RELOC/doc/latex/pmdraw/README.md details="Readme"
RELOC/doc/latex/pmdraw/examples/example-1.tex
RELOC/doc/latex/pmdraw/examples/example-10.tex
@@ -256922,8 +256964,8 @@ runfiles size=11
RELOC/tex/latex/pmdraw/pmdraw.sty
catalogue-ctan /graphics/pmdraw
catalogue-license lppl1.3
-catalogue-topics graphics diagram
-catalogue-version 1.0
+catalogue-topics maths graphics diagram pgf-tikz
+catalogue-version 1.1
name pmgraph
category Package
@@ -259141,7 +259183,7 @@ catalogue-version 0.1.3
name postnotes
category Package
-revision 68006
+revision 68840
shortdesc Endnotes for LaTeX
relocated 1
longdesc This is an endnotes package for LaTeX. Its user interface
@@ -259154,11 +259196,11 @@ longdesc up contextual running headers for printed notes. The default is
longdesc a simple but useful one, in the form "Notes to pages N-M", but
longdesc more elaborate ones can be built. When hyperref is loaded,
longdesc postnotes provides hyperlinked notes, including back links.
-containersize 7372
-containerchecksum 612446adfdb5cc28a4d03d96304e8bf948603182b1ac5785aaa14f159d7dc2defaaa52b7b28a3124f8578bdf88986775eae30b5be2351369652e251680715be0
-doccontainersize 1007300
-doccontainerchecksum 68fc51d9394d02d24c0243836e19db9c7d14781247682b00d7850f4b5ddd6c1f3d6b0a2b8c905a43536e438c07a3c156a6cdf492a1eccfa95c19f8b80183a5cb
-docfiles size=266
+containersize 7396
+containerchecksum 96d25ab37f1f3b5bc34956f48a800cecd622bb102c4043b4534cdfc2513becc79bb247473ecbbeb43c4933257da4772c17d853feba01f5cab0f2ff18c8c5a02b
+doccontainersize 1004116
+doccontainerchecksum 80d8129a50ff54a59a8782b95d03ebbf4d70848f885a4d8a39419999ca55d401790b6b16caaf60f87bca19c4b6865c9d312c66a96ed317f474be8139ea133835
+docfiles size=267
RELOC/doc/latex/postnotes/CHANGELOG.md
RELOC/doc/latex/postnotes/DEPENDS.txt
RELOC/doc/latex/postnotes/README.md details="Readme"
@@ -259166,9 +259208,9 @@ docfiles size=266
RELOC/doc/latex/postnotes/postnotes-code.tex
RELOC/doc/latex/postnotes/postnotes-doc.pdf details="User manual"
RELOC/doc/latex/postnotes/postnotes-doc.tex
-srccontainersize 22436
-srccontainerchecksum 6950b83a15cfdf15026292a3725fe2c4566d3909a167cf82e38e46e787638070bb3c0e2ded5b0a0be7531d4b425595e63e4d7570be0fb6c266bd82c185a1d8e6
-srcfiles size=26
+srccontainersize 22524
+srccontainerchecksum 0c6e5f6e0ab3443d5cd2b8072e062076b484a9fe34c5d553699245b99a15b47b70c5cd4428a2d8a64acbe7df5da457938452e43a24beb79d63f7bb1371874a2f
+srcfiles size=27
RELOC/source/latex/postnotes/postnotes.dtx
RELOC/source/latex/postnotes/postnotes.ins
runfiles size=12
@@ -259177,7 +259219,7 @@ catalogue-contact-repository https://github.com/gusbrs/postnotes
catalogue-ctan /macros/latex/contrib/postnotes
catalogue-license lppl1.3c
catalogue-topics endnote expl3
-catalogue-version 0.2.6
+catalogue-version 0.2.7
name powerdot
category Package
@@ -260056,7 +260098,7 @@ catalogue-version 1.1
name profcollege
category Package
-revision 68558
+revision 68841
shortdesc A LaTeX package for French maths teachers in college
relocated 1
longdesc This package provides some commands to help French mathematics
@@ -260066,16 +260108,16 @@ longdesc \Pythagore{ABC}{5}{7} to write the entire calculation of AC
longdesc with the Pythagorean theorem, \Trigo[Cosinus]{ABC}{3}{}{60} to
longdesc write the entire calculation of AC with cosine, ... and some
longdesc others.
-containersize 1319080
-containerchecksum cf6bc41fe95174f45d460a667c3de5da472e6892bcc01bde9290ef047b30e03448f67ac1384566f8fad7955950b5146a4062c7b4a3a348f03d8cba8ec9797688
-doccontainersize 14515396
-doccontainerchecksum eed1e29822bda01e8c5b7168394911f1936d0b67e49ab9a45b11ab151b08977bdb26cbdbbfc73714e280fa3a0a11c86f3b4c19d3f04d8300dfa093d54273fda0
-docfiles size=3831
+containersize 1333464
+containerchecksum a60279ad94dab8ee81597aa1926181a23095012e25094975c99e6e2e77dfbbdabb11c321779540542230b15f72f24f6d6911e4dc987dd5eec20db251ddf8df76
+doccontainersize 14981936
+doccontainerchecksum 2c588f7a18a653c24589ac06d2c7e95f646916e714d98a27b0f9b55f94b488b16d89f9e2d59143ef5a05903b9d49d22016ea20fbeb3299f81da164d2231abbcf
+docfiles size=3844
RELOC/doc/latex/profcollege/PfCLogoNumberHive.png
RELOC/doc/latex/profcollege/ProfCollege-doc.pdf details="Package documentation" language="fr"
RELOC/doc/latex/profcollege/ProfCollege-doc.zip
RELOC/doc/latex/profcollege/README details="Readme"
-runfiles size=2898
+runfiles size=2907
RELOC/metapost/profcollege/PfCAfficheur.mp
RELOC/metapost/profcollege/PfCAllumettes.mp
RELOC/metapost/profcollege/PfCArithmetique.mp
@@ -260310,6 +260352,7 @@ runfiles size=2898
RELOC/tex/latex/profcollege/PfCCalculatrice.tex
RELOC/tex/latex/profcollege/PfCCalculsCroises.tex
RELOC/tex/latex/profcollege/PfCCalculsFractions.tex
+ RELOC/tex/latex/profcollege/PfCCalculsFractionsoldv1.tex
RELOC/tex/latex/profcollege/PfCCalisson.tex
RELOC/tex/latex/profcollege/PfCCartesJeux.tex
RELOC/tex/latex/profcollege/PfCCartesMentales.tex
@@ -260318,6 +260361,7 @@ runfiles size=2898
RELOC/tex/latex/profcollege/PfCCibleQOp.tex
RELOC/tex/latex/profcollege/PfCColorilude.tex
RELOC/tex/latex/profcollege/PfCCompteBon.tex
+ RELOC/tex/latex/profcollege/PfCCritere.tex
RELOC/tex/latex/profcollege/PfCCryptarithme.tex
RELOC/tex/latex/profcollege/PfCDecDeci.tex
RELOC/tex/latex/profcollege/PfCDecompFracDeci.tex
@@ -260343,7 +260387,6 @@ runfiles size=2898
RELOC/tex/latex/profcollege/PfCEquationSoustraction2.tex
RELOC/tex/latex/profcollege/PfCEquationSymbole1.tex
RELOC/tex/latex/profcollege/PfCEquationTerme1.tex
- RELOC/tex/latex/profcollege/PfCErathostene.tex
RELOC/tex/latex/profcollege/PfCEratosthene.tex
RELOC/tex/latex/profcollege/PfCFactorisation.tex
RELOC/tex/latex/profcollege/PfCFicheMemo.tex
@@ -260440,7 +260483,7 @@ catalogue-also proflycee
catalogue-ctan /macros/latex/contrib/profcollege
catalogue-license lppl1.3c
catalogue-topics maths french teaching
-catalogue-version 0.99-z-v
+catalogue-version 0.99-z-w
name proflabo
category Package
@@ -279303,7 +279346,7 @@ catalogue-topics font font-body font-proportional font-mono font-sans font-serif
name robust-externalize
category Package
-revision 68757
+revision 68842
shortdesc Cache anything (TikZ, python, ...) in a robust, efficient and pure way
relocated 1
longdesc This package provides a LaTeX library to cache anything (TikZ,
@@ -279311,15 +279354,15 @@ longdesc python, ...), in a robust, efficient and pure way. We also
longdesc provide a template system with placeholders to provide
longdesc configurable templates. For more information, see the
longdesc documentation and the github repository.
-containersize 26548
-containerchecksum d9b03972893c3548787f1e3dd8fe48879270208d0283f28f2a65ab1df992954552d48bb0e091e29c8c979e6f0d585d0a5b29a3c623902169f1cf6adc65d3615e
-doccontainersize 666716
-doccontainerchecksum 83d42662d5bf9a6ca9bc14e85955cf5c156498797d23410765bb27b7dff3e8fd022a5d83b4545ff9ccc3cfb0e04b7a89a4bc4cbc68836c6cdb8f022d2a0d74e6
-docfiles size=235
+containersize 27184
+containerchecksum b210a9adbfa6bc7d0063e624a30abb885eb49a7e7dd3e215f97784e5da4c79886fe4d19aa012395894098833c18209c117e913b14091fd2f3eb8904a356fd792
+doccontainersize 691812
+doccontainerchecksum e1732e10a355b4f54d870420acfa3bbeb6256b0a7c0136f5cfde829ff02885422b175c2834b229bf22a4b4a28a1c8e80932af2b0a826b1658d0d8ec58de909bf
+docfiles size=244
RELOC/doc/latex/robust-externalize/README.md details="Readme"
RELOC/doc/latex/robust-externalize/robust-externalize.pdf details="Package documentation"
RELOC/doc/latex/robust-externalize/robust-externalize.tex
-runfiles size=34
+runfiles size=35
RELOC/tex/latex/robust-externalize/robust-externalize.sty
catalogue-contact-announce https://github.com/leo-colisson/robust-externalize/releases
catalogue-contact-bugs https://github.com/leo-colisson/robust-externalize/issues
@@ -279327,7 +279370,7 @@ catalogue-contact-repository https://github.com/leo-colisson/robust-externalize/
catalogue-ctan /macros/latex/contrib/robust-externalize
catalogue-license mit
catalogue-topics compilation expl3
-catalogue-version 2.1
+catalogue-version 2.2
name robustcommand
category Package
@@ -287874,21 +287917,23 @@ catalogue-version 1.6
name sim-os-menus
category Package
-revision 68830
+revision 68843
shortdesc Insert 'terminal' or 'context menu' or 'viewers' like in an OS
relocated 1
longdesc This is a package to present, like in an OS: a fake terminal
longdesc (with tcolorbox); a fake context menu with sub-menus (with
longdesc TikZ); a fake viewer (with tcolorbox).
-containersize 4248
-containerchecksum eb29792d331aa2b6fa0d6276f97207266189a4998fce256c1b1dd46d20190c8641c99f8d38eb391020226cd8dfc8000498f1e87137d2e9e08bc43e31ce9021bc
-doccontainersize 392852
-doccontainerchecksum 44bea14c40bfb5718278bdfdaf781bad75463c71a99aad247fe8ecf6f60bfbf661c7b01b3973214445669e881905d7be6f9d273d53f9e8b6af4ffa17f96b4237
-docfiles size=102
+containersize 4820
+containerchecksum 565fce3e9e13d14f7f52d3390e407b03ec680b21cef37e68439095d9e7cc813739853c9e3307dae040dcf60c6a6dc4934b0d8bac68b258af4c14aa22d8d9aadf
+doccontainersize 563656
+doccontainerchecksum b2392fac63c75de85b89ca7037f495155cb749b17220cdc3fb2aca368bdbd593039425bf21a0341a4160935fba94d0a9bf5fcfa6c7d686178a715aab44a28ae5
+docfiles size=205
RELOC/doc/latex/sim-os-menus/README.md details="Readme"
+ RELOC/doc/latex/sim-os-menus/sim-os-menus-doc-fr.pdf
+ RELOC/doc/latex/sim-os-menus/sim-os-menus-doc-fr.tex
RELOC/doc/latex/sim-os-menus/sim-os-menus-doc.pdf details="Package documentation"
RELOC/doc/latex/sim-os-menus/sim-os-menus-doc.tex
-runfiles size=5
+runfiles size=8
RELOC/tex/latex/sim-os-menus/sim-os-menus.sty
catalogue-contact-bugs https://github.com/cpierquet/sim-os-menus/issues
catalogue-contact-home https://github.com/cpierquet/sim-os-menus
@@ -287896,7 +287941,7 @@ catalogue-contact-repository https://github.com/cpierquet/sim-os-menus
catalogue-ctan /macros/latex/contrib/sim-os-menus
catalogue-license lppl1.3c
catalogue-topics presentation boxing comp-sci
-catalogue-version 0.1.0
+catalogue-version 0.1.1
name simple-resume-cv
category Package
@@ -288545,7 +288590,7 @@ catalogue-version 1.36
name siunitx
category Package
-revision 68775
+revision 68844
shortdesc A comprehensive (SI) units package
relocated 1
longdesc Typesetting values with units requires care to ensure that the
@@ -288570,17 +288615,17 @@ longdesc The package relies on LaTeX 3 support from the l3kernel and
longdesc l3packages bundles.
depend l3kernel
depend l3packages
-containersize 67728
-containerchecksum fbee3113ef34989b6440166def53eacd5ed3ab83c9009b02cad4989bd12cf68899c1f5ac04cdaeac422f702247a10797968d325d9ce91bee7c2f9f41d854b91d
-doccontainersize 1288648
-doccontainerchecksum 16bff5296d383ad6571d08399aac21001dfbca7b04e8221f08613babe40f69399196a9f3aa2ab4afd36dc1a3516578f8de4ea068412476a95cccadfe4320e0b1
+containersize 67724
+containerchecksum adf94a225f73f132a84a2bcd40ac1f024f81fa10eb35be7ca6a41149960f508ccb45f967371aa11ec1a129251a3272361ab270a3ba00b595627489cac789f279
+doccontainersize 1288056
+doccontainerchecksum 35fe0a78311f053e98153fb435327478cd6fca48e1c9595736d4857cbb6e8882ddb20a89fcaf95542c9076c7a89cd8ad0c042e0faf0a8a7dc3a4dccc8131fa98
docfiles size=353
RELOC/doc/latex/siunitx/CHANGELOG.md
RELOC/doc/latex/siunitx/README.md details="Readme"
RELOC/doc/latex/siunitx/siunitx-code.pdf details="Code documentation"
RELOC/doc/latex/siunitx/siunitx.pdf details="User manual"
-srccontainersize 122932
-srccontainerchecksum 6885914818eaa462b249e5cc5c9b9fd4908b5999c7d3634bb99d3bc3e385c80a669015edcc2c6e4f1aa5a02fa9fb57c6a30bd1edda7b9b9601c89a92c4b07bad
+srccontainersize 122968
+srccontainerchecksum 1abddd04b462232b62d9f53a1dec4f9815862fe208680e7b62aff00c6ce4649494eedfda81051e7d842d64ebec35043e7a38321212af22e3bf70cf9649bc107d
srcfiles size=190
RELOC/source/latex/siunitx/siunitx-abbreviation.dtx
RELOC/source/latex/siunitx/siunitx-angle.dtx
@@ -288612,7 +288657,7 @@ catalogue-contact-repository https://github.com/josephwright/siunitx
catalogue-ctan /macros/latex/contrib/siunitx
catalogue-license lppl1.3c
catalogue-topics units scientific-docs expl3
-catalogue-version 3.3.8
+catalogue-version 3.3.9
name skak
category Package
@@ -301742,7 +301787,7 @@ catalogue-version 1.1
name tagpdf
category Package
-revision 68805
+revision 68845
shortdesc Tools for experimenting with tagging using pdfLaTeX and LuaLaTeX
relocated 1
longdesc The package offers tools to experiment with tagging and
@@ -301753,10 +301798,10 @@ longdesc needed; to test what else is needed so that a pdf works e.g.
longdesc with a screen reader. Its goal is to get a feeling for what has
longdesc to be done, which kernel changes are needed, how packages
longdesc should be adapted.
-containersize 35932
-containerchecksum 3ee9aaae0d2dd30c63d56d725353523599ed2d6acdadf9db1f5f3dcf544a0f239e7dc25bb37a493aabce6d65bace1e08d0fb862a84a99fd9f010e3f63acd195d
-doccontainersize 2143960
-doccontainerchecksum f9fac7758ad139781c8cd206d2a985e6c225bfe74e800ebf36ed5e52280a58305fd6394118bd0055781e1d10c5da476db1b09f9ee32fbce6e1b5b98c0dc7cbe5
+containersize 35920
+containerchecksum 25cdb44d398cf0346260c6db0739b3c4d9212121233c9a9903fa0c8f13344a5268f7d8dd2e54a1937fa212de30778f2a33569e8dd051fe602ae16ad0583600cb
+doccontainersize 2143932
+doccontainerchecksum af6ba6232594e978438d553c66f3ec31444b9d1833423a7af970536d7f1b66321b87215bb436c2517958d3cb9a0e7396879a86579bb4ba4512659ffe199291ba
docfiles size=827
RELOC/doc/latex/tagpdf/README.md details="Readme"
RELOC/doc/latex/tagpdf/acrobat.png
@@ -301792,8 +301837,8 @@ docfiles size=827
RELOC/doc/latex/tagpdf/tagpdf.bib
RELOC/doc/latex/tagpdf/tagpdf.pdf details="Package documentation"
RELOC/doc/latex/tagpdf/tagpdf.tex
-srccontainersize 66476
-srccontainerchecksum a8b303af7a96815d89573d8a5e9a62e5240a6683f673d2ae1d57158d0f851c1fbf2e557b64c67e54dd3367cc5a9d7643197ec6d74b828eaefd57cc1b335456dd
+srccontainersize 66528
+srccontainerchecksum 4547390ee840806fb007564ac2d6fcffa02893634b8167dbca698ffac79f38869791b9bbc01c44ff42a6a51df3145cacd8fd8a50efc2da9219056a0bf361b1d6
srcfiles size=96
RELOC/source/latex/tagpdf/tagpdf-backend.dtx
RELOC/source/latex/tagpdf/tagpdf-checks.dtx
@@ -301832,7 +301877,7 @@ catalogue-contact-support https://github.com/u-fischer/tagpdf/issues
catalogue-ctan /macros/latex/contrib/tagpdf
catalogue-license lppl1.3c
catalogue-topics tagged-pdf accessible expl3
-catalogue-version 0.98n
+catalogue-version 0.98o
name talk
category Package
@@ -317055,7 +317100,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 68825
+revision 68833
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -317063,10 +317108,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 114228
-containerchecksum dba36d28cbfbc5e4768c68716fe6342af02ebc14878c0c7e6c376ace0b570e41db54c6681cbbc24e62a93177d0402a90829b2e559ff6468b3d373213226fda13
-doccontainersize 429896
-doccontainerchecksum 64534a0dd0f9a26ef2fb9c18bb5d08bb2e30ab179dca1c9965e6cf43d0e75f2971d4e7464778da3bac9230b8053e36f72a6aff117f5e43a33dc8c6fc58b15bd8
+containersize 114224
+containerchecksum fe6cc2ab4b3fa50b56df827053e5b5c096893d2f30361538f6b7a4a32047dfc25831325f317fc531faa35244012cd526915754017f6bf76f4637318f5c96dfcc
+doccontainersize 430052
+doccontainerchecksum f4b7c52a4dc5f0e02a0847f4d7ef4388187dcc6c42dd4ffda2efc991b487be5dff2d5fe68ec0a68b6540164abb660fce86f6c21055ccc532c09da28952d61dbf
docfiles size=559
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -367796,7 +367841,7 @@ catalogue-version 2.35
name zref-check
category Package
-revision 67939
+revision 68846
shortdesc Flexible cross-references with contextual checks based on zref
relocated 1
longdesc This package provides an user interface for making LaTeX
@@ -367810,11 +367855,11 @@ longdesc in a warning at compilation time if any of these checks fail.
longdesc \zctarget and the zcregion environment are also defined as a
longdesc means to easily set label targets to arbitrary places in the
longdesc text which can be referred to by \zcheck.
-containersize 5600
-containerchecksum 9b683918a02b4cb58a67122f533f124c28f58a87f9675e7bc761057df423689f804dc6a3c1a94ec4ecb5e91d652917e7287122d10207f8330214f139769332ab
-doccontainersize 1059472
-doccontainerchecksum 044316a3075e9daf5b62d6ba8f97bdc9c735a7856158c597ea2db1418e4b960d6ef7724192f1322ac7b4c3e841eb5db8c8774f946533617ec4944197dc3574fd
-docfiles size=304
+containersize 5612
+containerchecksum 98aeb6007f1f599a2bda644c60c9929ca27c9045d73af3d54298837eb842e7976a2f9067182ce38c77ff197e2fe36a53207d2aa39adaa9deeb4e118bd034b0e5
+doccontainersize 1015828
+doccontainerchecksum d050bb4a6c68a80eafe3eb7f99c61407424385743785014600404397e6fa322becaf3a28157f59951a2406fdfb66968f3cba9de4e388282ea0c84e3f33d4fc8d
+docfiles size=285
RELOC/doc/latex/zref-check/CHANGELOG.md
RELOC/doc/latex/zref-check/DEPENDS.txt
RELOC/doc/latex/zref-check/README.md details="Readme"
@@ -367822,8 +367867,8 @@ docfiles size=304
RELOC/doc/latex/zref-check/zref-check-code.tex
RELOC/doc/latex/zref-check/zref-check-doc.pdf details="User manual"
RELOC/doc/latex/zref-check/zref-check-doc.tex
-srccontainersize 13940
-srccontainerchecksum 67d1d06f357dba1c828d8ab307aa17cd491f42f8c4269147a621ca517791eddf996ec6b49fa340ea782d18583a51d1a10728c348ff12969b8bf788c9874a8bca
+srccontainersize 14048
+srccontainerchecksum a84246193d390c55dd66d65b64eae79e52099e7f7c75b8ef03d595d466d57643832f95ff23ecdc2dd0cc31b7c5cc64db361bd5ece7949e544936739b2c70e1bb
srcfiles size=18
RELOC/source/latex/zref-check/zref-check.dtx
RELOC/source/latex/zref-check/zref-check.ins
@@ -367833,11 +367878,11 @@ catalogue-contact-repository https://github.com/gusbrs/zref-check
catalogue-ctan /macros/latex/contrib/zref-check
catalogue-license lppl1.3c
catalogue-topics label-ref expl3
-catalogue-version 0.3.4
+catalogue-version 0.3.5
name zref-clever
category Package
-revision 67937
+revision 68846
shortdesc Clever LaTeX cross-references based on zref
relocated 1
longdesc This package provides a user interface for making LaTeX
@@ -367849,11 +367894,11 @@ longdesc multiple labels can be automatically sorted and compressed into
longdesc ranges when due. The reference format is highly and easily
longdesc customizable, both globally and locally. The package is based
longdesc on zref's extensible referencing system.
-containersize 23308
-containerchecksum a2e64ecd8d8e47f71caf25bddab9c57c3f30697406ab436053c576165ebbc4f116b3d8700dd5c72c09cf8934e37dda93d3abc86edd7d683cb6f49b500b8b8beb
-doccontainersize 1567496
-doccontainerchecksum 1501723f8b813dce23d98b001139eae2e3930a391c92f1dde89a736bd426316f696204a4f00dfa0a939deea00088abb890b3e9b7bc63c11137cbbdcc74465121
-docfiles size=433
+containersize 23304
+containerchecksum d7a32fde3ee94e304f854f690756ad9d15a9287c1dd38e1707a1f33e2bd30ac23147a439990ba7e9f7bc0b2c5b37b5d475bb64f2ab89bb15752bfc0e2f9ad3ac
+doccontainersize 1515088
+doccontainerchecksum c18e86417db71ece26e6a29e0598e521d17a79c26f5ebd92dbd78c427142bb992df9ff39c0a5867dd296093036615bc319aa9dc970faa0ae0d4ed479452e1b89
+docfiles size=421
RELOC/doc/latex/zref-clever/CHANGELOG.md
RELOC/doc/latex/zref-clever/DEPENDS.txt
RELOC/doc/latex/zref-clever/README.md details="Readme"
@@ -367861,12 +367906,12 @@ docfiles size=433
RELOC/doc/latex/zref-clever/zref-clever-code.tex
RELOC/doc/latex/zref-clever/zref-clever-doc.pdf details="User manual"
RELOC/doc/latex/zref-clever/zref-clever-doc.tex
-srccontainersize 52896
-srccontainerchecksum ec0eedaa6ec46ef055b26798c48d85f231aba642b7fd1f52ccff27110e6e73b4486c01181ca8f1c218579dcf203c45e772a33332168f2d9c70cf1f9a0663807a
+srccontainersize 52876
+srccontainerchecksum 3ff30e4c2ee570c5c142542110699ec17b123078c5d01ed9de2781404026b120856d38d4cb05160bd90ea56063e220e09dd46158d938a70416488797855a1fe3
srcfiles size=86
RELOC/source/latex/zref-clever/zref-clever.dtx
RELOC/source/latex/zref-clever/zref-clever.ins
-runfiles size=67
+runfiles size=68
RELOC/tex/latex/zref-clever/zref-clever-dutch.lang
RELOC/tex/latex/zref-clever/zref-clever-english.lang
RELOC/tex/latex/zref-clever/zref-clever-french.lang
@@ -367879,11 +367924,11 @@ catalogue-contact-repository https://github.com/gusbrs/zref-clever
catalogue-ctan /macros/latex/contrib/zref-clever
catalogue-license lppl1.3c
catalogue-topics label-ref expl3
-catalogue-version 0.4.2
+catalogue-version 0.4.3
name zref-vario
category Package
-revision 67949
+revision 68846
shortdesc Extended LaTeX page cross-references with varioref and zref-clever
relocated 1
longdesc This package offers a compatibility layer for varioref to be
@@ -367893,11 +367938,11 @@ longdesc does some (scoped) setup for varioref, then calls the original
longdesc one.
depend tools
depend zref-clever
-containersize 4536
-containerchecksum ff87f85b813a5c8b30ff73674abe1bc6a2e6343bad802a160468b3f57d17baf94f4e30104b2dcb287621f83b0296762cce7805bb6684e999fb57c58cb74ac880
-doccontainersize 781408
-doccontainerchecksum 9059a2e53a0ca5927a448ca2663d8d20655d90eeecabd817faec67e455d4101c1b5f5fddf07d343edad993cfd21d4f5ce55cdbd20d772992add1b983c62edfd5
-docfiles size=204
+containersize 4644
+containerchecksum c159620be1d7d853641d4b42108ec0b2e36b6f4b0c604680469b52cf4c0557196263293d4692906d1d42c1d0ab9a666b59d462266131e42f319a5ab3a2385780
+doccontainersize 725800
+doccontainerchecksum b618216a0bd8d7b65fe73be05156e899917719436ef0139122fd01047b8d55faeea55ae05e259d99c464aaeb3fdd9268886b7dec9c4b6a86209da1dcf1c3a3ca
+docfiles size=191
RELOC/doc/latex/zref-vario/CHANGELOG.md
RELOC/doc/latex/zref-vario/DEPENDS.txt
RELOC/doc/latex/zref-vario/README.md details="Readme"
@@ -367905,8 +367950,8 @@ docfiles size=204
RELOC/doc/latex/zref-vario/zref-vario-code.tex
RELOC/doc/latex/zref-vario/zref-vario-doc.pdf details="User manual"
RELOC/doc/latex/zref-vario/zref-vario-doc.tex
-srccontainersize 8112
-srccontainerchecksum 66b7dd2b0daf31cc2215ba480d25704f7071541c1116b0fcd1ebc16436727a3fbf2fdf708a18a18e58b9dfe70b41322f35a5517e488a36ace77682a2c5481dd3
+srccontainersize 8220
+srccontainerchecksum 0569db63bf6fd492952cdee442312e818926bceba7663ce0e17f485dbe990687d97efc02649acef6dd89210aa44f9e88c86cf2667c4a487e9b78b90b10a779ce
srcfiles size=11
RELOC/source/latex/zref-vario/zref-vario.dtx
RELOC/source/latex/zref-vario/zref-vario.ins
@@ -367916,7 +367961,7 @@ catalogue-contact-repository https://github.com/gusbrs/zref-vario
catalogue-ctan /macros/latex/contrib/zref-vario
catalogue-license lppl1.3c
catalogue-topics label-ref expl3
-catalogue-version 0.1.9
+catalogue-version 0.1.10
name zwgetfdate
category Package
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 6b1e923db8..9504f57580 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-927e127539d0f81cc3eb0f07ba5c6787 texlive.tlpdb
+04b8177c453efa913ec7edc3dc5511d1 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 62cb480d46..1729553df3 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-0759a4b7ff55abb11d223e53931426bacec56a2fe4ab1fdc828041f76541a2d192771b09157ee21d972721742e75266c064486bf93f2c3ce7d8749ed5ae66c33 texlive.tlpdb
+82f9eb7e2e52bcee22f6fd4dd84095e40db65acd3904d3557a516f0914f3e9d4428173b2718fed7bf8ca0b1890e99107b9d135e921f6cc14ce8164acb5299bd3 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index a9ba88bcd5..0708d08c5f 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,11 +1,11 @@
-----BEGIN PGP SIGNATURE-----
-iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmVSw0oACgkQTOGHfhlD
-jHDvmggAqbxE4RlhbUYKQmYd90pGdIaeXJHF/YnpA7H9k8B3AU/kCoaW+W+/i8CZ
-xkyVNPurVFkcHZS75w4qM0UCQ281Xb7busxyGa9jfMYktdaRImKmTk+41bvkS6UA
-rA0k3zwdim8FyAo9YQrFkJPbIplTKo0SZBXwBkAy12t50XInvHhPyNGoEbGeJaaY
-kWu9SVzfDmLPmwIXggcvbQusLOWDAOGugYxxFdK3eLwlgCmt1Uj2Etc/7lkahknI
-UHmQZHn5+o8u0cD+8BwVSgS5BBxlFPRPKTLJKX4op82Wk1PdkttfPi1hZHRai9Fx
-mH/neFtZ85uwXRM7KAw0m7+Aia3/Bg==
-=pRzT
+iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmVUFLUACgkQTOGHfhlD
+jHB0zgf9Hy9gIbQB+SbaP4RNpQH9xgexZMuxssb9eW1LPqaiPrvZlXaRdtq9gBtm
++s0BRHAb89AwgZ0iQajPuDXMr8I1+KBT/zcONozz/8f+dfElznMJ6WMP/AE91pYy
++0Onxsi4rOP9OeY+0GIhvOXA0CXdfe4+gb0Av/0/3IdaWItXfdpZsp+YohqbFm9U
++4hRcBalqHM874bp0sllvnX8O41iiBInEH7JJtB16TEQ6qbpj4FEwOIM8TjDiMfP
+lfpFSqd+RY8CoY7FRmtXigDOs6RC5OYT2+lNvZZw64JWmw2j8iyymwtb182xi4Ba
+O7Hm6r3vlLe3kqHSBiX381JOkxWY+w==
+=V/u7
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index b0a28d7a9a..6977793511 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index 6220a1b640..16bfa3d97d 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2023-11-15-02-02
+2023-11-16-02-02